From 7c9b169a39c5fbb6286296e08a05d58021fe2856 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Wed, 2 Mar 2022 19:40:03 -0300 Subject: [PATCH 01/42] Update build.gradle I have now Gradle v.7.3.3: - "compile" --> "implementation" Freeplane comes now with Groovy 3.0.8 (my prev. version was 3.0.1) --- Tutorial-o-Matic/build.gradle | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Tutorial-o-Matic/build.gradle b/Tutorial-o-Matic/build.gradle index 45f7bf1..a0cf932 100644 --- a/Tutorial-o-Matic/build.gradle +++ b/Tutorial-o-Matic/build.gradle @@ -1,5 +1,7 @@ //Tutorial-o-Matic + + apply plugin: 'groovy' targetCompatibility='1.8' @@ -29,14 +31,21 @@ repositories { // ] } + +// I had this error: + // Could not find method compile() for arguments [{name=freeplanelauncher}] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler +// answer: + // https://stackoverflow.com/questions/69733508/couldnt-find-compile-for-arguments-directory-libs-on-object-of-type-org-g + dependencies { - compile name : 'freeplanelauncher' - compile name : 'freeplaneviewer' - compile group: 'org.freeplane.core', name: 'freeplaneeditor', version:"+" - compile group: 'org.freeplane.script', name: 'plugin', version: '+' - compile name : 'markedj', version: '+' //<---- para markedj - compile name : 'jsoup' , version: '+' //<---- para jsoup - compile ('org.codehaus.groovy:groovy-all:3.0.1') { + implementation name : 'freeplanelauncher' + implementation name : 'freeplaneviewer' + implementation group: 'org.freeplane.core', name: 'freeplaneeditor', version:"+" + implementation group: 'org.freeplane.script', name: 'plugin', version: '+' + implementation name : 'markedj', version: '+' //<---- para markedj + implementation name : 'jsoup' , version: '+' //<---- para jsoup + //Freeplane now comes with groovy 3.0.8 + implementation ('org.codehaus.groovy:groovy-all:3.0.8') { exclude group:'org.codehaus.groovy', module:'groovy-test' exclude group:'org.codehaus.groovy', module:'groovy-test-junit5' exclude group:'org.codehaus.groovy', module:'groovy-testng' @@ -46,5 +55,5 @@ dependencies { exclude group:'org.codehaus.groovy', module:'groovy-cli-commons' exclude group:'org.codehaus.groovy', module:'groovy-cli-picocli' } - compile 'org.codehaus.groovy:groovy-dateutil:3.0.1' + implementation 'org.codehaus.groovy:groovy-dateutil:3.0.8' } \ No newline at end of file From 7520b8ffc99c0e10a15ef45dffac1dfabf30e1fc Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Wed, 2 Mar 2022 19:46:36 -0300 Subject: [PATCH 02/42] Update Tutorial-o-Matic.mm --- Tutorial-o-Matic/Tutorial-o-Matic.mm | 189 ++++++++++++++++++++------- 1 file changed, 145 insertions(+), 44 deletions(-) diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 88bcb9a..5c23e02 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -2,13 +2,16 @@ - + + + + @@ -40,9 +43,16 @@
  • updateUrl: URL of the file containing information (version, download url) on the latest version of this add-on. By default: "${homepage}/version.properties"
  • +
  • + addonsMenu: Defines the addon's main menu location, defaults menu 'main_menu_scripting'.
    Use developer tool menuItemInfo to inspect menu location keys.
    This attribute is mandatory.
    Example: '/menu_bar/myAddons' +
  • +
  • + downloadUrl: URL from the place where the AddOn file will be available for downloading.
    By default is the same as the homepage.
    You can define a different place or a subfolder of the homepage.
    Example: "${homepage}/files/" +
  • -
    + + @@ -128,7 +138,7 @@ - + @@ -147,7 +157,8 @@ To translate the description you have to define a translation for the key 'addons.${name}.description'.

    -
    + + @@ -162,7 +173,8 @@ Change log of this add-on: append one node for each noteworthy version and put the details for each version into a child node.

    - + + @@ -177,6 +189,7 @@ + @@ -197,7 +210,8 @@ The License text has to be entered as a child of the 'license' node, either as plain text or as HTML.

    - + + @@ -212,10 +226,104 @@ The child node contains the add-on configuration as an extension to mindmapmodemenu.xml (in Tools->Preferences->Add-ons).

    - Every property in the configuration should receive a default value in default.properties node. +   +

    +

    + Every property in the configuration should receive a default value in default.properties node.

    +

    + +

    +

    + Automatic way (new since v0.9.30): +

    +

    + you can add the preferences parameters as attributes to this node and then, by checking AddOn it will: +

    +
      +
    • + create the child node containing the add-on configuration as an extension to mindmapmodemenu.xml +
    • +
    • + add the properties to the default.properties node +
    • +
    • + add the properties to the translations node +
    • +
    +

    + +

    +

    + How? +

    +
      +
    • + Add an attribute for each preference. +
    • +
    • + the attribute name should be the preference name. +
    • +
    • + as attribute value you should specify if it is a boolean, string or number preference +
    • +
    • + if it is a number preference. you should add the min and max value for it (separed by comma) +
    • +
    +

    + +

    +

    + Example: +

    +

    + +

    +

    + Attributes: +

    + + + + + + + + + + + + + +
    +

    + isStudent +

    +
    +

    + boolean +

    +
    +

    + userName +

    +
    +

    + string +

    +
    +

    + birthMonth +

    +
    +

    + number,1,12 +

    +
    - + +
    @@ -237,7 +345,8 @@ For each menu item with an icon add an attribute with the icon key (use develope - + + @@ -262,9 +371,10 @@ For each menu item with an icon add an attribute with the icon key (use develope - + + - + @@ -272,6 +382,7 @@ For each menu item with an icon add an attribute with the icon key (use develope + @@ -285,7 +396,8 @@ For each menu item with an icon add an attribute with the icon key (use develope List of files and/or directories to remove on uninstall

    - + + @@ -416,11 +528,12 @@ For each menu item with an icon add an attribute with the icon key (use develope   - In any case set execute_scripts_without_asking to true unless you want to annoy users.

    - + + - + - + @@ -430,9 +543,9 @@ For each menu item with an icon add an attribute with the icon key (use develope - + - + @@ -478,7 +591,8 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    - + + @@ -519,7 +633,8 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    - + + @@ -556,42 +671,28 @@ For each menu item with an icon add an attribute with the icon key (use develope Images can be added automatically by releaseAddOn.groovy or must be uploaded into the map via the script Tools->Scripts->Insert Binary since they have to be (base64) encoded as simple strings.

    - + + - - + + -

    - some nodes to build AddOn and test changes easily and fast -

    - -
    - - - - - - -

    - Edo -

    + Direct links to menu commands -
    - - - - - - - + + + + + + From 472981a59bb4bdb6908c4e600480d96d15ed98e4 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Wed, 2 Mar 2022 19:47:49 -0300 Subject: [PATCH 03/42] translations wip --- Tutorial-o-Matic/translations/en.properties | 7 +++++++ Tutorial-o-Matic/translations/es.properties | 1 + 2 files changed, 8 insertions(+) create mode 100644 Tutorial-o-Matic/translations/en.properties create mode 100644 Tutorial-o-Matic/translations/es.properties diff --git a/Tutorial-o-Matic/translations/en.properties b/Tutorial-o-Matic/translations/en.properties new file mode 100644 index 0000000..e53085b --- /dev/null +++ b/Tutorial-o-Matic/translations/en.properties @@ -0,0 +1,7 @@ +#Sun Feb 27 18:12:08 CLST 2022 +addons.${name}.ActionInstruction1=In submenu {0}
    click on {1} +addons.${name}=Tutorial-o-Matic +addons.${name}.ActionInstruction2=You can also use de keyboard shortcut {0} for this command +addons.${name}.openDemoMap=open Demo map +addons.${name}.ToMDemo=Tutorial-o-Matic Demo +addons.${name}.executeTutorial=execute Demo tutorial diff --git a/Tutorial-o-Matic/translations/es.properties b/Tutorial-o-Matic/translations/es.properties new file mode 100644 index 0000000..2a75246 --- /dev/null +++ b/Tutorial-o-Matic/translations/es.properties @@ -0,0 +1 @@ +#Sun Feb 27 18:12:08 CLST 2022 From 25d45eb99403e212eeab45a579f06003c5403ed9 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Thu, 3 Mar 2022 00:31:28 -0300 Subject: [PATCH 04/42] added Editing status --- Tutorial-o-Matic/Tutorial-o-Matic.mm | 80 ++++++++----------- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 35 +++++++- .../src/main/groovy/ToM_ui.groovy | 35 +++++++- Tutorial-o-Matic/translations/en.properties | 2 +- Tutorial-o-Matic/translations/es.properties | 7 +- Tutorial-o-Matic/version.properties | 4 +- .../Tutorial-o-Matic/SimpleTutorialSample.mm | 75 ++++++----------- 7 files changed, 131 insertions(+), 107 deletions(-) diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 5c23e02..05a082e 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -2,9 +2,9 @@ - + - + @@ -138,10 +138,7 @@
    - - - - + @@ -161,9 +158,7 @@ - - - + @@ -187,14 +182,15 @@ - + + + + - - - + @@ -214,9 +210,7 @@ - - - + @@ -325,9 +319,7 @@ - - - + @@ -348,9 +340,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - - - + @@ -373,20 +363,26 @@ For each menu item with an icon add an attribute with the icon key (use develope - - - + + + - + - + + + + + + + + - - - + + @@ -411,9 +407,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - - - + @@ -531,7 +525,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -543,7 +537,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -555,9 +549,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - - - + @@ -597,9 +589,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - - - + @@ -639,9 +629,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - - - + @@ -677,9 +665,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - - - + diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 54ee7f4..8f66706 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -63,6 +63,11 @@ class ToM{ def static getNewPageNodes(nTutorial){ return nTutorial.find{it.style.name == styles.newPage} } + + def static isEditingMode(n){ + def nodo = getTutorialNode(n) + return nodo.icons.contains('emoji-1F58D') + } // end: @@ -151,14 +156,38 @@ class ToM{ } } + def static htmlTitle(String texto){ + return "

    ${texto}

    " + } + def static addPageTitle(myP, String texto){ - def html = "

    ${texto}

    " + def html = htmlTitle(texto) myP.add(tomui.createInstructionsPane(html), tomui.GBC) } - + def static addPageTitle(myP, nodo){ - addPageTitle(myP, nodo.text) + if (isEditingMode(nodo)) { + def html = htmlTitle(nodo.text) + def bttnText1 = "inspect" + def bttnToolTip1 = "Click to select the page's source nodes" + def bttnAction1 = { e -> + def pageNode = nodo //.parent + def m = c.mapLoader(nodo.map.file).withView()//.selectNodeById(pageNodeId) + m.load() + pageNode.pathToRoot*.folded = false + c.select(pageNode) + } + def bttnText2 = 'reload' + def bttnToolTip2 = "Click to reload '${nodo.text}' section" + def bttnAction2 = { e -> fillPage(myP, nodo, true, true)} + myP.add(tomui.createPageTitlePane(html, bttnText1, bttnToolTip1,bttnAction1,bttnText2,bttnToolTip2,bttnAction2), tomui.GBC) + } else { + addPageTitle(myP, nodo.text) + } } + + + def static addNextPagePane(myP, lastNode, boolean included = false, boolean showNextButton = true){ def closeLabel = 'Stop tutorial' diff --git a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy index 37519a6..f36f369 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy @@ -211,7 +211,40 @@ class ToM_ui{ sp.viewport.add(panel) return sp } - + + def static createPageTitlePane(String htmlMsg, bttnText1, bttnToolTip1,bttnAction1,bttnText2,bttnToolTip2,bttnAction2){ + def panel = swing.panel() { + borderLayout() + editorPane( + editable : false, + contentType : "text/html", + text : htmlMsg, + margin : new Insets(30,10,30,10), + border : new EmptyBorder(5, 10, 5, 10), // <------- éste + //border: new CompoundBorder(new LineBorder(Color.green, 1),new EmptyBorder(5, 10, 5, 10)), // éste es de prueba poder ver el borde + constraints : CENTER, + clientProperties: [(JEditorPane.HONOR_DISPLAY_PROPERTIES):true] + ) + vbox(constraints:WEST) { + button( + label : bttnText1, + // constraints : WEST, + // margin : new Insets(10,15,10,15), + toolTipText : bttnToolTip1, + actionPerformed : bttnAction1, + ) + button( + label : bttnText2, + // constraints : EAST, + // margin : new Insets(10,15,10,15), + toolTipText : bttnToolTip2, + actionPerformed : bttnAction2, + ) + } + } + return panel + } + // genera panel con botón def static createButtonPanel(htmlMsg, buttonLabel, buttonToolTip, buttonAction, boolean isToggleButton = false){ def panel = swing.panel( diff --git a/Tutorial-o-Matic/translations/en.properties b/Tutorial-o-Matic/translations/en.properties index e53085b..6203f60 100644 --- a/Tutorial-o-Matic/translations/en.properties +++ b/Tutorial-o-Matic/translations/en.properties @@ -1,4 +1,4 @@ -#Sun Feb 27 18:12:08 CLST 2022 +#Wed Mar 02 21:33:10 CLST 2022 addons.${name}.ActionInstruction1=In submenu {0}
    click on {1} addons.${name}=Tutorial-o-Matic addons.${name}.ActionInstruction2=You can also use de keyboard shortcut {0} for this command diff --git a/Tutorial-o-Matic/translations/es.properties b/Tutorial-o-Matic/translations/es.properties index 2a75246..2eebef4 100644 --- a/Tutorial-o-Matic/translations/es.properties +++ b/Tutorial-o-Matic/translations/es.properties @@ -1 +1,6 @@ -#Sun Feb 27 18:12:08 CLST 2022 +addons.${name}.ActionInstruction1=En submenu {0}
    has click en {1} +addons.${name}=Tutorial-o-Matic +addons.${name}.ActionInstruction2=Puedes usar también el atajo {0} para este comando +addons.${name}.openDemoMap=abrir mapa demo +addons.${name}.ToMDemo=Tutorial-o-Matic Demo +addons.${name}.executeTutorial=ejecutar Demo tutorial diff --git a/Tutorial-o-Matic/version.properties b/Tutorial-o-Matic/version.properties index 5f80fc8..d34d50c 100644 --- a/Tutorial-o-Matic/version.properties +++ b/Tutorial-o-Matic/version.properties @@ -1,3 +1,3 @@ -version=v0.0.5 -downloadUrl=https://github.com/EdoFro/Freeplane_Tutorial_AddOn/releases/download/v0.0.5/Tutorial-o-Matic-v0.0.5.addon.mm +version=v0.0.6 +downloadUrl=https://github.com/EdoFro/Freeplane_Tutorial_AddOn/releases/download/v0.0.6/Tutorial-o-Matic-v0.0.6.addon.mm freeplaneVersionFrom=v1.9.9 diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm index 00a2a80..367d575 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm @@ -1,7 +1,7 @@ - + - + @@ -135,7 +135,7 @@

    - + @@ -744,7 +744,7 @@ - + @@ -758,7 +758,7 @@ - + @@ -1476,7 +1476,7 @@ candle indicates that executes only one time (then button gets disabled) - + @@ -1780,7 +1780,23 @@ candle indicates that executes only one time (then button gets disabled) - + + + + + + + + +

    + the "crayon" icon indicates that this tutorial is beeing edited. +

    +

    + Buttons "inspect" and "reload" appear on page's top. +

    + + +
    @@ -1793,9 +1809,6 @@ candle indicates that executes only one time (then button gets disabled)
    - - -
    @@ -1898,9 +1911,6 @@ candle indicates that executes only one time (then button gets disabled)
    - - - @@ -2036,9 +2046,6 @@ candle indicates that executes only one time (then button gets disabled) - - - @@ -2059,9 +2066,6 @@ candle indicates that executes only one time (then button gets disabled)
    - - -
    @@ -2078,9 +2082,6 @@ candle indicates that executes only one time (then button gets disabled) - - - @@ -2211,9 +2212,6 @@ This example shows some actions applied without showing any message (muted):
    - - -
    @@ -2227,9 +2225,6 @@ This example shows some actions applied without showing any message (muted): - - - @@ -2263,9 +2258,6 @@ This example shows some actions applied without showing any message (muted):
    - - -
    @@ -2350,9 +2342,6 @@ candle indicates that executes only one time (then button gets disabled)
    - - -
    @@ -2409,9 +2398,6 @@ candle indicates that executes only one time (then button gets disabled)
    - - -
    @@ -2453,9 +2439,6 @@ candle indicates that executes only one time (then button gets disabled)
    - - -
    @@ -2510,9 +2493,6 @@ candle indicates that executes only one time (then button gets disabled) - - - @@ -2531,9 +2511,6 @@ candle indicates that executes only one time (then button gets disabled) - - - @@ -2546,9 +2523,6 @@ candle indicates that executes only one time (then button gets disabled)
    - - -
    @@ -2575,9 +2549,6 @@ candle indicates that executes only one time (then button gets disabled)
    - - - From 864978332be3310a00370c3ba1db17e80fb1e1ee Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Thu, 10 Mar 2022 12:15:24 -0300 Subject: [PATCH 05/42] added "get Menu Command" it adds a node with a link to the menu command that is been pointed by the mouse arrow --- .../scripts/getMenuCommand.groovy | 3 + .../src/main/groovy/MenuAction.groovy | 92 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 Tutorial-o-Matic/scripts/getMenuCommand.groovy create mode 100644 Tutorial-o-Matic/src/main/groovy/MenuAction.groovy diff --git a/Tutorial-o-Matic/scripts/getMenuCommand.groovy b/Tutorial-o-Matic/scripts/getMenuCommand.groovy new file mode 100644 index 0000000..b1607df --- /dev/null +++ b/Tutorial-o-Matic/scripts/getMenuCommand.groovy @@ -0,0 +1,3 @@ +import edofro.menuomatic.MenuAction as MA + +MA.menuCommandToNode(node) diff --git a/Tutorial-o-Matic/src/main/groovy/MenuAction.groovy b/Tutorial-o-Matic/src/main/groovy/MenuAction.groovy new file mode 100644 index 0000000..13e1d95 --- /dev/null +++ b/Tutorial-o-Matic/src/main/groovy/MenuAction.groovy @@ -0,0 +1,92 @@ +package edofro.menuomatic + +import java.awt.Component +import java.awt.Point +import java.awt.Window +import javax.swing.SwingUtilities +import javax.swing.JComponent + +import org.freeplane.plugin.script.proxy.ScriptUtils +import org.freeplane.core.util.TextUtils as textUtils +import org.freeplane.core.util.LogUtils as logger + + +class MenuAction{ + + static final int maxTextLength = { + try{ + edofro.menuomatic.PackMenu.maxTextLen + } + catch(e){ + 50 + } + }() + + static final c = ScriptUtils.c() + + def static menuCommandToNode(n){ + def nodo + def action + try { + JComponent component = (JComponent) getComponent() + action = getAction(component) + } catch (e){ + nodo = n.createChild(e.toString()) + nodo.note = e.printStackTrace() + } + if(action){ + nodo = n.createChild(getLabelText(action)) + nodo.link.text = "menuitem:_${action.key}" + } else { + c.statusInfo = 'No menu or toolbar command encountered under mouse pointer' + } + } + + def static getLabelText(action){ + return getActionText(action.key,'text')?:getActionText(action.key,'tooltip')?:action.rawText?:action.key + } + + def static getActionText(acc,tipo){ + def texto = textUtils.getText("${acc}.${tipo}", null) + texto = (texto && texto!='null')?textUtils.getShortText(texto, maxTextLength,'.'):null + return texto + } + + def static getAction(component){ + if(component.properties.containsKey('action') && component.action!=null){ + def accion + if(component.action.properties.containsKey('originalAction')){ + accion = component.action.originalAction + }else{ + accion = component.action + } + return accion + }else{ + return null + } + } + + def static getComponent(){ + for (Window window : Window.getWindows()) { + Point mousePositionA = window.getMousePosition(true) + if(!mousePositionA)continue + def compo = window.getLayeredPane() + Point mousePosition + try { + mousePosition = SwingUtilities.convertPoint(window,mousePositionA,compo) + } catch (e){ + logger.warn('menuAction',e) + logger.warn('window: ' + window.toString()) + logger.warn('mousePosition: ' + mousePositionA.toString()) + logger.warn('LayeredPane: ' + compo.toString()) + throw e + } + if (mousePosition != null) { + Component componentUnderMouse = SwingUtilities.getDeepestComponentAt(compo, (int) mousePosition.x, + (int) mousePosition.y); + return componentUnderMouse + } + } + } + +} \ No newline at end of file From 328b101713f1bd69154d2abde47f3666c743eafe Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Thu, 10 Mar 2022 12:16:00 -0300 Subject: [PATCH 06/42] Create tutorial_styles_template.mm --- .../tutorial_styles_template.mm | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm diff --git a/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm b/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm new file mode 100644 index 0000000..4c48d73 --- /dev/null +++ b/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + +pre { + background-color: rgb(230, 230, 230); + border: 1px solid rgb(0, 0, 0); + display: block; + padding: 10px; +} +code { + font-family: Consolas,"courier new"; + color: rgb(0, 80, 0); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 6cda0b880de44ccd65f6614e7732f57d56c75cff Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Thu, 10 Mar 2022 12:22:47 -0300 Subject: [PATCH 07/42] tab name can now be customized --- .../src/main/groovy/TabPane.groovy | 19 ++++++++++++++-- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 22 ++++++++++++------- .../src/main/groovy/ToM_ui.groovy | 17 +++++++++++--- .../Tutorial-o-Matic/SimpleTutorialSample.mm | 16 ++++++++++++-- 4 files changed, 59 insertions(+), 15 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/TabPane.groovy b/Tutorial-o-Matic/src/main/groovy/TabPane.groovy index 4e80c67..10a0783 100644 --- a/Tutorial-o-Matic/src/main/groovy/TabPane.groovy +++ b/Tutorial-o-Matic/src/main/groovy/TabPane.groovy @@ -12,8 +12,19 @@ class TabPane{ //region: methods def static removeTab(String tabName, boolean hideTabPane = false){ - def index = tabPane.indexOfTab(tabName) - //eliminar + int index = tabPane.indexOfTab(tabName) + //msg("removeTab String - index: $index") + removeTab(index, hideTabPane) + } + + def static removeTab(javax.swing.JComponent comp, boolean hideTabPane = false){ + int index = tabPane.indexOfComponent(comp) + //msg("removeTab Component - index: $index") + removeTab(index, hideTabPane) + } + + def static removeTab(int index, boolean hideTabPane = false){ + //msg("removeTab index - index: $index") if (index >= 0) { tabPane.removeTabAt(index) def previousTab = tabPane.hasProperty('previousTab')? tabPane.previousTab : 0 @@ -67,5 +78,9 @@ class TabPane{ def static repaint(){ tabPane.repaint() } + + def static msg(texto){ + ui.informationMessage(texto.toString()) + } //end: } \ No newline at end of file diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 8f66706..cf4b7d9 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -15,10 +15,13 @@ class ToM{ // region: properties // this region has all the properties for the ToM class - static final String version = '0.0.4' - static final c = ScriptUtils.c() - static final String tabName = 'Tutorial' - static final String idDictStorage = 'ToM_idDictionary' + static final String version = '0.0.6' + static final c = ScriptUtils.c() + static final String idDictStorage = 'ToM_idDictionary' + static final String attributeTabLabel = 'ToM_TabLabel' + static final String defaultTabLabel = 'Tutorial' + static final String defaultMapTutorialsTabLabel = 'Tutorials' + static final Map styles = [ tutorial : 'ToM-Tutorial' , @@ -199,7 +202,7 @@ class ToM{ def tocToolTip = 'Click to show the Table of Contents of the tutorial' def tocBttnAction = { e -> showTOC(myP,lastNode) } - def nextButtonPanel = tomui.createNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction, tocLabel, tocToolTip, tocBttnAction) + def nextButtonPanel = tomui.createNextButtonPanel(closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction, tocLabel, tocToolTip, tocBttnAction) myP.add(nextButtonPanel, tomui.GBC) } @@ -513,7 +516,9 @@ class ToM{ def bttnAction = { e -> def tutNodes = getTutNodes(nT) if(tutNodes) { - fillContentPane(myP, tutNodes) + def tutorialTabName = nT[attributeTabLabel] ?: defaultTabLabel + def myP_thisTutorial = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true) + fillContentPane(myP_thisTutorial, tutNodes) } else { ui.informationMessage( "no tutorial components(nodes) found for tutorial '${nT.text}'".toString() ) } @@ -521,7 +526,7 @@ class ToM{ def button = tomui.createButton(title, bttnAction) pane.add(button, tomui.GBC) } - def stopButton = tomui.createButton('Exit tutorial', {tomui.closeTab(tabName)}) + def stopButton = tomui.createButton('CLOSE', { e -> tomui.closeTab(e.source)}) pane.add(stopButton, tomui.GBC) myP.add(pane, tomui.GBC) } else { @@ -548,7 +553,8 @@ class ToM{ } def static showTutorials(mapa){ - def myP = tomui.getContentPaneFromMyTab(tabName, true) + def tutorialTabName = mapa.root[attributeTabLabel] ?: defaultMapTutorialsTabLabel + def myP = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true) myP.removeAll() tomui.resizeContentPanel(myP,tomui.maxContentPaneHeigth) addTutorialsPane(myP, mapa) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy index f36f369..dd35969 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy @@ -295,7 +295,7 @@ class ToM_ui{ // genera panel close - next page //nextButtonAction == null --> no 'Next page' button - def static createNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip, nextButtonAction, tocLabel = '', tocToolTip = '', tocButtonAction = null ){ + def static createNextButtonPanel(closeLabel, closeToolTip, nextLabel, nextToolTip, nextButtonAction, tocLabel = '', tocToolTip = '', tocButtonAction = null ){ def panel = swing.panel( //border : new LineBorder(Color.gray, 1), name : myNextPanelName, @@ -311,7 +311,7 @@ class ToM_ui{ constraints : WEST, margin : new Insets(10,15,10,15), toolTipText : closeToolTip, - actionPerformed : {closeTab(tabName)}, + actionPerformed : { e -> closeTab(e.source) }, ) if(tocButtonAction /* && nextButtonAction */ ){ button( @@ -415,10 +415,17 @@ class ToM_ui{ //region: other methods - def static closeTab(tabName, boolean hideTabPane = false) { + def static closeTab(String tabName, boolean hideTabPane = false) { TabPane.removeTab(tabName, hideTabPane) } + def static closeTab(javax.swing.JComponent comp, boolean hideTabPane = false) { + //msg(comp.class) + def componente = getScrollPaneViewport(comp).parent + //msg(componente.class) + TabPane.removeTab(componente, hideTabPane) + } + def static setNextPagePanelEnabled(JPanel myP, boolean isEnabled){ setPanelEnabled(getNextButtonPanel(myP), isEnabled) } @@ -442,6 +449,10 @@ class ToM_ui{ getScrollPaneViewport(comp).setViewPosition(new Point(0,0)) } + def static msg(texto){ + ui.informationMessage(texto.toString()) + } + //end: diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm index 367d575..c98da30 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm @@ -135,6 +135,8 @@

    + + @@ -1794,9 +1796,19 @@ candle indicates that executes only one time (then button gets disabled)

    Buttons "inspect" and "reload" appear on page's top.

    +

    + +

    +

    + the attribute "ToM_TabLabel" indicates which Tab should the tutorial be shown in. +

    +

    + If not present -> default is "Tutorial" +

    - - + + + From e05fae80022c0a7cd7f248a44df750fcd6db7589 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Thu, 10 Mar 2022 12:23:31 -0300 Subject: [PATCH 08/42] devtools v0.9.31 --- Tutorial-o-Matic/Tutorial-o-Matic.mm | 163 ++++++++++++++------ Tutorial-o-Matic/history.md | 54 +++++++ Tutorial-o-Matic/translations/en.properties | 3 +- Tutorial-o-Matic/translations/es.properties | 1 + Tutorial-o-Matic/version.properties | 1 + 5 files changed, 176 insertions(+), 46 deletions(-) create mode 100644 Tutorial-o-Matic/history.md diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 05a082e..0383b13 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -2,16 +2,16 @@ - + - - + + @@ -26,34 +26,66 @@

    • - name: The name of the add-on, normally a technically one (no spaces, no special characters except _.-). + name: The name of the add-on, normally a technically one (no spaces, no special characters except _.-).
    • - author: Author's name(s) and (optionally) email adresses. + author: Author's name(s) and (optionally) email adresses.
    • - version: Since it's difficult to protect numbers like 1.0 from Freeplane's number parser it's advised to prepend a 'v' to the number, e.g. 'v1.0'. + version: Since it's difficult to protect numbers like 1.0 from Freeplane's number parser it's advised to prepend a 'v' to the number, e.g. 'v1.0'.
    • - freeplane-version-from: The oldest compatible Freeplane version. The add-on will not be installed if the Freeplane version is too old. + freeplane-version-from: The oldest compatible Freeplane version. The add-on will not be installed if the Freeplane version is too old.
    • - freeplane-version-to: Normally empty: The newest compatible Freeplane version. The add-on will not be installed if the Freeplane version is too new. + freeplane-version-to: Normally empty: The newest compatible Freeplane version. The add-on will not be installed if the Freeplane version is too new.
    • - updateUrl: URL of the file containing information (version, download url) on the latest version of this add-on. By default: "${homepage}/version.properties" + updateUrl: URL of the file containing information (version, download url) on the latest version of this add-on.
      By default: "${homepage}/version.properties"
      Examples: + +
        +
      • + For GitHub releases: "${homepage}/releases/latest/download/version.properties" +
      • +
      • + For Github in a folder named like the add-on (in the main repository branch): "${homepage}/raw/main/${name}/version.properties +
      • +
      • + For Github in a folder named like the add-on (in a repository branch named as the add-on version): "${homepage}/raw/${version}/${name}/version.properties" +
      • +
      +
    • +
    • + addonsMenu: Defines the addon's main menu location, defaults menu 'main_menu_scripting'.
      Use developer tool menuItemInfo to inspect menu location keys.
      This attribute is mandatory.
      Example: '/menu_bar/myAddons'
    • - addonsMenu: Defines the addon's main menu location, defaults menu 'main_menu_scripting'.
      Use developer tool menuItemInfo to inspect menu location keys.
      This attribute is mandatory.
      Example: '/menu_bar/myAddons' + downloadUrl: URL from the place where the AddOn file will be available for downloading.
      By default is the same as the homepage.
      You can define a different place or a subfolder of the homepage.
      Examples: + +
        +
      • + homepage subfolder 'files': "${homepage}/files/" +
      • +
      • + For GitHub releases (release named as the add-on version): ${homepage}/releases/download/${version}/ +
      • +
    • - downloadUrl: URL from the place where the AddOn file will be available for downloading.
      By default is the same as the homepage.
      You can define a different place or a subfolder of the homepage.
      Example: "${homepage}/files/" + changelogUrl: URL from the place where the history file will be available for downloading.
      By default is "${homepage}/history.md"
      You can define a different place or a subfolder of the homepage and a different file name and extension if wanted.
      Examples: + +
        +
      • + txt file: "${homepage}/history.md" +
      • +
      • + For GitHub releases as Markdown file: "${homepage}/releases/latest/download/history.md" +
      • +
    - -
    - + + @@ -154,8 +186,7 @@ To translate the description you have to define a translation for the key 'addons.${name}.description'.

    - - + @@ -168,26 +199,54 @@ Change log of this add-on: append one node for each noteworthy version and put the details for each version into a child node.

    - -
    + - + + + - + + + + + + + + + + + + + + + + + + + + - + + + + + + - + + + + @@ -206,8 +265,7 @@ The License text has to be entered as a child of the 'license' node, either as plain text or as HTML.

    - -
    + @@ -316,8 +374,7 @@ - - + @@ -337,8 +394,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - - + @@ -359,18 +415,27 @@ For each menu item with an icon add an attribute with the icon key (use develope
  • 'addons.${name}.<scriptname>' for each script since it will be the menu title.
  • +
  • + 'OptionPanel.separator.${name}' for the add-on's name in the preferences panel +
  • +
  • + 'OptionPanel.<property>' for the label of the property in the preferences panel +
  • +
  • + 'OptionPanel.<property>.tooltip' for the tooltip message for the property in the preferences panel (whwn hovering on it with the mouse) +
  • - -
    + - + + @@ -392,8 +457,7 @@ For each menu item with an icon add an attribute with the icon key (use develope List of files and/or directories to remove on uninstall

    - - + @@ -406,6 +470,8 @@ For each menu item with an icon add an attribute with the icon key (use develope + +
    @@ -522,10 +588,9 @@ For each menu item with an icon add an attribute with the icon key (use develope   - In any case set execute_scripts_without_asking to true unless you want to annoy users.

    - -
    + - + @@ -537,7 +602,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -548,6 +613,18 @@ For each menu item with an icon add an attribute with the icon key (use develope + + + + + + + + + + + +
    @@ -583,8 +660,7 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    - -
    + @@ -623,8 +699,7 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    - - + @@ -659,8 +734,7 @@ For each menu item with an icon add an attribute with the icon key (use develope Images can be added automatically by releaseAddOn.groovy or must be uploaded into the map via the script Tools->Scripts->Insert Binary since they have to be (base64) encoded as simple strings.

    - - + @@ -673,8 +747,7 @@ For each menu item with an icon add an attribute with the icon key (use develope Direct links to menu commands - - + diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md new file mode 100644 index 0000000..12dd2ed --- /dev/null +++ b/Tutorial-o-Matic/history.md @@ -0,0 +1,54 @@ +# History + +## v0.0.6 + +* using devtools v0.9.31 +* added "editing status" to tutorial node (crayon icon) +* Added command "get menu command" +* Tab name can be set for each tutorial individually + +## v0.0.5 + +* - use look and feel specific colors (dpolivaev) + +## v0.0.4 + +* - corrected link to version.properties +* - information of pasted nodes now is saved in each map for later exercises and multiple exercising maps +* - added 'go back' when using 'GOTO' panes +* - added 'show node from map' +* - added 'Show Tutorials' in tutorial's last page +* - added markedj.Options for Markdown + +## v0.0.3 + +* - better scrollspeed +* - message when command no present in Menu for active map +* - added execute_scripts_without_network_restriction: true so web images could be loaded +* - improved showMenu to show actions in extended submenus +* - changed 'Close tutorial' to 'Stop tutorial' +* - tables have now black borders +* - Codeblocks have special style in EditorPanes +* - links in EditorPanes are now clickeable and open the default web browser +* - added a listener to resize height of content panel when tabpanel width changes +* - added newPage styles and functionality +* - added Table of Contents styles and functionality +* - added Table of Contents button to 'next page' panel +* - added GOTO style and its functionality +* - added Action style and its functionality +* - added groovy style and its functionality +* - enables multiple tutorials in one map +* - added 'copy' style and its functionality +* - added 'select' style and its functionality +* - added 'openMap' style and its functionality +* - added 'inspect tutorial map' functionality + +## v0.0.2 + +* Bugs corrections: +* - License as plain text +* - Updated version of Demo map + +## v0.0.1 + +* Demo version diff --git a/Tutorial-o-Matic/translations/en.properties b/Tutorial-o-Matic/translations/en.properties index 6203f60..fc09ad2 100644 --- a/Tutorial-o-Matic/translations/en.properties +++ b/Tutorial-o-Matic/translations/en.properties @@ -1,7 +1,8 @@ -#Wed Mar 02 21:33:10 CLST 2022 +#Wed Mar 09 00:14:46 CLST 2022 addons.${name}.ActionInstruction1=In submenu {0}
    click on {1} addons.${name}=Tutorial-o-Matic addons.${name}.ActionInstruction2=You can also use de keyboard shortcut {0} for this command addons.${name}.openDemoMap=open Demo map +addons.${name}.getMenuCommand=Get menu command addons.${name}.ToMDemo=Tutorial-o-Matic Demo addons.${name}.executeTutorial=execute Demo tutorial diff --git a/Tutorial-o-Matic/translations/es.properties b/Tutorial-o-Matic/translations/es.properties index 2eebef4..68d3aa3 100644 --- a/Tutorial-o-Matic/translations/es.properties +++ b/Tutorial-o-Matic/translations/es.properties @@ -1,3 +1,4 @@ +#Wed Mar 09 00:14:46 CLST 2022 addons.${name}.ActionInstruction1=En submenu {0}
    has click en {1} addons.${name}=Tutorial-o-Matic addons.${name}.ActionInstruction2=Puedes usar también el atajo {0} para este comando diff --git a/Tutorial-o-Matic/version.properties b/Tutorial-o-Matic/version.properties index d34d50c..c0a6324 100644 --- a/Tutorial-o-Matic/version.properties +++ b/Tutorial-o-Matic/version.properties @@ -1,3 +1,4 @@ version=v0.0.6 downloadUrl=https://github.com/EdoFro/Freeplane_Tutorial_AddOn/releases/download/v0.0.6/Tutorial-o-Matic-v0.0.6.addon.mm +changelogUrl=https://github.com/EdoFro/Freeplane_Tutorial_AddOn/releases/latest/download/history.md freeplaneVersionFrom=v1.9.9 From b412c19ada8b1fd55207d0c3f8e214c13b3636b0 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Thu, 10 Mar 2022 12:48:08 -0300 Subject: [PATCH 09/42] added showTutorialsFromActiveMap --- Tutorial-o-Matic/Tutorial-o-Matic.mm | 68 +++++++++++++------ Tutorial-o-Matic/history.md | 2 + Tutorial-o-Matic/scripts/ToMDemo.groovy | 3 - .../scripts/showTutorialsFromActiveMap.groovy | 3 + Tutorial-o-Matic/translations/en.properties | 3 +- Tutorial-o-Matic/translations/es.properties | 6 +- 6 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 Tutorial-o-Matic/scripts/showTutorialsFromActiveMap.groovy diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 0383b13..8055764 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -84,7 +84,8 @@ - + + @@ -186,7 +187,8 @@ To translate the description you have to define a translation for the key 'addons.${name}.description'.

    - + + @@ -199,7 +201,8 @@ Change log of this add-on: append one node for each noteworthy version and put the details for each version into a child node.

    -
    + + @@ -247,6 +250,7 @@ + @@ -265,7 +269,8 @@ The License text has to be entered as a child of the 'license' node, either as plain text or as HTML.

    -
    + + @@ -374,7 +379,8 @@ - + + @@ -394,7 +400,8 @@ For each menu item with an icon add an attribute with the icon key (use develope - + + @@ -426,23 +433,27 @@ For each menu item with an icon add an attribute with the icon key (use develope - - - + + + + + + - - - - + + + + + @@ -457,7 +468,8 @@ For each menu item with an icon add an attribute with the icon key (use develope List of files and/or directories to remove on uninstall

    - + + @@ -472,6 +484,7 @@ For each menu item with an icon add an attribute with the icon key (use develope +
    @@ -588,7 +601,8 @@ For each menu item with an icon add an attribute with the icon key (use develope   - In any case set execute_scripts_without_asking to true unless you want to annoy users.

    -
    + + @@ -625,6 +639,18 @@ For each menu item with an icon add an attribute with the icon key (use develope + + + + + + + + + + + +
    @@ -660,7 +686,8 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    -
    + + @@ -699,7 +726,8 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    - + + @@ -734,7 +762,8 @@ For each menu item with an icon add an attribute with the icon key (use develope Images can be added automatically by releaseAddOn.groovy or must be uploaded into the map via the script Tools->Scripts->Insert Binary since they have to be (base64) encoded as simple strings.

    - + + @@ -747,7 +776,8 @@ For each menu item with an icon add an attribute with the icon key (use develope Direct links to menu commands - + + diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index 12dd2ed..ce40527 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -6,6 +6,8 @@ * added "editing status" to tutorial node (crayon icon) * Added command "get menu command" * Tab name can be set for each tutorial individually +* List of Tutorials in Map can be shown in its own Tab. Its text can be set as a root node attribute. +* Added command: "Show tutorials from active map" ## v0.0.5 diff --git a/Tutorial-o-Matic/scripts/ToMDemo.groovy b/Tutorial-o-Matic/scripts/ToMDemo.groovy index fbd88fd..7101cf3 100644 --- a/Tutorial-o-Matic/scripts/ToMDemo.groovy +++ b/Tutorial-o-Matic/scripts/ToMDemo.groovy @@ -1,4 +1,3 @@ -import edofro.tutorialomatic.ToM_ui as tomui import edofro.tutorialomatic.ToM as tom //region: opens tutorial map @@ -11,6 +10,4 @@ import edofro.tutorialomatic.ToM as tom tom.showTutorials( tutMap ) - return 'tutorial started' - //end: diff --git a/Tutorial-o-Matic/scripts/showTutorialsFromActiveMap.groovy b/Tutorial-o-Matic/scripts/showTutorialsFromActiveMap.groovy new file mode 100644 index 0000000..2288b02 --- /dev/null +++ b/Tutorial-o-Matic/scripts/showTutorialsFromActiveMap.groovy @@ -0,0 +1,3 @@ +import edofro.tutorialomatic.ToM as tom + +tom.showTutorials( node.map ) diff --git a/Tutorial-o-Matic/translations/en.properties b/Tutorial-o-Matic/translations/en.properties index fc09ad2..1a4a58a 100644 --- a/Tutorial-o-Matic/translations/en.properties +++ b/Tutorial-o-Matic/translations/en.properties @@ -1,8 +1,9 @@ -#Wed Mar 09 00:14:46 CLST 2022 +#Thu Mar 10 12:35:30 CLST 2022 addons.${name}.ActionInstruction1=In submenu {0}
    click on {1} addons.${name}=Tutorial-o-Matic addons.${name}.ActionInstruction2=You can also use de keyboard shortcut {0} for this command addons.${name}.openDemoMap=open Demo map addons.${name}.getMenuCommand=Get menu command +addons.${name}.showTutorialsFromActiveMap=Show tutorials from active map addons.${name}.ToMDemo=Tutorial-o-Matic Demo addons.${name}.executeTutorial=execute Demo tutorial diff --git a/Tutorial-o-Matic/translations/es.properties b/Tutorial-o-Matic/translations/es.properties index 68d3aa3..d716f5d 100644 --- a/Tutorial-o-Matic/translations/es.properties +++ b/Tutorial-o-Matic/translations/es.properties @@ -1,7 +1,9 @@ -#Wed Mar 09 00:14:46 CLST 2022 -addons.${name}.ActionInstruction1=En submenu {0}
    has click en {1} +#Thu Mar 10 12:35:30 CLST 2022 +addons.${name}.ActionInstruction1=En submenu {0}
    has click en {1} addons.${name}=Tutorial-o-Matic addons.${name}.ActionInstruction2=Puedes usar también el atajo {0} para este comando addons.${name}.openDemoMap=abrir mapa demo +addons.${name}.getMenuCommand=Obtener comando desde el menú +addons.${name}.showTutorialsFromActiveMap=Mostrar tutoriales de mapa activo addons.${name}.ToMDemo=Tutorial-o-Matic Demo addons.${name}.executeTutorial=ejecutar Demo tutorial From b4980a68b52129fed631f0755b8b99e00cb0885c Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Thu, 10 Mar 2022 13:04:04 -0300 Subject: [PATCH 10/42] change log typos --- Tutorial-o-Matic/Tutorial-o-Matic.mm | 58 ++++++++++++++-------------- Tutorial-o-Matic/history.md | 58 ++++++++++++++-------------- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 8055764..bd33d7a 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -208,41 +208,41 @@
    - - + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - + diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index ce40527..e4eb50e 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -11,45 +11,45 @@ ## v0.0.5 -* - use look and feel specific colors (dpolivaev) +* use look and feel specific colors (dpolivaev) ## v0.0.4 -* - corrected link to version.properties -* - information of pasted nodes now is saved in each map for later exercises and multiple exercising maps -* - added 'go back' when using 'GOTO' panes -* - added 'show node from map' -* - added 'Show Tutorials' in tutorial's last page -* - added markedj.Options for Markdown +* corrected link to version.properties +* information of pasted nodes now is saved in each map for later exercises and multiple exercising maps +* added 'go back' when using 'GOTO' panes +* added 'show node from map' +* added 'Show Tutorials' in tutorial's last page +* added markedj.Options for Markdown ## v0.0.3 -* - better scrollspeed -* - message when command no present in Menu for active map -* - added execute_scripts_without_network_restriction: true so web images could be loaded -* - improved showMenu to show actions in extended submenus -* - changed 'Close tutorial' to 'Stop tutorial' -* - tables have now black borders -* - Codeblocks have special style in EditorPanes -* - links in EditorPanes are now clickeable and open the default web browser -* - added a listener to resize height of content panel when tabpanel width changes -* - added newPage styles and functionality -* - added Table of Contents styles and functionality -* - added Table of Contents button to 'next page' panel -* - added GOTO style and its functionality -* - added Action style and its functionality -* - added groovy style and its functionality -* - enables multiple tutorials in one map -* - added 'copy' style and its functionality -* - added 'select' style and its functionality -* - added 'openMap' style and its functionality -* - added 'inspect tutorial map' functionality +* better scrollspeed +* message when command no present in Menu for active map +* added execute_scripts_without_network_restriction: true so web images could be loaded +* improved showMenu to show actions in extended submenus +* changed 'Close tutorial' to 'Stop tutorial' +* tables have now black borders +* Codeblocks have special style in EditorPanes +* links in EditorPanes are now clickeable and open the default web browser +* added a listener to resize height of content panel when tabpanel width changes +* added newPage styles and functionality +* added Table of Contents styles and functionality +* added Table of Contents button to 'next page' panel +* added GOTO style and its functionality +* added Action style and its functionality +* added groovy style and its functionality +* enables multiple tutorials in one map +* added 'copy' style and its functionality +* added 'select' style and its functionality +* added 'openMap' style and its functionality +* added 'inspect tutorial map' functionality ## v0.0.2 * Bugs corrections: -* - License as plain text -* - Updated version of Demo map +* License as plain text +* Updated version of Demo map ## v0.0.1 From eb230a312b932f4935089e9ab32833cf6332cbdb Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Fri, 11 Mar 2022 22:36:46 -0300 Subject: [PATCH 11/42] updated addGroovyPane method --- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 37 +++++++++++++-------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index cf4b7d9..b67186b 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -268,23 +268,29 @@ class ToM{ } def static addGroovyPane(myP, nodoT){ - def enabled = !disableBttn(nodoT) + def parentEnabled = !disableBttn(nodoT) + def parentReadOnly = isReadOnly(nodoT) nodoT.children.findAll{n -> WSE.isGroovyNode(n)}.each{nodo -> + def enabled = parentEnabled && !disableBttn(nodo) + def readOnly = parentReadOnly || isReadOnly(nodo) def script = WSE.scriptFromNode(nodo) if (script){ def scrText = script + "\n c.statusInfo = '---- ready ----'".toString() def msgHtml = getGroovyHtml(nodo, script) - def bttnText = 'Execute' - def bttnToolTip = "Click to execute script on selected nodes" - def bttnAction = { e -> - def bttn = e.source - bttn.setEnabled(enabled) - c.script(scrText, "groovy").executeOn(c.selected) - } - - def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) - buttonPanel.metaClass.pending = false - myP.add(buttonPanel, tomui.GBC) + if(readOnly){ + myP.add(tomui.createInstructionsPane(msgHtml), tomui.GBC) + } else { + def bttnText = enabled ? 'Execute' : 'Execute 1 time' + def bttnToolTip = "Click to execute script on selected nodes" + def bttnAction = { e -> + def bttn = e.source + bttn.setEnabled(enabled) + c.script(scrText, "groovy").executeOn(c.selected) + } + def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) + buttonPanel.metaClass.pending = false + myP.add(buttonPanel, tomui.GBC) + } } else { def textoHtml = '

    No script encountered in tutorial node

    ' myP.add(tomui.createInstructionsPane(textoHtml), tomui.GBC) @@ -293,7 +299,7 @@ class ToM{ } def static getGroovyHtml(nodo, script){ - def showScript = nodo.icons.icons.contains('emoji-1F50D') + def showScript = nodo.icons.icons.contains('emoji-1F50D') || nodo.icons.icons.contains('emoji-1F453') uiMsg("showScript ${showScript}") def html = showScript? tomui.getHtmlFromGroovyNode(nodo, script) : nodo.text uiMsg("html ${html}") @@ -336,6 +342,11 @@ class ToM{ def iconos = nodo.icons.icons return iconos.contains('emoji-1F56F') } + + def static isReadOnly(nodo){ + def iconos = nodo.icons.icons + return iconos.contains('emoji-1F453') + } def static addPastePane(myP, nodoSource){ def enabled = !disableBttn(nodoSource) From c514f3db7620f8b9c7ff554de2e9a4749901c4af Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Fri, 11 Mar 2022 22:42:15 -0300 Subject: [PATCH 12/42] added createNewTutorialMindMap --- Tutorial-o-Matic/Tutorial-o-Matic.mm | 21 +++++++++++++++++-- Tutorial-o-Matic/history.md | 2 ++ .../scripts/createNewTutorialMindMap.groovy | 8 +++++++ Tutorial-o-Matic/translations/en.properties | 3 ++- Tutorial-o-Matic/translations/es.properties | 3 ++- 5 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 Tutorial-o-Matic/scripts/createNewTutorialMindMap.groovy diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index bd33d7a..0d38995 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -251,6 +251,8 @@ + + @@ -435,8 +437,9 @@ For each menu item with an icon add an attribute with the icon key (use develope - + + @@ -446,8 +449,9 @@ For each menu item with an icon add an attribute with the icon key (use develope - + + @@ -485,6 +489,7 @@ For each menu item with an icon add an attribute with the icon key (use develope + @@ -651,6 +656,18 @@ For each menu item with an icon add an attribute with the icon key (use develope + + + + + + + + + + + + diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index e4eb50e..6c749de 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -8,6 +8,8 @@ * Tab name can be set for each tutorial individually * List of Tutorials in Map can be shown in its own Tab. Its text can be set as a root node attribute. * Added command: "Show tutorials from active map" +* Added command: "Create new tutorial mind map" +* addGroovyPane method updated ## v0.0.5 diff --git a/Tutorial-o-Matic/scripts/createNewTutorialMindMap.groovy b/Tutorial-o-Matic/scripts/createNewTutorialMindMap.groovy new file mode 100644 index 0000000..4c222d3 --- /dev/null +++ b/Tutorial-o-Matic/scripts/createNewTutorialMindMap.groovy @@ -0,0 +1,8 @@ +def cP = new ConfigProperties() + +def sep = File.separator +def path = cP.freeplaneUserDirectory + sep + 'templates,Tutorial-o-Matic,tutorial_styles_template.mm'.split(',').join(sep) + +def templateFile = new File(path) + +def newTutorialMindMap = c.mapLoader(templateFile).unsetMapLocation().withView().getMindMap() \ No newline at end of file diff --git a/Tutorial-o-Matic/translations/en.properties b/Tutorial-o-Matic/translations/en.properties index 1a4a58a..d59d810 100644 --- a/Tutorial-o-Matic/translations/en.properties +++ b/Tutorial-o-Matic/translations/en.properties @@ -1,4 +1,5 @@ -#Thu Mar 10 12:35:30 CLST 2022 +#Fri Mar 11 20:49:48 CLST 2022 +addons.${name}.createNewTutorialMindMap=Create new tutorial mind map addons.${name}.ActionInstruction1=In submenu {0}
    click on {1} addons.${name}=Tutorial-o-Matic addons.${name}.ActionInstruction2=You can also use de keyboard shortcut {0} for this command diff --git a/Tutorial-o-Matic/translations/es.properties b/Tutorial-o-Matic/translations/es.properties index d716f5d..3eaad01 100644 --- a/Tutorial-o-Matic/translations/es.properties +++ b/Tutorial-o-Matic/translations/es.properties @@ -1,4 +1,5 @@ -#Thu Mar 10 12:35:30 CLST 2022 +#Fri Mar 11 20:49:48 CLST 2022 +addons.${name}.createNewTutorialMindMap=Crear nuevo mapa para tutoriales addons.${name}.ActionInstruction1=En submenu {0}
    has click en {1} addons.${name}=Tutorial-o-Matic addons.${name}.ActionInstruction2=Puedes usar también el atajo {0} para este comando From 65a883d76e4172405a161c0ab32af524badb3f40 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Fri, 11 Mar 2022 22:44:51 -0300 Subject: [PATCH 13/42] WIP - How to create tutorials --- .../Tutorial-o-Matic/SimpleTutorialSample.mm | 1406 ++++++++++------- 1 file changed, 856 insertions(+), 550 deletions(-) diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm index c98da30..b033d58 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm @@ -137,7 +137,7 @@
    - + @@ -746,7 +746,7 @@ - + @@ -1478,7 +1478,7 @@ candle indicates that executes only one time (then button gets disabled) - + @@ -1520,268 +1520,6 @@ candle indicates that executes only one time (then button gets disabled) - - - - - - In the following page it's a demo tutorial about moving nodes with keyboard commands. - -It works *mostly* as expected, but when clicking in the buttons it will throw an error while it's moving the nodes. - - -I don't know why this is happening. If somebody has an idea, please post it in the Freeplane forum. - - -Please try it. It may open a bug report, but it will not freeze Freeplane or something like that. - - - - - - - - - to move nodes, - -- you can **drag and drop** them with the **mouse** -- or you can move them with the **keyboard** - - - -To move the selected node with the Keyboard -you have to press the CONTROL key while using the -ARROW keys to move the node. - -I prepared a little example. -Please select the node where you want -to insert the example nodes. - - - - - - - - - - - -

    - 2008 movie -

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - Now we can see that the nodes contains the names of the Characters of the "KungFu Panda" movie. - -Some of them are allready grouped but others are still not classified. - - -Let's classify them, beginning with **Po** as the **main character** - - - - - - - - - - - - - - - -

    - First we will move the 'Po' node into the 'main' node -

    - -
    - - - - - - - - - - - - Now let's move both kung fu masters (Oogway and Shifu) to the masters node. - - - - - - - - - - - - **'Shifu'** and **'Oogway'** nodes are not together, so we are going to move them to the right first and then back to the left. This way they get together. - - - - - - - - - Now we will move the **'Shifu'** and **'Oogway'** nodes into the **'kung fu masters'** node. - - - - - - - - - - - - - - - Now let's move the **Furious Five** to their node. - - - - - - - - - - - - - - - Now we will move the nodes into the **'Furious Five'** node. - - - - - - - - - - - ## Now is your turn!! - -1. **Insert the example nodes** again -1. and try to do the classification yourself **moving the nodes** with **CONTROL and ARROW** keys!! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1822,6 +1560,7 @@ candle indicates that executes only one time (then button gets disabled) + @@ -2052,513 +1791,1080 @@ candle indicates that executes only one time (then button gets disabled) > > -## Conclusions +## Conclusions + +Blah **blablablah** blablah. Blablablah blah **blablablah** blablablah, Blablah blah, Blah blah blablah blablablah blablah. Blablah blablah blablablah blah blablah blablablah blablablah blablablah. + + + + + + + + + + + + + +

    + Welcome to the Tutorial-o-Matic demo!! +

    +

    + This is a demo version of an addon that can be used to build tutorials in Freeplane. +

    + +
    +
    +
    +
    + + + + + **ToM** builds automatically the tutorial's table of content using the titles of each new page + + +Here is the current tutorial's TOC: + + + + + + + + + + + + You can make that **ToM** shows where in the menu the user can find a specific command. + + +Here are some examples: + + + + + + + + + + + + + + + + + +

    + Here are some example on how you can apply some menu actions on the selected nodes: +

    + +
    +
    +
    + + + + + + + + + +

    + This example shows some menu actions applied using the menus: +

    +

    + +

    +

    + it creates a new child node and it adds an icon to it +

    + +
    + + + + + + +

    + added icons: +

    +

    + candle: indicates it executes only one time and get disabled +

    +

    + mouse: should show the menu location +

    + +
    + + + + + + + + + + + + +

    + This example shows some actions applied using Hotkeys (or the menus commands): +

    +

    + +

    +
      +
    1. + applies BOLD to selected node +
    2. +
    3. + shows(or hides) the Filter Toolbar +
    4. +
    + +
    + + + + + + +

    + keyboard icon (or no icon) indicates it should show the Hotkeys (if it hasn't a defined hotkey, then it shows the menu position) +

    + +
    + + + + + + + + + + + +

    + This example shows some actions applied without showing any message (muted): +

    +

    + +

    +
      +
    • + shows/hides the "map overview" window +
    • +
    + +
    + + + + + + +

    + muted icon indicates it should execute the command without showing menus or hotkeys +

    + +
    + + +
    + + + + + You can add buttons to jump to other tutorial pages + + +Here is an example: + + + + + + + + + + +

    + To jump to the **'HTML example'** page click on the button bellow: +

    + +
    +
    + + You can also jump to another tutorial's page. + + +To jump to the **'SimpleDemo's TOC page'** page click on the button bellow: + + +
    +
    + + + + + + + + + + + +

    + Here are some examples of **groovy scripts** as part of the tutorial +

    + +
    +
    + + The first example shows two times the following groovy script: + + + +
    + + + + + + + + + + +

    + .groovy +

    + + +
    + + + +
    + + + This script will reverse the text of the selected node. + + +The difference between both scripts is that after clicking the button, the first one will disable itself (one time execution) and the second button will stay enabled (for multiple time uses) -Blah **blablablah** blablah. Blablablah blah **blablablah** blablablah, Blablah blah, Blah blah blablah blablablah blablah. Blablah blablah blablablah blah blablah blablablah blablablah blablablah. + +Select a node with a text and try them. + + + + + + + + + + +

    + candle indicates that executes only one time (then button gets disabled) +

    + +
    + + + + + + + + +

    + .groovy +

    +

    + magnifier icon indicates that the script code must be shown in the tutorial +

    + +
    +
    - - - - + + + + + + - -

    - Welcome to the Tutorial-o-Matic demo!! -

    +

    - This is a demo version of an addon that can be used to build tutorials in Freeplane. + .groovy

    +
    - - - - - You can make that **ToM** shows where in the menu the user can find a specific command. + + + + + + + + This example shows also two times the same groovy script. -Here are some examples: +This script will show a dialog and ask the user to pick an option and show it. That's all. + + +The difference between both panels is that one shows the groovy script and the other doesn't. + + +Try them. + - - - - + + + + + + + + + + +

    + .groovy +

    +

    + magnifier icon indicates that the script code must be shown in the tutorial +

    + +
    +
    - - - - +

    - Here are some example on how you can apply some menu actions on the selected nodes: + .groovy

    +
    - - - - + +
    + + + + + When building a tutorial you can add nodes that the user can insert in his/her own map. + + +Select a node in your map and click the button to insert a branch containing the "Madagascar characters". + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + After inserting an example branch, you can have a button that selects the nodes that you want so the user can easily go further with the tutorial. + + +In this example I added a button that selects the nodes "Alex", "Kowalski" and "Julien". + +Click the button to see how the selection changes: + + + + +

    - This example shows some menu actions applied using the menus: + to indicate which are the nodes you want to select just paste clones of them here as childs

    + +
    + + + + + + + + + + + +

    - + Now we can apply them some command, like

    +
      +
    • + "Blinking node" + "Bold" +
    • +

    - it creates a new child node and it adds an icon to it + click again to turn it on/off

    - + + + + + + + + + You can add a button to open other maps needed for the tutorial. + +Currently that map must be in the same directory as the tutorial map + + +**Open the ExercisingMap.mm** by clicking the following button + + + + + + + + + + + + + + I added a button to directly go to the map that contains the tutorial information and select the node that defines the current page. + +Click the following button to go to the node that has this page information: + + + + + + + + + - +

    - added icons: + Ok. that was the features demo.

    - candle: indicates it executes only one time and get disabled + I hope you enjoyed it. bye!

    - mouse: should show the menu location + +

    +

    + edo

    - - - - - - + + +
    + + + + + + + + + ## Hi!! + +In this tutorial I will try to show you how to create your own tutorials. + + +

    - This example shows some actions applied using Hotkeys (or the menus commands): -

    -

    - + This tutorial is for users that have some experience using Freeplane.

    -
      -
    1. - applies BOLD to selected node -
    2. -
    3. - shows(or hides) the Filter Toolbar -
    4. -
    - +
    + + I hope you enjoy this! + + +### Edo + + + +
    +
    + + + + +

    - keyboard icon (or no icon) indicates it should show the Hotkeys (if it hasn't a defined hotkey, then it shows the menu position) + bla bla bla

    - - - + + + + + - +

    - This example shows some actions applied without showing any message (muted): -

    -

    - + crear **mapa** nuevo

    -
      -
    • - shows/hides the "map overview" window -
    • -
    - + + +
    + + +

    - muted icon indicates it should execute the command without showing menus or hotkeys + bla bla bla

    -
    - - - - - **ToM** builds automatically the tutorial's table of content using the titles of each new page - - -Here is the current tutorial's TOC: + + + + + + + revisar estilos de nuevo mapa + + - + + + + + + + + +

    + bla bla bla +

    + +
    - - - - - You can add buttons to jump to other tutorial pages - - -Here is an example: - + + - - + + + + +

    - To jump to the **'HTML example'** page click on the button bellow: + bla bla bla

    - - You can also jump to another tutorial's page. - - -To jump to the **'SimpleDemo's TOC page'** page click on the button bellow: - + + - - - - - - + + + + + + +

    - Here are some examples of **groovy scripts** as part of the tutorial + bla bla bla

    - - The first example shows two times the same groovy script. - - -This script will reverse the text of the selected node. - - -The difference between both scripts is that after clicking the button, the first one will disable itself (one time execution) and the second button will stay enabled (for multiple time uses) - - -Select a node with a text and try them. + +
    + + + + + + + bla bla bla + - - - - + + + + + + bla bla bla + + + + + + + + bla bla bla + + + + + + + + +

    - candle indicates that executes only one time (then button gets disabled) + Information +

    +

    + One page

    - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    - .groovy + information

    - magnifier icon indicates that the script code must be shown in the tutorial + multiple pages

    - + + + + + + - - - - - + + + + + + +

    - .groovy + actions

    - +
    + + + + + + In the following page it's a demo tutorial about moving nodes with keyboard commands. + +It works *mostly* as expected, but when clicking in the buttons it will throw an error while it's moving the nodes. + + +I don't know why this is happening. If somebody has an idea, please post it in the Freeplane forum. + + +Please try it. It may open a bug report, but it will not freeze Freeplane or something like that. + + - - - - - - - This example shows also two times the same groovy script. + + + + + to move nodes, - -This script will show a dialog and ask the user to pick an option and show it. That's all. +- you can **drag and drop** them with the **mouse** +- or you can move them with the **keyboard** -The difference between both panels is that one shows the groovy script and the other doesn't. +To move the selected node with the Keyboard +you have to press the CONTROL key while using the +ARROW keys to move the node. -Try them. - +I prepared a little example. +Please select the node where you want +to insert the example nodes. + - - - - - + +

    - .groovy -

    -

    - magnifier icon indicates that the script code must be shown in the tutorial + 2008 movie

    - + + + + + + + + + + + + + + + + + + + + + + + + + + + Now we can see that the nodes contains the names of the Characters of the "KungFu Panda" movie. + +Some of them are allready grouped but others are still not classified. + + +Let's classify them, beginning with **Po** as the **main character** + + + + + + - + + +

    - .groovy + First we will move the 'Po' node into the 'main' node

    - -
    -
    + + + + + + - - - - - When building a tutorial you can add nodes that the user can insert in his/her own map. - - -Select a node in your map and click the button to insert a branch containing the "Madagascar characters". + + + + Now let's move both kung fu masters (Oogway and Shifu) to the masters node. + - - - - - - - + + + - - - - - + + + + **'Shifu'** and **'Oogway'** nodes are not together, so we are going to move them to the right first and then back to the left. This way they get together. + + + + - - - - - + + + + Now we will move the **'Shifu'** and **'Oogway'** nodes into the **'kung fu masters'** node. + + + + + + + + + - - - - + + + + Now let's move the **Furious Five** to their node. + + + + + + + + + + + + + Now we will move the nodes into the **'Furious Five'** node. + + + + + + - - - - - After inserting an example branch, you can have a button that selects the nodes that you want so the user can easily go further with the tutorial. - - -In this example I added a button that selects the nodes "Alex", "Kowalski" and "Julien". + + + ## Now is your turn!! -Click the button to see how the selection changes: +1. **Insert the example nodes** again +1. and try to do the classification yourself **moving the nodes** with **CONTROL and ARROW** keys!! - - - - - - -

    - to indicate which are the nodes you want to select just paste clones of them here as childs -

    - -
    - - - + + - - - - - - - - -

    - Now we can apply them some command, like -

    -
      -
    • - "Blinking node" + "Bold" -
    • -
    -

    - click again to turn it on/off -

    - -
    - - - - - - - You can add a button to open other maps needed for the tutorial. - -Currently that map must be in the same directory as the tutorial map - - -**Open the ExercisingMap.mm** by clicking the following button - - + + + + + + + + + + - - + + + + + + - - - - - I added a button to directly go to the map that contains the tutorial information and select the node that defines the current page. - -Click the following button to go to the node that has this page information: - - + + + + + + + + + + + + + + + + + - - - - - - - - - -

    - Ok. that was the features demo. -

    -

    - I hope you enjoyed it. bye! -

    -

    - -

    -

    - edo -

    - -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7439af7b0ea19258f66b0ef13e25ebae239bb9ef Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Mon, 28 Mar 2022 10:32:54 -0300 Subject: [PATCH 14/42] Added Tutorial-o-Matic How to --- Tutorial-o-Matic/scripts/ToMTutorial.groovy | 13 + .../Tutorial-o-Matic/HowToTutorial-o-Matic.mm | 2329 +++++++++++++++++ 2 files changed, 2342 insertions(+) create mode 100644 Tutorial-o-Matic/scripts/ToMTutorial.groovy create mode 100644 Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm diff --git a/Tutorial-o-Matic/scripts/ToMTutorial.groovy b/Tutorial-o-Matic/scripts/ToMTutorial.groovy new file mode 100644 index 0000000..3bc9d51 --- /dev/null +++ b/Tutorial-o-Matic/scripts/ToMTutorial.groovy @@ -0,0 +1,13 @@ +import edofro.tutorialomatic.ToM as tom + +//region: opens tutorial map + + def sep = File.separator + def userDir = c.userDirectory.path + def mapFileName = "HowToTutorial-o-Matic.mm" + def pathName = userDir + sep + "doc" + sep + "Tutorial-o-Matic" + sep + mapFileName + def tutMap = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto) + + tom.showTutorials( tutMap ) + +//end: diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm new file mode 100644 index 0000000..c36e62d --- /dev/null +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm @@ -0,0 +1,2329 @@ + + + + + + + + + + + + + + + + + + + + + +pre { + background-color: rgb(230, 230, 230); + border: 1px solid rgb(0, 0, 0); + display: block; + padding: 10px; +} +code { + font-family: Consolas,"courier new"; + color: rgb(0, 80, 0); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## Hi!! + +In this tutorial I will try to show you how to create your own tutorials. + + + + + + + + +

    + This tutorial is for users that have some experience using Freeplane. +

    + +
    +
    + + I hope you enjoy this! + + +### Edo + + + +
    +
    + + + + + + + + + + +

    + In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. +

    +

    + I recommend to do the tutorials to fully understand this section. +

    + +
    +
    + + +
    +
    + + + + + + + + + + + + + +

    + Tutorial-o-Matic use mindmaps to store the tutorial's information. +

    +

    + To understand how to build a tutorial and its structure Tutorial-o-Matic needs that the map has some special user styles. +

    +

    + It looks after the nodes that have such styles and builds the pages of the tutorials by using those nodes and their children information. +

    +

    + All other nodes are ignorated and you can use them to organize your tutorial, add notes and other information that won't be shown in the tutorial. +

    + +
    +
    + + + + + + +

    + The best way to learn how to use this add-on is to make a tutorial by yourself. +

    + +
    +
    + + + + + + +

    + In the following pages you can see a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. +

    +

    + +

    + +
    +
    +
    +
    + + + + + + + + + +

    + To create a new mindmap that has the styles needed to build a tutorial using Tutorial-o-Matic you can use the command "Create new tutorial mind map". +

    +

    + You can get the same result by creating a new map using the "tutorial_styles_template"  as template map. +

    +

    + +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + To prepare any existing mindmap to contain a tutorial, you have to add the special Tutorial-o-Matic styles to it. +

    +

    + +

    +

    + You get that by using the command "Import Tutorial-o-Matic Styles" +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + + + + +

    + To start a tutorial you have to: +

    +
      +
    • + Select the node that will be the root of the new tutorial +
    • +
    • + Its text will be used as the title of the new tutorial +
    • +
    • + Assign the style "ToM-Tutorial" to that node +
    • +
    +

    + +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + +

    + Editing mode +

    + +
    +
    + + To see a tutorial in "***Editing Mode***" +you need to add a "**crayon**" icon to the **Tutorial base node**. + + + +
    + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    + + + + + + + + +

    + Tab Title +

    + +
    +
    + + + + + + +

    + You can assign the title of the tab where your tutorial will be shown. +

    +

    + To do this you have to add an attribute named "ToM_TabLabel" to your ToM-Tutorial node. +

    +

    + The value of that attribute will be shown as the tutorial's tab title. +

    +

    + You can add that attribute by yourself or copy it from the ToM-Tutorial style. +

    +

    + +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + To add information to a tutorial you have to +

    +
      +
    • + Select a node (its text doesn't affect the tutorial) +
    • +
    • + Assign the style "ToM_note" to that node +
    • +
    • + Add one or more child nodes to that node +
    • +
    • + The notes of that child nodes will be used as the text to be shown in the tutorial +
    • +
    + +
    +
    +
    + + + + + + + +

    + The text in the child nodes can be written using plain text, Html or Markdown, just as usual. +

    +

    + +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + +

    + If you want to divide your tutorial in multiple pages  you have two different options: +

    +
      +
    • + inserting "New page" nodes +
    • +
    • + inserting "Next page" nodes +
    • +
    +

    + You have to insert these nodes to indicate where the next page starts. +

    + +
    +
    + + + + + + +

    + "New page" nodes are used to indicate where a new page starts AND the title of this new page. +

    +

    + This title gets shown at the top of the page +

    +

    + +

    + +
    +
    + + + + + + +

    + "Next page" nodes only indicates where a new page starts but doesn't insert a new title to the tutorial +

    + +
    +
    + + + + + + +

    + With the same logic, when showing the Table of Content only "New page" titles are listed there. +

    + +
    +
    + + + + + + +

    + These nodes can be set between the other nodes or as parents of them. They just have to be "before" the others ("in breadth-first order") +

    +

    + +

    + +
    +
    +
    + + + + + + + + +

    + New Pages nodes +

    + +
    +
    + + + + + + +

    + To insert "New page" nodes, you have to +

    +
      +
    • + Select the desired node (its text will be used as title for that page) +
    • +
    • + Assign the style "ToM_newPage" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + +

    + Next Pages nodes +

    + +
    + + + + + + +

    + Edo +

    + +
    +
    +
    + + + + + + +

    + To insert "Next page" nodes, you have to +

    +
      +
    • + Select the desired node (its text doesn't affect the tutorial) +
    • +
    • + Assign the style "ToM_nextPage" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + To add a Table of Content (TOC) to your tutorial, you just have to: +

    +
      +
    • + Add a node +
    • +
    • + Assign the style "ToM-TOC" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + +
    + + + + + + + + + + +

    + c.selecteds.each{n -> +

    +

    +     def texto = n.text +

    +

    +     n.note = "<html>\n    <body>\n    <p>\n      <font color=\"#ff0000\" size=\"6\"><b>${texto}</b></font>\n    </p>\n  </body>\n</html>\n" +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + +

    + You can add multiple actions to your tutorial by using the following special styles: +

    +
    +
    +
      +
    • + ToM_showMenu +
    • +
    • + ToM_goto +
    • +
    • + ToM_groovy +
    • +
    • + ToM_menuAction +
    • +
    • + ToM_copy +
    • +
    • + ToM_select +
    • +
    • + ToM_openMap +
    • +
    • + ToM_openTutMap +
    • +
    • + ToM_showNode +
    • +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + + + + + + + +

    + ToM_showMenu +

    + +
    +
    + + You can make that **ToM** shows where in the menu the user can find a specific command. + + + + + + ## Steps + +* Add a node with style "**ToM_showMenu**" +* Add **child nodes** with **links to menu commands** you want to show + * The text of that nodes are not used + + + + + +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + +

    + How to (1): +

    +

    + Add link to menu command +

    +

    + (Manually) +

    + +
    +
    + + To add a node that has a link to a command + +Manual: + +* add a new node as child of the ToM_showMenu node +* select it +* use command 'Add hyperlink to menu item…' + + + +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + +

    + How to (2): +

    +

    + "Get menu command" +

    +

    + (Automatically) +

    + +
    +
    + + Another way to get a node +with a link to a menu command is using the +ToM command "Get menu command" + +For this to work the command must have defined hotkeys. + +Steps: + +* select the ToM_showMenu node +* open the Freeplane Menu and place the mouse + arrow on the command you want (without clicking) +* use the hotkeys to apply command "Get menu command" + + + + + +
    + + + + +
    + + + + + + + + +

    + ToM_menuAction +

    + +
    +
    + + + + + + +

    + You can add to your tutorial buttons that apply menu actions. +

    + +
    +
    + + ## Steps + +The steps are very similar to the "showMenu" case: + +* Add a node with style "ToM_menuAction" + * the text of its note is used as text in the panel + +* Add child nodes with links to menu commands you want to show + * The text of that nodes are not used + +* When the user clicks on the "Execute" button + * all menu commands are executed in the same order as the child nodes + + + +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + ## Modifiers + +The **ToM_menuAction** node accept some icons as +modifiers + +* Present or not: + * **candle:** <br>indicates it executes only one time and +gets disabled + +* One of these (or none): + * **computer mouse:** <br>should show the menu locations + * **keyboard:** (or no icon) <br>indicates it should +show the Hotkeys <br>(if it hasn't a defined hotkey, +then it shows the menu position) + * **muted speaker:** <br>indicates it should execute the +commands without showing menus or hotkeys + + + + + + + + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + ToM_groovy +

    + +
    +
    + + You can add to your tutorial panels that show blocks +of **groovy code ** and / or **buttons** that apply those +**groovy scripts** to the selected nodes. + + + + By using icons as modifiers you can get panels that: + +* show the code but don't have a button +to execute the code +* show the code and have a button +to execute the code +* don't show any code but have a button +to execute the code + + + + + + ## Steps + +The steps are very similar to the "menuAction" case: + +* Add a node with style "ToM_groovy" + * the text of this node, its note + or details are not shown in the tutorial + +* Add child nodes with groovy scripts + * The text of that nodes are used as the texts of the panels + +* When the user clicks on the "Execute" button + * the script in that node gets executed + + + +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + ## Modifiers + +The **ToM_groovy** node accept some icons as +modifiers + + * **glasses:** (read only)<br> + indicates that the groovy script is to be seen, + but it can't be executed (no button) + * **magnifying glass tilted left:** <br> + indicates that the script code must + be shown in the tutorial + * **candle:** <br> + indicates it executes only one time and +gets disabled + + + + + + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + ToM_goto +

    + +
    +
    + + You can add buttons to jump to other tutorial pages + + + + + + ## Steps + +The steps are very similar to the "menuAction" case: + +* Add a node with style "ToM_goto" + * the text of this node, its note + or details are not shown in the tutorial + +* Add child nodes with links to other +ToM nodes in the same Mindmap + * The text of that nodes are used as the texts + of the buttons + * The text of their notes are used as the + texts of the panels + + + + + + By using icons as modifiers you +can add a "**Return back**" button + + + + +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + ## Modifiers + +The **ToM_goto** node accept some icons as +modifiers + + * **BACK arrow:** <br> + indicates that the target page has to have + a "return" panel, so the user can return + back to the starting page + + + + + + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + ToM_copy +

    + +
    +
    + + When building a tutorial you can add predefined nodes +or branches of nodes +that the user can insert in his/her own map. + + +The user can copy those nodes directly to his/her selected a node in his/her own map. + +It can be used to insert example nodes or specific node structures. + + + + + + ## Steps + + +* Add a node with style "ToM_copy" + * the text of this node, its note + or details are not shown in the tutorial + +* Add the node structure you want to be copied +as descendants of that node + + + + +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + +

    + ToM_select +

    + +
    +
    + + After inserting an example branch, you can have a +button that selects the nodes that you want so +the user can easily go further with the tutorial. + + + + + + To indicate **which** are the nodes +you want **to select**, just paste **clones +of them** as child nodes of the **ToM_select node**. + + + + + + ## Steps + + +* Add a node with style "ToM_select" + * the text of this node, its note + or details are not shown in the tutorial +* Select the nodes you want to be selected +* "Copy node (single)" them +* Paste clones +as descendants of the "ToM_select" node + + + + +
    + + + + + + + + +

    + Create ToM_select node +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + +

    + "Copy node (single)" +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + + + + +

    + Paste clone(s) +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + ToM_openMap +

    + +
    +
    + + You can add a button to open other maps needed +for the tutorial. + +Currently that map must be in the same +directory as the tutorial map + + + + + + + ## Steps + + +* Add a node with style "ToM_openMap" + * the text of this node, its note + or details are not shown in the tutorial + +* Insert a child node indicating +the mindmap's name in its text + + + + +
    + + + + + + + + +

    + Create ToM_openMap node +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + ToM_openTutMap +

    + +
    +
    + + You can add a button to the tutorial to directly go +to the map that +contains the tutorial information and select +the node that defines the current page. + + + + + + + + ## Steps + + +* Add a node with style "ToM_openTutMap" + * the text of this node, its note + or details are not shown in the tutorial + + + + + + +
    + + + + + + + + +

    + Create ToM_openTutMap node +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + ToM_showNode +

    + +
    +
    + + You can add a button to show nodes in the +same or in another MindMap. + +It may be any node. +It doesn't need to be in a tutorial. + + + + + + ## Steps + +The steps are very similar to the "goto" case: + +* Add a node with style "ToM_showNode" + * the text of this node, its note + or details are not shown in the tutorial + +* Add child nodes with links to other + nodes in the same or another Mindmap + * The text of that nodes are used as the texts + of the panels + + + + + +
    + + + + + + + + +

    + Create ToM_showNode node +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + +
    +
    +
    From 7194c9179a6ebecfbc68f5cba23a635c914f3886 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Mon, 28 Mar 2022 10:35:39 -0300 Subject: [PATCH 15/42] Added command "import Tutorial-o-Matic Styles" and some changes in template map --- Tutorial-o-Matic/history.md | 1 + .../scripts/importToMStyles.groovy | 29 ++++ .../src/main/groovy/UserStyles.groovy | 134 ++++++++++++++++++ .../tutorial_styles_template.mm | 25 +++- 4 files changed, 183 insertions(+), 6 deletions(-) create mode 100644 Tutorial-o-Matic/scripts/importToMStyles.groovy create mode 100644 Tutorial-o-Matic/src/main/groovy/UserStyles.groovy diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index 6c749de..0319bf6 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -10,6 +10,7 @@ * Added command: "Show tutorials from active map" * Added command: "Create new tutorial mind map" * addGroovyPane method updated +* Added command "import Tutorial-o-Matic Styles" ## v0.0.5 diff --git a/Tutorial-o-Matic/scripts/importToMStyles.groovy b/Tutorial-o-Matic/scripts/importToMStyles.groovy new file mode 100644 index 0000000..0038750 --- /dev/null +++ b/Tutorial-o-Matic/scripts/importToMStyles.groovy @@ -0,0 +1,29 @@ +import edofro.tutorialomatic.ToM as tom +import edofro.pseudofreeplaneapi.UserStyles as us + +//region: opens tutorial map + + def sep = File.separator + def userDir = c.userDirectory.path + def mapFileName = "tutorial_styles_template.mm" + def pathName = userDir + sep + "templates" + sep + "Tutorial-o-Matic" + sep + mapFileName + def sourceMap = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto) + +// return tutMap.class + def targetMap = node.map + us.copyUserStyles(sourceMap, targetMap) + +//Other use case examples on how to use edofro.pseudofreeplaneapi.UserStyles.copyUserStyles +/* + def myString = 'ToM_goto' + def myList = 'ToM_nextPage,ToM_goto,ToM_showNode'.split(',') + def myClosure = {it.text.contains('u')} + + + us.copyUserStyles(sourceMap, targetMap, myString) + us.copyUserStyles(sourceMap, targetMap, myList) + us.copyUserStyles(sourceMap, targetMap, myClosure) +*/ + + + diff --git a/Tutorial-o-Matic/src/main/groovy/UserStyles.groovy b/Tutorial-o-Matic/src/main/groovy/UserStyles.groovy new file mode 100644 index 0000000..c23d9e3 --- /dev/null +++ b/Tutorial-o-Matic/src/main/groovy/UserStyles.groovy @@ -0,0 +1,134 @@ +package edofro.pseudofreeplaneapi + +//region: imports + +import org.freeplane.api.MindMap as ApiMindMap +//import org.freeplane.api.Node as ProxyNode +//import org.freeplane.plugin.script.proxy.Proxy.Node as ProxyNode +import org.freeplane.plugin.script.proxy.NodeProxy as ProxyNode +import org.freeplane.core.ui.components.UITools as ui +import org.freeplane.features.map.MapModel; +import org.freeplane.features.map.NodeModel; +import org.freeplane.features.mode.Controller; +import org.freeplane.features.styles.MapStyleModel; +import org.freeplane.plugin.script.ScriptContext +import org.freeplane.plugin.script.proxy.ScriptUtils + + +class UserStyles { + +//region: properties + +//end: + +//region: copyUserStyles + + def static copyUserStyles(sourceMap, targetMap, boolean showMessage, groovy.lang.Closure closure){ + def stylesToImport = getUserDefinedStylesParentNode(sourceMap).children.findAll(closure) + def styleNamesToImport = stylesToImport*.text + def texto = new StringBuilder("The following styles were imported \n from map '${sourceMap.name}.mm' \n into current map '${targetMap.name}.mm':\n\n") + styleNamesToImport.each{styleName -> + targetMap.copyStyleFrom(sourceMap, styleName) + def sourceStyleNode = getUserStyleNode(sourceMap, styleName ) + def targetStyleNode = getUserStyleNode(targetMap, styleName ) + copyIcons(sourceStyleNode, targetStyleNode) + copyAttributes(sourceStyleNode, targetStyleNode) + texto << " - $styleName\n" + } + texto << "\n\n" + if(showMessage) ui.informationMessage(texto.toString()) + } + + def static copyUserStyles(sourceMap, targetMap, boolean showMessage = true){ + copyUserStyles(sourceMap, targetMap, showMessage, {true}) + } + + def static copyUserStyles(sourceMap, targetMap, groovy.lang.Closure closure){ + copyUserStyles(sourceMap, targetMap, true, closure) + } + + def static copyUserStyles(sourceMap, targetMap, String[] lista){ + copyUserStyles(sourceMap, targetMap, true, lista) + } + + def static copyUserStyles(sourceMap, targetMap, boolean showMessage, String[] lista){ + def closure = {it.text in lista} + copyUserStyles(sourceMap, targetMap, showMessage, closure) + } + + def static copyUserStyles(sourceMap, targetMap, String texto){ + copyUserStyles(sourceMap, targetMap, true, texto) + } + + def static copyUserStyles(sourceMap, targetMap, boolean showMessage, String texto){ + def closure = {it.text == texto} + copyUserStyles(sourceMap, targetMap, showMessage, closure) + } + +//end: + +//region: copy other things from node to node + + def static copyIcons(sourceNode, targetNode, boolean doClear = true){ + if(doClear) targetNode.icons.clear() + targetNode.icons.addAll(sourceNode.icons.icons) + } + + def static copyAttributes(sourceNode, targetNode, boolean doClear = true){ + if(doClear) targetNode.attributes.clear() + sourceNode.attributes.each{a -> + targetNode.attributes.add(a.key, a.value) + } + } + +//end: + +//region: getting an UserStyleNode as ProxyNode from active map + +// public + def static getUserStyleNode( String userStyle ){ + return getUserStyleNode( null, userStyle ) + } + + def static getUserStyleNode(ApiMindMap mapaProxy, String userStyle ){ + return getUserDefinedStylesParentNode(mapaProxy).children.find{it.text == userStyle} + } + + + def static getUserDefinedStylesParentNode(x = null){ + return getUserDefinedStylesParentNode((ScriptContext) null) + } + + def static getUserDefinedStylesParentNode(MapModel mapa){ + return getUserDefinedStylesParentNode(mapa, null) + } + + def static getUserDefinedStylesParentNode(ApiMindMap mapaProxy){ + return getUserDefinedStylesParentNode(mapaProxy.delegate, null) + } + + + def static getUserDefinedStylesParentNode(ScriptContext scriptContext){ + MapModel mapa = Controller.getCurrentController().getMap(); + return getUserDefinedStylesParentNode(mapa, scriptContext) + } + + def static getUserDefinedStylesParentNode(ApiMindMap mapaProxy, ScriptContext scriptContext){ + return getUserDefinedStylesParentNode(mapaProxy.delegate, scriptContext) + } + + def static getUserDefinedStylesParentNode(MapModel mapa, ScriptContext scriptContext){ + if(!mapa) { + return getUserDefinedStylesParentNode(scriptContext) + } + MapStyleModel styleModel = MapStyleModel.getExtension(mapa); + MapModel styleMap = styleModel.getStyleMap(); + NodeModel userStyleParentNode = styleModel.getStyleNodeGroup(styleMap, MapStyleModel.STYLES_USER_DEFINED); + def userDefinedParentNode = new ProxyNode(userStyleParentNode, scriptContext) + return userDefinedParentNode + } + +//end: + +} + diff --git a/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm b/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm index 4c48d73..4ee50ba 100644 --- a/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm +++ b/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm @@ -1,6 +1,8 @@ - + + + @@ -41,60 +43,72 @@ - + + + - + - + - + + + + + + + + + + + @@ -124,6 +138,5 @@ - From 6bd1a3f249a80ea865efe982e9181c66c6830328 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Mon, 28 Mar 2022 10:54:17 -0300 Subject: [PATCH 16/42] ApiNode, ApiMap, refactoring --- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 72 +++++++++++-------- .../src/main/groovy/ToM_actions.groovy | 3 +- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index b67186b..29009df 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -9,6 +9,9 @@ import org.freeplane.core.ui.components.UITools as ui import org.freeplane.plugin.script.proxy.ScriptUtils +import org.freeplane.api.Node as ApiNode +import org.freeplane.api.MindMap as ApiMindMap + class ToM{ @@ -48,26 +51,38 @@ class ToM{ // region: getting tutorial components nodes //The methods in this region get the nodes from the mindmap that contain the information needed to build the tutorial - def static getNextTutNodes(n, boolean included = false){ + def static getNextTutNodes( n, boolean included = false){ def tutNodes = getTutNodes(getTutorialNode(n)) def pos = tutNodes.indexOf(n) def t = included?0:1 return tutNodes.drop(pos + t) } - def static getTutNodes(nTutorial){ - return nTutorial.find{it.style.name?.startsWith(styles.ini)?:false} + def static getTutNodes( nTutorial){ + return nTutorial.find{isTutNode(it)} + } + + def static isTutNode( n){ + return n?.style?.name?.startsWith(styles.ini)?:false + } + + def static getTutorialNode( n){ + return n.pathToRoot.find{isTutorialNode(it)} } - def static getTutorialNode(n){ - return n.pathToRoot.find{it.style.name == styles.tutorial} + def static isTutorialNode( n){ + return n.style.name == styles.tutorial } - def static getNewPageNodes(nTutorial){ - return nTutorial.find{it.style.name == styles.newPage} + def static getNewPageNodes( nTutorial){ + return nTutorial.find{isNewPageNode(it)} } - def static isEditingMode(n){ + def static isNewPageNode( n){ + return n.style.name == styles.newPage + } + + def static isEditingMode( n){ def nodo = getTutorialNode(n) return nodo.icons.contains('emoji-1F58D') } @@ -141,7 +156,7 @@ class ToM{ tomui.adjustHeight(myPanel, doClear) } - def static fillPage(myP, nodo, included, doClear){ + def static fillPage(myP, nodo, boolean included, boolean doClear){ def nextNodes = getNextTutNodes(nodo, included) fillContentPane(myP, nextNodes, doClear) } @@ -168,7 +183,7 @@ class ToM{ myP.add(tomui.createInstructionsPane(html), tomui.GBC) } - def static addPageTitle(myP, nodo){ + def static addPageTitle(myP, ApiNode nodo){ if (isEditingMode(nodo)) { def html = htmlTitle(nodo.text) def bttnText1 = "inspect" @@ -191,8 +206,7 @@ class ToM{ - - def static addNextPagePane(myP, lastNode, boolean included = false, boolean showNextButton = true){ + def static addNextPagePane(myP, ApiNode lastNode, boolean included = false, boolean showNextButton = true){ def closeLabel = 'Stop tutorial' def closeToolTip = 'Click to stop the tutorial and close the tutorial tab' def nextLabel = showNextButton?'Next page':'Show tutorials' @@ -251,14 +265,14 @@ class ToM{ } } - def static gotoAction(myP,targetNode, backNode){ + def static gotoAction(myP, ApiNode targetNode, ApiNode backNode){ myP.removeAll() addReturnPane(myP, backNode) fillPage(myP, targetNode, true, false) addReturnPane(myP, backNode) } - def static addReturnPane(myP, backNode){ + def static addReturnPane(myP, ApiNode backNode){ def msgHtml = "Return to '${backNode.text}' page" def bttnText = 'go back' def bttnToolTip = "Click to go to '${backNode.text}' section" @@ -267,7 +281,7 @@ class ToM{ myP.add(buttonPanel, tomui.GBC) } - def static addGroovyPane(myP, nodoT){ + def static addGroovyPane(myP, ApiNode nodoT){ def parentEnabled = !disableBttn(nodoT) def parentReadOnly = isReadOnly(nodoT) nodoT.children.findAll{n -> WSE.isGroovyNode(n)}.each{nodo -> @@ -298,7 +312,7 @@ class ToM{ } } - def static getGroovyHtml(nodo, script){ + def static getGroovyHtml( ApiNode nodo, script){ def showScript = nodo.icons.icons.contains('emoji-1F50D') || nodo.icons.icons.contains('emoji-1F453') uiMsg("showScript ${showScript}") def html = showScript? tomui.getHtmlFromGroovyNode(nodo, script) : nodo.text @@ -306,7 +320,7 @@ class ToM{ return html } - def static addActionPane(myP, nodo, options){ + def static addActionPane(myP, ApiNode nodo, options){ def infoAcciones = [] nodo.children.findAll{n -> toma.hasAction(n)}.each{n -> def infoAccion = toma.getActionInfoMap(n) @@ -327,7 +341,7 @@ class ToM{ myP.add(buttonPanel, tomui.GBC) } - def static exeActionsHow(nodo){ + def static exeActionsHow( ApiNode nodo){ def iconos = nodo.icons.icons def iconitos = iconos.intersect(exeHowIcons) if(iconitos){ @@ -338,17 +352,17 @@ class ToM{ } } - def static disableBttn(nodo){ + def static disableBttn( ApiNode nodo){ def iconos = nodo.icons.icons return iconos.contains('emoji-1F56F') } - def static isReadOnly(nodo){ + def static isReadOnly( ApiNode nodo){ def iconos = nodo.icons.icons return iconos.contains('emoji-1F453') } - def static addPastePane(myP, nodoSource){ + def static addPastePane(myP, ApiNode nodoSource){ def enabled = !disableBttn(nodoSource) def msgHtml = "Click to paste the example nodes to the selected node" def bttnText = "Insert nodes" @@ -377,7 +391,7 @@ class ToM{ myP.add(buttonPanel, tomui.GBC) } - def static addSelectPane(myP, nodo){ + def static addSelectPane(myP, ApiNode nodo){ def enabled = !disableBttn(nodo) def msgHtml = "Click to select the node(s)" def bttnText = "Select node(s)" @@ -417,7 +431,7 @@ class ToM{ myP.add(buttonPanel, tomui.GBC) } - def static getIdDictionary(mapa){ + def static getIdDictionary(ApiMindMap mapa){ def dict = [:] def textoDict = mapa.storage[idDictStorage] if(textoDict){ @@ -429,7 +443,7 @@ class ToM{ return dict } - def static setIdDictionary(mapa, dict){ + def static setIdDictionary(ApiMindMap mapa, dict){ def texto = new StringBuilder() dict.each{k,v -> texto << "${k}:${v};" @@ -437,7 +451,7 @@ class ToM{ mapa.storage[idDictStorage] = texto } - def static addOpenMapPane(myP, tutNode, options){ + def static addOpenMapPane(myP, ApiNode tutNode, options){ def sep = File.separator def nodoMapa = tutNode.children.find{it.text.endsWith('.mm')} def mapFileName = nodoMapa?.text @@ -456,7 +470,7 @@ class ToM{ myP.add(buttonPanel, tomui.GBC) } - def static addInspectPane(myP, nodo){ + def static addInspectPane(myP, ApiNode nodo){ def msgHtml = "Click to inspect this page in the tutorial map" def bttnText = "inspect" def bttnToolTip = "Click to select the page's source nodes" @@ -471,7 +485,7 @@ class ToM{ myP.add(buttonPanel, tomui.GBC) } - def static addShowNodePane(myP, nodo){ + def static addShowNodePane(myP, ApiNode nodo){ def nodos = nodo.children.findAll{ n -> n.link && (n.link.node || (!n.link.node && !n.link.file && n.link.uri.scheme == 'file'))} nodos.each{ n -> def msgHtml = "Click to show ${n.text}" @@ -504,7 +518,7 @@ class ToM{ } } - def static addTOCPane(myP,nodo){ + def static addTOCPane(myP, ApiNode nodo){ def titleNodes = getNewPageNodes(getTutorialNode(nodo)) def pane = tomui.createEmptyGridBagPanel() titleNodes.each{ tn -> @@ -516,7 +530,7 @@ class ToM{ myP.add(pane, tomui.GBC) } - def static addTutorialsPane(myP, mapa){ + def static addTutorialsPane(myP, ApiMindMap mapa){ def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial} if ( nodosTutoriales.size() != 1 ){ def pane = tomui.createEmptyGridBagPanel() diff --git a/Tutorial-o-Matic/src/main/groovy/ToM_actions.groovy b/Tutorial-o-Matic/src/main/groovy/ToM_actions.groovy index 97e44d0..06d6821 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM_actions.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM_actions.groovy @@ -2,6 +2,7 @@ package edofro.tutorialomatic //import edofro.tutorialomatic.ToM_ui +import org.freeplane.api.Node as ApiNode import org.freeplane.core.ui.components.UITools as ui import org.freeplane.core.util.MenuUtils as menuUtils import org.freeplane.core.util.TextUtils as textUtils @@ -122,7 +123,7 @@ class ToM_actions{ // region: getting information for action // building a map [:] for each action with its information - def static getActionInfoMap(org.freeplane.plugin.script.proxy.NodeProxy nodo){ + def static getActionInfoMap(ApiNode nodo){ def accion = action(nodo) getActionInfoMap(accion) } From f04a316d50f8d9ef9f37e6765fd4032b10e1941b Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Mon, 28 Mar 2022 11:00:38 -0300 Subject: [PATCH 17/42] Added command "Open tutorial page from link" --- Tutorial-o-Matic/history.md | 1 + .../scripts/openTutorialPageFromLink.groovy | 3 + Tutorial-o-Matic/src/main/groovy/ToM.groovy | 57 ++++++++++++++++++- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 Tutorial-o-Matic/scripts/openTutorialPageFromLink.groovy diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index 0319bf6..3287dbf 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -11,6 +11,7 @@ * Added command: "Create new tutorial mind map" * addGroovyPane method updated * Added command "import Tutorial-o-Matic Styles" +* Added command "Open tutorial page from link" ## v0.0.5 diff --git a/Tutorial-o-Matic/scripts/openTutorialPageFromLink.groovy b/Tutorial-o-Matic/scripts/openTutorialPageFromLink.groovy new file mode 100644 index 0000000..6c3bf84 --- /dev/null +++ b/Tutorial-o-Matic/scripts/openTutorialPageFromLink.groovy @@ -0,0 +1,3 @@ +import edofro.tutorialomatic.ToM as tom + +c.statusInfo = tom.openTutorialPage(node) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 29009df..63957e9 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -24,7 +24,7 @@ class ToM{ static final String attributeTabLabel = 'ToM_TabLabel' static final String defaultTabLabel = 'Tutorial' static final String defaultMapTutorialsTabLabel = 'Tutorials' - + static final String attributeNewPageLink = 'ToM_LinkToPage' static final Map styles = [ tutorial : 'ToM-Tutorial' , @@ -604,6 +604,61 @@ class ToM{ // end: + // region: Linking tutorial pages from other mindmaps + + def static openTutorialPage(nodeDirection , ApiMindMap mapa = null){ + if(nodeDirection instanceof java.net.URI) { + return openTutorialPageUri(nodeDirection, mapa) + } + if(nodeDirection instanceof java.lang.String) { + return openTutorialPageString(nodeDirection, mapa) + } + if(nodeDirection instanceof ApiNode) { + def newPageUri = nodeDirection[attributeNewPageLink].uri ?: nodeDirection.link?.uri // TODO: probar que tome link de nodo si no existe el del attributo + mapa = mapa ?: nodeDirection.map + return openTutorialPage(newPageUri, mapa) + } + return 'No tutorial node found' + } + + + def static openTutorialPageUri(URI uri, ApiMindMap mapa){ + // if(!uri) return null + def isMindmap = uri.scheme in ['file','tutorial'] && uri.path.endsWith('.mm') + def nodeId = (!uri.scheme || isMindmap) && uri.fragment?.startsWith('ID_')? + uri.fragment + : null + // if (!nodeId) return 'No node ID defined in URI' + def tutMapPath = /* nodeId && */ isMindmap ? + uri.path.drop(1) + :null + def tutMap = tutMapPath ? + getMapFromPath(tutMapPath, false) //open mind map not visible + : mapa + openTutorialPageString(nodeId, tutMap) + } + + + def static openTutorialPageString(String nodeId, ApiMindMap tutMap){ + if(!tutMap) return 'No tutorial mindmap defined' + def targetNode = nodeId ? tutMap.node(nodeId) : null + // if(!targetNode) return 'No tutorial node found' + + if(targetNode){ + if(!(isTutNode(targetNode) || isTutorialNode(targetNode) )) return 'Indicated node is not part of a tutorial' + def tutorialTabName = getTutorialNode(targetNode)[attributeTabLabel] ?: tutMap.root[attributeTabLabel] ?: defaultMapTutorialsTabLabel + //uiMsg(tutorialTabName) + def myP = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true) + fillPage(myP, targetNode, true, true) + } else { + showTutorials(tutMap) + } + return 'tutorial displayed' + } + + + // end: + // region: help / debug def static uiMsg(texto){ From ee76cc833145ee162a63c4945a18d0b1ae0271e3 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Mon, 28 Mar 2022 11:05:56 -0300 Subject: [PATCH 18/42] added newPage Title button to create node with link to it --- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 62 ++++++++++++++++----- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 63957e9..1b1cb26 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -7,6 +7,7 @@ import edofro.menuomatic.WSE_redux as WSE import org.freeplane.core.ui.components.UITools as ui import org.freeplane.plugin.script.proxy.ScriptUtils +import org.freeplane.core.util.MenuUtils as menuUtils import org.freeplane.api.Node as ApiNode @@ -184,26 +185,55 @@ class ToM{ } def static addPageTitle(myP, ApiNode nodo){ + def html = htmlTitle(nodo.text) + def bttnText + def bttnToolTip + def bttnAction + def bttnIcon + def botones = [] + + bttnText = null //'link' + bttnToolTip = "Click to insert node with link to '${nodo.text}' section" + bttnAction = { e -> + def newPageNode = nodo + def selectedNode = c.selected + def linkNode = selectedNode.createChild(newPageNode.text) + linkNode[attributeNewPageLink] = getUriFromNode(newPageNode) + linkNode.link.uri = new URI('menuitem:_addons.tutorialOMatic.openTutorialPageFromLink_on_single_node') + } + bttnIcon = menuUtils.getMenuItemIcon('IconAction.emoji-1F517') + botones << [bttnText, bttnToolTip, bttnAction, bttnIcon] + if (isEditingMode(nodo)) { - def html = htmlTitle(nodo.text) - def bttnText1 = "inspect" - def bttnToolTip1 = "Click to select the page's source nodes" - def bttnAction1 = { e -> + bttnText = null //"inspect" + bttnToolTip = "Click to select the page's source nodes" + bttnAction = { e -> def pageNode = nodo //.parent def m = c.mapLoader(nodo.map.file).withView()//.selectNodeById(pageNodeId) m.load() pageNode.pathToRoot*.folded = false c.select(pageNode) } - def bttnText2 = 'reload' - def bttnToolTip2 = "Click to reload '${nodo.text}' section" - def bttnAction2 = { e -> fillPage(myP, nodo, true, true)} - myP.add(tomui.createPageTitlePane(html, bttnText1, bttnToolTip1,bttnAction1,bttnText2,bttnToolTip2,bttnAction2), tomui.GBC) - } else { - addPageTitle(myP, nodo.text) - } + bttnIcon = menuUtils.getMenuItemIcon('IconAction.emoji-1F52C') + botones << [bttnText, bttnToolTip, bttnAction, bttnIcon] + + bttnText = null //'reload' + bttnToolTip = "Click to reload '${nodo.text}' section" + bttnAction = { e -> fillPage(myP, nodo, true, true)} + bttnIcon = menuUtils.getMenuItemIcon('IconAction.emoji-1F504') + botones << [bttnText, bttnToolTip, bttnAction, bttnIcon] + } + // else { + // addPageTitle(myP, nodo.text) + // } + myP.add(tomui.createPageTitlePane(html, botones), tomui.GBC) } + def static getUriFromNode(ApiNode nodo, String sch = 'tutorial'){ + def ssp = nodo.map.file.toURI().schemeSpecificPart + def frg = nodo.id + return new URI(sch, ssp, frg) + } def static addNextPagePane(myP, ApiNode lastNode, boolean included = false, boolean showNextButton = true){ @@ -600,7 +630,13 @@ class ToM{ } } - def static exists(String path){new File(path).isFile()} + def static exists(String path){ + exists(new File(path)) + } + + def static exists(File file){ + file.isFile() + } // end: @@ -662,7 +698,7 @@ class ToM{ // region: help / debug def static uiMsg(texto){ - //ui.informationMessage(texto.toString()) + // ui.informationMessage(texto.toString()) } // end: From 484132939c88bbc4df6b6a4fe402259d776d4001 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Mon, 28 Mar 2022 11:06:51 -0300 Subject: [PATCH 19/42] Update ToM_ui.groovy --- .../src/main/groovy/ToM_ui.groovy | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy index dd35969..4fc6c0f 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy @@ -212,7 +212,7 @@ class ToM_ui{ return sp } - def static createPageTitlePane(String htmlMsg, bttnText1, bttnToolTip1,bttnAction1,bttnText2,bttnToolTip2,bttnAction2){ + def static createPageTitlePane(String htmlMsg, botones){ def panel = swing.panel() { borderLayout() editorPane( @@ -225,21 +225,26 @@ class ToM_ui{ constraints : CENTER, clientProperties: [(JEditorPane.HONOR_DISPLAY_PROPERTIES):true] ) - vbox(constraints:WEST) { - button( - label : bttnText1, - // constraints : WEST, - // margin : new Insets(10,15,10,15), - toolTipText : bttnToolTip1, - actionPerformed : bttnAction1, - ) - button( - label : bttnText2, - // constraints : EAST, - // margin : new Insets(10,15,10,15), - toolTipText : bttnToolTip2, - actionPerformed : bttnAction2, - ) + if(botones.size()>0){ + vbox(constraints:WEST) { + botones.each{b -> + button( + label : b[0], + // constraints : WEST, + margin : new Insets(0,2,0,2), + toolTipText : b[1], + actionPerformed : b[2], + icon : b[3], + ) + } + // button( + // label : bttnText2, + // // constraints : EAST, + // // margin : new Insets(10,15,10,15), + // toolTipText : bttnToolTip2, + // actionPerformed : bttnAction2, + // ) + } } } return panel From d281c3d6cabe5aea84102bae9f0bdc8b1f7bf644 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Mon, 28 Mar 2022 11:09:24 -0300 Subject: [PATCH 20/42] Changed GotoPane to work with links to other maps (wip) --- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 27 ++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 1b1cb26..0c14e61 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -123,7 +123,7 @@ class ToM{ addTOCPane(myPanel, tutNode) break case styles.goto: - addGotoPane(myPanel, tutNode.children, nextTutNodes[0], options) + addGotoPane(myPanel, tutNode, nextTutNodes[0], options) break case styles.action: addActionPane(myPanel, tutNode, options) @@ -283,23 +283,38 @@ class ToM{ } } - def static addGotoPane(myP, nodos, backNode, options){ + def static addGotoPane(myP, ApiNode tNode, ApiNode backNode, options){ + backNode = withGoBack(tNode)?backNode:null + def nodos = tNode.children nodos.findAll{n -> n.link.node?true:false}.each{nodo -> def targetNode = nodo.link.node def msgHtml = nodo.note?tomui.getHtmlFromNote(nodo, options):null def bttnText = nodo.text def bttnToolTip = "Click to go to '${bttnText}' section" - def bttnAction = { e -> gotoAction(myP, targetNode, backNode) } - def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) + def bttnAction = { e -> + if(targetNode.style.name == styles.tutorial){ + def tutorialTabName = targetNode[attributeTabLabel] ?: defaultTabLabel + def myP_thisTutorial = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true) + gotoAction(myP_thisTutorial, targetNode, null) + } else { + gotoAction(myP, targetNode, backNode) + } + } + def buttonPanel = tomui.createButtonPanel(msgHtml, bttnText, bttnToolTip, bttnAction, false) myP.add(buttonPanel, tomui.GBC) } } + def static withGoBack( ApiNode nodo){ + def iconos = nodo.icons.icons + return iconos.contains('emoji-1F519') + } + def static gotoAction(myP, ApiNode targetNode, ApiNode backNode){ myP.removeAll() - addReturnPane(myP, backNode) + if (backNode) addReturnPane(myP, backNode) fillPage(myP, targetNode, true, false) - addReturnPane(myP, backNode) + if (backNode) addReturnPane(myP, backNode) } def static addReturnPane(myP, ApiNode backNode){ From da6f51f3325b04a25182935375c6b11960ccd946 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Mon, 28 Mar 2022 11:09:53 -0300 Subject: [PATCH 21/42] wip --- Tutorial-o-Matic/Tutorial-o-Matic.mm | 76 +- Tutorial-o-Matic/build.gradle | 2 +- Tutorial-o-Matic/history.md | 1 + Tutorial-o-Matic/translations/en.properties | 11 +- Tutorial-o-Matic/translations/es.properties | 4 +- .../Tutorial-o-Matic/SimpleTutorialSample.mm | 522 +++------ .../Tutorial-o-Matic Intro.mm | 266 +++++ .../Tutorial-o-MaticCommands.mm | 1043 +++++++++++++++++ .../Tutorial-o-MaticStepByStep.mm | 474 ++++++++ resources/modifiers.png | Bin 0 -> 7775 bytes 10 files changed, 2031 insertions(+), 368 deletions(-) create mode 100644 Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm create mode 100644 Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm create mode 100644 Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm create mode 100644 resources/modifiers.png diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 0d38995..436df08 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -2,7 +2,7 @@ - + @@ -253,6 +253,10 @@ + + + + @@ -405,7 +409,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -437,8 +441,8 @@ For each menu item with an icon add an attribute with the icon key (use develope - - + + @@ -447,10 +451,13 @@ For each menu item with an icon add an attribute with the icon key (use develope + + + - - + + @@ -459,6 +466,8 @@ For each menu item with an icon add an attribute with the icon key (use develope + + @@ -490,8 +499,15 @@ For each menu item with an icon add an attribute with the icon key (use develope + + + + + + + - + @@ -609,7 +625,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -621,7 +637,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -632,8 +648,20 @@ For each menu item with an icon add an attribute with the icon key (use develope + + + + + + + + + + + + - + @@ -645,7 +673,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -657,7 +685,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -668,6 +696,30 @@ For each menu item with an icon add an attribute with the icon key (use develope + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tutorial-o-Matic/build.gradle b/Tutorial-o-Matic/build.gradle index a0cf932..51e269e 100644 --- a/Tutorial-o-Matic/build.gradle +++ b/Tutorial-o-Matic/build.gradle @@ -41,7 +41,7 @@ dependencies { implementation name : 'freeplanelauncher' implementation name : 'freeplaneviewer' implementation group: 'org.freeplane.core', name: 'freeplaneeditor', version:"+" - implementation group: 'org.freeplane.script', name: 'plugin', version: '+' + implementation group: 'org.freeplane.script', name: 'plugin', version: '+' implementation name : 'markedj', version: '+' //<---- para markedj implementation name : 'jsoup' , version: '+' //<---- para jsoup //Freeplane now comes with groovy 3.0.8 diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index 3287dbf..6ac9605 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -10,6 +10,7 @@ * Added command: "Show tutorials from active map" * Added command: "Create new tutorial mind map" * addGroovyPane method updated +* Added Tutorial-o-Matic How to * Added command "import Tutorial-o-Matic Styles" * Added command "Open tutorial page from link" diff --git a/Tutorial-o-Matic/translations/en.properties b/Tutorial-o-Matic/translations/en.properties index d59d810..553e0d1 100644 --- a/Tutorial-o-Matic/translations/en.properties +++ b/Tutorial-o-Matic/translations/en.properties @@ -1,10 +1,13 @@ -#Fri Mar 11 20:49:48 CLST 2022 +#Sun Mar 20 22:18:47 CLST 2022 addons.${name}.createNewTutorialMindMap=Create new tutorial mind map -addons.${name}.ActionInstruction1=In submenu {0}
    click on {1} addons.${name}=Tutorial-o-Matic +addons.${name}.ToMDemo=Tutorial-o-Matic Demo +addons.${name}.ToMTutorial=Tutorial-o-Matic How to +addons.${name}.importToMStyles=Import Tutorial-o-Matic Styles +addons.${name}.executeTutorial=execute Demo tutorial +addons.${name}.ActionInstruction1=In submenu {0}
    click on {1} +addons.${name}.openTutorialPageFromLink=Open tutorial page from link addons.${name}.ActionInstruction2=You can also use de keyboard shortcut {0} for this command addons.${name}.openDemoMap=open Demo map addons.${name}.getMenuCommand=Get menu command addons.${name}.showTutorialsFromActiveMap=Show tutorials from active map -addons.${name}.ToMDemo=Tutorial-o-Matic Demo -addons.${name}.executeTutorial=execute Demo tutorial diff --git a/Tutorial-o-Matic/translations/es.properties b/Tutorial-o-Matic/translations/es.properties index 3eaad01..d4fdc3e 100644 --- a/Tutorial-o-Matic/translations/es.properties +++ b/Tutorial-o-Matic/translations/es.properties @@ -1,4 +1,4 @@ -#Fri Mar 11 20:49:48 CLST 2022 +#Sun Mar 20 22:18:47 CLST 2022 addons.${name}.createNewTutorialMindMap=Crear nuevo mapa para tutoriales addons.${name}.ActionInstruction1=En submenu {0}
    has click en {1} addons.${name}=Tutorial-o-Matic @@ -7,4 +7,6 @@ addons.${name}.openDemoMap=abrir mapa demo addons.${name}.getMenuCommand=Obtener comando desde el menú addons.${name}.showTutorialsFromActiveMap=Mostrar tutoriales de mapa activo addons.${name}.ToMDemo=Tutorial-o-Matic Demo +addons.${name}.ToMTutorial=Como usar Tutorial-o-Matic +addons.${name}.importToMStyles=Importar estilos Tutorial-o-Matic addons.${name}.executeTutorial=ejecutar Demo tutorial diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm index b033d58..210a770 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm @@ -1,7 +1,7 @@ - + @@ -137,8 +137,8 @@
    - - + + @@ -175,8 +175,8 @@ - - + + @@ -746,7 +746,7 @@ - + @@ -1546,12 +1546,69 @@ candle indicates that executes only one time (then button gets disabled)
    - + + + + + + + + This tutorial is the same as the previous "Current features", + but as you can see, there are two new buttons left from the title of the page: + +- **inspect**: + - it shows you the map that is beeing used as source information for this tutorial + - and it selects the node that defines the title of the current tutorial page + +- **reload**: + - it reloads the information from the mindmap and builds this page again + +This way you can go to the map by clicking **inspect**, +make some changes and then **reload** the page to look how the changes work. + + + + Any tutorial can be seen in this "***Editing Mode***". + +You just need to add a "**crayon**" icon to the **Tutorial base node**. + +Click **inspect** to look into the mind map and see the icon in the Tutorial node (the one in *salmon-pink* color). + + + + Do the following steps to test these features: + +- Click **inspect** +- Select the yellow node next to the currently selected node +- Change the text in its note +- Change the order of the nodes inside the "Text" node +- Click **reload** + + + + Now you can click "**Next page**" and look how the different Tutorial pages +and their features have been configured in the MindMap. + +There are also comments in the map that explain some of the configuration options. + + + + - + + + + + + +

    + nodes with style ToM_Note look at the notes of their children to build text panes +

    + +
    In the following pages you can see the different content that the **Tutorial-o-Matic(ToM)** AddOn can show. @@ -1560,7 +1617,7 @@ candle indicates that executes only one time (then button gets disabled)
    - + @@ -1798,7 +1855,9 @@ candle indicates that executes only one time (then button gets disabled) - + + + @@ -1833,7 +1892,7 @@ candle indicates that executes only one time (then button gets disabled) - + @@ -1849,7 +1908,7 @@ candle indicates that executes only one time (then button gets disabled) - + @@ -1986,11 +2045,13 @@ This example shows some actions applied without showing any message (muted): You can add buttons to jump to other tutorial pages -Here is an example: +Here are two examples with option "goBack" selected +that adds a "return panel" to the visited page:
    + @@ -2011,8 +2072,30 @@ This example shows some actions applied without showing any message (muted): + + + +Here is the same first example without option "goBack" selected: + + + + + + + + + + + +

    + To jump to the **'HTML example'** page click on the button bellow: +

    + +
    +
    +
    - + @@ -2037,7 +2120,7 @@ This example shows some actions applied without showing any message (muted): - + @@ -2049,8 +2132,7 @@ This example shows some actions applied without showing any message (muted): .groovy

    - -
    +
    @@ -2241,7 +2323,8 @@ candle indicates that executes only one time (then button gets disabled) to indicate which are the nodes you want to select just paste clones of them here as childs

    -
    + +
    @@ -2271,7 +2354,7 @@ candle indicates that executes only one time (then button gets disabled) - + @@ -2289,8 +2372,24 @@ candle indicates that executes only one time (then button gets disabled) + + + + + You can add a button to show nodes in the same or in another MindMaps. + +It may be any node. It doesn't need to be in a tutorial. + + + + - + + + + + + @@ -2301,6 +2400,7 @@ candle indicates that executes only one time (then button gets disabled) + @@ -2329,285 +2429,79 @@ candle indicates that executes only one time (then button gets disabled) - - + - - - - - - ## Hi!! - -In this tutorial I will try to show you how to create your own tutorials. - - - - - - - - -

    - This tutorial is for users that have some experience using Freeplane. -

    - -
    -
    - - I hope you enjoy this! - - -### Edo - - - -
    -
    - - - - - - - - - - -

    - bla bla bla -

    - -
    -
    -
    - - - - - - - - - - - -

    - crear **mapa** nuevo -

    - -
    - - -
    - - - - - - - - -

    - bla bla bla -

    - -
    -
    -
    - - - - - - - revisar estilos de nuevo mapa - - - - - - - - - - - - - -

    - bla bla bla -

    - -
    -
    -
    - - - - - - - - - - - - - -

    - bla bla bla -

    - -
    -
    -
    - - - - -
    -
    - - - - - - - - - - -

    - bla bla bla -

    - -
    -
    -
    -
    - - - - - - - bla bla bla - - - - - - - - - - - bla bla bla - - - + + + + + + + + - - - bla bla bla - - - + + + + + - - + + + + - - - - - - -

    - Information -

    -

    - One page -

    - -
    - - - - - - - + + + + + + + + + + + + + - - - - - + + + + + - - + + + + - - - - - + + + - - + + + + - - - - - - -

    - information -

    -

    - multiple pages -

    - -
    - - - - - - + + + + - - - - - - - - - - - -

    - actions -

    - -
    -
    - + @@ -2797,77 +2691,5 @@ candle indicates that executes only one time (then button gets disabled) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm new file mode 100644 index 0000000..0f4f93b --- /dev/null +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## Hi!! + +In this tutorial I will try to show you how to create your own tutorials. + + + + + + + + +

    + This tutorial is for users that have some experience using Freeplane. +

    + +
    +
    + + I hope you enjoy this! + + +### Edo + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. +

    +

    + I recommend to do the tutorials to fully understand this section. +

    + +
    +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm new file mode 100644 index 0000000..d201d3a --- /dev/null +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm @@ -0,0 +1,1043 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    +
    +
    +
    +
    diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm new file mode 100644 index 0000000..e74cbb6 --- /dev/null +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## Hi!! + +In this tutorial I will try to show you how to create your own tutorials. + + + + + + + + +

    + This tutorial is for users that have some experience using Freeplane. +

    + +
    +
    + + I hope you enjoy this! + + +### Edo + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. +

    +

    + I recommend to do the tutorials to fully understand this section. +

    + +
    +
    + + +
    +
    + + + + + + + + +

    + Information +

    +

    + One page +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + bla bla bla +

    + +
    +
    +
    + + + + + + + revisar estilos de nuevo mapa + + + + + + + + + + + + + + +

    + bla bla bla +

    + +
    +
    +
    + + + + + + + + + + + + + +

    + bla bla bla +

    + +
    +
    +
    + + + + +
    +
    +
    + + + + + + + + + + +

    + bla bla bla +

    + +
    +
    +
    +
    + + + + + + + bla bla bla + + + + + + + + + + + bla bla bla + + + + + + + + bla bla bla + + + + + + + + + + + + + + + + + +

    + information +

    +

    + multiple pages +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + +

    + actions +

    + +
    + + +
    + + + + + + + + +
    diff --git a/resources/modifiers.png b/resources/modifiers.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e324cec6519a5fa999b3c13524812d60c0dcf7 GIT binary patch literal 7775 zcmV-l9-!fgP)I#V!bn7XbkU%T=$U-irb%0%Aj?DNTAu zK&2!xkU$a$A<3rqWP6+W&SsL$X0yAQ+3fCY!u}tgF#GPAGiT1uZ_ax(9(m+Z zw-$oqINfRR$Rm%OD-Y+?giFo=Q6%EslkS9ce`&P3jGVirl{GvryLV(*OhgFXDRR0L z7cSRr`I+4_%74W|RKRy&%x=fIRH4*pv^)-*&*Rda7IWcsx!Bo-fF)#1+ysQ7bSI}f zOQ+ZGJN-v}qs(YY8W!UHWyj7|t^O3(>)|msen9ZXj~s})yKt`8W9d0}bvlgA zW)T*hR+~I1mhN=55%$MwyzEbSfQX{di5mfvM|X<4tuk-l`|EnPsRc#Rr)N%PvzT-z z%_(Zw^pooJpUQiMm`+Pr9E-YJaIR3P({JVRcx|wO#78HgPBZ7$AO~*7IbL-g`~5X@E0fQdvK0urfBTSQC6z00 z7Z%?uF0XBnn%b)?%eQ~CkvQ&<^CzC2XZjT^-ot|Ydq#vthX*szE(83pufP4?>EmG> z?z$dvPDPy*=gL1*mDe)Zy`qIF69Ixa>LzVK4%~`!y+(g}9*`Eb{{|5cLC1bZclx@F z8f5Zou;yJ-Zt4Ch7(c-$fVdi9NtKv9Q1s7}&>Zrb{CK$=#ITiJeIhXD| zTJ`?t&6zl5toV~vh$E^-wjl@Z#5s0-BYx)>Yu}-Byh<#ja!L$%J$U=V3ts z4~$KsI}Z%90XZS3qE4azyfdg%g&fezIezabmiAw&XQ2s8k(dW*Nw7PsK`P&U{C6@T zoxypi*#95nlIhNajv*&R33dMHq~NbUB$)te<7DhZ-44hBeVpT!>DZ-}0MnU&fgpg- z0dkeK6A|CO=%lY*pI|qahjWsU6QY1RibSU#Bk4_39uG$qb^9O(ba5^#(VtxiG}89p zApYLKiw9&Xyrv#l&NGBDeY@xU&KtAHd2wMuUhXYPL4HkDrNy&C z!y_Mm`US*fkabmg*^civS$tesEOuB#WJGjK?0`W+uQt7#G;(ecava0!%E~K?igaoV z&yT>zJ34+4acl#1oW%(E>H}0LAfFg}IM-;k`%hldT)Z;!#5ttxFvjAZQJ1HU$B|~# zCyYw8ds2a`Imfj6BeQ|J-a;OUeGN5p)3m9zpsdD1Bup;jp~KLBx8wT771d|2WT-6t z{BA2DpEr5L5V4<+jWDL1W0*cOEj1(UN?lELhmj8+nlxtebSBd<;k>%C;>g}zb+t9N zPeD+$XYbfyBgO=Wg%cLKIJXG7qOq|g=Z;#Tuyz)M$>=wFr17Ig)ctros*nTwI6wVo zT3VK&IV3c{&^GE_h;zK~BzA3$g$&}dL9m~N@D=qyX`xLHoxBC{=}q+&@_Hnq(A(`Q!zclUCeoV$h9g}VOF+EChPEA zjzG{mF~Q7eL_N{VchiAAJbzz1Qe_Y48@BCJs#@!iHc%fwI=RbmeqkA2nQm@H5hNlA zSef96OR9iLA=7-u(B(*U3e~G$&&|JbBggm=KJFP;FY9y~CW|#FA(7}|D!6+)!-ptCrkxm$gjTjvo(E}QDvaV-mUe_Cp z+{961Lc$`9sU4p9aKiDh4BqwP5L+IF4=p>||8iv;I?~>&xNtURwHwS|R^t!&+EpCXCQYp1)+J zLN43-#ag`Or{oKT^B1p>H8yqesYu?MRE}8!f z)t|#YwTHaEqOv6CHhILN;|B_SEZm?S4R2<04ClZK>guE+ir3n-z>}A&Ils6ZuP|>o zL43V{xAn}GtMDrGb~|+F>qztiRIhHv`R32pXj&TN44f~013^%TG%T_RBP^4l(TsC8 zhyBu$H(`;x71d$hmnV zdDQ6dzgp*lE4GKcrlhnyFP}VLY#z5ya$l`u3~P-kI3#%l;i5xl{ziH#bo*iPn2_A;qQhb~ zD6($vqb@GPo*GrMCU2TtM~I0AKA z=CRp!|;-t)_ygFfsTA138CC`PN*AmPJSMXGvvH+GVLMP z>9luKGqfrdrFhsJPS3=l3})*{<&15|6>)96*qrm zF_0i%bJTTuP*rajDnp3vg(j^=g6)5v+H)>zY{YOqil9P~w~4U@tCSahr4g(Nxc>68; zFCk&0(ZP!VU)-4snsI*oz^^$sZxF}5V*CB$u{rSI=)OI-v$F_epMG&EkIse%hkxCf zm)pD#S>FMJra$}`Jos(Tj{G~#vGpGqKXvA#@K-*#XFD;e6KX(w!juOdhQ|Fnw-w!M zUd(r3!mvp*W@6B|<3~wBK4FX>mOOsi1JDuO`|}UQMFoU$NYV(?cD4JBbBmDImX?>^ zrq=cb1>JS%v>QJ<33A|U&L@mYa?#92UIn9!EvnMD3Fy}_?9n5LPj7l zGZAkGB+`^~wMzN*+BPHYUtGK#MbRyve`0E!zhotbVO!U?S@&k)vNtsv&9`5yHChk^ zS-5PqQX%_(<2qC0E6d-4#ruz&HW-a4G_HK7zP9G4Enl`8QO2t)->$Bz{CVp}qmjX6 zE?V)naWdI`#kobuwQ6PbsQ^@X+91t$mHogB-Yka|VjCu4UMPI{lotX#cN2 zSLOZb%T{w4dX=6L6csmi$}Hd&(fOE-GUZ$*lbX@{+{>?_42CJaP%pf?4AbjP=><)1 z1o+IE(hHj22uiu!lwQ#EMrdqkFr^pjmF25zYpQpC*Jg6=qLuGdRg~@i;Tu!qzgE46 z-hZ51n@=venbS~JMJXzuAaQuV)=@)Fg&eqsb9i6}>MrBFL8erwHCmmX$v}A=mQtnB z>Gi?>KE^G0f82fGue1zf_|eHj=gxBQI&h|(Yc%Sw|M!vU?=t_jm9RYD^jVuie!PJePm><>y8tMD*nqZ_A_&KWtpzYD5`}R=!nV zSG#S~7e*s2x?frGc5PMV_HVv28ksB>bO-LY^4uEaDw*tVS_UPKME-seas7=M=xoS= z%Qy$rQFjgJjdEqZtablgg-Rt?7}`rk0$%UP<_!{E%sJG>Gbhq6|3MrN9-2I1x?v#g z@28Iaef2NGXsjWhKXD`@^$KAeI(*caNz>rLnPb0YrW>9}_#_P*F?!U5De(Bz;R83X zrxV7+QDaArGwc<0;?TbA8ySQ#dGz?E-~z~jD>(-gQFjgJ6?KhjP3v4D zDWtqz;12r|B0ps~8Dg27+}1d2`HBc|%!od2@ytu^OPeGnd-B(yN3uUb-4em9>?Jdo|c z9+Bdx*4el&gB-Y?b3ht(XLBxBs_zt)LDYqOu5qPGcwaJw!Hs9LS>7!_03R9_uk2#-P(WK^;K6=cgsivLtP_X(va{S~Y`*z>S zZgowEkAZddiKdHo|k*T;LLno&^bo}7noUH3cpTugovWstdJ*)ZnHvu)PyOCBgeE)WcTB|;rl(BQ_cMy5cM}Dw^FU3Zq09p zKfO-a&VfzTaRlwsoQDVcqNF{4Yn<2BR3F&2t)brVkcqr~9{#_% zegWdz>dFJVwl|GS2i`u=__VKoKy_usf!*6>jfR?tx3BLbbDs9`^{=ihZ!#Kg6MlT; zpU=SXmE~o>L8HvD=ZvqP!3blnC@VR*=VwLJT7|F@{^*=%g(6W|i3HZ<6>@o#QT*tW z&j{O&Y$w#sIG3F`U$yEJZg@DeWtT!Vj;$)nwurh)E-$#AsWVxqm%(EBhy(q?LO6W$ z8O?M-4(#K6^R7enjU6vu3COMMYz=kUzvc~#>*c&Vx5&93!=y3=hT%d1&p1xTJ~@Q* zE+N~TOXbR)N6*ofw(#JXc-WbD0v#;Hog03}2B~XX1A_ z=e5<<3VHMEl`jw)o4)mWJuJ+%8v8eR;BdMA;vnNVRv4SArESSeB=Yw4vwga4&Q%)C zwu7fTlarlMOnC6*5eekO%g_E%vE<*)A4sF#q3DGi*vC11L+?6#rnW)aVMy}pw_8M= z(*EjHWs!5!{&RmHQD@?JEa&G>9?iIR+0+uBIDGun6unNj>xV5>73H1Gjffu6k3RV< ztW}yd-9f=BJ*?QL< z^95dCul>;Mk$?sI^NVaPhGm;`s68hxkgVuATqEQA$Mue)bV}(9%T%eYO_H5N-5nqY zc5_ZrHT8|Tg{2&}JEGpTIA8zKyJo)>EPEHPdQVc2zxU@K9Fie(=e;8E^4k2_$7Xhc z&}-h}_by2jYL*lx?29qY71XbN8NoO2QJ_oxGU;ii}UMgS1+D9(YhZClR0Mc z^ua@ui0Ngyw=z5PJ0d7LI3aQTG{da8%NNgI`}2b7b}o}r9*P|hXXEq^Ij5`1Jt8=8 z29?HksEXwu$WLCdl1&s)cPq$&Yd8mPiMm^He!H;b{MG9u1G}42#w3OZ2igwv+qui- z)wSf}bC@P3$M=d1B_Cd2-%vDV4sK)DT5_nn8|1)coCE5pGp}ZdHhhEY+H64QK-7(# zGf>p81!=lCmnl?xj{mOHQ(Jh*9mHX?=A?{go6KposJx=mvsW_6Md=vvIP5tOOkh%Z zRO+_;T=&%v9R%tK^>s0W$NsS1tsn=kad0FN1|2PTtng(e>sbQ@j)2V56 zaSob_^owbkdObb;Pxgt$WWqADM`*`uV8X|2_wnBw+ig4PJS7c`jqgigrzc#iE1LeK zo{ZCB9rYwH->>c6y4b05Dd&I+>cseV`Po05hk9M3tfoQEVlj;a(P`wIxO!1pm8ugX zUR)_YmlGKx7Vx+v!{tvoOgR2y>PX-qT|`xo!8Wn2~lCe6i&c!$-~cU3yUe7(iU|U z6AAeIUH60>(84(&hq~!}HH)Zw%}NP;$DYm1Oy%L+l~O2Gdrw_bs-5ew^o@=fJ8U4O zQ{*RquUP&c%2#SZ-3=Sw%u`AW=YRz2X7f@lppGCt&hBCOb-eMt4S6_su}Ugyj$ORw zykW3`zTOW`7*47A4L)kckH4h3Lv0)5W+8|mVNl?P_uLtBKqKd%Bh=f^KW~q^f%DFJ zN@kqH0!OYi3`b!xnLZ+6XJYnnZcTYbrRT0*cgBO~?In0!@2>Pexl*sO9z1T?AUl=}kexVRx#C0HVK@U~y`P#Tm^2z;v&hBjcA}qiU=VU=%vDm!w zcj256e8EF^PLJWx0gLEp$h1R*VK{W%9a~X^68m~_yR45#iy-Ye_aud-6=X&P3i-S~ zQDOaJBFT@^u_cK5>Q7`x&l-*);VBb+=lzov<;Z<9X_tF(PKzMq^{`CW=sHh3bVk@L zhL3>HVRwPH88?(xr!T9jEv>Asm&zNYa=zdW3Ki+U@ l?vY2`Umngq@~Hdk{{fwIdO9yj;l%&|002ovPDHLkV1hRCboc-O literal 0 HcmV?d00001 From 9e38c291e178cc92757294bd6eb3e175fd257820 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Tue, 29 Mar 2022 23:32:30 -0300 Subject: [PATCH 22/42] Update ToM.groovy --- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 0c14e61..05c670e 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -235,7 +235,6 @@ class ToM{ return new URI(sch, ssp, frg) } - def static addNextPagePane(myP, ApiNode lastNode, boolean included = false, boolean showNextButton = true){ def closeLabel = 'Stop tutorial' def closeToolTip = 'Click to stop the tutorial and close the tutorial tab' @@ -295,7 +294,7 @@ class ToM{ if(targetNode.style.name == styles.tutorial){ def tutorialTabName = targetNode[attributeTabLabel] ?: defaultTabLabel def myP_thisTutorial = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true) - gotoAction(myP_thisTutorial, targetNode, null) + gotoAction(myP_thisTutorial, targetNode, myP.equals(myP_thisTutorial) ? backNode : null) } else { gotoAction(myP, targetNode, backNode) } @@ -306,9 +305,8 @@ class ToM{ } def static withGoBack( ApiNode nodo){ - def iconos = nodo.icons.icons - return iconos.contains('emoji-1F519') - } + return nodo.icons.icons.contains('emoji-1F519') + } def static gotoAction(myP, ApiNode targetNode, ApiNode backNode){ myP.removeAll() From 7a4c421b8c72f2bce9b2fcaf83587121f4b0f5db Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Tue, 29 Mar 2022 23:33:52 -0300 Subject: [PATCH 23/42] addOpenTutorialPage --- Tutorial-o-Matic/history.md | 3 ++ Tutorial-o-Matic/src/main/groovy/ToM.groovy | 31 +++++++++++++++++-- .../tutorial_styles_template.mm | 5 +++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index 6ac9605..a8316b7 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -13,6 +13,9 @@ * Added Tutorial-o-Matic How to * Added command "import Tutorial-o-Matic Styles" * Added command "Open tutorial page from link" +* Added button that creates a link to current page +* Updated gotoPane to open in corresponding Tab and use withGoBack modifier +* Added openTutorialPage style and pane ## v0.0.5 diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 05c670e..6eb5f93 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -43,6 +43,7 @@ class ToM{ openMap : 'ToM_openMap' , openTutMap: 'ToM_openTutMap', showNode : 'ToM_showNode' , + openTutorialPage : 'ToM_openTutPage', ] static final exeHowIcons = ['emoji-1F507', 'emoji-2328', 'emoji-1F5B1'] @@ -125,6 +126,9 @@ class ToM{ case styles.goto: addGotoPane(myPanel, tutNode, nextTutNodes[0], options) break + case styles.openTutorialPage: + addOpenTutorialPage(myPanel, tutNode, options) + break case styles.action: addActionPane(myPanel, tutNode, options) break @@ -323,6 +327,20 @@ class ToM{ def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) myP.add(buttonPanel, tomui.GBC) } + + def static addOpenTutorialPage(myP, ApiNode tNode, options){ + def nodos = tNode.children.findAll{ n -> isValidUri(n.link?.uri) || isValidUri(n[attributeNewPageLink].uri)} + nodos.each{nodo -> + def msgHtml = nodo.note?tomui.getHtmlFromNote(nodo, options):null + def bttnText = nodo.text + def bttnToolTip = "Click to go to '${bttnText}' section" + def bttnAction = { e -> + openTutorialPage(nodo) + } + def buttonPanel = tomui.createButtonPanel(msgHtml, bttnText, bttnToolTip, bttnAction, false) + myP.add(buttonPanel, tomui.GBC) + } + } def static addGroovyPane(myP, ApiNode nodoT){ def parentEnabled = !disableBttn(nodoT) @@ -673,12 +691,12 @@ class ToM{ def static openTutorialPageUri(URI uri, ApiMindMap mapa){ // if(!uri) return null - def isMindmap = uri.scheme in ['file','tutorial'] && uri.path.endsWith('.mm') - def nodeId = (!uri.scheme || isMindmap) && uri.fragment?.startsWith('ID_')? + def isMM = isMindmap(uri) + def nodeId = (!uri.scheme || isMM) && uri.fragment?.startsWith('ID_')? uri.fragment : null // if (!nodeId) return 'No node ID defined in URI' - def tutMapPath = /* nodeId && */ isMindmap ? + def tutMapPath = /* nodeId && */ isMM ? uri.path.drop(1) :null def tutMap = tutMapPath ? @@ -686,7 +704,14 @@ class ToM{ : mapa openTutorialPageString(nodeId, tutMap) } + + def static isMindmap(uri){ + uri && uri.scheme in ['file','tutorial'] && uri.path.endsWith('.mm') + } + def static isValidUri(uri){ + return uri && (!uri.scheme && uri.fragment?.startsWith('ID_') || isMindmap(uri)) + } def static openTutorialPageString(String nodeId, ApiMindMap tutMap){ if(!tutMap) return 'No tutorial mindmap defined' diff --git a/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm b/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm index 4ee50ba..8ebf281 100644 --- a/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm +++ b/Tutorial-o-Matic/zips/templates/Tutorial-o-Matic/tutorial_styles_template.mm @@ -110,6 +110,11 @@ + + + + + From 0b64c525d2bddddbc4a69d4f433ac563023c4309 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Tue, 29 Mar 2022 23:34:27 -0300 Subject: [PATCH 24/42] WIP --- Tutorial-o-Matic/Tutorial-o-Matic.mm | 4 +- Tutorial-o-Matic/translations/en.properties | 2 +- Tutorial-o-Matic/translations/es.properties | 2 +- .../Tutorial-o-Matic/HowToTutorial-o-Matic.mm | 23 +++++- .../Tutorial-o-Matic/SimpleTutorialSample.mm | 71 ++++++++++++++++--- .../Tutorial-o-Matic Intro.mm | 26 ++++--- 6 files changed, 103 insertions(+), 25 deletions(-) diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 436df08..41dffc4 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -86,7 +86,7 @@
    - + @@ -257,6 +257,8 @@ + + diff --git a/Tutorial-o-Matic/translations/en.properties b/Tutorial-o-Matic/translations/en.properties index 553e0d1..f853681 100644 --- a/Tutorial-o-Matic/translations/en.properties +++ b/Tutorial-o-Matic/translations/en.properties @@ -1,4 +1,4 @@ -#Sun Mar 20 22:18:47 CLST 2022 +#Tue Mar 29 23:27:57 CLST 2022 addons.${name}.createNewTutorialMindMap=Create new tutorial mind map addons.${name}=Tutorial-o-Matic addons.${name}.ToMDemo=Tutorial-o-Matic Demo diff --git a/Tutorial-o-Matic/translations/es.properties b/Tutorial-o-Matic/translations/es.properties index d4fdc3e..3c0bc58 100644 --- a/Tutorial-o-Matic/translations/es.properties +++ b/Tutorial-o-Matic/translations/es.properties @@ -1,4 +1,4 @@ -#Sun Mar 20 22:18:47 CLST 2022 +#Tue Mar 29 23:27:57 CLST 2022 addons.${name}.createNewTutorialMindMap=Crear nuevo mapa para tutoriales addons.${name}.ActionInstruction1=En submenu {0}
    has click en {1} addons.${name}=Tutorial-o-Matic diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm index c36e62d..9e1d457 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm @@ -195,7 +195,7 @@
    - + @@ -940,7 +940,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to:
    - + @@ -2324,6 +2324,25 @@ To add a Table of Content (TOC) to your tutorial, you just have to:
    + + + + + + + + + +

    + PENDIENTE!!!! +

    + +
    +
    +
    + + +
    diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm index 210a770..d6f7f2d 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm @@ -41,60 +41,77 @@ - + + + - + - + - + + + + + + + + + + + + + + + + @@ -1617,7 +1634,7 @@ candle indicates that executes only one time (then button gets disabled)
    - + @@ -1855,8 +1872,8 @@ candle indicates that executes only one time (then button gets disabled) - - + + @@ -2038,7 +2055,7 @@ This example shows some actions applied without showing any message (muted): - + @@ -2071,6 +2088,10 @@ This example shows some actions applied without showing any message (muted): To jump to the **'SimpleDemo's TOC page'** page click on the button bellow: + + + + @@ -2095,6 +2116,37 @@ This example shows some actions applied without showing any message (muted): + + + + + + + + + +

    + To jump to the **'HTML example'** page click on the button bellow: +

    + +
    +
    + + You can also jump to another tutorial's page. + + +To jump to the **'SimpleDemo's TOC page'** page click on the button bellow: + + + + + + + + + + + @@ -2323,8 +2375,7 @@ candle indicates that executes only one time (then button gets disabled) to indicate which are the nodes you want to select just paste clones of them here as childs

    - -
    +
    diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm index 0f4f93b..2fe6d13 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm @@ -10,7 +10,7 @@ - + @@ -39,9 +39,9 @@ - + @@ -105,6 +105,11 @@ + + + + + @@ -145,7 +150,7 @@
    - + @@ -180,7 +185,7 @@ - + @@ -222,17 +227,18 @@

    +
    - - + + - + @@ -241,18 +247,18 @@ - + - + - + From 986efbd643dfd9ab1b9a95da119c5c89604f485f Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Tue, 12 Apr 2022 23:12:54 -0400 Subject: [PATCH 25/42] added mergeHtml --- Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy index 4fc6c0f..6885c55 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy @@ -35,6 +35,10 @@ import org.freeplane.core.ui.components.UITools as ui import io.github.gitbucket.markedj.Marked import io.github.gitbucket.markedj.Options + +import org.jsoup.Jsoup +import org.jsoup.nodes.Document + //end: class ToM_ui{ @@ -155,6 +159,14 @@ class ToM_ui{ return html } + def static mergeHtml(baseHtml, addedHtml){ + if(!baseHtml) return addedHtml + if(!addedHtml) return baseHtml + Document doc = Jsoup.parse(baseHtml) + doc.body().append('

    ').append(addedHtml) + return doc.html() + } + //end: //region: creating panes From 0c1f08f1a925df01212ddbb8b2c3b9b28694906b Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Tue, 12 Apr 2022 23:17:15 -0400 Subject: [PATCH 26/42] addShowMenuItemPane with multiple buttons --- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 51 +++++++++++++--- .../src/main/groovy/ToM_ui.groovy | 58 ++++++++++++------- 2 files changed, 81 insertions(+), 28 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 6eb5f93..985795d 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -118,7 +118,7 @@ class ToM{ } break case styles.showMenu: - addShowMenuItemPane(myPanel, tutNode.children) + addShowMenuItemPane(myPanel, tutNode.children, options) break case styles.toc: addTOCPane(myPanel, tutNode) @@ -253,14 +253,22 @@ class ToM{ myP.add(nextButtonPanel, tomui.GBC) } - def static addShowMenuItemPane(myP, nodos){ + def static addShowMenuItemPane(myP, nodos, options){ nodos.findAll{n -> toma.hasAction(n)}.each{nodo -> def infoAccion = toma.getActionInfoMap(nodo) if (infoAccion){ - def msgHtml = infoAccion.instructions - def bttnText = 'Show it in the menu' - def bttnToolTip = "Click to see where is ${toma.apos(infoAccion.label)} in Freeplane Menu" - def bttnAction = { e -> + def msgHtmlA = nodo.note?tomui.getHtmlFromNote(nodo, options):null + def msgHtmlB = infoAccion.instructions + def msgHtml = tomui.mergeHtml(msgHtmlA,msgHtmlB) + def botones = [] + def bttnText + def bttnToolTip + def bttnAction + def bttnIcon + + bttnText = null //'Show me' + bttnToolTip = "Click to see where is ${toma.apos(infoAccion.label)} in Freeplane Menu" + bttnAction = { e -> def bttn = e.source def sel = bttn.isSelected() def bttnPanel = tomui.getButtonPanel(bttn) @@ -271,12 +279,33 @@ class ToM{ bttn.label = 'Close menu' tomui.setNextPagePanelEnabled(myP, false) } else { - bttn.label = 'Show me' + bttn.label = null // 'Show me' if(! tomui.anyCompPending(myP) ) tomui.setNextPagePanelEnabled(myP, true) } } + bttnIcon = menuUtils.getMenuItemIcon('IconAction.emoji-1F50D') + + botones << [bttnText, bttnToolTip, bttnAction, bttnIcon, true] + + if(withExecute(nodo)){ + def enabled = !disableBttn(nodo) + def exeHow = exeActionsHow(nodo) + bttnText = null // 'Execute' + bttnToolTip = "Click to execute the command on the selected nodes" + bttnAction = { e -> + def bttn = e.source + bttn.setEnabled(enabled) + toma.executeActions([] << infoAccion, exeHow) + } + bttnIcon = menuUtils.getMenuItemIcon('IconAction.launch') + + botones << [bttnText, bttnToolTip, bttnAction, bttnIcon, true] + } - def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, true) + + def buttonPanel = tomui.createButtonPanel(msgHtml, botones) + + buttonPanel.metaClass.pending = false myP.add(buttonPanel, tomui.GBC) } else { @@ -285,6 +314,12 @@ class ToM{ } } } + + def static withExecute( ApiNode nodo){ + return nodo.icons.icons.contains('emoji-1F525') + } + + def static addGotoPane(myP, ApiNode tNode, ApiNode backNode, options){ backNode = withGoBack(tNode)?backNode:null diff --git a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy index 6885c55..8f2dae0 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM_ui.groovy @@ -12,6 +12,7 @@ import java.awt.Insets import java.awt.GridBagConstraints import java.awt.Dimension import java.awt.GridBagLayout +import java.awt.GridLayout import java.awt.Point import java.awt.event.* @@ -263,7 +264,12 @@ class ToM_ui{ } // genera panel con botón - def static createButtonPanel(htmlMsg, buttonLabel, buttonToolTip, buttonAction, boolean isToggleButton = false){ + def static createButtonPanel(String htmlMsg, buttonLabel, buttonToolTip, buttonAction, boolean isToggleButton = false){ + def botones = [] << [buttonLabel, buttonToolTip, buttonAction, null, isToggleButton] + createButtonPanel(htmlMsg, botones) + } + + def static createButtonPanel(String htmlMsg, botones){ def panel = swing.panel( border : new LineBorder(Color.gray, 1), name : myButtonPanelName, @@ -279,33 +285,45 @@ class ToM_ui{ constraints : CENTER, clientProperties: [(JEditorPane.HONOR_DISPLAY_PROPERTIES):true] ) - vbox(constraints:SOUTH) { + if(botones.size()>0){ + panel( + constraints:EAST, + background: Color.white, + ) { + borderLayout() panel( - // border : new LineBorder(Color.black, 1), - border : new EmptyBorder(2, 10, 2, 10), // <------- éste - //border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10)) // éste es de prueba poder ver el borde - //insets : new Insets(30,10,30,10), - ) { - borderLayout() - if (isToggleButton){ + constraints:SOUTH, + background: Color.white, + // // border : new LineBorder(Color.black, 1), + border : new EmptyBorder(2, 2, 2, 2), // <------- éste + // //border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10)) // éste es de prueba poder ver el borde + // //insets : new Insets(30,10,30,10), + ) { + gridLayout(new GridLayout(0,1)) + botones.each{ b -> + if ( b[4] == true ){ toggleButton( - label : buttonLabel, - constraints : EAST, - margin : new Insets(10,15,10,15), - toolTipText : buttonToolTip, - actionPerformed : buttonAction, + label : b[0], + // constraints : EAST, + margin : new Insets(3,6,3,6), + toolTipText : b[1], + actionPerformed : b[2], + icon : b[3], ) } else { button( - label : buttonLabel, - constraints : EAST, - margin : new Insets(10,15,10,15), - toolTipText : buttonToolTip, - actionPerformed : buttonAction, + label : b[0], + // constraints : EAST, + margin : new Insets(3,6,3,6), + toolTipText : b[1], + actionPerformed : b[2], + icon : b[3], ) } } - } + } + } + } } return panel } From 4c0ffdacce038cf01be963b61a27585e92cb297d Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Tue, 12 Apr 2022 23:18:47 -0400 Subject: [PATCH 27/42] added isBlocked() --- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 985795d..276eb55 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -8,6 +8,7 @@ import edofro.menuomatic.WSE_redux as WSE import org.freeplane.core.ui.components.UITools as ui import org.freeplane.plugin.script.proxy.ScriptUtils import org.freeplane.core.util.MenuUtils as menuUtils +//import org.freeplane.core.util.HtmlUtils as htmlUtils import org.freeplane.api.Node as ApiNode @@ -61,12 +62,16 @@ class ToM{ } def static getTutNodes( nTutorial){ - return nTutorial.find{isTutNode(it)} + return nTutorial.find{isTutNode(it) && !isBlocked(it)} } def static isTutNode( n){ return n?.style?.name?.startsWith(styles.ini)?:false } + + def static isBlocked(n){ + return (n && (n.pathToRoot - n).any{it.icons.icons.contains('closed')}) + } def static getTutorialNode( n){ return n.pathToRoot.find{isTutorialNode(it)} @@ -627,7 +632,7 @@ class ToM{ } def static addTutorialsPane(myP, ApiMindMap mapa){ - def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial} + def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial && !isBlocked(it) } if ( nodosTutoriales.size() != 1 ){ def pane = tomui.createEmptyGridBagPanel() def pre = nodosTutoriales.size() == 0 ? "No t" : "T" From c03a1bf26c5374af1973153558daa305ccd244c6 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Tue, 12 Apr 2022 23:20:33 -0400 Subject: [PATCH 28/42] correctin texts for buttons labels and tooltips --- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 276eb55..e4b7535 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -332,8 +332,8 @@ class ToM{ nodos.findAll{n -> n.link.node?true:false}.each{nodo -> def targetNode = nodo.link.node def msgHtml = nodo.note?tomui.getHtmlFromNote(nodo, options):null - def bttnText = nodo.text - def bttnToolTip = "Click to go to '${bttnText}' section" + def bttnText = nodo.htmlText + def bttnToolTip = "Click to go to '${nodo.plainText.replace('\n',' ')}' section" def bttnAction = { e -> if(targetNode.style.name == styles.tutorial){ def tutorialTabName = targetNode[attributeTabLabel] ?: defaultTabLabel @@ -362,7 +362,7 @@ class ToM{ def static addReturnPane(myP, ApiNode backNode){ def msgHtml = "Return to '${backNode.text}' page" def bttnText = 'go back' - def bttnToolTip = "Click to go to '${backNode.text}' section" + def bttnToolTip = "Click to go to '${backNode.plainText.replace('\n',' ')}' section" def bttnAction = { e -> fillPage(myP, backNode, true, true)} def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) myP.add(buttonPanel, tomui.GBC) @@ -372,8 +372,8 @@ class ToM{ def nodos = tNode.children.findAll{ n -> isValidUri(n.link?.uri) || isValidUri(n[attributeNewPageLink].uri)} nodos.each{nodo -> def msgHtml = nodo.note?tomui.getHtmlFromNote(nodo, options):null - def bttnText = nodo.text - def bttnToolTip = "Click to go to '${bttnText}' section" + def bttnText = nodo.htmlText + def bttnToolTip = "Click to go to '${nodo.plainText.replace('\n',' ')}' section" def bttnAction = { e -> openTutorialPage(nodo) } @@ -416,7 +416,7 @@ class ToM{ def static getGroovyHtml( ApiNode nodo, script){ def showScript = nodo.icons.icons.contains('emoji-1F50D') || nodo.icons.icons.contains('emoji-1F453') uiMsg("showScript ${showScript}") - def html = showScript? tomui.getHtmlFromGroovyNode(nodo, script) : nodo.text + def html = showScript? tomui.getHtmlFromGroovyNode(nodo, script) : nodo.htmlText uiMsg("html ${html}") return html } @@ -589,9 +589,9 @@ class ToM{ def static addShowNodePane(myP, ApiNode nodo){ def nodos = nodo.children.findAll{ n -> n.link && (n.link.node || (!n.link.node && !n.link.file && n.link.uri.scheme == 'file'))} nodos.each{ n -> - def msgHtml = "Click to show ${n.text}" + def msgHtml = "Click to show ${n.plainText.replace('\n',' ')}" def bttnText = "goto Node" - def bttnToolTip = "Click to show ${n.text}" + def bttnToolTip = "Click to show ${n.plainText.replace('\n',' ')}" def bttnAction if(n.link.node){ bttnAction = { e -> @@ -623,7 +623,7 @@ class ToM{ def titleNodes = getNewPageNodes(getTutorialNode(nodo)) def pane = tomui.createEmptyGridBagPanel() titleNodes.each{ tn -> - def title = tn.text + def title = tn.htmlText def bttnAction = { e -> fillPage(myP, tn, true, true) } def button = tomui.createButton(title, bttnAction) pane.add(button, tomui.GBC) @@ -638,7 +638,7 @@ class ToM{ def pre = nodosTutoriales.size() == 0 ? "No t" : "T" addPageTitle(myP, "${pre}utorials present in '${mapa.name}' map".toString()) nodosTutoriales.each{ nT -> - def title = nT.text + def title = nT.htmlText def bttnAction = { e -> def tutNodes = getTutNodes(nT) if(tutNodes) { From 0e512767604743a24232ab63cfae2e60077b2019 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Tue, 12 Apr 2022 23:22:24 -0400 Subject: [PATCH 29/42] correcting openTutorialPage --- Tutorial-o-Matic/src/main/groovy/ToM.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index e4b7535..8dbc67b 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -721,7 +721,9 @@ class ToM{ return openTutorialPageString(nodeDirection, mapa) } if(nodeDirection instanceof ApiNode) { + def newPageFile= nodeDirection.link?.file // TODO: probar que tome link de nodo si no existe el del attributo def newPageUri = nodeDirection[attributeNewPageLink].uri ?: nodeDirection.link?.uri // TODO: probar que tome link de nodo si no existe el del attributo + mapa = mapa ?: (newPageFile && !newPageUri.absolute && !newPageUri.scheme && newPageUri.path.endsWith('.mm'))? getMapFromPath(newPageFile.path, false) : null mapa = mapa ?: nodeDirection.map return openTutorialPage(newPageUri, mapa) } @@ -750,7 +752,7 @@ class ToM{ } def static isValidUri(uri){ - return uri && (!uri.scheme && uri.fragment?.startsWith('ID_') || isMindmap(uri)) + return uri && (!uri.scheme && (uri.fragment?.startsWith('ID_') || uri.path?.endsWith('.mm'))|| isMindmap(uri)) } def static openTutorialPageString(String nodeId, ApiMindMap tutMap){ From e5477ecf7766ead635ad226be89706bbcd36714e Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Tue, 12 Apr 2022 23:22:43 -0400 Subject: [PATCH 30/42] wip --- .../HowToTutorial-o-Matic.mm | 2740 +++++++++++++++++ .../Tutorial-o-Matic Intro.mm | 528 ++++ .../Tutorial-o-MaticCommands.mm | 1147 +++++++ .../Tutorial-o-MaticStepByStep.mm | 1908 ++++++++++++ EditingTutorialsWithMDH/myExistingMindMap.mm | 609 ++++ Tutorial-o-Matic/Tutorial-o-Matic.mm | 19 +- Tutorial-o-Matic/translations/en.properties | 4 +- Tutorial-o-Matic/translations/es.properties | 4 +- .../Tutorial-o-Matic/HowToTutorial-o-Matic.mm | 13 +- .../Tutorial-o-Matic/SimpleTutorialSample.mm | 23 +- .../Tutorial-o-Matic Intro.mm | 716 ++++- .../doc/Tutorial-o-Matic/myExistingMindMap.mm | 609 ++++ 12 files changed, 8224 insertions(+), 96 deletions(-) create mode 100644 EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm create mode 100644 EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm create mode 100644 EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm create mode 100644 EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm create mode 100644 EditingTutorialsWithMDH/myExistingMindMap.mm create mode 100644 Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm diff --git a/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm b/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm new file mode 100644 index 0000000..ee7d2d5 --- /dev/null +++ b/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm @@ -0,0 +1,2740 @@ + + + + + + + + + + + + + + + + + + + + + + + + +pre { + background-color: rgb(230, 230, 230); + border: 1px solid rgb(0, 0, 0); + display: block; + padding: 10px; +} +code { + font-family: Consolas,"courier new"; + color: rgb(0, 80, 0); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pre { + background-color: #e5e7ff; + border-left: 5px solid #ccc; + display: block; + padding: 8px; + margin: 5px; +} +code { + font-family: Consolas,"courier new"; + font-size: 11px; + color: #999; +} + +blockquote { + border-left: 5px solid #cccccc; + background-color: #eeeeee; + padding: 8px; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + + + + ## Hi!! + +This guide contains brief **explanations of all commands and building blocks** you can use to build a Tutorial. + +I recommend you to do the **"Step by Step" tutorials first** and use this document as a guide afterwards. + + + + + + + + +

    + This tutorial is for users that have some experience using Freeplane. +

    + +
    +
    + + I hope you enjoy this! + + +### Edo + + + +
    +
    +
    + + + + + + + + + + +

    + In this section you can see the commands used to **create new tutorials** in a new or an existing mindmap. +

    + +
    +
    + + In this section you can see the commands used to add new **actions** to your tutorials. + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + **Tutorial-o-Matic** use mindmaps to store the tutorial's information. + +To understand how to display a tutorial and its structure **Tutorial-o-Matic** needs that the map has some _special user styles_. +It looks after the nodes that have such styles and builds the pages of the tutorials by using those nodes and their children information. + +All other nodes are ignored and you can use them to organize your tutorial, add notes and other information that won't be shown in the tutorial. + + + + + The best way to learn how to use this add-on is to make the **'Step by step' tutorial** by yourself. + + + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + This is not a real tutorial, it's more like a guide. + +For example, for each "building block", there is a brief an explanation and **multiple buttons** with different actions. +You **don't need to click on all** of them. More preciselly, you don't need to click any of them if you don't want to. +They **are the different alternatives** you can use to insert those building blocks in a tutorial mindmap. + +For example, there are buttons to: + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + +
    + + + + + + + + + + In the following pages you can see a brief explanation about how to create a tutorial with **Tutorial-o-Matic**. + + +This guide's "**Table of Contents**" : + + + + + + + + + + + + + + + +

    + To create a new mindmap that has the styles needed to build a tutorial using Tutorial-o-Matic you can use the command "Create new tutorial mind map". +

    +

    + You can get the same result by creating a new map using the "tutorial_styles_template"  as template map. +

    +

    + +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + To prepare any existing mindmap to contain a tutorial, you have to add the special Tutorial-o-Matic styles to it. +

    +

    + +

    +

    + You get that by using the command "Import Tutorial-o-Matic Styles" +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + + + + +

    + To start a tutorial you have to: +

    +
      +
    • + Select the node that will be the root of the new tutorial +
    • +
    • + Its text will be used as the title of the new tutorial +
    • +
    • + Assign the style "ToM-Tutorial" to that node +
    • +
    +

    + +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + +

    + Editing mode +

    + +
    +
    + + To see a tutorial in "***Editing Mode***" +you need to add a "**crayon**" icon to the **Tutorial base node**. + + + +
    + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    + + + + + + + + +

    + Tab Title +

    + +
    +
    + + + + + + +

    + You can assign the title of the tab where your tutorial will be shown. +

    +

    + To do this you have to add an attribute named "ToM_TabLabel" to your ToM-Tutorial node. +

    +

    + The value of that attribute will be shown as the tutorial's tab title. +

    +

    + You can add that attribute by yourself or copy it from the ToM-Tutorial style. +

    +

    + +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + To add information to a tutorial you have to +

    +
      +
    • + Select a node (its text doesn't affect the tutorial) +
    • +
    • + Assign the style "ToM_note" to that node +
    • +
    • + Add one or more child nodes to that node +
    • +
    • + The notes of that child nodes will be used as the text to be shown in the tutorial +
    • +
    + +
    +
    +
    + + + + + + + +

    + The text in the child nodes can be written using plain text, Html or Markdown, just as usual. +

    +

    + +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + +

    + If you want to divide your tutorial in multiple pages  you have two different options: +

    +
      +
    • + inserting "New page" nodes +
    • +
    • + inserting "Next page" nodes +
    • +
    +

    + You have to insert these nodes to indicate where the next page starts. +

    + +
    +
    + + + + + + +

    + "New page" nodes are used to indicate where a new page starts AND the title of this new page. +

    +

    + This title gets shown at the top of the page +

    +

    + +

    + +
    +
    + + + + + + +

    + "Next page" nodes only indicates where a new page starts but doesn't insert a new title to the tutorial +

    + +
    +
    + + + + + + +

    + With the same logic, when showing the Table of Content only "New page" titles are listed there. +

    + +
    +
    + + + + + + +

    + These nodes can be set between the other nodes or as parents of them. They just have to be "before" the others ("in breadth-first order") +

    +

    + +

    + +
    +
    +
    + + + + + + + + +

    + New Pages nodes +

    + +
    +
    + + + + + + +

    + To insert "New page" nodes, you have to +

    +
      +
    • + Select the desired node (its text will be used as title for that page) +
    • +
    • + Assign the style "ToM_newPage" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + +

    + Next Pages nodes +

    + +
    + + + + + + +

    + Edo +

    + +
    +
    +
    + + + + + + +

    + To insert "Next page" nodes, you have to +

    +
      +
    • + Select the desired node (its text doesn't affect the tutorial) +
    • +
    • + Assign the style "ToM_nextPage" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + To add a Table of Content (TOC) to your tutorial, you just have to: +

    +
      +
    • + Add a node +
    • +
    • + Assign the style "ToM-TOC" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +

    + c.selecteds.each{n -> +

    +

    +     def texto = n.text +

    +

    +     n.note = "<html>\n    <body>\n    <p>\n      <font color=\"#ff0000\" size=\"6\"><b>${texto}</b></font>\n    </p>\n  </body>\n</html>\n" +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + You can add multiple **actions** to your tutorial by using the following **special styles**: + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.table(node) +

    + +
    + + + + + + + + You can make that **ToM** shows **where in the menu** the user can find a specific command. + + + + + + + + + You can add to your tutorial buttons that **apply menu actions**. + + + + + + + You can add to your tutorial panels that show blocks of **groovy code ** +and / or +**buttons** that apply those **groovy scripts** to the selected nodes. + + + + + + + You can add buttons to **jump to other tutorial pages** in the same mindmap (and jump back). + + + + + + + + + You can add actions to **insert example nodes** or specific node structures **to the user's mindmap**. + + + + + + + + + After inserting an example branch, you can have a **button that selects the nodes** that you want so the user can easily go further with the tutorial. + + + + + + + + + You can add a button to **open other mindmaps** needed for the tutorial. + + + + + + + + You can add an "_**inspect**_" button to the tutorial that directly goes to the map that +contains the current tutorial information and selects the node where the current page starts. + + + + + + + + You can add a button to **show nodes** in the same or in another MindMap. + +It may be any node. It doesn't need to be in a tutorial. + + + + + + + + + You can add buttons to **open other tutorials** or **tutorial's pages** from the same or another mindmap. + + + + + + + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + This is not a real tutorial, it's more like a guide. + +For each "action", there is a brief an explanation and **multiple buttons** with different actions. +You **don't need to click on all** of them. More preciselly, you don't need to click any of them if you don't want to. +They **are the different alternatives** you can use to insert those actions in a tutorial mindmap. + +For example, there are buttons to: + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + In the following pages, you can see a brief explanation about all the **building components** +used to **add actions** to your tutorials with **Tutorial-o-Matic**. + + +This guide's "**Table of Contents**" : + + + + + + + + + + + + + + + + + +

    + ToM_showMenu +

    + +
    +
    + + + ## Steps + +* Add a node with style "**ToM_showMenu**" +* Add **child node(s)** with **link(s) to the menu command(s)** you want to show + * The text of that nodes is not used + + + + + + + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + +

    + How to (1): +

    +

    + Add link to menu command +

    +

    + (Manually) +

    + +
    +
    + + To add a node that has a link to a command + +Manual: + +* add a new node as child of the ToM_showMenu node +* select it +* use command 'Add hyperlink to menu item…' + + + +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + +

    + How to (2): +

    +

    + "Get menu command" +

    +

    + (Automatically) +

    + +
    +
    + + Another way to get a node +with a link to a menu command is using the +ToM command "Get menu command" + +For this to work the command must have defined hotkeys. + +Steps: + +* select the ToM_showMenu node +* open the Freeplane Menu and place the mouse + arrow on the command you want (without clicking) +* use the hotkeys to apply command "Get menu command" + + + + + +
    + + + + +
    + + + + + + + + +

    + ToM_menuAction +

    + +
    +
    + + + ## Steps + +The steps are very similar to the "showMenu" case: + +* Add a node with style "ToM_menuAction" + * the text of its note is used as text in the panel + +* Add child nodes with links to menu commands you want to show + * The text of that nodes are not used + +* When the user clicks on the "Execute" button + * all menu commands are executed in the same order as the child nodes + + + + + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + ## Modifiers + +The **ToM_menuAction** node accept some icons as +modifiers + +* Present or not: + * **candle:** <br>indicates it executes only one time and +gets disabled + +* One of these (or none): + * **computer mouse:** <br>should show the menu locations + * **keyboard:** (or no icon) <br>indicates it should +show the Hotkeys <br>(if it hasn't a defined hotkey, +then it shows the menu position) + * **muted speaker:** <br>indicates it should execute the +commands without showing menus or hotkeys + + + + + + + + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + ToM_groovy +

    + +
    +
    + + + By using icons as modifiers you can get panels that: + +* show the code but don't have a button +to execute the code +* show the code and have a button +to execute the code +* don't show any code but have a button +to execute the code + + + + + + ## Steps + +The steps are very similar to the "menuAction" case: + +* Add a node with style "ToM_groovy" + * the text of this node, its note + or details are not shown in the tutorial + +* Add child nodes with groovy scripts + * The text of that nodes are used as the texts of the panels + +* When the user clicks on the "Execute" button + * the script in that node gets executed + + + + + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + ## Modifiers + +The **ToM_groovy** node accept some icons as +modifiers + + * **glasses:** (read only)<br> + indicates that the groovy script is to be seen, + but it can't be executed (no button) + * **magnifying glass tilted left:** <br> + indicates that the script code must + be shown in the tutorial + * **candle:** <br> + indicates it executes only one time and +gets disabled + + + + + + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + ToM_goto +

    + +
    +
    + + + ## Steps + +The steps are very similar to the "menuAction" case: + +* Add a node with style "ToM_goto" + * the text of this node, its note + or details are not shown in the tutorial + +* Add child nodes with links to other +ToM nodes in the same Mindmap + * The text of that nodes are used as the texts + of the buttons + * The text of their notes are used as the + texts of the panels + + + + + + By using icons as modifiers you +can add a "**Return back**" button + + + + + + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + ## Modifiers + +The **ToM_goto** node accept some icons as +modifiers + + * **BACK arrow:** <br> + indicates that the target page has to have + a "return" panel, so the user can return + back to the starting page + + + + + + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + ToM_copy +

    + +
    +
    + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + When building a tutorial you can add **predefined nodes +or branches of nodes** +that the user can **insert in his/her own map**. + +The user can copy those nodes directly to his/her own map as childs of the selected node. + +In other words: + + + + + + + ## Steps + + +* Add a node with style "ToM_copy" + * the text of this node, its note + or details are not shown in the tutorial + +* Add the node structure you want to be copied +as descendants of that node + + + + +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + +

    + ToM_select +

    + +
    +
    + + + To indicate **which** are the nodes +you want **to select**, just paste **clones +of them** as child nodes of the **ToM_select node**. + + + + + + ## Steps + + +* Add a node with style "ToM_select" + * the text of this node, its note + or details are not shown in the tutorial +* Select the nodes you want to be selected +* "Copy node (single)" them +* Paste clones +as descendants of the "ToM_select" node + + + + + + + + + + + + + +

    + Create ToM_select node +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + +

    + "Copy node (single)" +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + + + + +

    + Paste clone(s) +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    +
    + + + + + + + + +

    + ToM_openMap +

    + +
    +
    + + + Currently that map must be in the same +directory as the tutorial map + + + + + + + ## Steps + + +* Add a node with style "ToM_openMap" + * the text of this node, its note + or details are not shown in the tutorial + +* Insert a child node indicating +the mindmap's name in its text + + + + + + + + + + + + + +

    + Create ToM_openMap node +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + ToM_openTutMap +

    + +
    +
    + + + ## Steps + + +* Add a node with style "ToM_openTutMap" + * the text of this node, its note + or details are not shown in the tutorial + + + + + + + + + + + + + + + +

    + Create ToM_openTutMap node +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + ToM_showNode +

    + +
    +
    + + + ## Steps + +The steps are very similar to the "goto" case: + +* Add a node with style "ToM_showNode" + * the text of this node, its note + or details are not shown in the tutorial + +* Add child nodes with links to other + nodes in the same or another Mindmap + * The text of that nodes are used as the texts + of the panels + + + + + + + + + + + + + + +

    + Create ToM_showNode node +

    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + ToM_openTutPage +

    + +
    +
    + + + ## Steps + +The steps are very similar to the "goto" case: + +* Add a node with style "ToM_openTutPage" + * the text of this node, its note + or details are not shown in the tutorial + +* Add child nodes with links to other +ToM nodes in the same or to other Mindmaps + * The text of that nodes are used as the texts + of the buttons + * The text of their notes are used as the + texts of the panels + + + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.table(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + +
    +
    + diff --git a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm new file mode 100644 index 0000000..a281671 --- /dev/null +++ b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm @@ -0,0 +1,528 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pre { + background-color: #e5e7ff; + border-left: 5px solid #ccc; + display: block; + padding: 8px; + margin: 5px; +} +code { + font-family: Consolas,"courier new"; + font-size: 11px; + color: #999; +} + +blockquote { + border-left: 5px solid #cccccc; + background-color: #eeeeee; + padding: 8px; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + ## Hi!! + +**Tutorial-o-Matic** is a Freeplane Add-on that helps you build tutorials +for your mindmaps or your own add-ons. + + + + + This very guide was created using this add-on. + + + + + + + +I hope you enjoy this! + +### Edo + + + +
    + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + +

    + 'Step by step' +

    +

    + tutorials +

    + + + +
    + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + +

    + 'How to ToM' +

    +

    + panel +

    + + + +
    + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + + + This document contains **two guides** about the **building components** used to build tutorials with **Tutorial-o-Matic**: + + 1. commands used to **create new tutorials** + 2. **actions** you can add to the tutorials + + + + + +
    + + + + + + + +

    + 'ToM Commands' +

    +

    + panel +

    + + + +
    + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm b/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm new file mode 100644 index 0000000..a80486d --- /dev/null +++ b/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm @@ -0,0 +1,1147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pre { + background-color: #e5e7ff; + border-left: 5px solid #ccc; + display: block; + padding: 8px; + margin: 5px; +} +code { + font-family: Consolas,"courier new"; + font-size: 11px; + color: #999; +} + +blockquote { + border-left: 5px solid #cccccc; + background-color: #eeeeee; + padding: 8px; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + + +

    + "$0 directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    +
    +
    +
    +
    diff --git a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm new file mode 100644 index 0000000..57b84e8 --- /dev/null +++ b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm @@ -0,0 +1,1908 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pre { + background-color: #e5e7ff; + border-left: 5px solid #ccc; + display: block; + padding: 8px; + margin: 5px; +} +code { + font-family: Consolas,"courier new"; + font-size: 11px; + color: #999; +} + +blockquote { + border-left: 5px solid #cccccc; + background-color: #eeeeee; + padding: 8px; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + +
    + + + + + + + + +
    + + + + ## 1. Create a basic tutorial in a new mindmap + +In this tutorial you will learn how to create a new map containing a one page tutorial. + + + + ## 2. xx + +xx + + + + + + ## 3. xx + +xx + + + + + + + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + **Tutorial-o-Matic** use mindmaps to store the tutorial's information. + +To understand how to display a tutorial and its structure **Tutorial-o-Matic** needs that the map has some _special user styles_. +It looks after the nodes that have such styles and builds the pages of the tutorials by using those nodes and their children information. + +All other nodes are ignored and you can use them to organize your tutorial, add notes and other information that won't be shown in the tutorial. + + + + + + + + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + To create a new mindmap that has the styles +needed to build a tutorial using **Tutorial-o-Matic** , you can use +the command "**Create new tutorial mind map**". + +You can get the same result by creating a new map using the "tutorial_styles_template" as template map. + + + + + + + + + + ## Step 1: create a new tutorial able mind map + +You can do it yourself by clicking the menu command, +or click the 'Execute' button to let ToM do it for you. + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + After creating the new map, click the "**Next page**" button to continue with the tutorial. + + + + + + + + + + + + As said before this new map has some _special styles_. + +Let's take a look at the **styles manager**. There you will see the **ToM** styles in the _user defined styles_ group. + +To close the **Styles manager** just press **escape** or click "**OK**" or "**Cancel**" + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + Ok, now is time to create the tutorial. + +We first need a title for our tutorial. + +For that we will insert a new node that will have the tutorial's title as text and will contain the whole tutorial's information as nodes in it. + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + Ok. just insert a new node and write "my first tutorial" as its text. + +(If you want to skip this step, just click 'insert nodes') + + + + + + + + + + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + Ok. that was kind of frustrating, but as said before, nodes need special styles to be recognized as part of the tutorial. + + + + + + + + + + +

    + To start a tutorial you have to: +

    +
      +
    • + Select the node that will be the root of the new tutorial +
    • +
    • + Its text will be used as the title of the new tutorial +
    • +
    • + Assign the style "ToM-Tutorial" to that node +
    • +
    +

    + +

    + +
    +
    +
    + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + Select the node you want to be your tutorial's title and apply the **ToM-Tutorial** style to it. + + + + +
    + + + + + + + + + + + + +

    + Apply the style to the node: +

    + + +
    +
    + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + +
    +
    + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + Ok. that was kind of frustrating again. + +Let's put some information in the tutorial now!! + + + + + + + +
    + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + To know what information from the map should be used as text in the information panels of the tutorial, +**Tutorial-o Matic** looks for nodes with the **ToM_note** style and it uses the notes form their childnodes as information. + + + + + + + + + + + +

    + You should do the following steps to add the first information to our tutorial +

    +
      +
    1. + Insert a childnode to the Tutorial node +
    2. +
    3. + Its text will be "info" (has no relevance) +
    4. +
    5. + apply style 'ToM_note' to it +
    6. +
    7. + add a child node to it +
    8. +
    9. + It's text will be "first panel" (has no relevance) +
    10. +
    11. + Write some text to its note (this is the information that will be shown) +
    12. +
    + + +
    +
    + + + + + + +

    + You can do those steps by yourself and skip to the next page or use the following buttons to let ToM do the steps for you. +

    + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + +

    + Ok. Let's apply the style to the node: +

    + + +
    +
    +
    + + + + + + + + + + + + + + + +

    + Add a note
    Now you have to add a note to the node. +

    +

    + Follow the instructions to open a dialog where you can write the information. +

    +

    + Write something and click OK +

    + + +
    +
    + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + +
    +
    +
    + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + Now we will copy to the tutorial some othr 'ToM_note' nodes as examples so you can see other use cases + + + + + + + + + +

    + The notes in the child nodes can be written using plain text, Html or Markdown, just as usual. +

    + + +
    +
    +
    +
    + + + + + + + + + + + + + +

    + Welcome to the Tutorial-o-Matic demo!! +

    +

    + This is a demo version of an addon that can be used to build tutorials in Freeplane. +

    + +
    +
    +
    +
    + + + + + ## List examples + +### Simple list + +1. apples +1. bananas +1. oranges +1. lettuce +1. cucumber +1. tomatos +1. carrots + +### Structured list + +1. fruits + 1. apples + 1. bananas + 1. oranges + 1. tomatoes +1. salats + * lettuce + * cucumber + * tomatoes + * carrots + + + + + ## Table example + +|Name|this is the Age column|Badge| +|----|:----:|----| +|Piotr|25|![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png)| +|Maria|33|![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png)| +|Alex|45|![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png)| + + + + + + + + +

    + because it's not a direct child +

    + + +
    + + The ![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png), the ![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png) and the ![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png) are from **[Graphic Burger](https://graphicburger.com/)** and can be found [here](https://graphicburger.com/71-free-animal-icons/). + +
    +
    + + ## Code block + +Code: **'example code'** + +```groovy +// example code +// the node's details must start with a dot and then the language of the code + +def text = node.text + +def msg = "the text of the selected node is ${text}" + +ui.informationMessage(msg.toString()) +``` + + + +
    +
    +
    + + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + + +
    + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + Now you can play with your map and see how the tutorial changes! + +For example: + +* reorder the 'ToM_note' nodes +* reorder their childnodes in them +* change the text in their notes +* duplicate some of the childnodes +* clone one of the childnodes and modify it +* etc + +Test each change any times you want! + + + + + + + + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + + + + + + = "${node?.children[0]?.text}".toString() + + + + + + + +

    + "$0 " +

    + + +
    + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + +
    + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + # Congratulations!! + +## You have completed this tutorial!! + +(you can save your test map if you want, but you don't need to) + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + You can add a tutorial to any of your existing map. + +You can do it, for example, + +* to explain how the map is organized +* to add some recurrent commands +* to paste some standard nodes structures +* etc + + +Let's practice how to add a tutorial to an existing map. + +I prepared a map for this. Let's open it. + + + + + + + + + + + + + + + + As said in previous tutorial, the map needs some _special styles_. + +Let's take a look at the **styles manager**. It has no **ToM** styles yet. + +To close the **Styles manager** just press **escape** or click "**OK**" or "**Cancel**" + + + + + + + + + + + + + + +

    + OK. Let's import the Tutorial-o-Matic styles +

    + + +
    +
    +
    + + + + + Let's take a look at the **styles manager** again now. + +There you will see that the **ToM** styles have been added into the _user defined styles_ group. + +To close the **Styles manager** just press **escape** or click "**OK**" or "**Cancel**" + + + +
    + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + I recommend you to complete the first tutorial if you haven't. + +In the following page we will add a sample tutorial, so we can see that it works in an existing map too. + + + + + + +
    + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + Select any node in any branch and continue with the next steps. + + + + + + + + + + + + + + + + + +

    + This is just an example Tutorial +

    +

    + +

    +

    + I hope you understand the way it work. +

    +

    + You can move to the next tutorial. +

    +

    + +

    +

    + bye, +

    +

    + +

    +

    + Edo +

    + + +
    +
    + + ## Table example + +|Name|this is the Age column|Badge| +|----|:----:|----| +|Piotr|25|![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png)| +|Maria|33|![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png)| +|Alex|45|![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png)| + + + + + + + + +

    + because it's not a direct child +

    + +
    + + The ![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png), the ![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png) and the ![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png) are from **[Graphic Burger](https://graphicburger.com/)** and can be found [here](https://graphicburger.com/71-free-animal-icons/). + +
    +
    + + ## Code block + +Code: **'example code'** + +```groovy +// example code + +def text = node.text +def msg = "the text of the selected node is ${text}" + +ui.informationMessage(msg.toString()) +``` + + + +
    +
    +
    + + + + + + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + # Congratulations!! + +## You have completed this tutorial!! + +(you can save your test map if you want, but you don't need to) + + + + + + +
    +
    + + + + + + + + + +

    + information +

    +

    + multiple pages +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + +

    + To prepare any existing mindmap to contain a tutorial, you have to add the special Tutorial-o-Matic styles to it. +

    +

    + +

    +

    + You get that by using the command "Import Tutorial-o-Matic Styles" +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + + + + +

    + If you want to divide your tutorial in multiple pages  you have two different options: +

    +
      +
    • + inserting "New page" nodes +
    • +
    • + inserting "Next page" nodes +
    • +
    +

    + You have to insert these nodes to indicate where the next page starts. +

    + +
    +
    + + + + + + +

    + "New page" nodes are used to indicate where a new page starts AND the title of this new page. +

    +

    + This title gets shown at the top of the page +

    +

    + +

    + +
    +
    + + + + + + +

    + "Next page" nodes only indicates where a new page starts but doesn't insert a new title to the tutorial +

    + +
    +
    + + + + + + +

    + With the same logic, when showing the Table of Content only "New page" titles are listed there. +

    + +
    +
    + + + + + + +

    + These nodes can be set between the other nodes or as parents of them. They just have to be "before" the others ("in breadth-first order") +

    +

    + +

    + +
    +
    +
    + + + + + + + + +

    + New Pages nodes +

    + +
    +
    + + + + + + +

    + To insert "New page" nodes, you have to +

    +
      +
    • + Select the desired node (its text will be used as title for that page) +
    • +
    • + Assign the style "ToM_newPage" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + +

    + Next Pages nodes +

    + +
    + + + + + + +

    + Edo +

    + +
    +
    +
    + + + + + + +

    + To insert "Next page" nodes, you have to +

    +
      +
    • + Select the desired node (its text doesn't affect the tutorial) +
    • +
    • + Assign the style "ToM_nextPage" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + To add a Table of Content (TOC) to your tutorial, you just have to: +

    +
      +
    • + Add a node +
    • +
    • + Assign the style "ToM-TOC" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + bla bla bla +

    + +
    +
    +
    + + + + + + + + + + + + + +

    + bla bla bla +

    + +
    +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + + +

    + actions +

    + +
    + + +
    + + + + + + + + + + + +

    + Editing mode +

    + +
    +
    + + To see a tutorial in "***Editing Mode***" +you need to add a "**crayon**" icon to the **Tutorial base node**. + + + +
    + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + Tab Title +

    + +
    +
    + + + + + + +

    + You can assign the title of the tab where your tutorial will be shown. +

    +

    + To do this you have to add an attribute named "ToM_TabLabel" to your ToM-Tutorial node. +

    +

    + The value of that attribute will be shown as the tutorial's tab title. +

    +

    + You can add that attribute by yourself or copy it from the ToM-Tutorial style. +

    +

    + +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    +
    +
    +
    +
    diff --git a/EditingTutorialsWithMDH/myExistingMindMap.mm b/EditingTutorialsWithMDH/myExistingMindMap.mm new file mode 100644 index 0000000..34845b3 --- /dev/null +++ b/EditingTutorialsWithMDH/myExistingMindMap.mm @@ -0,0 +1,609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + This mindmap is just an example. +

    +

    + I used a script to "build" it randomly. +

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + maxLevel: 5 +

    +

    + maxChildNr: 5 +

    +

    + randomSeed: 33 +

    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 41dffc4..705a592 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -411,7 +411,7 @@ For each menu item with an icon add an attribute with the icon key (use develope
    - + @@ -446,7 +446,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -457,11 +457,24 @@ For each menu item with an icon add an attribute with the icon key (use develope + + + + + + +

    + Instructions: +

    + In submenu {0}
    click on {1} + + +
    - + diff --git a/Tutorial-o-Matic/translations/en.properties b/Tutorial-o-Matic/translations/en.properties index f853681..47e0f0e 100644 --- a/Tutorial-o-Matic/translations/en.properties +++ b/Tutorial-o-Matic/translations/en.properties @@ -1,11 +1,11 @@ -#Tue Mar 29 23:27:57 CLST 2022 +#Tue Apr 12 16:11:29 CLT 2022 addons.${name}.createNewTutorialMindMap=Create new tutorial mind map addons.${name}=Tutorial-o-Matic addons.${name}.ToMDemo=Tutorial-o-Matic Demo addons.${name}.ToMTutorial=Tutorial-o-Matic How to addons.${name}.importToMStyles=Import Tutorial-o-Matic Styles addons.${name}.executeTutorial=execute Demo tutorial -addons.${name}.ActionInstruction1=In submenu {0}
    click on {1} +addons.${name}.ActionInstruction1=

    Instructions\:

    In submenu {0}
    click on {1} addons.${name}.openTutorialPageFromLink=Open tutorial page from link addons.${name}.ActionInstruction2=You can also use de keyboard shortcut {0} for this command addons.${name}.openDemoMap=open Demo map diff --git a/Tutorial-o-Matic/translations/es.properties b/Tutorial-o-Matic/translations/es.properties index 3c0bc58..f7303f0 100644 --- a/Tutorial-o-Matic/translations/es.properties +++ b/Tutorial-o-Matic/translations/es.properties @@ -1,6 +1,6 @@ -#Tue Mar 29 23:27:57 CLST 2022 +#Tue Apr 12 16:11:29 CLT 2022 addons.${name}.createNewTutorialMindMap=Crear nuevo mapa para tutoriales -addons.${name}.ActionInstruction1=En submenu {0}
    has click en {1} +addons.${name}.ActionInstruction1=

    Instrucciones\:

    En submenu {0}
    has click en {1} addons.${name}=Tutorial-o-Matic addons.${name}.ActionInstruction2=Puedes usar también el atajo {0} para este comando addons.${name}.openDemoMap=abrir mapa demo diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm index 9e1d457..41869b2 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm @@ -137,10 +137,11 @@
    - + - + + @@ -198,7 +199,8 @@ - + + @@ -940,10 +942,11 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + - + + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm index d6f7f2d..f72c689 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm @@ -113,6 +113,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -1873,7 +1894,7 @@ candle indicates that executes only one time (then button gets disabled) - + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm index 2fe6d13..9ae4655 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm @@ -1,16 +1,20 @@ - + + + + + - - + + - + @@ -33,7 +37,7 @@ - + @@ -150,68 +154,412 @@ - - + - - - - - ## Hi!! - -In this tutorial I will try to show you how to create your own tutorials. + + + + + + + + + + + + + + + +

    + ## Hi!! +

    +

    + +

    +

    + In this tutorial I will try to show you how to create your own tutorials. +

    +

    + +

    +

    + This tutorial is for users that have some experience using Freeplane. +

    +

    + +

    +

    +    +

    +

    + I hope you enjoy this! +

    +

    + +

    +

    +    +

    +

    + ### Edo +

    +

    + +

    + +
    - + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    - This tutorial is for users that have some experience using Freeplane. + Tutorial 1 +

    +

    +

    -
    + +
    - - I hope you enjoy this! - - -### Edo - + + + + + + + + +

    + Tutorial 2 +

    +

    + +

    + +
    + + + + + + + + +

    + Tutorial 3 +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + # ToM commands +

    +

    + +

    +

    + In this panel you can access all Tutorial-o-Matic commands. +

    +

    + +

    +

    + They are ordered into this titles: +

    +

    + +

    +

    + * Styles +

    +

    + * Commands I +

    +

    + * Commands II +

    +

    + * Commands III +

    +

    + * Modifiers (icons) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. +

    +

    + I recommend to do the tutorials to fully understand this section. +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + + + + + +

    + In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. +

    +

    + I recommend to do the tutorials to fully understand this section. +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + - - - + + - - - + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. +

    +

    + I recommend to do the tutorials to fully understand this section. +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -227,44 +575,246 @@

    - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm new file mode 100644 index 0000000..34845b3 --- /dev/null +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm @@ -0,0 +1,609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + This mindmap is just an example. +

    +

    + I used a script to "build" it randomly. +

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + maxLevel: 5 +

    +

    + maxChildNr: 5 +

    +

    + randomSeed: 33 +

    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    From 7debf861f1d2aeda924807da979242e89da32524 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Fri, 6 May 2022 10:55:47 -0400 Subject: [PATCH 31/42] wip --- .../Tutorial-o-Matic Intro.mm | 147 ++-- .../Tutorial-o-MaticStepByStep.mm | 34 +- Tutorial-o-Matic/Tutorial-o-Matic.mm | 18 +- Tutorial-o-Matic/build - copia (2).gradle | 64 ++ Tutorial-o-Matic/build - copia.gradle | 59 ++ Tutorial-o-Matic/build.gradle | 64 +- Tutorial-o-Matic/history.md | 3 + ...ommand.groovy => getMenuCommandToM.groovy} | 0 .../src/main/groovy/ToM_actions.groovy | 5 +- Tutorial-o-Matic/version.properties | 4 +- .../Tutorial-o-Matic Intro.mm | 702 +++++------------- 11 files changed, 468 insertions(+), 632 deletions(-) create mode 100644 Tutorial-o-Matic/build - copia (2).gradle create mode 100644 Tutorial-o-Matic/build - copia.gradle rename Tutorial-o-Matic/scripts/{getMenuCommand.groovy => getMenuCommandToM.groovy} (100%) diff --git a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm index a281671..d546c76 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm @@ -4,17 +4,17 @@ - + - + - + @@ -205,13 +205,13 @@ - + - - - - + + + + @@ -235,7 +235,7 @@

    - + ## Hi!! **Tutorial-o-Matic** is a Freeplane Add-on that helps you build tutorials @@ -243,14 +243,14 @@ - + This very guide was created using this add-on. - + I hope you enjoy this! @@ -259,7 +259,7 @@ - + @@ -274,17 +274,17 @@ =edofro.MarkDownHelper.MDH.document(node) - - - + + + - + - - - + + + @@ -299,7 +299,6 @@

    -
    @@ -315,9 +314,9 @@ =edofro.MarkDownHelper.MDH.document(node) - - - + + + @@ -330,14 +329,14 @@

    - - - - + + + + - + @@ -360,9 +359,9 @@

    - + - + @@ -385,9 +384,9 @@

    - + - + @@ -402,7 +401,6 @@

    -
    @@ -418,8 +416,8 @@ =edofro.MarkDownHelper.MDH.document(node) - - + + This document contains **two guides** about the **building components** used to build tutorials with **Tutorial-o-Matic**: @@ -432,7 +430,7 @@ - + @@ -447,7 +445,6 @@

    -
    @@ -463,11 +460,11 @@ = edofro.MarkDownHelper.MDH.document(node) - - - - - + + + + + @@ -478,49 +475,49 @@

    - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - + + - - - - - + + + + + - - - - + + + + - - - - - - - + + + + + + + diff --git a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm index 57b84e8..5dc055a 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm @@ -207,7 +207,7 @@ - + @@ -573,8 +573,7 @@ Apply the style to the node:

    - -
    +
    @@ -673,8 +672,7 @@ Write some text to its note (this is the information that will be shown) - -
    +
    @@ -686,8 +684,7 @@ Write some text to its note (this is the information that will be shown) You can do those steps by yourself and skip to the next page or use the following buttons to let ToM do the steps for you.

    - -
    +
    @@ -713,8 +710,7 @@ Write some text to its note (this is the information that will be shown) Ok. Let's apply the style to the node:

    - - +
    @@ -742,8 +738,7 @@ Write some text to its note (this is the information that will be shown) Write something and click OK

    - - +
    @@ -789,8 +784,7 @@ Write some text to its note (this is the information that will be shown) The notes in the child nodes can be written using plain text, Html or Markdown, just as usual.

    - - +
    @@ -869,8 +863,7 @@ Write some text to its note (this is the information that will be shown) because it's not a direct child

    - - + The ![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png), the ![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png) and the ![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png) are from **[Graphic Burger](https://graphicburger.com/)** and can be found [here](https://graphicburger.com/71-free-animal-icons/). @@ -972,8 +965,7 @@ Write some text to its note (this is the information that will be shown) "$0 "

    - - + @@ -1089,8 +1081,7 @@ Write some text to its note (this is the information that will be shown) OK. Let's import the Tutorial-o-Matic styles

    - -
    +
    @@ -1196,8 +1187,7 @@ Write some text to its note (this is the information that will be shown) Edo

    - - +
    ## Table example @@ -1289,7 +1279,7 @@ Write some text to its note (this is the information that will be shown)
    - + diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 705a592..5d85a43 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -4,7 +4,7 @@ - + @@ -86,7 +86,7 @@ - + @@ -260,6 +260,7 @@ + @@ -450,7 +451,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -468,8 +469,7 @@ For each menu item with an icon add an attribute with the icon key (use develope In submenu {0}
    click on {1} - -
    +
    @@ -478,7 +478,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -521,6 +521,8 @@ For each menu item with an icon add an attribute with the icon key (use develope + + @@ -675,9 +677,9 @@ For each menu item with an icon add an attribute with the icon key (use develope - + - + diff --git a/Tutorial-o-Matic/build - copia (2).gradle b/Tutorial-o-Matic/build - copia (2).gradle new file mode 100644 index 0000000..9467312 --- /dev/null +++ b/Tutorial-o-Matic/build - copia (2).gradle @@ -0,0 +1,64 @@ +//Tutorial-o-Matic + + + +apply plugin: 'groovy' + +targetCompatibility='1.8' + +// 1. I have to define which freeplane version is going to be used to look at the libreries (freeplane and groovy) +def FPversion = 'v9_15' +def freeplaneDirs = [ + instaled : "C:/Program Files/Freeplane", + protableApps : "C:/PortableApps/FreeplanePortable/App/Freeplane", + v9_15 : "C:/Freeplane/freeplane-1.9.15-pre01", + v10_1 : "C:/Freeplane/freeplane-1.10.1-pre05" + ] +def freeplaneDir = freeplaneDirs[FPversion] + +def groovyGroupId = FPversion.startsWith('v10')?'org.apache.groovy':'org.codehaus.groovy' +def groovyVersion = FPversion.startsWith('v10')?'4.0.1':'3.0.8' + + +libsDirName = "${rootDir}/lib" +//clean.doFirst { delete "${rootDir}/lib" } // para eliminar todas las .jar +clean.doFirst { delete "${rootDir}/lib/Tutorial-o-Matic.jar" } //para eliminar sólo una de las .jar y que no me borrara markedj ni jsoup + +repositories { + mavenCentral() + flatDir name: 'localGitDepsRepository', + dirs: [ + "${freeplaneDir}", + "${freeplaneDir}/core/org.freeplane.core/lib", + "${freeplaneDir}/plugins/org.freeplane.plugin.script/lib", + // "${freeplaneDir}/plugins/org.freeplane.plugin.markdown/lib", // para incluir markedj.jar + "${rootDir}/lib" //ahí puse markedj y jsoup + ] +} + + +// I had this error: + // Could not find method compile() for arguments [{name=freeplanelauncher}] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler +// answer: + // https://stackoverflow.com/questions/69733508/couldnt-find-compile-for-arguments-directory-libs-on-object-of-type-org-g + +dependencies { + implementation name : 'freeplanelauncher' + implementation name : 'freeplaneviewer' + implementation group: 'org.freeplane.core', name: 'freeplaneeditor', version:"+" + implementation group: 'org.freeplane.script', name: 'plugin', version: '+' + implementation name : 'markedj', version: '+' //<---- para markedj + implementation name : 'jsoup' , version: '+' //<---- para jsoup + //Freeplane now comes with groovy 3.0.8 + implementation ("${groovyGroupId}:groovy-all:${groovyVersion}".toString()) { + exclude group:groovyGroupId, module:'groovy-test' + exclude group:groovyGroupId, module:'groovy-test-junit5' + exclude group:groovyGroupId, module:'groovy-testng' + exclude group:groovyGroupId, module:'groovy-ant' + exclude group:groovyGroupId, module:'groovy-docgenerator' + exclude group:groovyGroupId, module:'groovy-groovydoc' + exclude group:groovyGroupId, module:'groovy-cli-commons' + exclude group:groovyGroupId, module:'groovy-cli-picocli' + } + implementation "${groovyGroupId}:groovy-dateutil:${groovyVersion}".toString() +} \ No newline at end of file diff --git a/Tutorial-o-Matic/build - copia.gradle b/Tutorial-o-Matic/build - copia.gradle new file mode 100644 index 0000000..51e269e --- /dev/null +++ b/Tutorial-o-Matic/build - copia.gradle @@ -0,0 +1,59 @@ +//Tutorial-o-Matic + + + +apply plugin: 'groovy' + +targetCompatibility='1.8' + +libsDirName = "${rootDir}/lib" +//clean.doFirst { delete "${rootDir}/lib" } // para eliminar todas las .jar +clean.doFirst { delete "${rootDir}/lib/Tutorial-o-Matic.jar" } //para eliminar sólo una de las .jar y que no me borrara markedj ni jsoup + +repositories { + mavenCentral() + flatDir name: 'localGitDepsRepository', + dirs: [ + "C:/Program Files/Freeplane", + "C:/Program Files/Freeplane/core/org.freeplane.core/lib", + "C:/Program Files/Freeplane/plugins/org.freeplane.plugin.script/lib", + // "C:/Program Files/Freeplane/plugins/org.freeplane.plugin.markdown/lib", // para incluir markedj.jar + "${rootDir}/lib" //ahí puse markedj y jsoup + ] + + + // Así para cuando Freeplane está en Portable Apps + // dirs: [ + // "C:/PortableApps/FreeplanePortable/App/Freeplane", + // "C:/PortableApps/FreeplanePortable/App/Freeplane/core/org.freeplane.core/lib", + // "C:/PortableApps/FreeplanePortable/App/Freeplane/plugins/org.freeplane.plugin.script/lib", + // "${rootDir}/lib" //así lo usé en wikdshellext, porque ahí puse WikdShell.jar + // ] +} + + +// I had this error: + // Could not find method compile() for arguments [{name=freeplanelauncher}] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler +// answer: + // https://stackoverflow.com/questions/69733508/couldnt-find-compile-for-arguments-directory-libs-on-object-of-type-org-g + +dependencies { + implementation name : 'freeplanelauncher' + implementation name : 'freeplaneviewer' + implementation group: 'org.freeplane.core', name: 'freeplaneeditor', version:"+" + implementation group: 'org.freeplane.script', name: 'plugin', version: '+' + implementation name : 'markedj', version: '+' //<---- para markedj + implementation name : 'jsoup' , version: '+' //<---- para jsoup + //Freeplane now comes with groovy 3.0.8 + implementation ('org.codehaus.groovy:groovy-all:3.0.8') { + exclude group:'org.codehaus.groovy', module:'groovy-test' + exclude group:'org.codehaus.groovy', module:'groovy-test-junit5' + exclude group:'org.codehaus.groovy', module:'groovy-testng' + exclude group:'org.codehaus.groovy', module:'groovy-ant' + exclude group:'org.codehaus.groovy', module:'groovy-docgenerator' + exclude group:'org.codehaus.groovy', module:'groovy-groovydoc' + exclude group:'org.codehaus.groovy', module:'groovy-cli-commons' + exclude group:'org.codehaus.groovy', module:'groovy-cli-picocli' + } + implementation 'org.codehaus.groovy:groovy-dateutil:3.0.8' +} \ No newline at end of file diff --git a/Tutorial-o-Matic/build.gradle b/Tutorial-o-Matic/build.gradle index 51e269e..340ea4e 100644 --- a/Tutorial-o-Matic/build.gradle +++ b/Tutorial-o-Matic/build.gradle @@ -6,6 +6,20 @@ apply plugin: 'groovy' targetCompatibility='1.8' +// 1. I have to define which freeplane version is going to be used to look at the libreries (freeplane and groovy) +def FPversion = 'v9_15' +def freeplaneDirs = [ + instaled : "C:/Program Files/Freeplane", + protableApps : "C:/PortableApps/FreeplanePortable/App/Freeplane", + v9_15 : "C:/Freeplane/freeplane-1.9.15-pre01", + v10_1 : "C:/Freeplane/freeplane-1.10.1-pre05" + ] +def freeplaneDir = freeplaneDirs[FPversion] + +def groovyGroupId = FPversion.startsWith('v10')?'org.apache.groovy':'org.codehaus.groovy' +def groovyVersion = FPversion.startsWith('v10')?'4.0.1':'3.0.8' + + libsDirName = "${rootDir}/lib" //clean.doFirst { delete "${rootDir}/lib" } // para eliminar todas las .jar clean.doFirst { delete "${rootDir}/lib/Tutorial-o-Matic.jar" } //para eliminar sólo una de las .jar y que no me borrara markedj ni jsoup @@ -14,21 +28,12 @@ repositories { mavenCentral() flatDir name: 'localGitDepsRepository', dirs: [ - "C:/Program Files/Freeplane", - "C:/Program Files/Freeplane/core/org.freeplane.core/lib", - "C:/Program Files/Freeplane/plugins/org.freeplane.plugin.script/lib", - // "C:/Program Files/Freeplane/plugins/org.freeplane.plugin.markdown/lib", // para incluir markedj.jar + "${freeplaneDir}", + "${freeplaneDir}/core/org.freeplane.core/lib", + "${freeplaneDir}/plugins/org.freeplane.plugin.script/lib", + // "${freeplaneDir}/plugins/org.freeplane.plugin.markdown/lib", // para incluir markedj.jar "${rootDir}/lib" //ahí puse markedj y jsoup ] - - - // Así para cuando Freeplane está en Portable Apps - // dirs: [ - // "C:/PortableApps/FreeplanePortable/App/Freeplane", - // "C:/PortableApps/FreeplanePortable/App/Freeplane/core/org.freeplane.core/lib", - // "C:/PortableApps/FreeplanePortable/App/Freeplane/plugins/org.freeplane.plugin.script/lib", - // "${rootDir}/lib" //así lo usé en wikdshellext, porque ahí puse WikdShell.jar - // ] } @@ -45,15 +50,28 @@ dependencies { implementation name : 'markedj', version: '+' //<---- para markedj implementation name : 'jsoup' , version: '+' //<---- para jsoup //Freeplane now comes with groovy 3.0.8 - implementation ('org.codehaus.groovy:groovy-all:3.0.8') { - exclude group:'org.codehaus.groovy', module:'groovy-test' - exclude group:'org.codehaus.groovy', module:'groovy-test-junit5' - exclude group:'org.codehaus.groovy', module:'groovy-testng' - exclude group:'org.codehaus.groovy', module:'groovy-ant' - exclude group:'org.codehaus.groovy', module:'groovy-docgenerator' - exclude group:'org.codehaus.groovy', module:'groovy-groovydoc' - exclude group:'org.codehaus.groovy', module:'groovy-cli-commons' - exclude group:'org.codehaus.groovy', module:'groovy-cli-picocli' + if(FPversion.startsWith('v10')){ + implementation platform ("${groovyGroupId}:groovy-all:${groovyVersion}".toString()) { + exclude group:groovyGroupId, module:'groovy-test' + exclude group:groovyGroupId, module:'groovy-test-junit5' + exclude group:groovyGroupId, module:'groovy-testng' + exclude group:groovyGroupId, module:'groovy-ant' + exclude group:groovyGroupId, module:'groovy-docgenerator' + exclude group:groovyGroupId, module:'groovy-groovydoc' + exclude group:groovyGroupId, module:'groovy-cli-commons' + exclude group:groovyGroupId, module:'groovy-cli-picocli' + } + } else { + implementation ("${groovyGroupId}:groovy-all:${groovyVersion}".toString()) { + exclude group:groovyGroupId, module:'groovy-test' + exclude group:groovyGroupId, module:'groovy-test-junit5' + exclude group:groovyGroupId, module:'groovy-testng' + exclude group:groovyGroupId, module:'groovy-ant' + exclude group:groovyGroupId, module:'groovy-docgenerator' + exclude group:groovyGroupId, module:'groovy-groovydoc' + exclude group:groovyGroupId, module:'groovy-cli-commons' + exclude group:groovyGroupId, module:'groovy-cli-picocli' + } } - implementation 'org.codehaus.groovy:groovy-dateutil:3.0.8' + implementation "${groovyGroupId}:groovy-dateutil:${groovyVersion}".toString() } \ No newline at end of file diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index a8316b7..f4f9f66 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -1,5 +1,8 @@ # History +## v0.0.7 + + ## v0.0.6 * using devtools v0.9.31 diff --git a/Tutorial-o-Matic/scripts/getMenuCommand.groovy b/Tutorial-o-Matic/scripts/getMenuCommandToM.groovy similarity index 100% rename from Tutorial-o-Matic/scripts/getMenuCommand.groovy rename to Tutorial-o-Matic/scripts/getMenuCommandToM.groovy diff --git a/Tutorial-o-Matic/src/main/groovy/ToM_actions.groovy b/Tutorial-o-Matic/src/main/groovy/ToM_actions.groovy index 06d6821..5876389 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM_actions.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM_actions.groovy @@ -181,7 +181,8 @@ class ToM_actions{ def path // ver si hijos leaf contiene accion - def menuCommand = mTree.children.findAll{it.leaf}?.find{it.userObject.key == miAccion} + //def menuCommand = mTree.children.findAll{it.leaf}?.find{it.userObject.key == miAccion} //JAVA 8 + def menuCommand = mTree.children().findAll{it.leaf}?.find{it.userObject.key == miAccion} //JAVA 17 // alguno? if (menuCommand){ // devolver MenuEntry @@ -190,7 +191,7 @@ class ToM_actions{ // no // sacar lista hijos no leaf - def hijosNoLeaf = mTree.children.findAll{!it.leaf} + def hijosNoLeaf = mTree.children().findAll{!it.leaf} // si hay if (hijosNoLeaf){ // recursivo diff --git a/Tutorial-o-Matic/version.properties b/Tutorial-o-Matic/version.properties index c0a6324..0048eaf 100644 --- a/Tutorial-o-Matic/version.properties +++ b/Tutorial-o-Matic/version.properties @@ -1,4 +1,4 @@ -version=v0.0.6 -downloadUrl=https://github.com/EdoFro/Freeplane_Tutorial_AddOn/releases/download/v0.0.6/Tutorial-o-Matic-v0.0.6.addon.mm +version=v0.0.7 +downloadUrl=https://github.com/EdoFro/Freeplane_Tutorial_AddOn/releases/download/v0.0.7/Tutorial-o-Matic-v0.0.7.addon.mm changelogUrl=https://github.com/EdoFro/Freeplane_Tutorial_AddOn/releases/latest/download/history.md freeplaneVersionFrom=v1.9.9 diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm index 9ae4655..303459f 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm @@ -4,7 +4,7 @@ - + @@ -14,7 +14,7 @@ - + @@ -114,6 +114,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -156,13 +177,13 @@ - + - - - - + + + + @@ -178,13 +199,16 @@

    - In this tutorial I will try to show you how to create your own tutorials. + **Tutorial-o-Matic** is a Freeplane Add-on that helps you build tutorials  +

    +

    + for your mindmaps or your own add-ons.

    - This tutorial is for users that have some experience using Freeplane. + This very guide was created using this add-on.

    @@ -194,9 +218,6 @@

    I hope you enjoy this! -

    -

    -

       @@ -211,33 +232,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -246,25 +241,25 @@

    - Tutorial 1 + ----

    - - -
    -
    - - - - - - - -

    - Tutorial 2 + # Content +

    +

    + +

    +

    + +

    +

    + +

    +

    + ----

    @@ -273,26 +268,28 @@ - + + + + + - + + -

    - Tutorial 3 +

    + 'Step by step'

    -

    - +

    + tutorials

    -
    - - @@ -300,37 +297,46 @@

    - # ToM commands + # Tutorial-o-Matic Step by Step

    - In this panel you can access all Tutorial-o-Matic commands. + This guide contains step by step tutorials to learn hands on how to build tutorials using **Tutorial-o-Matic**

    - They are ordered into this titles: -

    -

    - + 1. new map with a basic tutorial

    - * Styles + 1. adding a tutorial to an existing map

    - * Commands I + 1. a tutorial with multiple pages

    - * Commands II + 1. adding acctions

    - * Commands III +

    + + +
    +
    + + + + + + + +

    - * Modifiers (icons) + Tutorial 2

    @@ -339,7 +345,7 @@ - + @@ -348,10 +354,7 @@

    - In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. -

    -

    - I recommend to do the tutorials to fully understand this section. + Tutorial 3

    @@ -360,461 +363,160 @@ - - - - - - - - - - - + + + + -

    - In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. +

    + 'How to ToM'

    -

    - I recommend to do the tutorials to fully understand this section. +

    + panel

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +

    - In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. + # How to Tutorial-o-Matic +

    +

    +

    - I recommend to do the tutorials to fully understand this section. + This document contains **two guides** about the **building components** used to build tutorials with **Tutorial-o-Matic**: +

    +

    + +

    +

    +  1. commands used to **create new tutorials** +

    +

    +  2. **actions** you can add to the tutorials +

    +

    +

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + + + + + + + +

    + 'ToM Commands' +

    +

    + panel +

    + + +
    +

    - In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. + # ToM commands

    - I recommend to do the tutorials to fully understand this section. + +

    +

    + In this panel you can access all Tutorial-o-Matic commands. +

    +

    + +

    +

    + There is **no explanation**. Just the commands. +

    +

    + +

    +

    + They are ordered into this titles: +

    +

    + +

    +

    + * Assigning ToM Styles +

    +

    + * Tutorial's creation commands +

    +

    + * Adding action's commands +

    +

    + * Adding action nodes with default text' commands +

    +

    + * Modifiers (icons) +

    +

    +

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
    - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 07bdbc6605dfe9bada2533e9fccaf66ebed8f963 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Fri, 6 May 2022 11:30:58 -0400 Subject: [PATCH 32/42] updating tutorial mindmaps without MDH --- .../HowToTutorial-o-Matic.mm | 2 +- .../Tutorial-o-Matic Intro.mm | 144 +- .../Tutorial-o-MaticCommands.mm | 2 +- .../Tutorial-o-MaticStepByStep.mm | 3 +- EditingTutorialsWithMDH/myExistingMindMap.mm | 42 +- .../Tutorial-o-Matic/HowToTutorial-o-Matic.mm | 671 ++++-- .../Tutorial-o-Matic Intro.mm | 86 +- .../Tutorial-o-MaticCommands.mm | 95 +- .../Tutorial-o-MaticStepByStep.mm | 1891 +++++++++++++++-- .../doc/Tutorial-o-Matic/myExistingMindMap.mm | 17 +- 10 files changed, 2467 insertions(+), 486 deletions(-) diff --git a/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm b/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm index ee7d2d5..93f9bb2 100644 --- a/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm +++ b/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm @@ -4,7 +4,7 @@ - + diff --git a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm index d546c76..e5f3ad3 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm @@ -4,17 +4,17 @@ - + - + - + @@ -205,13 +205,13 @@ - + - - - - + + + + @@ -235,7 +235,7 @@

    - + ## Hi!! **Tutorial-o-Matic** is a Freeplane Add-on that helps you build tutorials @@ -243,14 +243,14 @@ - + This very guide was created using this add-on. - + I hope you enjoy this! @@ -259,7 +259,7 @@ - + @@ -274,17 +274,17 @@ =edofro.MarkDownHelper.MDH.document(node) - - - + + + - + - - - + + + @@ -314,9 +314,9 @@ =edofro.MarkDownHelper.MDH.document(node) - - - + + + @@ -329,14 +329,14 @@

    - - - - + + + + - + @@ -359,9 +359,9 @@

    - + - + @@ -384,9 +384,9 @@

    - + - + @@ -416,8 +416,8 @@ =edofro.MarkDownHelper.MDH.document(node) - - + + This document contains **two guides** about the **building components** used to build tutorials with **Tutorial-o-Matic**: @@ -430,7 +430,7 @@ - + @@ -460,11 +460,11 @@ = edofro.MarkDownHelper.MDH.document(node) - - - - - + + + + + @@ -475,49 +475,49 @@

    - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - + + - - - - - + + + + + - - - - + + + + - - - - - - - + + + + + + + diff --git a/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm b/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm index a80486d..0e0b85a 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm @@ -7,7 +7,7 @@ - + diff --git a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm index 5dc055a..610105d 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm @@ -4,7 +4,7 @@ - + @@ -212,6 +212,7 @@ + diff --git a/EditingTutorialsWithMDH/myExistingMindMap.mm b/EditingTutorialsWithMDH/myExistingMindMap.mm index 34845b3..483a5df 100644 --- a/EditingTutorialsWithMDH/myExistingMindMap.mm +++ b/EditingTutorialsWithMDH/myExistingMindMap.mm @@ -4,13 +4,13 @@ - + - + - + @@ -40,6 +40,34 @@ + + + + + + + + + +pre { + background-color: #e5e7ff; + border-left: 5px solid #ccc; + display: block; + padding: 8px; + margin: 5px; +} +code { + font-family: Consolas,"courier new"; + font-size: 11px; + color: #999; +} + +blockquote { + border-left: 5px solid #cccccc; + background-color: #eeeeee; + padding: 8px; +} + @@ -92,8 +120,7 @@ I used a script to "build" it randomly.

    - -
    +
    @@ -176,7 +203,7 @@ - + @@ -406,8 +433,7 @@ randomSeed: 33

    - -
    +
    diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm index 41869b2..52100ef 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm @@ -1,7 +1,10 @@ + + + - + @@ -43,8 +46,8 @@ - + @@ -108,6 +111,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
    @@ -145,37 +174,62 @@ - - ## Hi!! - -In this tutorial I will try to show you how to create your own tutorials. - - - + + + +

    + ## Hi!! +

    +

    + +

    +

    + This guide contains brief **explanations of all commands and building blocks** you can use to build a Tutorial. +

    +

    + +

    +

    + I recommend you to do the **"Step by Step" tutorials first** and use this document as a guide afterwards. +

    +

    + +

    This tutorial is for users that have some experience using Freeplane.

    +

    + +

    +

    + I hope you enjoy this! +

    +

    + +

    +

    +    +

    +

    + ### Edo +

    +

    + +

    -
    -
    - - I hope you enjoy this! - - -### Edo - +
    - + @@ -184,15 +238,15 @@

    - In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. -

    -

    - I recommend to do the tutorials to fully understand this section. + In this section you can see the commands used to **create new tutorials** in a new or an existing mindmap.

    - + + In this section you can see the commands used to add new **actions** to your tutorials. + +
    @@ -202,57 +256,126 @@ - + - + + +

    - Tutorial-o-Matic use mindmaps to store the tutorial's information. + # How does ToM works? +

    +

    +

    - To understand how to build a tutorial and its structure Tutorial-o-Matic needs that the map has some special user styles. + **Tutorial-o-Matic** use mindmaps to store the tutorial's information. +

    +

    + +

    +

    + To understand how to display a tutorial and its structure **Tutorial-o-Matic** needs that the map has some _special user styles_.  

    It looks after the nodes that have such styles and builds the pages of the tutorials by using those nodes and their children information.

    - All other nodes are ignorated and you can use them to organize your tutorial, add notes and other information that won't be shown in the tutorial. + +

    +

    + All other nodes are ignored and you can use them to organize your tutorial, add notes and other information that won't be shown in the tutorial.

    - -
    -
    - - - - - -

    - The best way to learn how to use this add-on is to make a tutorial by yourself. + +

    +

    + The best way to learn how to use this add-on is to make the **'Step by step' tutorial** by yourself. +

    +

    +

    -
    + +
    - + + +

    - In the following pages you can see a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. + # Good to know ... +

    +

    + +

    +

    + This is not a real tutorial, it's more like a guide. +

    +

    + +

    +

    + For example, for each "building block", there is a brief an explanation and **multiple buttons** with different actions.   +

    +

    + You **don't need to click on all** of them. More preciselly, you don't need to click any of them if you don't want to.   +

    +

    + They **are the different alternatives** you can use to insert those building blocks in a tutorial mindmap. +

    +

    + +

    +

    + For example, there are buttons to: +

    +

    + +

    +

    + * see where in Freeplane's menu you can find the command to apply that style +

    +

    + * apply the style directly to the currently selected node +

    +

    + * insert a new node with that style as a child of the currently selected node.<br>The node has no text and it's ready to type in it. +

    +

    + * insert a new node with a predefined style and text as a child of the currently selected node +

    +

    + +

    +

    + As you can see they are very similar and you can choose which is the one that matches you best.

    -
    + +
    +
    + + In the following pages you can see a brief explanation about how to create a tutorial with **Tutorial-o-Matic**. + + +This guide's "**Table of Contents**" : + +
    + @@ -942,7 +1065,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to:
    - + @@ -979,59 +1102,175 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + - - - - - - -

    - You can add multiple actions to your tutorial by using the following special styles: -

    -
    -
    -
      -
    • - ToM_showMenu -
    • -
    • - ToM_goto -
    • -
    • - ToM_groovy -
    • -
    • - ToM_menuAction -
    • -
    • - ToM_copy -
    • -
    • - ToM_select -
    • -
    • - ToM_openMap -
    • -
    • - ToM_openTutMap -
    • -
    • - ToM_showNode -
    • -
    -
    -
    -
    -
    - -
    -
    + + + + + + + + +

    + # Tutorial-o-Matic styles +

    +

    + +

    +

    + You can add multiple **actions** to your tutorial by using the following **special styles**:   +

    +

    + +

    +

    +    +

    +

    + +

    +

    + |Style|tutorial "action"| +

    +

    + |----|----| +

    +

    + |ToM_showMenu|You can make that **ToM** shows **where in the menu** the user can find a specific command.| +

    +

    + |ToM_menuAction|You can add to your tutorial buttons that **apply menu actions**.| +

    +

    + |ToM_groovy|You can add to your tutorial panels that show blocks of **groovy code ** <br>and / or <br>**buttons** that apply those **groovy scripts** to the selected nodes.| +

    +

    + |ToM_goto|You can add  buttons to **jump to other tutorial pages** in the same mindmap (and jump back).| +

    +

    + |ToM_copy|You can add actions to **insert example nodes** or specific node structures **to the user's mindmap**.| +

    +

    + |ToM_select|After inserting an example branch, you can have a **button that selects the nodes** that you want so the user can easily go further with the tutorial.| +

    +

    + |ToM_openMap|You can add a button to **open other mindmaps** needed for the tutorial| +

    +

    + |ToM_openTutMap|You can add an "_**inspect**_" button to the tutorial that directly goes to the map that <br>contains the current tutorial information and selects the node where the current page starts.| +

    +

    + |ToM_showNode|You can add a button to **show nodes** in the same or in another MindMap.<br>It may be any node. It doesn't need to be in a tutorial.| +

    +

    + |ToM_openTutPage|You can add buttons to **open other tutorials** or **tutorial's pages** from the same or another mindmap.| +

    +

    + +

    -
    + +
    +
    + + + + + + + + +

    + # Good to know ... +

    +

    + +

    +

    + This is not a real tutorial, it's more like a guide. +

    +

    + +

    +

    + For each "action", there is a brief an explanation and **multiple buttons** with different actions.   +

    +

    + You **don't need to click on all** of them. More preciselly, you don't need to click any of them if you don't want to.   +

    +

    + They **are the different alternatives** you can use to insert those actions in a tutorial mindmap. +

    +

    + +

    +

    + For example, there are buttons to: +

    +

    + +

    +

    + * see where in Freeplane's menu you can find the command to apply that style +

    +

    + * apply the style directly to the currently selected node +

    +

    + * insert a new node with that style as a child of the currently selected node.<br>The node has no text and it's ready to type in it. +

    +

    + * insert a new node with a predefined style and text as a child of the currently selected node +

    +

    + +

    +

    + As you can see they are very similar and you can choose which is the one that matches you best. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + # In this guide ... +

    +

    + +

    +

    + In the following pages, you can see a brief explanation about all the **building components**  +

    +

    + used to **add actions** to your tutorials with **Tutorial-o-Matic**. +

    +

    + +

    +

    + This guide's "**Table of Contents**" : +

    +

    + +

    + + +
    + @@ -1048,7 +1287,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - You can make that **ToM** shows where in the menu the user can find a specific command. + You can make that **ToM** shows **where in the menu** the user can find a specific command. @@ -1057,8 +1296,8 @@ To add a Table of Content (TOC) to your tutorial, you just have to: ## Steps * Add a node with style "**ToM_showMenu**" -* Add **child nodes** with **links to menu commands** you want to show - * The text of that nodes are not used +* Add **child node(s)** with **link(s) to the menu command(s)** you want to show + * The text of that nodes is not used @@ -1245,17 +1484,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - - - - -

    - You can add to your tutorial buttons that apply menu actions. -

    - -
    + + You can add to your tutorial buttons that **apply menu actions**. + ## Steps @@ -1439,9 +1670,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - You can add to your tutorial panels that show blocks -of **groovy code ** and / or **buttons** that apply those -**groovy scripts** to the selected nodes. + You can add to your tutorial panels that show blocks of **groovy code ** +and / or +**buttons** that apply those **groovy scripts** to the selected nodes. @@ -1618,7 +1849,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - You can add buttons to jump to other tutorial pages + You can add buttons to **jump to other tutorial pages** in the same mindmap (and jump back). @@ -1751,17 +1982,49 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - When building a tutorial you can add predefined nodes -or branches of nodes -that the user can insert in his/her own map. - - -The user can copy those nodes directly to his/her selected a node in his/her own map. - -It can be used to insert example nodes or specific node structures. - - + + + + + + + + +

    + When building a tutorial you can add **predefined nodes  +

    +

    + or branches of nodes** +

    +

    + that the user can **insert in his/her own map**. +

    +

    +    +

    +

    + The user can copy those nodes directly to his/her own map as childs of the selected node.   +

    +

    + +

    +

    + In other words: +

    +

    + +

    +

    + You can add actions to **insert example nodes** or specific node structures **to the user's mindmap**. +

    +

    + +

    +

    + +

    + +
    @@ -1842,9 +2105,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - After inserting an example branch, you can have a -button that selects the nodes that you want so -the user can easily go further with the tutorial. + After inserting an example branch, you can have a **button that selects the nodes** that you want so the user can easily go further with the tutorial. @@ -2028,10 +2289,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to:
    - You can add a button to open other maps needed -for the tutorial. - -Currently that map must be in the same + You can add a button to **open other mindmaps** needed for the tutorial. + + + + + Currently that map must be in the same directory as the tutorial map @@ -2132,13 +2395,8 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - You can add a button to the tutorial to directly go -to the map that -contains the tutorial information and select -the node that defines the current page. - - - + You can add an "_**inspect**_" button to the tutorial that directly goes to the map that +contains the current tutorial information and selects the node where the current page starts. @@ -2234,12 +2492,10 @@ To add a Table of Content (TOC) to your tutorial, you just have to:
    - - You can add a button to show nodes in the -same or in another MindMap. + + You can add a button to **show nodes** in the same or in another MindMap. -It may be any node. -It doesn't need to be in a tutorial. +It may be any node. It doesn't need to be in a tutorial. @@ -2327,23 +2583,148 @@ To add a Table of Content (TOC) to your tutorial, you just have to:
    - - + - + + + + + + +

    + ToM_openTutPage +

    + +
    +
    + + You can add buttons to **open other tutorials** or **tutorial's pages** from the same or another mindmap. + + + + + + ## Steps + +The steps are very similar to the "goto" case: + +* Add a node with style "ToM_openTutPage" + * the text of this node, its note + or details are not shown in the tutorial + +* Add child nodes with links to other +ToM nodes in the same or to other Mindmaps + * The text of that nodes are used as the texts + of the buttons + * The text of their notes are used as the + texts of the panels + + + + + + + + + + + + +

    + # Linking posibilities +

    +

    + +

    +

    + You can add nodes with different types of links: +

    +

    + +

    +

    + |type of link|target node|example|opens ...| +

    +

    + |----|----|----|----| +

    +

    + |Absolute|no node|file:/C:/myMaps/2022/myTutorial.mm|panel with links to all tutorials present in myTutorial.mm| +

    +

    + |Absolute| a ToM-Tutorial node|file:/C:/myMaps/2022/myTutorial.mm#ID_1531255396|first page of the selected tutorial in myTutorial.mm| +

    +

    + |Absolute| a ToM_newPage node|file:/C:/myMaps/2022/myTutorial.mm#ID_1531254444|the selected page of myTutorial.mm| +

    +

    + |Relative|no node|myTutorial.mm|panel with links to all tutorials present in myTutorial.mm<br>that is in the same directory of the active tutorial mindmap.| +

    +

    + |Relative| a ToM-Tutorial node|myTutorial.mm#ID_1531255396|first page of the selected tutorial in myTutorial.mm<br>(in the same directory)| +

    +

    + |Relative| a ToM_newPage node|myTutorial.mm#ID_1531254444|the selected page of myTutorial.mm<br>(in the same directory)| +

    +

    + |to the same map| a ToM-Tutorial node|#ID_1531255223|the selected page of a tutorial from the same map| +

    +

    + +

    + + +
    +
    +
    + + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + +

    - PENDIENTE!!!! + "Insert new $1 node directly"

    + + + + + + + + - diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm index 303459f..b761354 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm @@ -4,7 +4,7 @@ - + @@ -14,7 +14,7 @@ - + @@ -177,13 +177,13 @@ - + - - - - + + + + @@ -232,7 +232,7 @@ - + @@ -270,9 +270,9 @@ - - - + + + @@ -327,7 +327,7 @@ - + @@ -345,7 +345,7 @@ - + @@ -363,7 +363,7 @@ - + @@ -412,7 +412,7 @@ - + @@ -485,38 +485,38 @@ - - - - - - - - - - + + + + + + + + + + - - + + - - - - - + + + + + - - - - + + + + - - - - - - - + + + + + + + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm index d201d3a..a77650f 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm @@ -1,10 +1,13 @@ + + + - - + + @@ -40,8 +43,8 @@ - + @@ -105,6 +108,11 @@ + + + + + @@ -148,7 +156,36 @@ - + + + + + + + + + + +

    + # About this map +

    +

    + +

    +

    + This map is similar to the How To mindmap, but all explanations have been deleted +

    +

    + +

    + + +
    +
    +
    + + + @@ -402,8 +439,26 @@ + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + +
    - + @@ -568,7 +623,7 @@ - + @@ -828,9 +883,29 @@ + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + - + @@ -887,6 +962,12 @@ + + + + + + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm index e74cbb6..6beb0d5 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm @@ -1,7 +1,10 @@ - - + + + + + @@ -42,8 +45,8 @@ - + @@ -107,9 +110,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
    - + @@ -148,327 +177,1789 @@
    + + - + + - + - - ## Hi!! - -In this tutorial I will try to show you how to create your own tutorials. - - - + + +

    - This tutorial is for users that have some experience using Freeplane. + # Tutorial-o-Matic Step by Step +

    +

    + +

    +

    + This guide contains step by step tutorials to learn hands on how to build tutorials using **Tutorial-o-Matic** +

    +

    + +

    +

    + 1. new map with a basic tutorial +

    +

    + 1. adding a tutorial to an existing map +

    +

    + 1. a tutorial with multiple pages +

    +

    + 1. adding actions +

    +

    +

    -
    -
    - - I hope you enjoy this! - - -### Edo - +
    - - - - + + + ## 1. Create a basic tutorial in a new mindmap + +In this tutorial you will learn how to create a new map containing a one page tutorial. + - - + + ## 2. xx + +xx + + + - - - - + + ## 3. xx + +xx + + + - - - - - - - - - - - - - + + + + + + + + +

    - In this section is a brief explanation about all the building components used to build tutorials with Tutorial-o-Matic. + # In this tutorial: +

    +

    + +

    +

    + In this tutorial you will learn how to build a one page tutorial into a new mind map.

    - I recommend to do the tutorials to fully understand this section. +

    -
    -
    - - -
    + +
    - - - + + +

    - Information + # How does ToM works? +

    +

    + +

    +

    + **Tutorial-o-Matic** use mindmaps to store the tutorial's information. +

    +

    + +

    +

    + To understand how to display a tutorial and its structure **Tutorial-o-Matic** needs that the map has some _special user styles_.   +

    +

    + It looks after the nodes that have such styles and builds the pages of the tutorials by using those nodes and their children information. +

    +

    + +

    +

    + All other nodes are ignored and you can use them to organize your tutorial, add notes and other information that won't be shown in the tutorial.  

    - One page +

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
    - - - - - - - - - - - + + + + +

    - bla bla bla + # Creating a new mind map +

    +

    + +

    +

    + To create a new mindmap that has the styles +

    +

    + needed to build a tutorial using **Tutorial-o-Matic** , you can use  +

    +

    + the command "**Create new tutorial mind map**".   +

    +

    + +

    +

    + You can get the same result by creating a new map using the "tutorial_styles_template"  as template map. +

    +

    +

    -
    -
    + +
    - - - - + + + - revisar estilos de nuevo mapa + ## Step 1: create a new tutorial able mind map + +You can do it yourself by clicking the menu command, +or click the 'Execute' button to let ToM do it for you. - - - - - + + + + +

    - bla bla bla + After creating the new map, click the "**Next page**" button to continue with the tutorial. +

    +

    +

    -
    + +
    - - + + + + + + As said before this new map has some _special styles_. + +Let's take a look at the **styles manager**. There you will see the **ToM** styles in the _user defined styles_ group. + +To close the **Styles manager** just press **escape** or click "**OK**" or "**Cancel**" + - - - - + + + + + + + +

    - bla bla bla + Ok, now is time to create the tutorial.   +

    +

    + +

    +

    + We first need a title for our tutorial. +

    +

    + +

    +

    + For that we will insert a new node that will have the tutorial's title as text and will contain the whole tutorial's information as nodes in it. +

    +

    +

    -
    -
    -
    - - - - -
    -
    + +
    - - - - - + + +

    - bla bla bla + # 1. Insert the tutorial's title node +

    +

    + +

    +

    + Ok. just insert a new node and write "my first tutorial" as its text. +

    +

    + +

    +

    + (If you want to skip this step, just click 'insert nodes') +

    +

    +

    -
    -
    -
    -
    - - - - - - - bla bla bla - + - - - - - - - - bla bla bla - - - + + - - - bla bla bla + + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! - - - - - - - + + + + +

    - information + # No tutorial in map

    - multiple pages + +

    +

    + Ok. that was kind of frustrating, but as said before, nodes need special styles to be recognized as part of the tutorial. +

    +

    + +

    +

    + To start a tutorial you have to: +

    +

    + +

    +

    +    *  Select the node that will be the root of the new tutorial +

    +

    +    *  Its text will be used as the title of the new tutorial +

    +

    +    *  Assign the style "ToM-Tutorial" to that node +

    +

    +

    -
    - - - - + +
    - - + + + + + + + + +

    + # Apply ToM_Tutorial style to your node +

    +

    + +

    +

    + Select the node you want to be your tutorial's title and apply the **ToM-Tutorial** style to it. +

    +

    + +

    + + +
    - - - - - + + - - - + + + +

    - actions + Apply the style to the node:

    - + + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + +
    +
    + + + + + + + + + + +

    + # No tutorial components ... +

    +

    + +

    +

    + Ok. that was kind of frustrating again. +

    +

    + +

    +

    + Let's put some information in the tutorial now!! +

    +

    + +

    + + +
    +
    +
    +
    +
    + + + + + + + + + + +

    + # "ToM_note" nodes +

    +

    + +

    +

    + To know what information from the map should be used as text in the information panels of the tutorial,  +

    +

    + **Tutorial-o Matic** looks for nodes with the **ToM_note** style and it uses the notes form their childnodes as information. +

    +

    + +

    + + +
    +
    + + + + + + +

    + You should do the following steps to add the first information to our tutorial +

    +
      +
    1. + Insert a childnode to the Tutorial node +
    2. +
    3. + Its text will be "info" (has no relevance) +
    4. +
    5. + apply style 'ToM_note' to it +
    6. +
    7. + add a child node to it +
    8. +
    9. + It's text will be "first panel" (has no relevance) +
    10. +
    11. + Write some text to its note (this is the information that will be shown) +
    12. +
    + +
    +
    + + + + + + +

    + You can do those steps by yourself and skip to the next page or use the following buttons to let ToM do the steps for you. +

    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + +

    + Ok. Let's apply the style to the node: +

    + +
    +
    +
    + + + + + + + + + + + + + + + +

    + Add a note
    Now you have to add a note to the node. +

    +

    + Follow the instructions to open a dialog where you can write the information. +

    +

    + Write something and click OK +

    + +
    +
    + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + +
    +
    +
    + + + + + + + + + + +

    + Now we will copy to the tutorial some othr 'ToM_note' nodes as examples so you can see other use cases +

    +

    + +

    +

    + The notes in the child nodes can be written using plain text, Html or Markdown, just as usual. +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + + + + + +

    + Welcome to the Tutorial-o-Matic demo!! +

    +

    + This is a demo version of an addon that can be used to build tutorials in Freeplane. +

    + +
    +
    +
    +
    + + + + + ## List examples + +### Simple list + +1. apples +1. bananas +1. oranges +1. lettuce +1. cucumber +1. tomatos +1. carrots + +### Structured list + +1. fruits + 1. apples + 1. bananas + 1. oranges + 1. tomatoes +1. salats + * lettuce + * cucumber + * tomatoes + * carrots + + + + + ## Table example + +|Name|this is the Age column|Badge| +|----|:----:|----| +|Piotr|25|![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png)| +|Maria|33|![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png)| +|Alex|45|![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png)| + + + + + + + + +

    + because it's not a direct child +

    + +
    + + The ![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png), the ![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png) and the ![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png) are from **[Graphic Burger](https://graphicburger.com/)** and can be found [here](https://graphicburger.com/71-free-animal-icons/). + +
    +
    + + ## Code block + +Code: **'example code'** + +```groovy +// example code +// the node's details must start with a dot and then the language of the code + +def text = node.text + +def msg = "the text of the selected node is ${text}" + +ui.informationMessage(msg.toString()) +``` + + + +
    +
    +
    + + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + + +
    + + + + + + + + + + +

    + # It's play time!! +

    +

    + +

    +

    + Now you can play with your map and see how the tutorial changes! +

    +

    + +

    +

    + For example: +

    +

    + +

    +

    + * reorder the 'ToM_note' nodes +

    +

    + * reorder their childnodes in them +

    +

    + * change the text in their notes +

    +

    + * duplicate some of the childnodes +

    +

    + * clone one of the childnodes and modify it +

    +

    + * etc +

    +

    + +

    +

    + Test each change any times you want! +

    +

    + +

    + + +
    +
    +
    + + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + + + + + + = "${node?.children[0]?.text}".toString() + + + + + + + +

    + "$0 " +

    + +
    + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + +
    + + + + + + + + + +

    + # Congratulations!! +

    +

    + +

    +

    + ## You have completed this tutorial!! +

    +

    + +

    +

    + (you can save your test map if you want, but you don't need to) +

    +

    + +

    + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + +

    + # Any mindmap can have its tutorials +

    +

    + +

    +

    + You can add a tutorial to any of your existing map. +

    +

    + +

    +

    + You can do it, for example, +

    +

    + +

    +

    + * to explain how the map is organized +

    +

    + * to add some recurrent commands +

    +

    + * to paste some standard nodes structures +

    +

    + * etc +

    +

    + +

    +

    + +

    +

    + Let's practice how to add a tutorial to an existing map. +

    +

    + +

    +

    + I prepared a map for this. Let's open it. +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + As said in previous tutorial, the map needs some _special styles_. + +Let's take a look at the **styles manager**. It has no **ToM** styles yet. + +To close the **Styles manager** just press **escape** or click "**OK**" or "**Cancel**" + + + + + + + + + + + + + + +

    + OK. Let's import the Tutorial-o-Matic styles +

    + +
    +
    +
    + + + + + Let's take a look at the **styles manager** again now. + +There you will see that the **ToM** styles have been added into the _user defined styles_ group. + +To close the **Styles manager** just press **escape** or click "**OK**" or "**Cancel**" + + + +
    + + + + + + + + + +

    + # Now you can add a tutorial using the steps seen in the previous tutorial +

    +

    + +

    +

    + I recommend you to complete the first tutorial if you haven't. +

    +

    + +

    +

    + In the following page we will add a sample tutorial, so we can see that it works in an existing map too. +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + # Select the node where you want to paste the sample tutorial +

    +

    + +

    +

    + Select any node in any branch and continue with the next steps. +

    +

    + +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + + +

    + This is just an example Tutorial +

    +

    + +

    +

    + I hope you understand the way it work. +

    +

    + You can move to the next tutorial. +

    +

    + +

    +

    + bye, +

    +

    + +

    +

    + Edo +

    + +
    +
    + + ## Table example + +|Name|this is the Age column|Badge| +|----|:----:|----| +|Piotr|25|![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png)| +|Maria|33|![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png)| +|Alex|45|![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png)| + + + + + + + + +

    + because it's not a direct child +

    + +
    + + The ![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png), the ![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png) and the ![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png) are from **[Graphic Burger](https://graphicburger.com/)** and can be found [here](https://graphicburger.com/71-free-animal-icons/). + +
    +
    + + ## Code block + +Code: **'example code'** + +```groovy +// example code + +def text = node.text +def msg = "the text of the selected node is ${text}" + +ui.informationMessage(msg.toString()) +``` + + + +
    +
    +
    + + + + + + + + + ### Ok. Now let's test it! + +Let's see our first tutorial!! + + + + + + + + + + + + + +

    + # Congratulations!! +

    +

    + +

    +

    + ## You have completed this tutorial!! +

    +

    + +

    +

    + (you can save your test map if you want, but you don't need to) +

    +

    + +

    + + +
    +
    +
    +
    +
    +
    + + + + + + + + + +

    + information +

    +

    + multiple pages +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + +

    + To prepare any existing mindmap to contain a tutorial, you have to add the special Tutorial-o-Matic styles to it. +

    +

    + +

    +

    + You get that by using the command "Import Tutorial-o-Matic Styles" +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    + + +
    + + + + + + + + +

    + If you want to divide your tutorial in multiple pages  you have two different options: +

    +
      +
    • + inserting "New page" nodes +
    • +
    • + inserting "Next page" nodes +
    • +
    +

    + You have to insert these nodes to indicate where the next page starts. +

    + +
    +
    + + + + + + +

    + "New page" nodes are used to indicate where a new page starts AND the title of this new page. +

    +

    + This title gets shown at the top of the page +

    +

    + +

    + +
    +
    + + + + + + +

    + "Next page" nodes only indicates where a new page starts but doesn't insert a new title to the tutorial +

    + +
    +
    + + + + + + +

    + With the same logic, when showing the Table of Content only "New page" titles are listed there. +

    + +
    +
    + + + + + + +

    + These nodes can be set between the other nodes or as parents of them. They just have to be "before" the others ("in breadth-first order") +

    +

    + +

    + +
    +
    +
    + + + + + + + + +

    + New Pages nodes +

    + +
    +
    + + + + + + +

    + To insert "New page" nodes, you have to +

    +
      +
    • + Select the desired node (its text will be used as title for that page) +
    • +
    • + Assign the style "ToM_newPage" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + +

    + Next Pages nodes +

    + +
    + + + + + + +

    + Edo +

    + +
    +
    +
    + + + + + + +

    + To insert "Next page" nodes, you have to +

    +
      +
    • + Select the desired node (its text doesn't affect the tutorial) +
    • +
    • + Assign the style "ToM_nextPage" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + To add a Table of Content (TOC) to your tutorial, you just have to: +

    +
      +
    • + Add a node +
    • +
    • + Assign the style "ToM-TOC" to that node +
    • +
    + +
    +
    +
    + + + + + + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + +

    + "Assign $0 style to selected node(s) directly" +

    + +
    + + + + + + = "Insert new **${node?.children[1]?.text}** node directly".toString() + + + + + + + +

    + "Insert new $1 node directly" +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + bla bla bla +

    + +
    +
    +
    + + + + + + + + + + + + + +

    + bla bla bla +

    + +
    +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + + +

    + actions +

    + +
    + + +
    + + + + + + + + + + + +

    + Editing mode +

    + +
    +
    + + To see a tutorial in "***Editing Mode***" +you need to add a "**crayon**" icon to the **Tutorial base node**. + + + +
    + + + + + + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + + + + + + + +

    + "Add a '$0' icon to the selected node(s) directly" +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + Tab Title +

    + +
    +
    + + + + + + +

    + You can assign the title of the tab where your tutorial will be shown. +

    +

    + To do this you have to add an attribute named "ToM_TabLabel" to your ToM-Tutorial node. +

    +

    + The value of that attribute will be shown as the tutorial's tab title. +

    +

    + You can add that attribute by yourself or copy it from the ToM-Tutorial style. +

    +

    + +

    + +
    +
    +
    + + + + + + + = "${node?.children[0]?.text} directly".toString() + + + + + + + +

    + "$0 directly" +

    + +
    +
    - - - - - diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm index 34845b3..dffcacc 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm @@ -4,13 +4,13 @@ - + - + - + @@ -92,8 +92,7 @@ I used a script to "build" it randomly.

    - -
    + @@ -176,7 +175,10 @@ - + + + + @@ -406,8 +408,7 @@ randomSeed: 33

    - - +
    From efc9ef6180e22c641f8c4efe037d114e7898ce02 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Fri, 6 May 2022 11:56:38 -0400 Subject: [PATCH 33/42] wip --- EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm | 5 +++-- .../zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm b/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm index 93f9bb2..4a4beb9 100644 --- a/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm +++ b/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm @@ -4,7 +4,7 @@ - + @@ -1087,7 +1087,8 @@ To add a Table of Content (TOC) to your tutorial, you just have to: }

    - + + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm index 52100ef..3e0ab51 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm @@ -174,9 +174,9 @@ - + - + From 19ad54d7f3ad9c26d261df41e15dd387f0c3ecba Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Sat, 7 May 2022 23:15:08 -0400 Subject: [PATCH 34/42] wip --- EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm | 4 ++-- EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm | 2 +- Tutorial-o-Matic/build.gradle | 2 +- .../zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm index e5f3ad3..6f10076 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm @@ -7,14 +7,14 @@ - + - + diff --git a/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm b/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm index 0e0b85a..f928e89 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-MaticCommands.mm @@ -7,7 +7,7 @@ - + diff --git a/Tutorial-o-Matic/build.gradle b/Tutorial-o-Matic/build.gradle index 340ea4e..99469e5 100644 --- a/Tutorial-o-Matic/build.gradle +++ b/Tutorial-o-Matic/build.gradle @@ -12,7 +12,7 @@ def freeplaneDirs = [ instaled : "C:/Program Files/Freeplane", protableApps : "C:/PortableApps/FreeplanePortable/App/Freeplane", v9_15 : "C:/Freeplane/freeplane-1.9.15-pre01", - v10_1 : "C:/Freeplane/freeplane-1.10.1-pre05" + v10_1 : "C:/Freeplane/freeplane-1.10.2" ] def freeplaneDir = freeplaneDirs[FPversion] diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm index b761354..7edba91 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm @@ -14,7 +14,7 @@ - + From 45a1b344f334250dfe38db543c21dcc0e001b584 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Sun, 24 Jul 2022 20:45:32 -0400 Subject: [PATCH 35/42] wip v0.0.7 --- .../LongTutorialExample_MDH.mm | 1298 + .../Tutorial-o-MaticStepByStep.mm | 99 +- README-Tutorial-o-Matic-MDH.mm | 1043 - README.MD | 129 + Tutorial-o-Matic.mm | 20813 ++++++++++++++++ Tutorial-o-Matic/Tutorial-o-Matic.mm | 10 +- Tutorial-o-Matic/build.gradle | 4 +- Tutorial-o-Matic/history.md | 2 + Tutorial-o-Matic/src/main/groovy/ToM.groovy | 16 +- .../Tutorial-o-Matic/LongTutorialExample.mm | 977 + .../Tutorial-o-MaticStepByStep.mm | 902 + 11 files changed, 24234 insertions(+), 1059 deletions(-) create mode 100644 EditingTutorialsWithMDH/LongTutorialExample_MDH.mm delete mode 100644 README-Tutorial-o-Matic-MDH.mm create mode 100644 Tutorial-o-Matic.mm create mode 100644 Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm diff --git a/EditingTutorialsWithMDH/LongTutorialExample_MDH.mm b/EditingTutorialsWithMDH/LongTutorialExample_MDH.mm new file mode 100644 index 0000000..ba1720b --- /dev/null +++ b/EditingTutorialsWithMDH/LongTutorialExample_MDH.mm @@ -0,0 +1,1298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pre { + background-color: #e5e7ff; + border-left: 5px solid #ccc; + display: block; + padding: 8px; + margin: 5px; +} +code { + font-family: Consolas,"courier new"; + font-size: 11px; + color: #999; +} + +blockquote { + border-left: 5px solid #cccccc; + background-color: #eeeeee; + padding: 8px; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webImageLink(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + +
    +
    +
    +
    +
    diff --git a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm index 610105d..d4dc1d0 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm @@ -4,7 +4,7 @@ - + @@ -281,7 +281,7 @@
    - + @@ -1283,6 +1283,95 @@ Write some text to its note (this is the information that will be shown) + + + + + + + + + + +

    + def nodos = c.selecteds +

    +

    + +

    +

    + nodos.each{n -> +

    +

    +     n.text = 'image Origami Bookmarks' +

    +

    +     n.link.text = n.link.text.takeBefore('?') + '?auto=webp&frame=1&width=500&height=500&fit=bounds' +

    +

    + } +

    + + +
    + + + + + + +

    + .groovy +

    + + +
    +
    + + + + + + +

    + def nodos = node.find{n -> n.style.name && n.style.name == 'MarkdownHelperNode' && n.text == 'Markdown document.md'} +

    +

    + +

    +

    + //def n = node +

    +

    + nodos.each{ n -> +

    +

    +    def newText = n.children.first().text.split(' ').take(5).join(' ') + ' ...' +

    +

    +    n.text = newText +

    +

    + } +

    + + +
    + + + + + + +

    + .groovy +

    + + +
    +
    +
    +
    @@ -1297,11 +1386,7 @@ Write some text to its note (this is the information that will be shown)

    - - - - - + diff --git a/README-Tutorial-o-Matic-MDH.mm b/README-Tutorial-o-Matic-MDH.mm deleted file mode 100644 index dfbce35..0000000 --- a/README-Tutorial-o-Matic-MDH.mm +++ /dev/null @@ -1,1043 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -pre { - background-color: #e5e7ff; - border-left: 5px solid #ccc; - display: block; - padding: 8px; - margin: 5px; -} -code { - font-family: Consolas,"courier new"; - font-size: 11px; - color: #999; -} - -blockquote { - border-left: 5px solid #cccccc; - background-color: #eeeeee; - padding: 8px; -} - - - - - - - - - - - - - - - - - -pre { - background-color: #e5e7ff; - border-left: 5px solid #ccc; - display: block; - padding: 8px; - margin: 5px; -} -code { - font-family: Consolas,"courier new"; - font-size: 11px; - color: #999; -} - -blockquote { - border-left: 5px solid #cccccc; - background-color: #eeeeee; - padding: 8px; -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - = edofro.MarkDownHelper.MDH.document(node) - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.textBlock(node) -

    - -
    - - - - - - -

    - Here I'm developing a $1 that will help users to create Tutorials for $2. -

    -

    - -

    -

    - It is in "work in progress" state, but I loaded a first addOn version that shows how it will work. It is a demo version. -

    -

    - -

    -

    - Look under $3 in this repository. -

    -

    - -

    - -
    - - - - - - -

    - = edofro.MarkDownHelper.MDH.webLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webLink(node) -

    - -
    - - -
    - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.list(node) -

    - -
    - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webImageLink(node) -

    - -
    - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.codeBlock(node) -

    - -
    - - - - - - -

    - import edofro.MarkDownHelper.MarkdownPreview -

    -

    - -

    -

    - new MarkdownPreview() -

    -

    - -

    -

    - def a = 5 -

    - -
    - - - - - - -

    - .groovy -

    - -
    -
    -
    - - =edofro.MarkDownHelper.MDH.plainTaskList(node) - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.document(node) -

    - -
    - - - - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webImageLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.fileLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - -
    - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.list(node) -

    - -
    - - - - - - - - - - - - - - - - -

    - 1. apples -

    -

    - 1. bananas -

    -

    - 1. oranges -

    -

    - 1. lettuce -

    -

    - 1. cucumber -

    -

    - 1. tomatos -

    -

    - 1. carrots -

    -

    - -

    - -
    -
    -
    - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.list(node) -

    - -
    - - - - - - - - - - - - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.list(node) -

    - -
    - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.fileLink(node) -

    - -
    - - -
    - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webImageLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - -
    -
    -
    -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.nestedTaskList(node) -

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - -

    - = edofro.MarkDownHelper.MDH.plainTaskList(node) -

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.table(node) -

    - -
    - - - - - - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - -
    - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - -
    - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - -
    - - - - - - - ![Bear.png](file:\C:\Users\Edo\Documents\GitHub\hello-world\resources\Animals%20Icons%20Set\Animals_png_small\mammals\Bear.png) - - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.codeBlock(node) -

    - -
    - - - - - - -

    - .groovy -

    - -
    - - - - - - -

    - // example code -

    -

    - // the node's details must start with a dot and then the language of the code -

    -

    - -

    -

    - def text = node.text -

    -

    - -

    -

    - def msg = "the text of the selected node is ${text}" -

    -

    - -

    -

    - ui.informationMessage(msg.toString()) -

    - - -
    -
    -
    -
    - - - - - - - -

    - = edofro.MarkDownHelper.MDH.textBlock(node) -

    - -
    - - - - - - -

    - The $1, the $2 and the $3 are from **$4** and can be found $5. -

    - -
    - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webLink(node) -

    - -
    - - -
    -
    -
    - - - - - - - -

    - = edofro.MarkDownHelper.MDH.comment(node) -

    - -
    - - - - - - - -

    - = edofro.MarkDownHelper.MDH.textBlock(node) -

    - -
    - - - - - - -

    - The $3, the $1 and the $2 are from **$4** and can be found $5. -

    - -
    - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webLink(node) -

    - -
    - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.webLink(node) -

    - -
    - - -
    -
    - - - - - - -

    - = edofro.MarkDownHelper.MDH.table(node) -

    - -
    - - - - - - - - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - -
    - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - -
    - - - - - - - - - -

    - = edofro.MarkDownHelper.MDH.imageLink(node) -

    - -
    - - -
    -
    -
    -
    - - - - -
    -
    -
    -
    diff --git a/README.MD b/README.MD index 6ac7504..5401385 100644 --- a/README.MD +++ b/README.MD @@ -18,3 +18,132 @@ Bye, edo +# Next tasks + +nullPendientesnull + - ToM v0.0.7 + - Freepla.Tutoria.Add.On + - Tuts w/ MDH + - [ ] Crear mapa Tutorial-o-MaticStepByStepActions.mm + - Tutoriale.acciones + - [ ] ToM_showMenu + - [ ] script de ayuda que llame a funcionalidad MDH para copiar mapas MDH clean + - [ ] *debe además quitar "Crayon" de mapa?* + - [ ] *si mapa no tiene nodos MDH, debería copiarlo igualmente, para asegurar que todos los mapas que están en una carpeta se copian a la otra definitiva* + - [ ] *script que lo aplique a todos los mapas de una carpeta* + - [ ] Delete MDH Styles from map + - hacer.tutoria.paso.paso + - [ ] Tutorial Crayon + - [ ] **Tutorial : organizing a tutorial in multiple pages (working on it)** + - [ ] **Ojo:
    puede ser que requiera que sea copiado pra poder usar opción "select node"** + - [ ] Link a tutoriales Acciones en WIP + - [ ] Mejorar ReadMe.MD + - ToM Future A + - Freepla.Tutoria.Add.On + - ToM + - lib + - ToM_actions.groovy + - ToM_showMenu + - [ ] ToM_showMenu: tras un par de segundos debe desaparecer + - ToM_groovy + - [ ] ToM_groovy: usa texto de nodos para panel + - ToM_copy + - [ ] ToM_copy: debe usar texto de la nota del nodo tom_copy + - ToM_select + - [ ] ToM_select: debe usar texto de la nota del nodo tom_select + - ToM_openMap + - [ ] ToM_openMap: debe usar texto de la nota del nodo + - ToM_showNode + - [ ] ToM_showNode: se usa el texto de los nodo hijos para armar el texto del panel (REVISAR) + - ToM_openTutMap + - [ ] ToM_openTutMap: debería usar texto de nota y si no existe tirar el texto por default + - nuevas + - [ ] botón Previous page + - icons + - [ ] agregar icono Tutorial-o-Matic + - Tuts w/ MDH + - [ ] Agregar mapa con nodos ejemplos + - ToM Future B + - Freepla.Tutoria.Add.On + - ToM + - lib + - ToM_actions.groovy + - [ ] Manage errors (message) + - [ ] *ActionNode* + - [ ] *groovyNode* + - [ ] *mensaje de error* + - [ ] *Log a log.0* + - nuevas + - [ ] accion displayMarkdownFile + - [ ] *desde disco* + - [ ] *desde web* + - [ ] *acción displayWebPage* + - ToM_ui.groovy + - [ ] Crear nuevo buttonPanel más compacto + - Tuts w/ MDH + - [ ] copiar panel de MoM + - Apuntes + - [ ] definir si un mapa para practica:
    ¿se permite sobreescribir (para guardar avance)? + - [ ] Funcionalidad MDH:
    Comando para 'actualizar' la nota a un nodo con link a un nodo MDH y copia su contenido + - ToM Future C + - Freepla.Tutoria.Add.On + - ToM + - lib + - ToM_actions.groovy + - ToM_groovy + - [ ] agregar botón opcional en groovyPanel que permita abrir script en groovyConsole + - [ ] Agregar comado que abra console con script en texto pero sin asociar nodo y que fuente sea opcional + - [ ] incluye dentro del marco + - [ ] incluir permisos aceptados en preferencias + - [ ] encapsular ejecución de script sólo con permisos aceptados + - [ ] exe scripts + - nuevas + - [ ] groovy console + - [ ] *agregar como acceder a listado de tutoriales de mapa* + - [ ] *crear estilo que inserte addTutorialsPane en página* + - [ ] *como pane automáticamente en última página* + - [ ] *crear estilo que agregue un buttonPane ...* + - ToM_ui.groovy + - [ ] Tutorial debe poder partir en toolPane o en Window propia + - [ ] Build a buttonPanel + - [ ] Tomar formatos panel desde userStyles + - [ ] revisar textos UI + - [ ] *revisar y hacer listado* + - [ ] *transformar en variables* + - [ ] *transformar en textos traducibles* + - [ ] *definir Opción* + - [ ] *definir lógica* + - [ ] *Acción Editorpane* + - [ ] *Acción newPage* + - doc + - [ ] Actualizar Tutorial Sample.mm + - Tuts w/ MDH + - [ ] modificar MoM + - ToM Future D + - Freepla.Tutoria.Add.On + - ToM + - lib + - ToM_actions.groovy + - ToM_showMenu + - [ ] *si dos acciones seguidas coinciden en algún menu entonces no se cierra menu completamente* + - nuevas + - [ ] *Desplegar mensaje inferior a pedido* + - [ ] - I agree with your goals of showing a mouse cursor and allowing the tutorial to execute actions. Even better, though, would be a way to wait and "listen" for the user to click on the action and have the tutorial pause until they do the right thing. If it's just showing the user what to do rather than teaching them what to do and having them do it, it's not really a tutorial, but more like a way to create instructional videos using Freeplane (which would not be a bad thing, of course!). Tutorial means the user is following along and doing stuff. + - [ ] *agregar comentarios en código con descripción de cda método* + - build.gradle + - [ ] hacer que Gradle acceda a librerías desde Freeplane o desde Maven + - [ ] jsoup + - [ ] markedj + - [ ] groovyNode + - Apuntes + - [ ] *hacer wiki?* + - [ ] Lastly, the only way to get proper feedback on this addon is to ask some people to actually use it to create tutorials for things. You might use it to try to create a tutorial for something that is *not* directly related to this addon, like a tutorial on how to change node width and save that change to the standard template. Only then will you get a sense of what this type of tool must be able to do. + - ToM Future E + - Freepla.Tutoria.Add.On + - ToM + - lib + - ToM_actions.groovy + - nuevas + - [ ] *Tutorial mouse arrow moves on the screen and shows where to click (not the actual mouse arrow, a simulated one)* + - [ ] *imita escribir en nodo* + diff --git a/Tutorial-o-Matic.mm b/Tutorial-o-Matic.mm new file mode 100644 index 0000000..4d6adce --- /dev/null +++ b/Tutorial-o-Matic.mm @@ -0,0 +1,20813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + null +

    +

    + +

    +

    + ================ MDI ===================== +

    +

    + +

    +

    + The import of files and folders can be adapted by providing various options in the attributes of the BaseFolder node: +

    +

    + +

    +

    + ----------------------------------------------------- +

    +

    +     -- nameFilter: +

    +

    + ----------------------------------------------------- +

    +

    +        A filter to perform on the name of traversed files. If set, only files which match are brought. +

    +

    +         This option allowes four types of inputs: +

    +

    +            1. nothing (empty) means no filtering (default) +

    +

    +            2. regex                   - example:       ~/.*\.mp3/ +

    +

    +            3. 'simplified' regex    - example:       ~.*\.mp3 +

    +

    +            4. string with *          - example:       *.mp3    (equivalent to regex      ~/(?i).*\.mp3/  ) +

    +

    +            5. list of strings with * and ;         - example:       *.mp3;*.png   (equivalent to regex      ~/(?i)(.*\.mp3|.*\.png)/  ) +

    +

    + +

    +

    + ----------------------------------------------------- +

    +

    +   -- maxDepth: +

    +

    + ----------------------------------------------------- +

    +

    +        The maximum number of directory levels when recursing +

    +

    +         (default is -1 which means no limit, set to 0 for no recursion) +

    +

    + +

    +

    + +

    +

    + +

    +

    + ----------------------------------------------------- +

    +

    +   -- markWhenMoved: +

    +

    + ----------------------------------------------------- +

    +

    +        change styles to moved/renamed file Nodes +

    +

    + +

    +

    +  set to: +

    +

    +     0 : to change style only if node hasn't a previous one (default), +

    +

    + +

    +

    +     1 : to allways change the style, +

    +

    + +

    +

    +    -1 : to never change the style +

    +

    + +

    +

    +     +

    +

    + +

    +

    + ----------------------------------------------------- +

    +

    +   -- checkIfReallyBroken: +

    +

    + ----------------------------------------------------- +

    +

    +        Check if existing nodes pointing to filtered files still exist.  +

    +

    +        This option is only useful if you defined a nameFilter before  +

    +

    +        but in the map there are also some files that doesn't match  +

    +

    +        this filter definition  +

    +

    +        (for example if you brought them manually or import them  +

    +

    +        before the actual namefilter setting)   +

    +

    + +

    +

    +     - default is 0 which means don't check --> Mark node as missing also if it doesn't match the current filter, +

    +

    + +

    +

    +     - set to 1 to extra check if a not matching file still exists in drive  +

    +

    + +

    +

    + +

    +

    + ========================================== +

    +

    +     +

    + +
    + + + + + + +

    + en orden de prioridad +

    + +
    + + + + + + +

    + notebook edo +

    + +
    + + + + +
    + + + + + + +

    + disco externo D: +

    + +
    +
    +
    + + + + + + + + + + + + + + + + + + +

    + package edofro.MarkDownHelper +

    +

    + +

    +

    + //region: imports +

    +

    + +

    +

    + import groovy.swing.SwingBuilder +

    +

    + import javax.swing.* +

    +

    + import java.awt.* +

    +

    + +

    +

    + 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.core.ui.components.UITools +

    +

    + import org.freeplane.plugin.script.proxy.ScriptUtils +

    +

    + +

    +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + +

    +

    + //end: +

    +

    + +

    +

    + class MarkdownPreview { +

    +

    + +

    +

    +     //region: properties +

    +

    +      +

    +

    +     SwingBuilder swing = new SwingBuilder() +

    +

    +     def dialogName = 'frameNota' +

    +

    +     def myPaneName = 'myContentPanel' +

    +

    +     def iniMsg = '----- select the node with the note you want to view and click the button ----' +

    +

    +     def c = ScriptUtils.c() +

    +

    +     final String htmlStyle         = +

    +

    +         """ +

    +

    +             table {border: 0; border-spacing: 0;} +

    +

    +             th, td {border: 1px solid;} +

    +

    +             pre { +

    +

    +                 background-color: rgb(230, 230, 230); +

    +

    +                 border: 1px solid rgb(0, 0, 0); +

    +

    +                 display: block; +

    +

    +                 padding: 10px; +

    +

    +             } +

    +

    +             code { +

    +

    +                 font-family: Consolas,"courier new"; +

    +

    +                 color: rgb(0, 80, 0); +

    +

    +             } +

    +

    +         """ +

    +

    +      +

    +

    +     //end: +

    +

    + +

    +

    +     //region: constructor +

    +

    +      +

    +

    +     public MarkdownPreview(){ +

    +

    +          +

    +

    +         def contentPane = swing.panel( +

    +

    +                 name: myPaneName, +

    +

    +                 layout: new GridBagLayout(), +

    +

    +                 background: Color.gray, +

    +

    +             ){} +

    +

    + +

    +

    +         def notePane = tomui.createInstructionsPane(iniMsg) +

    +

    + +

    +

    +         //return notePane.text +

    +

    + +

    +

    +         contentPane.add(notePane, tomui.GBC) +

    +

    + +

    +

    +         def sp = tomui.createScrollPaneForContentPane(contentPane) +

    +

    + +

    +

    + +

    +

    +         def buttonPanel = { +

    +

    +            swing.panel(constraints : BorderLayout.NORTH) { +

    +

    +               toggleButton( +

    +

    +                   text : 'Activate Listener', +

    +

    +                   margin      : new Insets(10,15,10,15), +

    +

    +                   actionPerformed : {e -> +

    +

    +                         def bttn = e.source +

    +

    +                         bttn.text = activateListener(notePane, c.selected) +

    +

    +                  } +

    +

    +               ) +

    +

    +            } +

    +

    +         } +

    +

    + +

    +

    +         def noteFrame = swing.frame( +

    +

    +             title : 'Markdown Note', +

    +

    +             //id:'myDialog', +

    +

    +             name: dialogName, +

    +

    +            // modal:false, +

    +

    +             locationRelativeTo:UITools.frame, +

    +

    +             preferredSize: new Dimension(450,400), +

    +

    +            // owner:UITools.frame, +

    +

    +             defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, +

    +

    +             pack : true, +

    +

    +             show : true, +

    +

    +         ) { +

    +

    +             buttonPanel() +

    +

    + +

    +

    +         } +

    +

    + +

    +

    +         //noteFrame.add(createActivateButtonPane()) +

    +

    +         noteFrame.add(sp) +

    +

    +     } +

    +

    +      +

    +

    +     //end: +

    +

    +      +

    +

    +     //region: methods +

    +

    + +

    +

    +     def activateListener(comp, nodo){ +

    +

    +         def mapController = Controller.currentModeController.mapController; +

    +

    +         def listenerFound = false; +

    +

    + +

    +

    +         (mapController.nodeChangeListeners.findAll { it.class.name == MyNodeChangeListener.class.name }).each { +

    +

    +             mapController.removeNodeChangeListener(it); +

    +

    +             listenerFound = true; +

    +

    +         } +

    +

    + +

    +

    +         if (listenerFound) { +

    +

    +             comp.text = iniMsg +

    +

    +             return 'Listener deactivated..' +

    +

    +         } +

    +

    + +

    +

    +         def myChgListener = new MyNodeChangeListener(comp, nodo ); +

    +

    +         mapController.addNodeChangeListener(myChgListener); +

    +

    +         comp.text = getHtmlFromNote(nodo) +

    +

    +         return nodo.text.take(30) +

    +

    +     } +

    +

    +      +

    +

    +     def getHtmlFromNote(nodo){ +

    +

    +         if(!nodo.note) return null +

    +

    +         def noteType = nodo.noteContentType +

    +

    +         def html +

    +

    +         switch (noteType){ +

    +

    +             case ['auto','html']: +

    +

    +                 html = nodo.plainNote.startsWith('=')?nodo.note.plain:nodo.note.html +

    +

    +                 break +

    +

    +             case 'markdown': +

    +

    +                 html = """<html> +

    +

    +                             <style>${htmlStyle}</style> +

    +

    +                             <body> +

    +

    +                                 ${Marked.marked(nodo.note.plain)} +

    +

    +                             </body> +

    +

    +                         </html>""" +

    +

    +                 break +

    +

    +             default: +

    +

    +                 html = "Node's note not recognized" +

    +

    +                 break +

    +

    +         } +

    +

    +         return html +

    +

    +     } +

    +

    + +

    +

    +      +

    +

    +     //end: +

    +

    +      +

    +

    +     //region: Listeners +

    +

    + +

    +

    +     class MyNodeChangeListener implements INodeChangeListener { +

    +

    +         def comp; +

    +

    +         def node; +

    +

    + +

    +

    +         MyNodeChangeListener(def component, nodo) { +

    +

    +             comp = component; +

    +

    +             node = nodo; +

    +

    +         } +

    +

    + +

    +

    +         public void nodeChanged(NodeChangeEvent event) { +

    +

    +             Object property = event.property +

    +

    +             def id = event.node.getID() +

    +

    +             if (id == node.id) { +

    +

    +                 comp.text = getHtmlFromNote(node) +

    +

    +             } +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    + +

    +

    +     //end: +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + } +

    +

    + +

    +

    + //tomui.createScrollPaneForContentPane +

    +

    + //tomui.createInstructionsPane(iniMsg) +

    +

    + //tomui.GBC +

    + +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + package edofro.tutorialomatic +

    +

    + +

    +

    + import org.freeplane.core.ui.components.UITools as ui +

    +

    + import org.freeplane.core.util.MenuUtils        as menuUtils +

    +

    + +

    +

    + class TabPane{ +

    +

    + //region: properties +

    +

    +     def static tabPane = ui.freeplaneTabbedPanel +

    +

    + +

    +

    + //end: +

    +

    + +

    +

    + //region: methods +

    +

    + +

    +

    +     def static removeTab(String tabName, boolean hideTabPane = false){ +

    +

    +         def index   = tabPane.indexOfTab(tabName) +

    +

    +         //eliminar +

    +

    +         if (index >= 0) { +

    +

    +             tabPane.removeTabAt(index) +

    +

    +             def previousTab = tabPane.hasProperty('previousTab')? tabPane.previousTab : 0 +

    +

    +             previousTab = previousTab >= tabPane.tabCount? 0 : previousTab +

    +

    +             tabPane.setSelectedIndex(previousTab) +

    +

    +             if(hideTabPane && tabPane.isShowing()) { +

    +

    +                 menuUtils.executeMenuItems(['ShowFormatPanel']) +

    +

    +             } +

    +

    +             return true +

    +

    +         } else return false +

    +

    +     } +

    +

    + +

    +

    +     def static showTab(String tabName){ +

    +

    +         //if tabPanel is not showing --> show +

    +

    +         if(!tabPane.isShowing()) { +

    +

    +             menuUtils.executeMenuItems(['ShowFormatPanel']) +

    +

    +         } +

    +

    +         // remembers selected tab number +

    +

    +         def previousTab = tabPane.selectedIndex +

    +

    +         if (tabPane.hasProperty('previousTab')){ +

    +

    +             tabPane.previousTab = previousTab +

    +

    +         } else { +

    +

    +             tabPane.metaClass.previousTab = previousTab +

    +

    +         } +

    +

    +         // look if tab exists +

    +

    +         def index = tabPane.indexOfTab(tabName) +

    +

    +         if (index>=0) { +

    +

    +             tabPane.selectedIndex = index +

    +

    +             return true +

    +

    +         } else return false +

    +

    +     } +

    +

    + +

    +

    +     def static addTab(String tabName, componente){ +

    +

    +         tabPane.addTab(tabName, componente) +

    +

    +     } +

    +

    + +

    +

    +     def static hasTab(String tabName){ +

    +

    +         def index = tabPane.indexOfTab(tabName) +

    +

    +         return ( index >= 0 ) +

    +

    +     } +

    +

    + +

    +

    +     def static getTab(String tabName){ +

    +

    +         def index = tabPane.indexOfTab(tabName) +

    +

    +         if (index>=0) { +

    +

    +             return tabPane.getComponentAt(index) +

    +

    +         } else { +

    +

    +             return null +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static repaint(){ +

    +

    +         tabPane.repaint() +

    +

    +     } +

    +

    + //end: +

    +

    + } +

    + +
    + + + + + + + + +

    + def tabName = 'Tutorial' +

    +

    + +

    +

    + def tabPane = ui.freeplaneTabbedPanel +

    +

    + def index = tabPane.indexOfTab(tabName) +

    +

    + +

    +

    + //eliminar +

    +

    + if(index >= 0) { +

    +

    +     tabPane.removeTabAt(index) +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + def tabPane = ui.freeplaneTabbedPanel +

    +

    + +

    +

    + if(!tabPane.isShowing()) { +

    +

    +     menuUtils.executeMenuItems(['ShowFormatPanel']) +

    +

    + } +

    +

    + +

    +

    + def tabName = 'Tutorial' +

    +

    + def index = tabPane.indexOfTab(tabName) +

    +

    + if (index>=0) { +

    +

    +     tabPane.selectedIndex = index +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import groovy.swing.SwingBuilder +

    +

    + +

    +

    + import java.awt.Color +

    +

    + import java.awt.Font +

    +

    + +

    +

    + def tabName = 'Tutorial' +

    +

    + +

    +

    + def tabPane = ui.freeplaneTabbedPanel +

    +

    + +

    +

    + +

    +

    + SwingBuilder swing = new SwingBuilder() +

    +

    + def panel = swing.panel(){ +

    +

    +     label( +

    +

    +         text : "Hola, hola", +

    +

    +         font : new Font("Agency FB", Font.BOLD, 64), +

    +

    +         foreground: Color.magenta, +

    +

    +     ) +

    +

    + } +

    +

    +      +

    +

    + +

    +

    + +

    +

    + tabPane.addTab('Tutorial', panel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    + + + + + + + +

    + import org.freeplane.plugin.script.FreeplaneScriptBaseClass.ConfigProperties +

    +

    + +

    +

    + ConfigProperties config = new ConfigProperties() +

    +

    + String  panelSizeProperty = 'styleScrollPaneVisible.size' +

    +

    + def lastSize = config.getIntProperty(panelSizeProperty) +

    +

    + +

    +

    + //return lastSize +

    +

    + +

    +

    + def tabPane = ui.freeplaneTabbedPanel +

    +

    + +

    +

    + //tabPane.width = 500  // <-- no funciona, es read only +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    +
    + + + + + + + +

    + .groovy +

    + +
    + + + + + + +

    + import edofro.tutorialomatic.TabPane +

    +

    + +

    +

    + +

    +

    + // crear panel +

    +

    + import groovy.swing.SwingBuilder +

    +

    + import java.awt.Color +

    +

    + import java.awt.Font +

    +

    + SwingBuilder swing = new SwingBuilder() +

    +

    + def panel = swing.panel(){ +

    +

    +     label( +

    +

    +         text : "Hola, hola", +

    +

    +         font : new Font("Agency FB", Font.BOLD, 64), +

    +

    +         foreground: Color.magenta, +

    +

    +     ) +

    +

    + } +

    +

    + +

    +

    + +

    +

    + +

    +

    + TabPane.addTab('Tutorial', panel) +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.TabPane +

    +

    + +

    +

    + +

    +

    + TabPane.removeTab('Tutorial') +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.TabPane +

    +

    + +

    +

    + +

    +

    + TabPane.showTab('Tutorial') +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    +
    + + + + + + + + + + + + +

    + package edofro.tutorialomatic +

    +

    + +

    +

    + //import edofro.tutorialomatic.ToM_ui +

    +

    + +

    +

    + import org.freeplane.core.ui.components.UITools         as ui +

    +

    + import org.freeplane.core.util.MenuUtils                as menuUtils +

    +

    + import org.freeplane.core.util.TextUtils                as textUtils +

    +

    + import org.freeplane.core.util.HtmlUtils                as htmlUtils +

    +

    + import org.freeplane.plugin.script.proxy.ScriptUtils +

    +

    + +

    +

    + class ToM_actions{ +

    +

    +     // region: definitions +

    +

    + +

    +

    +     static final c = ScriptUtils.c() +

    +

    +     static final name = 'tutorialOMatic' +

    +

    +     static final actionInstruction1 = "addons.${name}.ActionInstruction1" +

    +

    +     static final actionInstruction2 = "addons.${name}.ActionInstruction2" +

    +

    +     static final enum ex{ muted, showHotKeys, showMenu } +

    +

    +     static final int pausa = 400 +

    +

    + +

    +

    +     static boolean waiting = false +

    +

    + +

    +

    + +

    +

    +     // end: definitions +

    +

    + +

    +

    + +

    +

    +     // ----------------- Methods ------------------------------------- +

    +

    + +

    +

    +     // region: execute actions +

    +

    +         //methods to execute actions showing (or not) menu commands or hotkeys related to action +

    +

    + +

    +

    +     def static execute(String accion){ +

    +

    +         def acciones =[] + accion +

    +

    +         execute(acciones) +

    +

    +     } +

    +

    + +

    +

    +     def static execute(java.util.ArrayList acciones){ +

    +

    +         menuUtils.executeMenuItems(acciones) +

    +

    +     } +

    +

    + +

    +

    +     def static executeAction(infoAccion , how){ +

    +

    +         waiting = true +

    +

    +         def timer = new Timer() +

    +

    +         c.statusInfo = " ToM: Executing '${infoAccion.label}' " +

    +

    +         switch(how){ +

    +

    +             case ex.muted       : +

    +

    +                 execute(infoAccion.action) +

    +

    +                 waiting = false +

    +

    +                 break +

    +

    +             case ex.showHotKeys : +

    +

    +                 //looks if it has defined hotKeys +

    +

    +                 if(infoAccion.keyStroke){ +

    +

    +                     def msgDisplayTime = 1000 +

    +

    +                     ToM_ui.showTextMessage("${infoAccion.keyStroke} : ${infoAccion.label}".toString(),msgDisplayTime) +

    +

    +                     execute(infoAccion.action) +

    +

    +                     timer.runAfter(msgDisplayTime + 50){ +

    +

    +                         waiting = false +

    +

    +                     } +

    +

    +                     break // break is here, because if the action has not defined Hotkeys then it should show the menu way +

    +

    +                 } +

    +

    +             case ex.showMenu    : +

    +

    +                 closeMenus(infoAccion.action) +

    +

    +                 openMenus(infoAccion.action, pausa) +

    +

    +                 def espera = (infoAccion.path.size()*2)*pausa +

    +

    +                 timer.runAfter(espera){ +

    +

    +                     execute(infoAccion.action) +

    +

    +                     closeMenus(infoAccion.action) +

    +

    +                     waiting = false +

    +

    +                 } +

    +

    +                 break +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static executeActions(infoAccions , how){ +

    +

    +         if(infoAccions){ +

    +

    +             if(!waiting){ +

    +

    +                 def infoAccion = infoAccions[0] +

    +

    +                 executeAction(infoAccion , how) +

    +

    +                 executeActions(infoAccions.drop(1) , how) +

    +

    +             } else { +

    +

    +                 def timer = new Timer() +

    +

    +                 timer.runAfter(200){ +

    +

    +                     executeActions(infoAccions , how) +

    +

    +                 } +

    +

    +             } +

    +

    +         } else { +

    +

    +             if(!waiting){ +

    +

    +                 c.statusInfo = " ToM: Ready!! " +

    +

    +             } else { +

    +

    +                 def timer = new Timer() +

    +

    +                 timer.runAfter(200){ +

    +

    +                     executeActions(infoAccions , how) +

    +

    +                 } +

    +

    +             } +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: getting label / keyStroke / toolTipText from menuEntry +

    +

    +         //getting info from menuEntry +

    +

    + +

    +

    +     def static getKeyStroke(myMenuEntry){ +

    +

    +         def kS = myMenuEntry.keyStroke +

    +

    +         return kS?menuUtils.formatKeyStroke(kS).replace('+',' + '):null +

    +

    +     } +

    +

    + +

    +

    +     def static getLabel(mME){ +

    +

    +         mME.label +

    +

    +     } +

    +

    + +

    +

    +     def static getToolTip(mME){ +

    +

    +         mME.toolTipText +

    +

    +     } +

    +

    + +

    +

    +     def static getMenuPath(path){ +

    +

    +         path[1..-2]*.label.join("'->'") +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: getting information for action +

    +

    +         // building a map [:] for each action with its information +

    +

    + +

    +

    +     def static getActionInfoMap(org.freeplane.plugin.script.proxy.NodeProxy nodo){ +

    +

    +         def accion = action(nodo) +

    +

    +         getActionInfoMap(accion) +

    +

    +     } +

    +

    + +

    +

    +     def static getActionInfoMap(String accion){ +

    +

    +         def miPath    = getMenuEntryPath(accion) +

    +

    +         if (!miPath) { return null } +

    +

    +         Map myAction = [:] +

    +

    +         myAction +

    +

    +                  << [ action     : accion                        ] +

    +

    +                  << [ path       : miPath                        ] +

    +

    +                  << [ keyStroke  : getKeyStroke(miPath[-1])      ] +

    +

    +                  << [ label      : getLabel(miPath[-1])          ] +

    +

    +                  << [ menuPath   : getMenuPath(miPath)           ] +

    +

    +                  << [ toolTip    : getToolTip(miPath[-1])        ] +

    +

    +         def instr1    = textUtils.format(actionInstruction1, apos(myAction.menuPath), apos(myAction.label)) +

    +

    +         def instr2    = myAction.keyStroke?textUtils.format(actionInstruction2, apos(myAction.keyStroke)):"" +

    +

    +         myAction << [ instructions : instr2?htmlUtils.join(instr1,"", instr2).replace('\n',''):instr1 ] +

    +

    +         return myAction +

    +

    +     } +

    +

    + +

    +

    +     def static apos(String texto){ +

    +

    +         return "\'" + texto + "\'" +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: getting actions from nodes +

    +

    +         //getting actions from nodes +

    +

    + +

    +

    +     def static action(n){ +

    +

    +         return (n.link?.uri?.scheme == 'menuitem')?n.link.uri.schemeSpecificPart.drop(1):null +

    +

    +     } +

    +

    + +

    +

    +     def static hasAction(n){ +

    +

    +         return (n.link?.uri?.scheme == 'menuitem') +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: getting MenuEntryTree +

    +

    +         // getting MenuEntryTree +

    +

    + +

    +

    +     def static getMenuEntryPath(miAccion){ +

    +

    +         return getMenuEntryPath(getMenuEntryTree(), miAccion) +

    +

    +     } +

    +

    + +

    +

    +     def static getMenuEntryTree(){ +

    +

    +         def menuName = "main_menu" +

    +

    +         //    menuName = 'view' +

    +

    +         return menuUtils.createMenuEntryTree(menuName) +

    +

    +     } +

    +

    + +

    +

    +     def static getMenuEntryPath(mTree, miAccion){ +

    +

    +         def path +

    +

    + +

    +

    +         // ver si hijos leaf contiene accion +

    +

    +         def menuCommand = mTree.children.findAll{it.leaf}?.find{it.userObject.key == miAccion} +

    +

    +         // alguno? +

    +

    +         if (menuCommand){ +

    +

    +                 // devolver MenuEntry +

    +

    +                 return [] + mTree.userObject  + menuCommand.userObject +

    +

    +         } +

    +

    + +

    +

    +         // no +

    +

    +             // sacar lista hijos no leaf +

    +

    +         def hijosNoLeaf = mTree.children.findAll{!it.leaf} +

    +

    +         // si hay +

    +

    +         if (hijosNoLeaf){ +

    +

    +             // recursivo +

    +

    +             hijosNoLeaf.each{ mT -> +

    +

    +                 if(!path){ +

    +

    +                     path = getMenuEntryPath(mT, miAccion) +

    +

    +                 } +

    +

    +             } +

    +

    +             if(path){ +

    +

    +                 return [] + mTree.userObject  + path +

    +

    +             } else { +

    +

    +                 return null +

    +

    +             } +

    +

    +         } +

    +

    +         // si no hay, devolver null +

    +

    +         return null +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: displaying submenus +

    +

    +         //methods for displaying submenus from menubar +

    +

    + +

    +

    +     def static openMenus(accion, timeLapse){ +

    +

    +         timeLapse = timeLapse<25?25:timeLapse>3000?3000:timeLapse +

    +

    +         def menuPath = getMenuEntryPath(accion).drop(1)*.label +

    +

    +         def subMenu = ui.frame.JMenuBar.components.find{it.text == menuPath[0]} +

    +

    +         subMenu.armed = true +

    +

    + +

    +

    +         def timer = new Timer() +

    +

    +         menuPath.drop(1).eachWithIndex{menuItem, i -> +

    +

    +             timer.runAfter(2 * (i + 1) * timeLapse) { +

    +

    +                 if(subMenu instanceof javax.swing.JMenu){ +

    +

    +                     subMenu.popupMenuVisible = true +

    +

    +                     def tempMenu = subMenu.menuComponents.find{it.hasProperty('text') && it.text == menuItem} +

    +

    +                     def max = 0 +

    +

    +                     while (!tempMenu && max <15) { +

    +

    +                         subMenu = subMenu.menuComponents.find{it.hasProperty('text') && it.text == ' '} +

    +

    +                         subMenu.popupMenuVisible = true +

    +

    +                         tempMenu = subMenu.menuComponents.find{it.hasProperty('text') && it.text == menuItem} +

    +

    +                         max++ +

    +

    +                     } +

    +

    +                     subMenu = tempMenu +

    +

    +                 } +

    +

    +                 sleep(timeLapse) +

    +

    +                 subMenu?.armed = true +

    +

    +             } +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static closeMenus(accion){ +

    +

    +         def componentes = getMenuComponents(accion)//.takeRight(2) // mod +

    +

    +         componentes.reverse().each{com -> +

    +

    +             if(com instanceof javax.swing.JMenu){ +

    +

    +                 com.popupMenuVisible = false +

    +

    +             } +

    +

    +             com?.armed = false +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static isMenuItemVisible(accion){ +

    +

    +         def m = getMenuComponents(accion)[-1] +

    +

    +         return m && m.showing // && m.armed +

    +

    +     } +

    +

    + +

    +

    +     def static getMenuComponents(accion){ +

    +

    +         def menuPath = getMenuEntryPath(accion).drop(1)*.label +

    +

    +         def subMenu = ui.frame.JMenuBar.components.find{it.text == menuPath[0]} +

    +

    + +

    +

    +         def componentes = [] + subMenu +

    +

    +         menuPath.drop(1).each{menuItem -> +

    +

    +             subMenu = subMenu?.menuComponents.find{it.hasProperty('text') && it.text == menuItem} +

    +

    +             componentes += subMenu +

    +

    +         } +

    +

    +         return componentes +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: working with nodes +

    +

    +         //TODO: WIP simulateTextInputInNode +

    +

    + +

    +

    +     def static simulateTextInputInNode(nodo, texto, timeLapse, step){  //TODO: find a way that doesn't fire listener until the end +

    +

    +         def timer = new Timer() +

    +

    +         c.select(nodo)              //TODO: what if nodo is not visible? +

    +

    +         for(def i = 0 ; i <= texto.size() + step; i += step){ +

    +

    +             def subTexto = texto.take(i) +

    +

    +             timer.runAfter(i * timeLapse) { +

    +

    +                 nodo.text = subTexto +

    +

    +             } +

    +

    +         } +

    +

    +         timer.runAfter((texto.size()/step * timeLapse) as int) { +

    +

    +             c.select(nodo) +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    + } +

    + +
    + + + + + + + + +

    + .groovy +

    + +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + +

    +

    + def n = node +

    +

    + +

    +

    + def resultado = toma.hasAction(n) +

    +

    + +

    +

    + ui.informationMessage("selected node has link to action? :  $resultado".toString()) +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + +

    +

    + def n = node +

    +

    + +

    +

    + def resultado = toma.action(n) +

    +

    + +

    +

    + ui.informationMessage("selected node has link to  :   $resultado".toString()) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + +

    +

    + def nodo = node +

    +

    + +

    +

    + if (!toma.hasAction(nodo)) return 'no link to menu action in selected node' +

    +

    + +

    +

    + def accion = toma.action(nodo)//.toString()) +

    +

    + +

    +

    + // obtener path menuTree +

    +

    + def miPath = toma.getMenuEntryPath(accion) +

    +

    + +

    +

    + ui.informationMessage("This is the menu path for action '$accion': \n\n   $miPath \n".toString()) +

    +

    + ui.informationMessage("This is the keyStroke for action '$accion': \n\n   '${toma.getKeyStroke(miPath[-1])}' \n".toString()) +

    +

    + ui.informationMessage("This is the label for action '$accion': \n\n   '${toma.getLabel(miPath[-1])}' \n".toString()) +

    +

    + ui.informationMessage("This is the toolTip for action '$accion': \n\n   '${toma.getToolTip(miPath[-1])}' \n".toString()) +

    +

    + ui.informationMessage("${toma.getActionInstructions(accion)}".toString()) +

    +

    + +

    +

    + // nodo.createChild(accion).note = toma.getActionInstructions(accion) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + +

    +

    + def n = node +

    +

    + +

    +

    + def accion = toma.action(n) +

    +

    + +

    +

    + if (accion){ +

    +

    +     toma.execute(accion) +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + +

    +

    + def nodos = node.children +

    +

    + +

    +

    + def acciones = [] +

    +

    + nodos.each{n -> +

    +

    +     acciones += toma.action(n) +

    +

    + } +

    +

    + +

    +

    + // return acciones +

    +

    + +

    +

    + if (acciones){ +

    +

    +     toma.execute(acciones) +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + +

    +

    + def pausa = 400 +

    +

    + +

    +

    + def nodo = node +

    +

    + if (!toma.hasAction(nodo)) { +

    +

    +     c.statusInfo = 'no link to menu action in selected node' +

    +

    +     return 'no link to menu action in selected node' +

    +

    + } +

    +

    + def accion = toma.action(nodo) +

    +

    + +

    +

    + toma.closeMenus(accion) +

    +

    + +

    +

    + toma.openMenus(accion, pausa) +

    +

    + +

    +

    + +

    +

    + def espera = (toma.getMenuEntryPath(accion).size()*2)*pausa + 2000 +

    +

    + def timer = new Timer() +

    +

    + timer.runAfter(espera){ +

    +

    +     toma.closeMenus(accion) +

    +

    +     c.statusInfo = " $accion : test ended" +

    +

    + } +

    +

    + c.statusInfo = " $accion : showing menu location" +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + +
    + + + + + + + + + In submenu 'Insert' > 'Icons' > 'Icon by category…' > 'Emoji collection' > 'Food Drink' > 'food-prepared'
    click on 'taco' + +

    + +

    + +
    +
    + + + + + + + In submenu 'Insert'>'Icons'>'Icon by category…'>'Emoji collection'>'Food Drink'>'food-prepared'
    click on 'taco' + +

    + +

    + +
    + +
    + + + + + + + In submenu 'Insert'>'Icons'>'Icon by category…'>'Emoji collection'>'Food Drink'>'food-prepared'
    click on 'taco' + +

    + +

    + +
    +
    + + + + + + + In submenu 'Insert'>'Icons'>'Icon by category…'>'Emoji collection'>'Food Drink'>'food-prepared'
    click on 'taco' + +

    + +

    + +
    + +
    +
    + + + + + + + + + In submenu 'Format' > 'Node core'
    click on 'Bold' + +

    + +

    + You can also use de keyboard shortcut 'Ctrl + B' for this command + +
    +
    + + + + + + + In submenu 'Format'>'Node core'
    click on 'Bold' + +

    + +

    + You can also use de keyboard shortcut 'Ctrl + B' for this command + +
    + +
    + + + + + + + In submenu 'Format'>'Node core'
    click on 'Bold' + +

    + +

    + You can also use de keyboard shortcut 'Ctrl + B' for this command + +
    +
    +
    + + + + + + + + + In submenu 'Edit'
    click on 'Move' + +

    + +

    + You can also use de keyboard shortcut 'Ctrl + M' for this command + +
    +
    +
    + + + + + + + + In submenu
    'Format' > 'Node core'
    click on
    'Blinking node' + +

    + +

    + +
    + +
    + + + + + + + In submenu 'Format' > 'Node core'
    click on 'Blinking node' + +

    + +

    + +
    + +
    + + + + + + + In submenu 'Format'>'Node core'
    click on 'Blinking node' + +

    + +

    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    + poner try catch +

    +

    + +

    +

    + y que catch despliege mensaje de error +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + posibilidades +

    + +
    + + + + + + + + + + + +

    + opcional +

    + +
    + + + + + + + + + + + +

    + opcional +

    + +
    + + +
    + + + + + + +

    + opcional +

    + +
    + + + + + + + + +

    + Opcional +

    + +
    + + + + + + + +

    + opcional +

    + +
    +
    +
    + + + + + + + + + + + + +

    + Seguridad +

    + +
    + + + + + + + + + + + + + + +

    + import edofro.wikdshellextension.WSE +

    +

    + +

    +

    + def scrText = WSE.scriptFromNode(node) +

    +

    + +

    +

    + if (scrText) { +

    +

    +     def script = c.script(scrText, "groovy") +

    +

    +     // return script.class.methods*.name.unique() +

    +

    +     script.executeOn(node) +

    +

    + } else { +

    +

    +     c.statusInfo = 'no script in the selected node' +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + +

    + import edofro.wikdshellextension.WSE +

    +

    + +

    +

    + def scrText = WSE.scriptFromNode(node) +

    +

    + +

    +

    + if (scrText) { +

    +

    +     def script = c.script(scrText, "groovy") +

    +

    +     // return script.class.methods*.name.unique() +

    +

    +     script.readingFiles().executeOn(node) +

    +

    + } else { +

    +

    +     c.statusInfo = 'no script in the selected node' +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    + + + + + + +

    + def nodo = node.createChild("node with link to user directory") +

    +

    + nodo.link.file = c.userDirectory +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + + + + + + + +

    + def nodo = node.createChild("node with link to user directory") +

    +

    + //nodo.link.file = c.userDirectory +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + me parece que ya no es necesario con Crayon +

    + +
    + + + + + + + + + + + + + + + + + + + + + +

    + me parece que ya no es necesario con Crayon +

    + +
    + + + + + + + + + + + + + + +

    + feedback Quickfold +

    + +
    + + + + + + + + + + +

    + feedback Quickfold +

    + +
    + + +
    +
    + + + + + + + +

    + nodo con link a file .md +

    +

    + +

    +

    + --> +

    +

    + +

    +

    + lo despliega en panel de editor +

    + +
    + + + + + + + + + +

    + nodo con link a webpage +

    +

    + +

    +

    + --> +

    +

    + +

    +

    + lo despliega en panel de editor +

    + +
    + + + + + + + + + + + +

    + Deprecated +

    + +
    +
    +
    + + + + + + + +

    + Deprecated +

    + +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    + creo que mejor que no. +

    +

    + es más complicado +

    + +
    +
    +
    + + +
    +
    + + + + + + + + + + + +

    + feedback Quickfold +

    + +
    + + + + + + + + + + + +

    + def dato = ' 5 ' +

    +

    + def cumple = { x -> x.isNumber() && x.isInteger() && x.toInteger() >= 0 && x.toInteger() <= 12} +

    +

    + assert cumple(dato) +

    +

    + +

    +

    + dato = 'dos' +

    +

    + def lista = 'uno,dos,tres,cuatro'.split(',') +

    +

    + cumple ={x -> lista.contains(x)} +

    +

    + assert cumple(dato) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    +
    + + + + + + + +

    + nice to have - sample map +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + +

    +

    + def texto = """Hola, cómo estás? +

    +

    + combinar con siguiente para si mouse está sobre grupo de menus entonces descargue todos los botones bajo él""" +

    +

    + +

    +

    +      +

    +

    + def nodo = node.createChild() +

    +

    + +

    +

    + toma.simulateTextInputInNode(nodo, texto, 25, 10) +

    +

    + +

    +

    + c.statusInfo = '  listo!!   ' +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + package edofro.tutorialomatic +

    +

    + +

    +

    + //region: imports +

    +

    + import edofro.tutorialomatic.TabPane +

    +

    + //import edofro.tutorialomatic.CustomComponentListener +

    +

    + +

    +

    + import java.util.Timer +

    +

    + +

    +

    + import java.awt.Color +

    +

    + import java.awt.Font +

    +

    + import java.awt.Insets +

    +

    + import java.awt.GridBagConstraints +

    +

    + import java.awt.Dimension +

    +

    + import java.awt.GridBagLayout +

    +

    + import java.awt.Point +

    +

    + import java.awt.event.* +

    +

    + +

    +

    + // import javax.swing.* +

    +

    + import javax.swing.border.EmptyBorder +

    +

    + import javax.swing.border.LineBorder +

    +

    + import javax.swing.border.CompoundBorder +

    +

    + import javax.swing.SwingUtilities as SU +

    +

    + import javax.swing.JPanel +

    +

    + import javax.swing.JEditorPane +

    +

    + +

    +

    + +

    +

    + import java.awt.Desktop +

    +

    + import javax.swing.event.HyperlinkEvent +

    +

    + import javax.swing.event.HyperlinkListener +

    +

    + +

    +

    + import groovy.swing.SwingBuilder +

    +

    + +

    +

    + import org.freeplane.core.ui.components.UITools as ui +

    +

    + // import org.freeplane.core.util.MenuUtils        as menuUtils +

    +

    + +

    +

    + import io.github.gitbucket.markedj.Marked +

    +

    + import io.github.gitbucket.markedj.Options +

    +

    + //end: +

    +

    + +

    +

    + class ToM_ui{ +

    +

    + +

    +

    +     //region: definitions +

    +

    +     static final int minContentPaneWidth  = 408 +

    +

    +     static final int maxContentPaneHeigth = 50000 +

    +

    +     static final String myPaneName        = 'myContentPanel' +

    +

    +     static final String myButtonPanelName = 'aButtonPane' +

    +

    +     static final String myNextPanelName   = 'nextPane' +

    +

    +     static final String htmlStyle         = +

    +

    +         """ +

    +

    +             table {border: 0; border-spacing: 0;} +

    +

    +             th, td {border: 1px solid;} +

    +

    +             pre { +

    +

    +                 background-color: rgb(230, 230, 230); +

    +

    +                 border: 1px solid rgb(0, 0, 0); +

    +

    +                 display: block; +

    +

    +                 padding: 10px; +

    +

    +             } +

    +

    +             code { +

    +

    +                 font-family: Consolas,"courier new"; +

    +

    +                 color: rgb(0, 80, 0); +

    +

    +             } +

    +

    +         """ +

    +

    + +

    +

    +     static SwingBuilder swing      = new SwingBuilder() +

    +

    + +

    +

    +     // info: https://docs.oracle.com/javase/7/docs/api/java/awt/GridBagConstraints.html +

    +

    +     static GridBagConstraints GBC = new GridBagConstraints( +

    +

    +         gridx      : 0,                               //  0 -> allways first cell in a row +

    +

    +         gridy      : GridBagConstraints.RELATIVE,     //  Relative -> The value RELATIVE specifies that the component be placed just below the component that was added to the container just before this component was added. +

    +

    +         gridwidth  : 1,                               //  Specifies the number of cells in a row for the component's display area. +

    +

    +         gridheight : 1,                               //  Specifies the number of cells in a column for the component's display area. +

    +

    +         weightx    : 1,                               //  Specifies how to distribute extra horizontal space. +

    +

    +         weighty    : 1,                               //  Specifies how to distribute extra vertical space. +

    +

    +         anchor     : GridBagConstraints.PAGE_START,   //  This field is used when the component is smaller than its display area. It determines where, within the display area, to place the component. +

    +

    +         fill       : GridBagConstraints.HORIZONTAL,   //  This field is used when the component's display area is larger than the component's requested size. It determines whether to resize the component, and if so, how. +

    +

    +         insets     : new Insets(5,2,5,2),             //  This field specifies the external padding of the component, the minimum amount of space between the component and the edges of its display area. +

    +

    +         ipadx      : 0,                               //  This field specifies the internal padding of the component, how much space to add to the minimum width of the component. The width of the component is at least its minimum width plus ipadx pixels. +

    +

    +         ipady      : 0                                //  This field specifies the internal padding, that is, how much space to add to the minimum height of the component. The height of the component is at least its minimum height plus ipady pixels. +

    +

    +     ) +

    +

    +     //end: +

    +

    + +

    +

    +     //region: Text Message in transparent dialog +

    +

    + +

    +

    +     def static showTextMessage(msg, lapseTime){ +

    +

    +         def win +

    +

    +         swing.edt{ +

    +

    +             win = dialog( +

    +

    +                 undecorated        : true, +

    +

    +                 modal              : false, +

    +

    +                 owner              : ui.frame, +

    +

    +                 locationRelativeTo : ui.frame, +

    +

    +                 location           : [(ui.frame.location.x + 100) as int, (ui.frame.location.y + ui.frame.height - 150) as int], +

    +

    +                 //defaultCloseOperation: JFrame.DO_NOTHING_ON_CLOSE, +

    +

    +                 background         : new Color (240, 240, 240, 150), +

    +

    +                 pack               : true +

    +

    +             ){ +

    +

    +                 label( +

    +

    +                     text       : msg, +

    +

    +                     font       : new Font("Agency FB", Font.BOLD, 48), +

    +

    +                     foreground : Color.blue, +

    +

    +                     border     : new EmptyBorder(0, 15, 10, 15), +

    +

    +                 ) +

    +

    +             } +

    +

    +         } +

    +

    +         def timer = new Timer() +

    +

    +         timer.runAfter(lapseTime){ +

    +

    +             win.setVisible( false ) +

    +

    +             win.dispose() +

    +

    +         } +

    +

    +         win.setVisible( true ) +

    +

    +     } +

    +

    + +

    +

    +     //end: +

    +

    + +

    +

    +     //region: getting html +

    +

    +      +

    +

    +     def static tomMarkedjOptions(){ +

    +

    +         Options options         = new Options() +

    +

    +         options.getWhitelist().addProtocols("img", "src", "http", "https", "file") +

    +

    +         return options +

    +

    +     } +

    +

    + +

    +

    +     def static getHtmlFromNote(nodo, options){ +

    +

    +         if(!nodo.note) return null +

    +

    +         def noteType = nodo.noteContentType +

    +

    +         def html +

    +

    +         switch (noteType){ +

    +

    +             case ['auto','html']: +

    +

    +                 html = nodo.plainNote.startsWith('=')?nodo.note.plain:nodo.note.html +

    +

    +                 break +

    +

    +             case 'markdown': +

    +

    +                 //html = "<html> ${Marked.marked(nodo.note.plain, options))} </html>" +

    +

    +                 html = """<html> +

    +

    +                             <style>${htmlStyle}</style> +

    +

    +                             <body> +

    +

    +                                 ${Marked.marked(nodo.note.plain, options)} +

    +

    +                             </body> +

    +

    +                         </html>""" +

    +

    +                 break +

    +

    +             default: +

    +

    +                 html = "Node's note not recognized" +

    +

    +                 break +

    +

    +         } +

    +

    +         return html +

    +

    +     } +

    +

    + +

    +

    +     def static getHtmlFromGroovyNode(nodo, script){ +

    +

    +         def html = """<html> +

    +

    +                             <style>${htmlStyle}</style> +

    +

    +                             <body> +

    +

    +                                 <h3>${nodo.text}</h3> +

    +

    +                                 <pre><code>${script}</code></pre> +

    +

    +                             </body> +

    +

    +                         </html>""" +

    +

    +         return html +

    +

    +     } +

    +

    + +

    +

    +     //end: +

    +

    + +

    +

    +     //region: creating panes +

    +

    + +

    +

    +     def static createInstructionsPane(nodo, options){ +

    +

    +         return createInstructionsPane(getHtmlFromNote(nodo, options)) +

    +

    +     } +

    +

    + +

    +

    +     def static createInstructionsPane(String html){ +

    +

    +         def editor = swing.editorPane( +

    +

    +             editable    : false, +

    +

    +             contentType : "text/html", +

    +

    +             text        : html, +

    +

    +             //margin      : new Insets(30,10,30,10), +

    +

    +             border      : new EmptyBorder(2, 10, 2, 0), //new LineBorder(Color.black, 1), +

    +

    +             //border      : new CompoundBorder(new LineBorder(Color.gray, 1),new EmptyBorder(5, 10, 5, 10)) +

    +

    +             //preferredSize: new Dimension(minContentPaneWidth, 500), +

    +

    +             //lineWrap    : true +

    +

    +             clientProperties: [(JEditorPane.HONOR_DISPLAY_PROPERTIES):true] +

    +

    +         ) +

    +

    +         editor.addHyperlinkListener(e -> { +

    +

    +             if (HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType())) { +

    +

    +                 Desktop desktop = Desktop.getDesktop(); +

    +

    +                 try { +

    +

    +                     desktop.browse(e.getURL().toURI()); +

    +

    +                 } catch (Exception ex) { +

    +

    +                     ex.printStackTrace(); +

    +

    +                 } +

    +

    +             } +

    +

    +         }) +

    +

    +         return editor +

    +

    +     } +

    +

    + +

    +

    +     def static createTabContentPane(String tabName){ +

    +

    +         def contentPane = swing.panel( +

    +

    +                 name: myPaneName, +

    +

    +                 layout: new GridBagLayout(), +

    +

    +                 // background: Color.gray +

    +

    +             ){} +

    +

    +         def sp = createScrollPaneForContentPane(contentPane) +

    +

    +         TabPane.addTab(tabName, sp) +

    +

    +         return contentPane +

    +

    +     } +

    +

    +      +

    +

    +     def static createScrollPaneForContentPane(contentPane){ +

    +

    +         contentPane.addComponentListener(new CustomComponentListener()) +

    +

    +         def panel =  swing.panel( +

    +

    +                 layout: new GridBagLayout(), +

    +

    +                 preferredSize: new Dimension(minContentPaneWidth, maxContentPaneHeigth), +

    +

    +             ){} +

    +

    +         panel.add(contentPane,GBC) +

    +

    +         def sp = swing.scrollPane(){} +

    +

    +         sp.verticalScrollBar.unitIncrement = 16  //.getVerticalScrollBar().setUnitIncrement(16) +

    +

    +         sp.viewport.add(panel) +

    +

    +         return sp +

    +

    +     } +

    +

    + +

    +

    + // genera panel con botón +

    +

    +     def static createButtonPanel(htmlMsg, buttonLabel, buttonToolTip, buttonAction, boolean isToggleButton = false){ +

    +

    +         def panel = swing.panel( +

    +

    +             border      : new LineBorder(Color.gray, 1), +

    +

    +             name        : myButtonPanelName, +

    +

    +         ) { +

    +

    +               borderLayout() +

    +

    +               editorPane( +

    +

    +                     editable    : false, +

    +

    +                     contentType : "text/html", +

    +

    +                     text        : htmlMsg, +

    +

    +                     margin      : new Insets(30,10,30,10), +

    +

    +                     border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +

    +

    +                     //border: new CompoundBorder(new LineBorder(Color.green, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde +

    +

    +                     constraints : CENTER, +

    +

    +                     clientProperties: [(JEditorPane.HONOR_DISPLAY_PROPERTIES):true] +

    +

    +               ) +

    +

    +               vbox(constraints:SOUTH) { +

    +

    +                     panel( +

    +

    +                            // border      : new LineBorder(Color.black, 1), +

    +

    +                             border      : new EmptyBorder(2, 10, 2, 10),  // <------- éste +

    +

    +                             //border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde +

    +

    +                             //insets      : new Insets(30,10,30,10), +

    +

    +                         ) { +

    +

    +                             borderLayout() +

    +

    +                             if (isToggleButton){ +

    +

    +                                 toggleButton( +

    +

    +                                     label       : buttonLabel, +

    +

    +                                     constraints : EAST, +

    +

    +                                     margin      : new Insets(10,15,10,15), +

    +

    +                                     toolTipText : buttonToolTip, +

    +

    +                                     actionPerformed : buttonAction, +

    +

    +                                 ) +

    +

    +                             } else { +

    +

    +                                 button( +

    +

    +                                     label       : buttonLabel, +

    +

    +                                     constraints : EAST, +

    +

    +                                     margin      : new Insets(10,15,10,15), +

    +

    +                                     toolTipText : buttonToolTip, +

    +

    +                                     actionPerformed : buttonAction, +

    +

    +                                 ) +

    +

    +                             } +

    +

    +                         } +

    +

    +               } +

    +

    +         } +

    +

    +         return panel +

    +

    +     } +

    +

    + +

    +

    + // genera panel close - next page +

    +

    +         //nextButtonAction == null --> no 'Next page' button +

    +

    +     def static createNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip, nextButtonAction, tocLabel = '', tocToolTip = '', tocButtonAction = null ){ +

    +

    +         def panel = swing.panel( +

    +

    +             //border      : new LineBorder(Color.gray, 1), +

    +

    +             name        : myNextPanelName, +

    +

    +         ) { +

    +

    +                 borderLayout() +

    +

    +                 panel( +

    +

    +                         border      : new EmptyBorder(2, 10, 2, 10),  // <------- éste +

    +

    +                         constraints : NORTH +

    +

    +                     ) { +

    +

    +                         borderLayout() +

    +

    +                         button( +

    +

    +                             label       : closeLabel, +

    +

    +                             constraints : WEST, +

    +

    +                             margin      : new Insets(10,15,10,15), +

    +

    +                             toolTipText : closeToolTip, +

    +

    +                             actionPerformed : {closeTab(tabName)}, +

    +

    +                         ) +

    +

    +                         if(tocButtonAction /* && nextButtonAction */ ){ +

    +

    +                             button( +

    +

    +                                 label       : tocLabel, +

    +

    +                                 constraints : CENTER, +

    +

    +                                 margin      : new Insets(10,15,10,15), +

    +

    +                                 toolTipText : tocToolTip, +

    +

    +                                 actionPerformed : tocButtonAction, +

    +

    +                             ) +

    +

    +                         } +

    +

    +                         if(nextButtonAction){ +

    +

    +                             button( +

    +

    +                                 label       : nextLabel, +

    +

    +                                 constraints : EAST, +

    +

    +                                 margin      : new Insets(10,15,10,15), +

    +

    +                                 toolTipText : nextToolTip, +

    +

    +                                 actionPerformed : nextButtonAction, +

    +

    +                             ) +

    +

    +                         } +

    +

    +                     } +

    +

    +         } +

    +

    +         return panel +

    +

    +     } +

    +

    + +

    +

    +     def static createEmptyGridBagPanel(){ +

    +

    +         return swing.panel( +

    +

    +                     layout: new GridBagLayout(), +

    +

    +                     border      : new EmptyBorder(2, 10, 2, 0), //new LineBorder(Color.black, 1), +

    +

    +                     // background: Color.gray +

    +

    +                 ){} +

    +

    +     } +

    +

    + +

    +

    +     def static createButton(title, bttnAction){ +

    +

    +         return swing.button( +

    +

    +                     label       : title, +

    +

    +                     margin      : new Insets(10,15,10,15), +

    +

    +                     actionPerformed : bttnAction, +

    +

    +                 ) +

    +

    +     } +

    +

    + +

    +

    + +

    +

    +     //end: +

    +

    + +

    +

    +     //region: resizing panes +

    +

    + +

    +

    +     def static resizeContentPanel(comp, height){ +

    +

    +         comp.parent.preferredSize = new Dimension(minContentPaneWidth, height) +

    +

    +     } +

    +

    + +

    +

    +     def static adjustHeight(comp, boolean backToTop = false){ +

    +

    +         if (backToTop) scrollContentPaneBackToTop(comp) +

    +

    +         TabPane.repaint() +

    +

    +         def timer = new Timer() +

    +

    +         timer.runAfter(100) { +

    +

    +             resizeContentPanel(comp, comp.height + 100) +

    +

    +             if (backToTop) scrollContentPaneBackToTop(comp) +

    +

    +             // TabPane.revalidate() <--- no funciona +

    +

    +             TabPane.repaint() +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     //end: +

    +

    + +

    +

    +     //region: getting existing panes +

    +

    + +

    +

    +     def static getButtonPanel(javax.swing.JComponent comp){ +

    +

    +         return SU.getAncestorNamed(myButtonPanelName, comp) +

    +

    +     } +

    +

    + +

    +

    +     def static getTabContentPane(javax.swing.JComponent comp){ +

    +

    +         return SU.getAncestorNamed(myPaneName, comp) +

    +

    +     } +

    +

    + +

    +

    +     def static getTabContentPane(String tabName){ +

    +

    +         def contentPane +

    +

    +         if( !TabPane.hasTab(tabName)) { +

    +

    +             contentPane = createTabContentPane(tabName) +

    +

    +         } else { +

    +

    +             contentPane = TabPane.getTab(tabName)?.viewport.components[0].components.find{it.name == myPaneName} +

    +

    +         } +

    +

    +         return contentPane +

    +

    +     } +

    +

    + +

    +

    +     def static getContentPaneFromMyTab(String myTabName, boolean doClear){ +

    +

    +         def cPane =  ToM_ui.getTabContentPane(myTabName) +

    +

    +         if(doClear) cPane.removeAll() //eliminar contenido existente en el panel +

    +

    +         TabPane.showTab(myTabName) +

    +

    +         ToM_ui.resizeContentPanel(cPane,maxContentPaneHeigth) +

    +

    +         return cPane +

    +

    +     } +

    +

    + +

    +

    +     def static getNextButtonPanel(myP){ +

    +

    +         return myP.components.find{it.name == myNextPanelName} +

    +

    +     } +

    +

    + +

    +

    +     def static getScrollPaneViewport(comp){ +

    +

    +         return SU.getAncestorOfClass(javax.swing.JViewport, comp) +

    +

    +     } +

    +

    + +

    +

    +     //end: +

    +

    + +

    +

    +     //region: other methods +

    +

    + +

    +

    +     def static closeTab(tabName, boolean hideTabPane = false) { +

    +

    +         TabPane.removeTab(tabName, hideTabPane) +

    +

    +     } +

    +

    + +

    +

    +     def static setNextPagePanelEnabled(JPanel myP, boolean isEnabled){ +

    +

    +         setPanelEnabled(getNextButtonPanel(myP), isEnabled) +

    +

    +     } +

    +

    + +

    +

    +     def static setPanelEnabled(JPanel panel, boolean isEnabled) { +

    +

    +         panel.setEnabled(isEnabled) +

    +

    + +

    +

    +         panel.components.each{ comp -> +

    +

    +             if (comp instanceof JPanel) { +

    +

    +                 setPanelEnabled(comp, isEnabled) +

    +

    +             } +

    +

    +             comp.setEnabled(isEnabled) +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static anyCompPending(myP){ +

    +

    +         return myP.components.any{it.hasProperty('pending') && it.pending} +

    +

    +     } +

    +

    + +

    +

    +     def static scrollContentPaneBackToTop(comp){ +

    +

    +         getScrollPaneViewport(comp).setViewPosition(new Point(0,0)) +

    +

    +     } +

    +

    + +

    +

    +     //end: +

    +

    + +

    +

    + +

    +

    +     //region: Listeners +

    +

    +      +

    +

    +     // Listener for Tutorial Tab pane so it gets resized (enough length) each time its width gets modified +

    +

    +     static class CustomComponentListener implements ComponentListener { +

    +

    +         public void componentResized(ComponentEvent e) { //https://docs.oracle.com/javase/8/docs/api/java/awt/event/ComponentEvent.html +

    +

    +             def comp = e.component +

    +

    +             //ToM_ui.resizeContentPanel(comp, tomui.maxContentPaneHeigth) +

    +

    +             sleep(100) +

    +

    +             ToM_ui.resizeContentPanel(comp, comp.height + 500) +

    +

    +           //  TabPane.repaint() +

    +

    +         } +

    +

    +         public void componentMoved(ComponentEvent e) { +

    +

    +             // e.source.title =  " moved. " +

    +

    +         } +

    +

    +         public void componentShown(ComponentEvent e) { +

    +

    +             // e.source.title =  " shown. " +

    +

    +         } +

    +

    +         public void componentHidden(ComponentEvent e) { +

    +

    +             // e.getSource().title =  " hidden. " +

    +

    +         } +

    +

    +     } +

    +

    +      +

    +

    +     //end: +

    +

    + } +

    + +
    + + + + + + + +

    + import edofro.tutorialomatic.ToM_ui as tui +

    +

    + +

    +

    + def texto ='Ctrl + Alt + M : open MarkdownHelper dialog' +

    +

    + +

    +

    + tui.showTextMessage(texto,3000) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import io.github.gitbucket.markedj.Marked +

    +

    + //import edofro.tutorialomatic.markedj.Marked +

    +

    + +

    +

    + def text = node.note.toString() +

    +

    + +

    +

    + html = "<html> ${Marked.marked(text)} </html>" +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + # titulo +**hola** como +estás? + +------- + +*listo!* + + + + + + + +

    + mkdn +

    +

    + mkdn +

    + +
    + + + + + + + + + + + + + +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + +

    +

    + +

    +

    + // --------------------- crear / abrir panel ---------- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab('Tutorial', true) +

    +

    + +

    +

    + +

    +

    + // ---------- llenar contentPanel ------------------------------- +

    +

    + def nodos = c.selecteds +

    +

    + nodos.each{n -> +

    +

    +     if(n.note) { +

    +

    +         myPanel.add(ToM_ui.createInstructionsPane(n), ToM_ui.GBC) +

    +

    +     } +

    +

    + } +

    +

    + +

    +

    + +

    +

    + // -------------------- re establecer largo de panel ------------------- +

    +

    + ToM_ui.adjustHeight(myPanel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + +

    + =node.children*.text.join('\n') +

    + +
    + + + + + + +

    + fmla +

    +

    + stdrd +

    + +
    + + + + + + + + + # titulo +**hola** como +estás? + +------- + +*listo!* + + + + + + + +

    + mkdn +

    +

    + mkdn +

    + +
    + + + + + + + + + + + + +

    + hola que tal +

    + +
    + + + + + + +

    + html +

    +

    + stdrd +

    + +
    + + + + + + + + + +

    + MY BEST 61 TRAVEL TIPS TO MAKE YOU THE WORLD’S SAVVIEST TRAVELER +

    +

    + In the beginning, you make a lot of travel mistakes. +

    +

    + Travel savviness is a process born of missed buses, foolish behavior, cultural unawareness, and countless tiny errors. Then, one day, you begin to seamlessly move through airports and integrate yourself into new cultures like a fish to water. +

    +

    + I want to help speed up the process and help you avoid my mistakes (and I often make a lot of them), so I put together this giant list of my best travel tips that cover everything under the sun to help you reach your full travel ninja potential. +

    +

    + I’ve learned these tips over the last twelve years. +

    +

    + These tips for traveling will have you saving money, sleeping better, getting off the beaten path more, meeting locals, and just being a better traveler. +

    +

    + Without further ado, here are the best 61 tips in the world: +

    +

    + 1. Always pack a towel +

    +

    + It’s the key to successful galactic hitchhiking and plain common sense. You never know when you will need it, whether it’s at the beach, on a picnic, or just to dry off. While many hostels offer towels, you never know and carrying a small towel won’t add that much weight to your bag. +

    + +
    +
    + + =node.children*.text.join('\n') + + + + + + + +

    + fmla +

    +

    + mkdn +

    + +
    + + + + + + + + + + + + + + + + # Markdown Helper Add On for Freeplane + +----- + +Welcome to the **alpha** version of the **Markdown Helper AddOn** for **Freeplane**. + +This Add On is a tool to create markdown documents in a Freeplane mindmapping way. + +More information, instructions and examples in the [Markdown Helper **wiki**](https://github.com/EdoFro/Freeplane_MarkdownHelper/wiki) page. + +# How it works + +----- + +The general idea of this AddOn is to insert **special nodes** in your map that help to **translate** the information in a mindmap **into a Markdown** document. + +Here you can see an example where a **paragraph** is **combined with** nodes with links to **images** and **webpages** into a Markdown formatted text. + +You obtain a good looking document retaining the **flexibility** that offers Freeplane and Mindmapping. You can easy reorder and insert new ideas as usual. + +![textBlock 01.png](resources/Examples/textBlock%20%2001.png) + +More information, instructions and examples in the [Markdown Helper **wiki**](https://github.com/EdoFro/Freeplane_MarkdownHelper/wiki) page. + +# Some screenshots + +----- + +## 1. Mindmap and notepanel + +----- + +### 1.1. Building a textblock with links to webpages + +![Calvin02.png](resources/Examples/Calvin02.png) + +### 1.2. Building a table + +![Calvin01.png](resources/Examples/Calvin01.png) + +More information, instructions and examples in the [Markdown Helper **wiki**](https://github.com/EdoFro/Freeplane_MarkdownHelper/wiki) page. + +# Example animations + +----- + +## 1. ToC example + +----- + +![MDHnodes-TOC.gif](resources/Examples/MDHnodes-TOC.gif) + +## 2. List example + +----- + +![MDHnodes-Lists.gif](resources/Examples/MDHnodes-Lists.gif) + +## 3. Table example + +----- + +![MDHnodes-Table.gif](resources/Examples/MDHnodes-Table.gif) + +More information, instructions and examples in the [Markdown Helper **wiki**](https://github.com/EdoFro/Freeplane_MarkdownHelper/wiki) page. + +# This AddOn is still beta + +----- + +So it may have a lot of bugs. Use it at your own risk. (**Freeplane** has an excelent "*Undo*" implementation, so the risk is in fact very limited) + +Please report any bug in this addOn in its GitHub page + +# Your Help needed + +----- + +I'm not very good at writing in english, so if you find any error please tell me (and please explain me how to write it correctly) + +# About Freeplane + +----- + +[Freeplane](https://www.freeplane.org/wiki/index.php/Home) is a free and open source software application that supports thinking, sharing information and getting things done at work, in school and at home. The software can be used for [mind mapping](https://secure.wikimedia.org/wikipedia/en/wiki/Mind_map) and analyzing the information contained in mind maps. Freeplane runs on any operating system that has a current version of Java installed. It can be run locally or [portably](https://en.wikipedia.org/wiki/Portable_application) from removable storage like an USB drive. + + + + + # Description + +**'Map Saving Options'** is a **Freeplane AddOn** that gives you the possibility to add **saving preferences** to **each** of your **maps**. + +Mindmaps can be used for different purposes and saving information like node's modification times depends most of the times on the map itself, its content and use case. + +With this AddOn you can define if a map have to save the information of any of these: + +* folded and unfolded nodes +* selected node when saving +* *Creation* and *Modification times* of each node + +This way, you can define for each map if it will use the **central Freeplane preferences**, its own or a mix of both. + +# Do I need this AddOn? + +I don't know if you do, but I do! That's why I created it. Let me explain. + +I use Freeplane for multiple pourposes and work with different types of maps. + +For example, I use **maps for projects** I work in and use Freeplane to anotate all meetings agreements, pending tasks, relevant information, received data and files, etc. In these types of maps to have the creation and modification times of nodes can be very useful when searching for anotations done in a specific day or week for example. + +I also use **maps as workbooks**, where the modification time information has no use. But sometimes I have to compare different versions of the same map and this extra information only makes things harder (for example when using **GIT** versioning and commiting changes) + +# Installing the AddOn + +Installing a new AddOn is very straight forward in Freeplane. + +You only need to follow these **simple steps**: + +1. Download the [latest release](https://github.com/EdoFro/Freeplane_Map-Saving-Options/releases/latest) of the addOn +1. Open it in Freeplane +1. A first dialog will open.<br>![Install 001.png](file:/D:/Users/Edo/Documents/GitHub/Freeplane_Map-Saving-Options/Resources/Install%20001.png) +1. Click **Yes** and follow the instructions. +1. Close and reopen Freeplane to complete the installation. + +More information about Add Ons and how to install them in Freeplane can be found in the oficial [Freeplane wiki: Add-ons_(install)](https://www.freeplane.org/wiki/index.php/Add-ons_(install)). + +----- + +# How to use it + +----- + +## 1. Menu commands + +After installing the Addon and restarting Freeplane, a new menu will appear in the **Freeplane's Menu Bar** + +You can get to the new commands by selecting the menu **Edo Tools / Map Saving Options** + +![MSO_Image_001.png](file:/D:/Users/Edo/Documents/GitHub/Freeplane_Map-Saving-Options/Resources/MSO_Image_001.png) + +----- + +## 2. Assigning map preferences + +When selecting the "change saving options for this map" command, a new dialog opens: + +![MSO_Image_002.png](file:/D:/Users/Edo/Documents/GitHub/Freeplane_Map-Saving-Options/Resources/MSO_Image_002.png) + +Here you can define if the current map will have its own saving preferences or if it should use the ones defined in the **Freeplane Preferences Dialog**. + +If you decide that it should have its own preferences, then a second dialog opens. There you can define the saving options for the map: + +![MSO_Image_003.png](file:/D:/Users/Edo/Documents/GitHub/Freeplane_Map-Saving-Options/Resources/MSO_Image_003.png) + +----- + +## 3. Saving map + +When using the saving command in the menu, the AddOn uses the defined preferences for the map. + + +After saving the status bar shows a message indicating the preferences used for saving the map: + +![MSO_Image_005.png](file:/D:/Users/Edo/Documents/GitHub/Freeplane_Map-Saving-Options/Resources/MSO_Image_005.png) + +----- + +## 4. Preferences + +In **Freeplane Preferences** you can also choose if when saving a map for the first time, you should be asked for the saving preferences of the map or not. + +![MSO_Image_004.png](file:/D:/Users/Edo/Documents/GitHub/Freeplane_Map-Saving-Options/Resources/MSO_Image_004.png) + +# This AddOn is still beta + +So it may have a lot of bugs. Use it at your own risk. (**Freeplane** has an excelent "*Undo*" implementation, so the risk is in fact very limited) + +Please report any bug in this addOn in its GitHub page + +# Your Help needed + +I'm not very good at writing in english, so if you find any error please tell me (and please explain me how to write it correctly) + +I tried also to translate some of the texts to German. Please help me correct them. + +# About Freeplane + +[Freeplane](https://www.freeplane.org/wiki/index.php/Home) is a free and open source software application that supports thinking, sharing information and getting things done at work, in school and at home. The software can be used for [mind mapping](https://secure.wikimedia.org/wikipedia/en/wiki/Mind_map) and analyzing the information contained in mind maps. Freeplane runs on any operating system that has a current version of Java installed. It can be run locally or [portably](https://en.wikipedia.org/wiki/Portable_application) from removable storage like an USB drive. + + + + + + + + + + +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + +

    +

    + import groovy.swing.SwingBuilder +

    +

    + import javax.swing.JFrame +

    +

    + +

    +

    + // ------------- crear buttonPanel ----------------- +

    +

    + def msgHtml = 'Este es el <b> mensaje</b> Principal' +

    +

    + def bttnText    = 'Continuar' +

    +

    + def bttnToolTip =  'This is the button' +

    +

    + def bttnAction = { +

    +

    +          c.statusInfo = 'Option A chosen' +

    +

    +          ui.informationMessage('hola, hola!') +

    +

    +       } +

    +

    + +

    +

    + def buttonPanel = ToM_ui.getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction) +

    +

    + +

    +

    + +

    +

    + +

    +

    + // ----------------------- dialogo de prueba ------------------------------------- +

    +

    + +

    +

    + def swing = new SwingBuilder() +

    +

    + def dialog = swing.dialog( +

    +

    +     title: 'Frame', +

    +

    +     defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, +

    +

    +     size: [400, 400], +

    +

    + ){} +

    +

    + +

    +

    + +

    +

    + dialog.add(buttonPanel) +

    +

    + dialog.show() +

    +

    + +

    +

    + return 'ok' +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + import edofro.tutorialomatic.TabPane +

    +

    + +

    +

    + //import javax.swing.SwingUtilities as SU +

    +

    + +

    +

    + // ------------- crear buttonPanel ----------------- +

    +

    + def msgHtml = 'Este es el <b> mensaje</b> que acompaña al botón' +

    +

    + def bttnText    = 'Mostrar mensaje (This is the button label)' +

    +

    + def bttnToolTip =  'This is the button' +

    +

    + def bttnAction = { e -> +

    +

    +         def boton = e.source +

    +

    + +

    +

    +         //example how to get the contentPane +

    +

    +         def myPanel = ToM_ui.getTabContentPane(boton) +

    +

    +         c.statusInfo = myPanel.toString() +

    +

    + +

    +

    +         //example how to disable the button +

    +

    +         boton.setEnabled(false) +

    +

    + +

    +

    +         //example actions +

    +

    +         ui.informationMessage('se deshabilitó el botón\n\n y tras el click se hará una pausa de dos segundos y se removerá el buttonPanel') +

    +

    + +

    +

    +         TabPane.repaint() //I think this does nothing here +

    +

    +         sleep(2000) +

    +

    + +

    +

    +         //example how to delete the buttonPanel +

    +

    +         def buttonPanel = ToM_ui.getButtonPanel(boton) +

    +

    +         myPanel.remove(buttonPanel) +

    +

    +         TabPane.repaint() // <-- this is needed to show the change in the UI +

    +

    +     } +

    +

    + +

    +

    + def buttonPanel = ToM_ui.getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction) +

    +

    + +

    +

    + // --------------------- crear / abrir panel ---------- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab('Tutorial', false) +

    +

    + +

    +

    + +

    +

    + // ---------- llenar contentPanel ------------------------------- +

    +

    + +

    +

    + myPanel.add(buttonPanel, ToM_ui.GBC) +

    +

    + +

    +

    + // -------------------- re establecer largo de panel ------------------- +

    +

    + ToM_ui.adjustHeight(myPanel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + +

    +

    + import groovy.swing.SwingBuilder +

    +

    + import javax.swing.JFrame +

    +

    + +

    +

    + // ------------- crear buttonPanel ----------------- +

    +

    + def msgHtml = 'Este es el <b> mensaje</b> Principal' +

    +

    + def bttnText    = 'Activar' +

    +

    + def bttnToolTip = 'This is the button' +

    +

    + def bttnAction = {e -> +

    +

    +         def bttn = e.source +

    +

    +         def sel = bttn.isSelected() +

    +

    +         bttn.label = sel?'Desactivar':'Activar' +

    +

    +         c.statusInfo = "El botón está ${sel?'A':'Desa'}ctivado".toString() +

    +

    +     } +

    +

    + +

    +

    + def buttonPanel = ToM_ui.getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, true) +

    +

    + +

    +

    + +

    +

    + +

    +

    + // ----------------------- dialogo de prueba ------------------------------------- +

    +

    + +

    +

    + def swing = new SwingBuilder() +

    +

    + def dialog = swing.dialog( +

    +

    +     title: 'Frame', +

    +

    +     defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, +

    +

    +     size: [400, 400], +

    +

    + ){} +

    +

    + +

    +

    + +

    +

    + dialog.add(buttonPanel) +

    +

    + dialog.show() +

    +

    + +

    +

    + return 'ok' +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    + + + + + + +

    + next steps Sample Map +

    + +
    + + + + + + +

    + espera = 3000 +

    +

    + +

    +

    + repite(1,10) +

    +

    + +

    +

    + def repite(a,b){ +

    +

    +     if(a<b){ +

    +

    +         def timer = new Timer() +

    +

    +         timer.runAfter(espera){ +

    +

    +             c.statusInfo = a +

    +

    +             repite (a+1,b) +

    +

    +         } +

    +

    +     } +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + +

    +

    + def nodo = node +

    +

    + if (!toma.hasAction(nodo)) { +

    +

    +     c.statusInfo = 'no link to menu action in selected node' +

    +

    +     return 'no link to menu action in selected node' +

    +

    + } +

    +

    + def infoAccion = toma.getActionInfoMap(nodo) +

    +

    + //return infoAccion +

    +

    + +

    +

    + // ------------- crear buttonPanel ----------------- +

    +

    + def msgHtml = infoAccion.instructions +

    +

    + def bttnText    = 'Show me' +

    +

    + def bttnToolTip =  "Click to see where is ${toma.apos(infoAccion.label)} in Freeplane Menu" +

    +

    + def bttnAction = { e -> +

    +

    +         def bttn = e.source +

    +

    +         def sel = bttn.isSelected() +

    +

    +         toma.closeMenus(infoAccion.action) +

    +

    +         if (sel) { +

    +

    +             toma.openMenus(infoAccion.action, 400) +

    +

    +             bttn.label = 'Close menu' +

    +

    +         } else { +

    +

    +             bttn.label = 'Show me' +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    + +

    +

    + def buttonPanel = ToM_ui.getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, true) +

    +

    + +

    +

    + // --------------------- crear / abrir panel ---------- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab('Tutorial', false) +

    +

    + +

    +

    + +

    +

    + // ---------- llenar contentPanel ------------------------------- +

    +

    + +

    +

    + myPanel.add(buttonPanel, ToM_ui.GBC) +

    +

    + +

    +

    + // -------------------- re establecer largo de panel ------------------- +

    +

    + ToM_ui.adjustHeight(myPanel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + //import edofro.tutorialomatic.ToM         as tom +

    +

    + +

    +

    + def nodos = node.children +

    +

    +      +

    +

    + // --------------------- crear / abrir panel ---------- +

    +

    + def myPanel = tomui.getContentPaneFromMyTab('Tutorial', true) +

    +

    + +

    +

    + addShowMenuItemPane(myPanel, nodos) +

    +

    + +

    +

    + +

    +

    + tomui.adjustHeight(myPanel) +

    +

    + +

    +

    + return 'listo' +

    +

    + +

    +

    + // ----- methods ------------ +

    +

    + +

    +

    + def addShowMenuItemPane(myP, nodos){ +

    +

    +     nodos.findAll{n -> toma.hasAction(n)}.each{nodo -> +

    +

    +         def infoAccion  = toma.getActionInfoMap(nodo) +

    +

    +         def msgHtml     = infoAccion.instructions +

    +

    +         def bttnText    = 'Show me' +

    +

    +         def bttnToolTip = "Click to see where is ${toma.apos(infoAccion.label)} in Freeplane Menu" +

    +

    +         def bttnAction  = { e -> +

    +

    +                 def bttn = e.source +

    +

    +                 def sel = bttn.isSelected() +

    +

    +                 toma.closeMenus(infoAccion.action) +

    +

    +                 if (sel) { +

    +

    +                     toma.openMenus(infoAccion.action, 400) +

    +

    +                     bttn.label = 'Close menu' +

    +

    +                 } else { +

    +

    +                     bttn.label = 'Show me' +

    +

    +                 } +

    +

    +             } +

    +

    +          +

    +

    +         def buttonPanel = tomui.getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, true) +

    +

    +         myP.add(buttonPanel, tomui.GBC) +

    +

    +     } +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + import edofro.tutorialomatic.TabPane +

    +

    + +

    +

    + // ------------- crear buttonPanel ----------------- +

    +

    + def msgHtml = 'Do you want to close the tutorial?' +

    +

    + def bttnText    = 'Close' +

    +

    + def bttnToolTip =  'Click to close the Tutorial tab' +

    +

    + def bttnAction = { e -> +

    +

    +         TabPane.removeTab('Tutorial') +

    +

    +         TabPane.repaint() // <-- this is needed to show the change in the UI +

    +

    +     } +

    +

    + def buttonPanel = ToM_ui.getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction) +

    +

    + +

    +

    + // --------------------- crear / abrir panel ---------- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab('Tutorial', false) +

    +

    + +

    +

    + +

    +

    + // ---------- llenar contentPanel ------------------------------- +

    +

    + +

    +

    + myPanel.add(buttonPanel, ToM_ui.GBC) +

    +

    + +

    +

    + // -------------------- re establecer largo de panel ------------------- +

    +

    + ToM_ui.adjustHeight(myPanel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + +

    +

    + +

    +

    + def nodo = node +

    +

    + if (!toma.hasAction(nodo)) { +

    +

    +     c.statusInfo = 'no link to menu action in selected node' +

    +

    +     return 'no link to menu action in selected node' +

    +

    + } +

    +

    + def infoAccion = toma.getActionInfoMap(nodo) +

    +

    + +

    +

    + // -------- crear buttonPanel ---------- +

    +

    + def msgHtml = "Let's apply ${toma.apos(infoAccion.label)}" +

    +

    + def bttnText    = 'Execute' +

    +

    + def bttnToolTip =  "Click to execute ${toma.apos(infoAccion.label)} on the selected nodes" +

    +

    + def bttnAction = { e -> +

    +

    +         def bttn = e.source +

    +

    +         bttn.setEnabled(false) +

    +

    +         toma.executeAction(infoAccion, toma.ex.showHotKeys) +

    +

    +     } +

    +

    + +

    +

    + def buttonPanel = ToM_ui.getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    + +

    +

    + // --------- crear / abrir panel ----- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab('Tutorial', true) +

    +

    + +

    +

    + // ------- llenar contentPanel ---------- +

    +

    + myPanel.add(buttonPanel, ToM_ui.GBC) +

    +

    + +

    +

    + // ----- re establecer largo de panel ------ +

    +

    + ToM_ui.adjustHeight(myPanel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + +

    +

    + def nodo = node +

    +

    + def nodos = nodo.children.findAll{n -> toma.hasAction(n)} +

    +

    + def infoAcciones = [] +

    +

    + nodos.each{n -> +

    +

    +     def infoAccion = toma.getActionInfoMap(n) +

    +

    +     infoAcciones << infoAccion +

    +

    + } +

    +

    + +

    +

    + def msgHtml = "Let's apply xxxx" +

    +

    + def bttnText    = 'Execute' +

    +

    + def bttnToolTip =  "Click to execute xxxx on the selected nodes" +

    +

    + def bttnAction = { e -> +

    +

    +         def bttn = e.source +

    +

    +         bttn.setEnabled(false) +

    +

    +         toma.executeActions(infoAcciones, toma.ex.showHotKeys) +

    +

    +     } +

    +

    + +

    +

    + def buttonPanel = ToM_ui.getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    + +

    +

    + // --------- crear / abrir panel ----- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab('Tutorial', true) +

    +

    + +

    +

    + // ------- llenar contentPanel ---------- +

    +

    + myPanel.add(buttonPanel, ToM_ui.GBC) +

    +

    + +

    +

    + // ----- re establecer largo de panel ------ +

    +

    + ToM_ui.adjustHeight(myPanel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + (no había siguiente nodo) +

    + +
    + + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + import edofro.tutorialomatic.TabPane +

    +

    + +

    +

    + //import org.freeplane.core.ui.components.UITools as ui +

    +

    + +

    +

    + def primerNodo = node.children[0] +

    +

    + +

    +

    + def msgHtml = 'Este es el <b> mensaje</b> Principal' +

    +

    + def bttnText    = 'Continuar' +

    +

    + def bttnToolTip =  'Click para continuar' +

    +

    + def bttnAction = {e ->    muestraNodo(e.source, primerNodo)} +

    +

    + +

    +

    + +

    +

    + def muestraNodo(c, n){ +

    +

    +     def p = n.parent +

    +

    +     def nextNode = p.getChildPosition(n)<p.children.size()?p.children[p.getChildPosition(n)+1]:null  // siguiente nodo hermano de n (si es último entonces null) +

    +

    +     def html = n.text +

    +

    +     //ui.informationMessage(c.getActionListeners().toString()) +

    +

    +     def buttonLabel = nextNode?'Next':'Close' +

    +

    +     def buttonToolTip = nextNode?'click to show next page':'click to close the dialog' +

    +

    +     def buttonAction = {e ->   if(nextNode){ muestraNodo(e.source, nextNode)} else {TabPane.removeTab('Tutorial')}} +

    +

    +      +

    +

    +     changeButtonPanel(c, html, buttonLabel, buttonToolTip, buttonAction) +

    +

    + } +

    +

    + +

    +

    + def changeButtonPanel(boton, html, buttonLabel, buttonToolTip, buttonAction){ +

    +

    +     boton.label = buttonLabel +

    +

    +     boton.toolTipText = buttonToolTip +

    +

    +     boton.getActionListeners().each{ +

    +

    +         boton.removeActionListener(it) +

    +

    +     } +

    +

    +     boton.actionPerformed = buttonAction +

    +

    +     def contenedor = ToM_ui.getTabContentPane(boton) +

    +

    +     def editor = ToM_ui.getButtonPanel(boton).components[0] +

    +

    +     editor.text = html +

    +

    + //    contenedor.revalidate() +

    +

    + //    contenedor.repaint() +

    +

    + } +

    +

    + +

    +

    + def buttonPanel = ToM_ui.getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction) +

    +

    + +

    +

    + // --------------------- crear / abrir panel ---------- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab('Tutorial', false) +

    +

    + +

    +

    + // ---------- llenar contentPanel ------------------------------- +

    +

    + myPanel.add(buttonPanel, ToM_ui.GBC) +

    +

    + +

    +

    + // -------------------- re establecer largo de panel ------------------- +

    +

    + ToM_ui.adjustHeight(myPanel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + import edofro.tutorialomatic.TabPane +

    +

    + +

    +

    + import javax.swing.border.EmptyBorder +

    +

    + import javax.swing.border.LineBorder +

    +

    + import java.awt.Insets +

    +

    + import groovy.swing.SwingBuilder +

    +

    + import java.awt.Color +

    +

    + +

    +

    + swing      = new SwingBuilder() +

    +

    + myButtonPanelName = 'aButtonPane' +

    +

    + tabName    = 'Tutorial' +

    +

    + +

    +

    + +

    +

    + //import javax.swing.SwingUtilities as SU +

    +

    + +

    +

    + // ------------- crear buttonPanel ----------------- +

    +

    + def closeLabel   = 'Close tutorial' +

    +

    + def closeToolTip = 'Click to exit the tutorial and close the tutorial tab' +

    +

    + def nextLabel    = 'Next page' +

    +

    + def nextToolTip  = 'Click to continue to the next page of the tutorial' +

    +

    + +

    +

    + def bttnText    = 'Botón' +

    +

    + def bttnToolTip =  'This is the button' +

    +

    + def bttnAction = { e -> +

    +

    +         def boton = e.source +

    +

    + +

    +

    +         //example how to get the contentPane +

    +

    +         def myPanel = ToM_ui.getTabContentPane(boton) +

    +

    +         c.statusInfo = myPanel.toString() +

    +

    + +

    +

    +         //example how to disable the button +

    +

    +         boton.setEnabled(false) +

    +

    + +

    +

    +         //example actions +

    +

    +         ui.informationMessage('se deshabilitó el botón\n\n y tras el click se hará una pausa de dos segundos y se removerá el buttonPanel') +

    +

    + +

    +

    +         TabPane.repaint() //I think this does nothing here +

    +

    +         sleep(2000) +

    +

    + +

    +

    +         //example how to delete the buttonPanel +

    +

    +         def buttonPanel = ToM_ui.getButtonPanel(boton) +

    +

    +         myPanel.remove(buttonPanel) +

    +

    +         TabPane.repaint() // <-- this is needed to show the change in the UI +

    +

    +     } +

    +

    + +

    +

    + def nextButtonPanel = getNextButtonPanel(closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction) +

    +

    + +

    +

    + // --------------------- crear / abrir panel ---------- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab(tabName, false) +

    +

    + +

    +

    + +

    +

    + // ---------- llenar contentPanel ------------------------------- +

    +

    + +

    +

    + myPanel.add(nextButtonPanel, ToM_ui.GBC) +

    +

    + +

    +

    + // -------------------- re establecer largo de panel ------------------- +

    +

    + ToM_ui.adjustHeight(myPanel) +

    +

    + +

    +

    +     def getNextButtonPanel(closeLabel, closeToolTip, nextLabel, nextToolTip, nextButtonAction ){  //buttonLabel, buttonToolTip, buttonAction){ +

    +

    +         def panel = swing.panel( +

    +

    +             border      : new LineBorder(Color.gray, 1), +

    +

    +             name        : myButtonPanelName, +

    +

    +         ) { +

    +

    +                 borderLayout() +

    +

    +                 panel(  +

    +

    +                        // border      : new LineBorder(Color.black, 1), +

    +

    +                         border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +

    +

    +                         constraints : NORTH +

    +

    +                         //border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde +

    +

    +                         //insets      : new Insets(30,10,30,10), +

    +

    +                     ) { +

    +

    +                         borderLayout() +

    +

    +                         button( +

    +

    +                             label       : closeLabel, +

    +

    +                             constraints : WEST, +

    +

    +                             margin      : new Insets(10,15,10,15), +

    +

    +                             toolTipText : closeToolTip, +

    +

    +                             actionPerformed : {TabPane.removeTab(tabName)}, +

    +

    +                         ) +

    +

    +                         button( +

    +

    +                             label       : nextLabel, +

    +

    +                             constraints : EAST, +

    +

    +                             margin      : new Insets(10,15,10,15), +

    +

    +                             toolTipText : nextToolTip, +

    +

    +                             actionPerformed : buttonAction, +

    +

    +                         )                             +

    +

    +                     } +

    +

    +         } +

    +

    +         return panel +

    +

    +     } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + import edofro.tutorialomatic.TabPane +

    +

    + +

    +

    + def tabName = 'Tutorial' +

    +

    + +

    +

    + // ------------- crear nextButtonPanel ----------------- +

    +

    + def closeLabel   = 'Close tutorial' +

    +

    + def closeToolTip = 'Click to exit the tutorial and close the tutorial tab' +

    +

    + def nextLabel    = 'Next page' +

    +

    + def nextToolTip  = 'Click to continue to the next page of the tutorial' +

    +

    + +

    +

    + def bttnAction = { e -> +

    +

    +         def boton = e.source +

    +

    +         def myPanel = ToM_ui.getTabContentPane(boton) +

    +

    +         def buttonPanel = ToM_ui.getButtonPanel(boton) +

    +

    +         myPanel.remove(buttonPanel) +

    +

    +         TabPane.repaint() // <-- this is needed to show the change in the UI +

    +

    +     } +

    +

    + +

    +

    + //bttnAction = null +

    +

    + +

    +

    + def nextButtonPanel = ToM_ui.getNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction) +

    +

    + +

    +

    + // --------------------- crear / abrir panel ---------- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab(tabName, false) +

    +

    + +

    +

    + // ---------- llenar contentPanel ------------------------------- +

    +

    + myPanel.add(nextButtonPanel, ToM_ui.GBC) +

    +

    + +

    +

    + // -------------------- re establecer largo de panel ------------------- +

    +

    + ToM_ui.adjustHeight(myPanel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui as tomui +

    +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + def myPanel = tomui.getContentPaneFromMyTab(tom.tabName, false) +

    +

    + +

    +

    + def nextPane = myPanel.components.find{it.name == tomui.myNextPanelName} +

    +

    + +

    +

    + //nextPane.properties +

    +

    + +

    +

    + tomui.setPanelEnabled(nextPane, true) +

    +

    + +

    +

    + /* +

    +

    + def setPanelEnabled(panel, Boolean isEnabled) { +

    +

    +     panel.setEnabled(isEnabled) +

    +

    + +

    +

    +     panel.components.each{ comp -> +

    +

    +         if (comp instanceof JPanel) { +

    +

    +             setPanelEnabled(comp, isEnabled); +

    +

    +         } +

    +

    +         comp.setEnabled(isEnabled); +

    +

    +     } +

    +

    + } +

    +

    + */ +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + pre { +

    +

    +     background-color: #e5e7ff; +

    +

    +     border-left: 5px solid #ccc; +

    +

    +     display: block; +

    +

    +     padding: 8px; +

    +

    +     margin: 5px; +

    +

    + } +

    +

    + code { +

    +

    +     font-family: Consolas,"courier new"; +

    +

    +     font-size: 11px; +

    +

    +     color: #999; +

    +

    + } +

    +

    + +

    +

    + blockquote { +

    +

    +     border-left: 5px solid #cccccc; +

    +

    +     background-color: #eeeeee; +

    +

    +     padding: 8px; +

    +

    + } +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + package edofro.tutorialomatic +

    +

    + +

    +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + import edofro.tutorialomatic.ToM_actions as toma +

    +

    + +

    +

    + import edofro.menuomatic.WSE_redux              as WSE +

    +

    + +

    +

    + import org.freeplane.core.ui.components.UITools as ui +

    +

    + import org.freeplane.plugin.script.proxy.ScriptUtils +

    +

    + +

    +

    + +

    +

    + +

    +

    + class ToM{ +

    +

    + +

    +

    +     // region: properties +

    +

    +         // this region has all the properties for the ToM class +

    +

    + +

    +

    +     static final String version        = '0.0.4' +

    +

    +     static final c                     = ScriptUtils.c() +

    +

    +     static final String tabName        = 'Tutorial' +

    +

    +     static final String idDictStorage  = 'ToM_idDictionary' +

    +

    + +

    +

    +     static final Map styles = [ +

    +

    +         tutorial  : 'ToM-Tutorial'  , +

    +

    +         ini       : 'ToM_'          , +

    +

    +         note      : 'ToM_note'      , +

    +

    +         nextPage  : 'ToM_nextPage'  , +

    +

    +         newPage   : 'ToM_newPage'   , +

    +

    +         showMenu  : 'ToM_showMenu'  , +

    +

    +         toc       : 'ToM_TOC'       , +

    +

    +         goto      : 'ToM_goto'      , +

    +

    +         action    : 'ToM_menuAction', +

    +

    +         groovy    : 'ToM_groovy'    , +

    +

    +         copyPaste : 'ToM_copy'      , +

    +

    +         select    : 'ToM_select'    , +

    +

    +         openMap   : 'ToM_openMap'   , +

    +

    +         openTutMap: 'ToM_openTutMap', +

    +

    +         showNode  : 'ToM_showNode'  , +

    +

    +     ] +

    +

    + +

    +

    +     static final exeHowIcons = ['emoji-1F507', 'emoji-2328', 'emoji-1F5B1'] +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: getting tutorial components nodes +

    +

    +         //The methods in this region get the nodes from the mindmap that contain the information needed to build the tutorial +

    +

    + +

    +

    +     def static getNextTutNodes(n, boolean included = false){ +

    +

    +         def tutNodes  = getTutNodes(getTutorialNode(n)) +

    +

    +         def pos = tutNodes.indexOf(n) +

    +

    +         def t = included?0:1 +

    +

    +         return tutNodes.drop(pos + t) +

    +

    +     } +

    +

    + +

    +

    +     def static getTutNodes(nTutorial){ +

    +

    +         return nTutorial.find{it.style.name?.startsWith(styles.ini)?:false} +

    +

    +     } +

    +

    + +

    +

    +     def static getTutorialNode(n){ +

    +

    +         return n.pathToRoot.find{it.style.name == styles.tutorial} +

    +

    +     } +

    +

    + +

    +

    +     def static getNewPageNodes(nTutorial){ +

    +

    +         return nTutorial.find{it.style.name == styles.newPage} +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: loop fill contentPane +

    +

    +         // this region contains the methods that loop over the "tutorial nodes" and builds a tutorial page +

    +

    + +

    +

    +     def static fillContentPane(myPanel, nextTutNodes, boolean doClear = true){ +

    +

    +         def interruptLoop = false +

    +

    +         def startingNewPage = true +

    +

    +         if(doClear) myPanel.removeAll() +

    +

    +         tomui.resizeContentPanel(myPanel,tomui.maxContentPaneHeigth) +

    +

    +         for (tutNode in nextTutNodes){ +

    +

    +             switch(tutNode.style.name){ +

    +

    +                 case styles.note: +

    +

    +                     addNotes(myPanel, tutNode.children) +

    +

    +                     break +

    +

    +                 case styles.nextPage: +

    +

    +                     addNextPagePane(myPanel, tutNode, false) +

    +

    +                     interruptLoop = true +

    +

    +                     break +

    +

    +                 case styles.newPage: +

    +

    +                     if (startingNewPage){ +

    +

    +                         addPageTitle(myPanel, tutNode) +

    +

    +                     } else { +

    +

    +                         addNextPagePane(myPanel, tutNode, true) +

    +

    +                         interruptLoop = true +

    +

    +                     } +

    +

    +                     break +

    +

    +                 case styles.showMenu: +

    +

    +                     addShowMenuItemPane(myPanel, tutNode.children) +

    +

    +                     break +

    +

    +                 case styles.toc: +

    +

    +                     addTOCPane(myPanel, tutNode) +

    +

    +                     break +

    +

    +                 case styles.goto: +

    +

    +                     addGotoPane(myPanel, tutNode.children, nextTutNodes[0]) +

    +

    +                     break +

    +

    +                 case styles.action: +

    +

    +                     addActionPane(myPanel, tutNode) +

    +

    +                     break +

    +

    +                 case styles.groovy: +

    +

    +                     addGroovyPane(myPanel, tutNode) +

    +

    +                     break +

    +

    +                 case styles.copyPaste: +

    +

    +                     addPastePane(myPanel, tutNode) +

    +

    +                     break +

    +

    +                 case styles.select: +

    +

    +                     addSelectPane(myPanel, tutNode) +

    +

    +                     break +

    +

    +                 case styles.openMap: +

    +

    +                     addOpenMapPane(myPanel, tutNode) +

    +

    +                     break +

    +

    +                 case styles.openTutMap: +

    +

    +                     addInspectPane(myPanel, tutNode) +

    +

    +                     break +

    +

    +                 case styles.showNode: +

    +

    +                     addShowNodePane(myPanel, tutNode) +

    +

    +                     break +

    +

    +                 default: +

    +

    +                     ui.informationMessage('node style not defined') +

    +

    +                     break +

    +

    +             } +

    +

    +             startingNewPage = false +

    +

    +             if(interruptLoop) break +

    +

    +         } +

    +

    +         if(!interruptLoop) addNextPagePane(myPanel, nextTutNodes[-1], false, false) +

    +

    +         tomui.adjustHeight(myPanel, doClear) +

    +

    +     } +

    +

    + +

    +

    +     def static fillPage(myP, nodo, included, doClear){ +

    +

    +         def nextNodes = getNextTutNodes(nodo, included) +

    +

    +         fillContentPane(myP, nextNodes, doClear) +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: adding tutorial components nodes as contentPanes to tutorial tab +

    +

    +         //methods that create the contentPanes used to build a tutorial page +

    +

    + +

    +

    +     def static addNotes(myP, nodos){ +

    +

    +         nodos.each{n -> +

    +

    +             if(n.note) { +

    +

    +                 myP.add(tomui.createInstructionsPane(n), tomui.GBC) +

    +

    +             } +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static addPageTitle(myP, String texto){ +

    +

    +         def html = "<html><style>h1 {color: rgb(240, 240, 240);background-color: rgb(100, 100, 150);display: block;padding: 10px;}</style><body><h1>${texto}</h1></body></html>" +

    +

    +         myP.add(tomui.createInstructionsPane(html), tomui.GBC) +

    +

    +     } +

    +

    + +

    +

    +     def static addPageTitle(myP, nodo){ +

    +

    +         addPageTitle(myP, nodo.text) +

    +

    +     } +

    +

    + +

    +

    +     def static addNextPagePane(myP, lastNode, boolean included = false, boolean showNextButton = true){ +

    +

    +         def closeLabel   = 'Stop tutorial' +

    +

    +         def closeToolTip = 'Click to stop the tutorial and close the tutorial tab' +

    +

    +         def nextLabel    = showNextButton?'Next page':'Show tutorials' +

    +

    +         def nextToolTip  = showNextButton?'Click to continue to the next page of the tutorial':'Click to see the list of tutorials' +

    +

    +         def bttnAction   = showNextButton? { e -> fillPage(myP, lastNode, included, true) } : { e -> showTutorials(lastNode.mindMap) }  +

    +

    +         def tocLabel     = 'Table of Contents' +

    +

    +         def tocToolTip   = 'Click to show the Table of Contents of the tutorial' +

    +

    +         def tocBttnAction   = { e -> showTOC(myP,lastNode) } +

    +

    + +

    +

    +         def nextButtonPanel = tomui.createNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction, tocLabel, tocToolTip, tocBttnAction) +

    +

    +         myP.add(nextButtonPanel, tomui.GBC) +

    +

    +     } +

    +

    + +

    +

    +     def static addShowMenuItemPane(myP, nodos){ +

    +

    +         nodos.findAll{n -> toma.hasAction(n)}.each{nodo -> +

    +

    +             def infoAccion  = toma.getActionInfoMap(nodo) +

    +

    +             if (infoAccion){ +

    +

    +                 def msgHtml     = infoAccion.instructions +

    +

    +                 def bttnText    = 'Show it in the menu' +

    +

    +                 def bttnToolTip = "Click to see where is ${toma.apos(infoAccion.label)} in Freeplane Menu" +

    +

    +                 def bttnAction  = { e -> +

    +

    +                         def bttn = e.source +

    +

    +                         def sel = bttn.isSelected() +

    +

    +                         def bttnPanel = tomui.getButtonPanel(bttn) +

    +

    +                         bttnPanel.pending = sel +

    +

    +                         toma.closeMenus(infoAccion.action) +

    +

    +                         if (sel) { +

    +

    +                             toma.openMenus(infoAccion.action, 400) +

    +

    +                             bttn.label = 'Close menu' +

    +

    +                             tomui.setNextPagePanelEnabled(myP, false) +

    +

    +                         } else { +

    +

    +                             bttn.label = 'Show me' +

    +

    +                             if(! tomui.anyCompPending(myP) ) tomui.setNextPagePanelEnabled(myP, true) +

    +

    +                         } +

    +

    +                     } +

    +

    + +

    +

    +                 def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, true) +

    +

    +                 buttonPanel.metaClass.pending = false +

    +

    +                 myP.add(buttonPanel, tomui.GBC) +

    +

    +             } else { +

    +

    +                 def textoHtml = '<html><body><p>Command not encountered in Menu for active map</p></body></html>' +

    +

    +                 myP.add(tomui.createInstructionsPane(textoHtml), tomui.GBC) +

    +

    +             } +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static addGotoPane(myP, nodos, backNode){ +

    +

    +         nodos.findAll{n -> n.link.node?true:false}.each{nodo -> +

    +

    +             def targetNode  = nodo.link.node +

    +

    +             def msgHtml     = nodo.note?tomui.getHtmlFromNote(nodo):null +

    +

    +             def bttnText    = nodo.text +

    +

    +             def bttnToolTip = "Click to go to '${bttnText}' section" +

    +

    +             def bttnAction  = { e -> gotoAction(myP, targetNode, backNode) } +

    +

    +             def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +             myP.add(buttonPanel, tomui.GBC) +

    +

    +         } +

    +

    +     } +

    +

    +      +

    +

    +      def static gotoAction(myP,targetNode, backNode){ +

    +

    +          myP.removeAll() +

    +

    +          addReturnPane(myP, backNode) +

    +

    +          fillPage(myP, targetNode, true, false) +

    +

    +          addReturnPane(myP, backNode) +

    +

    +      } +

    +

    +      +

    +

    +     def static addReturnPane(myP, backNode){ +

    +

    +         def msgHtml     = "Return to '${backNode.text}' page" +

    +

    +         def bttnText    = 'go back' +

    +

    +         def bttnToolTip = "Click to go to '${backNode.text}' section" +

    +

    +         def bttnAction  = { e -> fillPage(myP, backNode, true, true)} +

    +

    +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +         myP.add(buttonPanel, tomui.GBC) +

    +

    +     } +

    +

    + +

    +

    +     def static addGroovyPane(myP, nodoT){ +

    +

    +         def enabled = !disableBttn(nodoT) +

    +

    +         nodoT.children.findAll{n -> WSE.isGroovyNode(n)}.each{nodo -> +

    +

    +             def script = WSE.scriptFromNode(nodo) +

    +

    +             if (script){ +

    +

    +                 def scrText     = script + "\n c.statusInfo = '---- ready ----'".toString() +

    +

    +                 def msgHtml     = getGroovyHtml(nodo, script) +

    +

    +                 def bttnText    = 'Execute' +

    +

    +                 def bttnToolTip = "Click to execute script on selected nodes" +

    +

    +                 def bttnAction  = { e -> +

    +

    +                         def bttn = e.source +

    +

    +                         bttn.setEnabled(enabled) +

    +

    +                         c.script(scrText, "groovy").executeOn(c.selected) +

    +

    +                     } +

    +

    + +

    +

    +                 def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +                 buttonPanel.metaClass.pending = false +

    +

    +                 myP.add(buttonPanel, tomui.GBC) +

    +

    +             } else { +

    +

    +                 def textoHtml = '<html><body><p>No script encountered in tutorial node</p></body></html>' +

    +

    +                 myP.add(tomui.createInstructionsPane(textoHtml), tomui.GBC) +

    +

    +             } +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +      def static getGroovyHtml(nodo, script){ +

    +

    +          def showScript = nodo.icons.icons.contains('emoji-1F50D') +

    +

    +          uiMsg("showScript ${showScript}") +

    +

    +          def html = showScript? tomui.getHtmlFromGroovyNode(nodo, script) : nodo.text +

    +

    +          uiMsg("html ${html}") +

    +

    +          return html +

    +

    +      } +

    +

    + +

    +

    +     def static addActionPane(myP, nodo){ +

    +

    +         def infoAcciones = [] +

    +

    +         nodo.children.findAll{n -> toma.hasAction(n)}.each{n -> +

    +

    +             def infoAccion = toma.getActionInfoMap(n) +

    +

    +             infoAcciones << infoAccion +

    +

    +         } +

    +

    +         def msgHtml = nodo.note?tomui.getHtmlFromNote(nodo):null +

    +

    +         def bttnText    = 'Execute' +

    +

    +         def bttnToolTip =  "Click to execute the command on the selected nodes" +

    +

    +         def enabled = !disableBttn(nodo) +

    +

    +         def exeHow  = exeActionsHow(nodo) +

    +

    +         def bttnAction = { e -> +

    +

    +                 def bttn = e.source +

    +

    +                 bttn.setEnabled(enabled) +

    +

    +                 toma.executeActions(infoAcciones, exeHow) +

    +

    +             } +

    +

    + +

    +

    +         def buttonPanel = ToM_ui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +         myP.add(buttonPanel, tomui.GBC) +

    +

    +     } +

    +

    + +

    +

    +      def static exeActionsHow(nodo){ +

    +

    +          def iconos = nodo.icons.icons +

    +

    +          def iconitos = iconos.intersect(exeHowIcons) +

    +

    +          if(iconitos){ +

    +

    +              def index = exeHowIcons.indexOf(iconitos[0]) +

    +

    +              return toma.ex.values()[index] +

    +

    +          } else { +

    +

    +              return toma.ex.showHotKeys +

    +

    +          } +

    +

    +      } +

    +

    + +

    +

    +      def static disableBttn(nodo){ +

    +

    +          def iconos = nodo.icons.icons +

    +

    +          return iconos.contains('emoji-1F56F') +

    +

    +      } +

    +

    + +

    +

    +     def static addPastePane(myP, nodoSource){ +

    +

    +         def enabled     = !disableBttn(nodoSource) +

    +

    +         def msgHtml     = "Click to paste the example nodes to the selected node" +

    +

    +         def bttnText    = "Insert nodes" +

    +

    +         def bttnToolTip = "Click to paste the example nodes to the selected node" +

    +

    +         def bttnAction  = { e -> +

    +

    +             def bttn = e.source +

    +

    +             bttn.setEnabled(enabled) +

    +

    +             def nodoTarget = c.selected +

    +

    +             def existentesNodoTarget = nodoTarget.findAll() +

    +

    +             nodoSource.children.each{n -> +

    +

    +                 nodoTarget.appendBranch(n) +

    +

    +             } +

    +

    +             def idSource = ( nodoSource.findAll() - nodoSource )*.id +

    +

    +             def idTarget = ( nodoTarget.findAll() - existentesNodoTarget )*.id +

    +

    +             //carga idDictionary desde mapa.storage +

    +

    +             def mapa = nodoTarget.map +

    +

    +             def idDictionary = getIdDictionary(mapa) +

    +

    +             //actualiza idDictionary +

    +

    +             for (def i = 0; i < idSource.size() ; i++){ +

    +

    +                 idDictionary[ idSource[i] ] = idTarget[i] +

    +

    +             } +

    +

    +             //guarda idDictionary en mapa +

    +

    +             setIdDictionary(mapa, idDictionary) +

    +

    +         } +

    +

    +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +         myP.add(buttonPanel, tomui.GBC) +

    +

    +     } +

    +

    + +

    +

    +     def static addSelectPane(myP, nodo){ +

    +

    +         def enabled     = !disableBttn(nodo) +

    +

    +         def msgHtml     = "Click to select the node(s)" +

    +

    +         def bttnText    = "Select node(s)" +

    +

    +         def bttnToolTip = "Click to select the nodes" +

    +

    +         def bttnAction  = { e -> +

    +

    +             def bttn = e.source +

    +

    +             bttn.setEnabled(enabled) +

    +

    +             //carga idDictionary desde mapa.storage +

    +

    +             def mapa = c.selected.map +

    +

    +             def idDictionary = getIdDictionary(mapa) +

    +

    +             def nodos = [] +

    +

    +             (nodo.findAll()- nodo).each{ n -> +

    +

    +                 //get list of clones ids +

    +

    +                 uiMsg("n.Id ${n.id}") +

    +

    +                 def clonesIds = n.getNodesSharingContent()*.id +

    +

    +                 uiMsg("clonesIds $clonesIds") +

    +

    +                 //intersect with list of dist.keySet +

    +

    +                 def keySet = idDictionary.keySet() +

    +

    +                 uiMsg("keySet $keySet") +

    +

    +                 def sourceId = keySet.intersect(clonesIds) +

    +

    +                 uiMsg("sourceId $sourceId") +

    +

    +                 //get Target id +

    +

    +                 def targetId = sourceId?idDictionary[ sourceId[0] ]:null +

    +

    +                 uiMsg("targetId $targetId") +

    +

    +                 //get node +

    +

    +                 def targetNode = targetId?mapa.node(targetId):null +

    +

    +                 uiMsg("targetNode $targetNode") +

    +

    +                 //add node to nodes list +

    +

    +                 if(targetNode) nodos += targetNode +

    +

    +                 uiMsg("nodos $nodos") +

    +

    +             } +

    +

    +             //select nodes list +

    +

    +             uiMsg("nodos $nodos") +

    +

    +             c.select(nodos) +

    +

    +         } +

    +

    +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +         myP.add(buttonPanel, tomui.GBC) +

    +

    +     } +

    +

    + +

    +

    +      def static getIdDictionary(mapa){ +

    +

    +          def dict = [:] +

    +

    +          def textoDict = mapa.storage[idDictStorage] +

    +

    +          if(textoDict){ +

    +

    +              textoDict.toString().split(';').each{e -> +

    +

    +                  def (k,v) = e.split(':') +

    +

    +                  dict[k] = v +

    +

    +              } +

    +

    +          } +

    +

    +          return dict +

    +

    +      } +

    +

    + +

    +

    +      def static setIdDictionary(mapa, dict){ +

    +

    +          def texto = new StringBuilder() +

    +

    +          dict.each{k,v -> +

    +

    +              texto << "${k}:${v};" +

    +

    +          } +

    +

    +          mapa.storage[idDictStorage] = texto +

    +

    +      } +

    +

    + +

    +

    +     def static addOpenMapPane(myP, tutNode){ +

    +

    +         def sep         = File.separator +

    +

    +         def nodoMapa    = tutNode.children.find{it.text.endsWith('.mm')} +

    +

    +         def mapFileName = nodoMapa?.text +

    +

    +         def Dir         = tutNode.map.file.parent +

    +

    +         def pathName    = Dir + sep + mapFileName +

    +

    +         def enabled     = !disableBttn(tutNode) +

    +

    +         def msgHtml     = tomui.getHtmlFromNote(nodoMapa)?:"Click to open '${mapFileName}'" +

    +

    +         def bttnText    = "Open map '${mapFileName}'" +

    +

    +         def bttnToolTip = "Click to open '${mapFileName}'" +

    +

    +         def bttnAction  = { e -> +

    +

    +             def bttn = e.source +

    +

    +             bttn.setEnabled(enabled) +

    +

    +             def mapa = getMapFromPath(pathName, true) //usar mapa indicado (pero oculto) +

    +

    +         } +

    +

    +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +         myP.add(buttonPanel, tomui.GBC) +

    +

    +     } +

    +

    + +

    +

    +     def static addInspectPane(myP, nodo){ +

    +

    +         def msgHtml     = "Click to inspect this page in the tutorial map" +

    +

    +         def bttnText    = "inspect" +

    +

    +         def bttnToolTip = "Click to select the page's source nodes" +

    +

    +         def bttnAction  = { e -> +

    +

    +             def pageNode = nodo.parent +

    +

    +             def m = c.mapLoader(nodo.map.file).withView()//.selectNodeById(pageNodeId) +

    +

    +             m.load() +

    +

    +             pageNode.pathToRoot*.folded = false +

    +

    +             c.select(pageNode) +

    +

    +         } +

    +

    +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +         myP.add(buttonPanel, tomui.GBC) +

    +

    +     } +

    +

    + +

    +

    +     def static addShowNodePane(myP, nodo){ +

    +

    +         def nodos = nodo.children.findAll{ n -> n.link && (n.link.node || (!n.link.node && !n.link.file && n.link.uri.scheme == 'file'))} +

    +

    +         nodos.each{ n -> +

    +

    +             def msgHtml     = "Click to show ${n.text}" +

    +

    +             def bttnText    = "goto Node" +

    +

    +             def bttnToolTip = "Click to show ${n.text}" +

    +

    +             def bttnAction   +

    +

    +             if(n.link.node){ +

    +

    +                 bttnAction = { e -> +

    +

    +                     def tNode = n.link.node +

    +

    +                     def m = c.mapLoader(tNode.map.file).withView()//.selectNodeById(pageNodeId) +

    +

    +                     m.load() +

    +

    +                     tNode.pathToRoot*.folded = false +

    +

    +                     c.select(tNode) +

    +

    +                     c.centerOnNode(tNode) +

    +

    +                 } +

    +

    +             } else { +

    +

    +                 bttnAction = { e -> +

    +

    +                     def path = n.link.uri.path.drop(1) +

    +

    +                     def id = n.link.uri.fragment +

    +

    +                     def m = c.mapLoader(path).withView()//.selectNodeById(pageNodeId) +

    +

    +                     m.load() +

    +

    +                     def tNode = m.mindMap.node(id) +

    +

    +                     tNode.pathToRoot*.folded = false +

    +

    +                     c.select(tNode) +

    +

    +                     c.centerOnNode(tNode) +

    +

    +                 } +

    +

    +             } +

    +

    +             def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +             myP.add(buttonPanel, tomui.GBC) +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static addTOCPane(myP,nodo){ +

    +

    +         def titleNodes  = getNewPageNodes(getTutorialNode(nodo)) +

    +

    +         def pane = tomui.createEmptyGridBagPanel() +

    +

    +         titleNodes.each{ tn -> +

    +

    +             def title = tn.text +

    +

    +             def bttnAction   = { e -> fillPage(myP, tn, true, true) } +

    +

    +             def button = tomui.createButton(title, bttnAction) +

    +

    +             pane.add(button, tomui.GBC) +

    +

    +         } +

    +

    +         myP.add(pane, tomui.GBC) +

    +

    +     } +

    +

    + +

    +

    +     def static addTutorialsPane(myP, mapa){ +

    +

    +         def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial} +

    +

    +         if ( nodosTutoriales.size() != 1 ){ +

    +

    +             def pane = tomui.createEmptyGridBagPanel() +

    +

    +             def pre  = nodosTutoriales.size() == 0 ? "No t" : "T" +

    +

    +             addPageTitle(myP, "${pre}utorials present in '${mapa.name}' map".toString()) +

    +

    +             nodosTutoriales.each{ nT -> +

    +

    +                 def title = nT.text +

    +

    +                 def bttnAction   = { e -> +

    +

    +                     def tutNodes = getTutNodes(nT) +

    +

    +                     if(tutNodes) { +

    +

    +                         fillContentPane(myP, tutNodes) +

    +

    +                     } else { +

    +

    +                         ui.informationMessage( "no tutorial components(nodes) found for tutorial '${nT.text}'".toString() ) +

    +

    +                     } +

    +

    +                 } +

    +

    +                 def button = tomui.createButton(title, bttnAction) +

    +

    +                 pane.add(button, tomui.GBC) +

    +

    +             } +

    +

    +             def stopButton = tomui.createButton('Exit tutorial', {tomui.closeTab(tabName)}) +

    +

    +             pane.add(stopButton, tomui.GBC) +

    +

    +             myP.add(pane, tomui.GBC) +

    +

    +         } else { +

    +

    +             def nT = nodosTutoriales[0] +

    +

    +             def tutNodes = getTutNodes(nT) +

    +

    +             if(tutNodes) { +

    +

    +                 fillContentPane(myP, tutNodes) +

    +

    +             } else { +

    +

    +                 ui.informationMessage( "no tutorial components(nodes) found for tutorial '${nT.text}'".toString() ) +

    +

    +             } +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: showing other content in Tutorial Tab +

    +

    +         //this region contains the methods that uses the tab to show other content leaving the Tutorial itself +

    +

    + +

    +

    +     def static showTOC(myP,nodo){ +

    +

    +         myP.removeAll() +

    +

    +         tomui.resizeContentPanel(myP,tomui.maxContentPaneHeigth) +

    +

    +         addTOCPane(myP,nodo) +

    +

    +         tomui.adjustHeight(myP, true) +

    +

    +     } +

    +

    + +

    +

    +     def static showTutorials(mapa){ +

    +

    +         def myP = tomui.getContentPaneFromMyTab(tabName, true) +

    +

    +         myP.removeAll() +

    +

    +         tomui.resizeContentPanel(myP,tomui.maxContentPaneHeigth) +

    +

    +         addTutorialsPane(myP, mapa) +

    +

    +         tomui.adjustHeight(myP, true) +

    +

    +     } +

    +

    + +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: Getting map +

    +

    +         //this region contains the methods used to open mindmaps +

    +

    + +

    +

    +     def static getMapFromPath(filePath, withView){ +

    +

    +         if(exists(filePath)){ +

    +

    +             def m = c.mapLoader(filePath) +

    +

    +             if(withView) m.withView() +

    +

    +             return m.load() +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static exists(String path){new File(path).isFile()} +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    +     // region: help / debug +

    +

    + +

    +

    +     def static uiMsg(texto){ +

    +

    +        //ui.informationMessage(texto.toString()) +

    +

    +     } +

    +

    + +

    +

    +     // end: +

    +

    + +

    +

    + +

    +

    + } +

    + +
    + + + + + + + + + + + + + + + +

    + // para probar en mapa Tutorial Sample.mm +

    +

    +     // para la prueba seleccionar uno de los nodos comonentes 'ToM_' +

    +

    + +

    +

    + def tomTutorial = 'ToM-Tutorial' +

    +

    + def tomIni      = 'ToM_' +

    +

    + +

    +

    + //saca listado de tutotiales de mapa +

    +

    + def nodosTutoriales = node.map.root.find{it.style.name == tomTutorial} +

    +

    + //return nodosTutoriales +

    +

    + +

    +

    + // se elige tutorial +

    +

    +     //en este ejemplo se toma el primero +

    +

    +     //TODO: hacer que usuario elija tutorial a realizar +

    +

    + def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null +

    +

    + //return nTutorial +

    +

    + +

    +

    + // listado de componentes de tutorial +

    +

    + def nodosTut = nTutorial.find{it.style.name?.startsWith(tomIni)?:false} +

    +

    + +

    +

    + if(!nodosTut) return 'no tutorial components(nodes) found' +

    +

    + +

    +

    + // prueba: ver posicion de nodo seleccionado en el listado +

    +

    +  def pos = nodosTut.indexOf(node) +

    +

    + +

    +

    + // prueba: obtener listado de nodos restantes +

    +

    + def restoDeNodos = nodosTut.drop(pos + 1) +

    +

    + +

    +

    + +

    +

    + // prueba: obtener siguiente nodo +

    +

    + def sigNodo = nodosTut.get(pos + 1) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + import edofro.tutorialomatic.ToM         as tom +

    +

    + +

    +

    + def nodos = node.children +

    +

    + +

    +

    + // --------------------- crear / abrir panel ---------- +

    +

    + def myPanel = tomui.getContentPaneFromMyTab('Tutorial', true) +

    +

    + +

    +

    + tom.addShowMenuItemPane(myPanel, nodos) +

    +

    + +

    +

    + tomui.adjustHeight(myPanel) +

    +

    + +

    +

    + +

    +

    + return 'listo' +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    +
    + + + + + + + +

    + import edofro.tutorialomatic.ToM_ui +

    +

    + +

    +

    + // para probar en mapa Tutorial Sample.mm +

    +

    +     // para la prueba seleccionar uno de los nodos comonentes 'ToM_' +

    +

    + +

    +

    + tomTutorial = 'ToM-Tutorial' +

    +

    + tomIni      = 'ToM_' +

    +

    + tabName     = 'Tutorial' +

    +

    + +

    +

    + +

    +

    + //saca listado de tutotiales de mapa +

    +

    + def nodosTutoriales = node.map.root.find{it.style.name == tomTutorial} +

    +

    + +

    +

    + // se elige tutorial +

    +

    +     //en este ejemplo se toma el primero +

    +

    +     //TODO: hacer que usuario elija tutorial a realizar +

    +

    + def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null +

    +

    + +

    +

    + // listado de componentes de tutorial +

    +

    + def tutNodes = getTutNodes(nTutorial) +

    +

    + if(!tutNodes) return 'no tutorial components(nodes) found' +

    +

    + +

    +

    + // ---- crear / abrir panel ----- +

    +

    + def myPanel = ToM_ui.getContentPaneFromMyTab(tabName, true) +

    +

    + +

    +

    + fillContentPane(myPanel, tutNodes) +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + // ---------- Methods ------------------------------- +

    +

    + def addNotes(myP, nodos){ +

    +

    +     nodos.each{n -> +

    +

    +         if(n.note) { +

    +

    +             myP.add(ToM_ui.createInstructionsPane(n), ToM_ui.GBC) +

    +

    +         } +

    +

    +     }    +

    +

    + } +

    +

    + +

    +

    + def addNextPagePane(myP, lastNode){ +

    +

    +     def closeLabel   = 'Close tutorial' +

    +

    +     def closeToolTip = 'Click to exit the tutorial and close the tutorial tab' +

    +

    +     def nextLabel    = 'Next page' +

    +

    +     def nextToolTip  = 'Click to continue to the next page of the tutorial' +

    +

    +     def bttnAction   = lastNode?{ e -> +

    +

    +             myP.removeAll() +

    +

    +             def nextNodes = getNextTutNodes(lastNode) +

    +

    +             fillContentPane(myP, nextNodes) +

    +

    +         }:null +

    +

    +     def nextButtonPanel = ToM_ui.getNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction) +

    +

    +     myP.add(nextButtonPanel, ToM_ui.GBC) +

    +

    + } +

    +

    + +

    +

    + def getTutorialNode(n){ +

    +

    +     return n.pathToRoot.find{it.style.name == tomTutorial} +

    +

    + } +

    +

    + +

    +

    + def getTutNodes(nTutorial){ +

    +

    +     return nTutorial.find{it.style.name?.startsWith(tomIni)?:false} +

    +

    + } +

    +

    + +

    +

    + def getNextTutNodes(n){ +

    +

    +     def tutNodes  = getTutNodes(getTutorialNode(n)) +

    +

    +     def pos = tutNodes.indexOf(n) +

    +

    +     return tutNodes.drop(pos + 1) +

    +

    + } +

    +

    + +

    +

    + def fillContentPane(myPanel, nextTutNodes){ +

    +

    +     def interruptLoop = false +

    +

    +     // loop TutNodes +

    +

    +     for (tutNode in nextTutNodes){ +

    +

    +         switch(tutNode.style.name){ +

    +

    +             case 'ToM_note': +

    +

    +                 addNotes(myPanel, tutNode.children) +

    +

    +                 break +

    +

    +             case 'ToM_nextPage': +

    +

    +                 addNextPagePane(myPanel, tutNode) +

    +

    +                 interruptLoop = true +

    +

    +                 break +

    +

    +             default: +

    +

    +                 ui.informationMessage('node style not defined') +

    +

    +                 break +

    +

    +         } +

    +

    +         if(interruptLoop) break +

    +

    +     } +

    +

    +     if(!interruptLoop) addNextPagePane(myPanel, null) +

    +

    +     ToM_ui.adjustHeight(myPanel) +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui as tomui +

    +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + //saca listado de tutotiales de mapa +

    +

    + def nodosTutoriales = node.map.root.find{it.style.name == tom.styles.tutorial} +

    +

    + +

    +

    + // se elige tutorial +

    +

    +     //TODO: hacer que usuario elija tutorial a realizar +

    +

    + def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null +

    +

    + +

    +

    + // listado de componentes de tutorial +

    +

    + def tutNodes = tom.getTutNodes(nTutorial) +

    +

    + if(!tutNodes) return 'no tutorial components(nodes) found' +

    +

    + +

    +

    + // ---- crear / abrir panel ----- +

    +

    + def myPanel = tomui.getContentPaneFromMyTab(tom.tabName, true) +

    +

    + +

    +

    + tom.fillContentPane(myPanel, tutNodes) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui as tomui +

    +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + def myPanel = tomui.getContentPaneFromMyTab(tom.tabName, false) +

    +

    + +

    +

    + myPanel.components.findAll{it.hasProperty('pending') && it.pending}.size() +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + + + + + + + +

    + package edofro.menuomatic +

    +

    + +

    +

    + import org.freeplane.plugin.script.FreeplaneScriptBaseClass.ConfigProperties +

    +

    + +

    +

    + +

    +

    + class WSE_redux{ +

    +

    +     static final String attributeForExtensions =  new ConfigProperties().getProperty('wikdShellExtension_attributeForExtensions','file_ext') +

    +

    + +

    +

    + //region: get/set/is extension from selected node +

    +

    + +

    +

    +     def static extensionFromNode(n){ +

    +

    +         extensionFromAttribute(n)?:extensionFromDetails(n)?:extensionFromText(n)?:null +

    +

    +     } +

    +

    + +

    +

    +     def static extensionFromAttribute(n){ +

    +

    +         n[attributeForExtensions]?:null +

    +

    +     } +

    +

    + +

    +

    +     def static extensionFromDetails(n){ +

    +

    +         n.details?.size()>1?n.details?[0]=='.'?n.details.drop(1).takeBefore(' ').takeBefore('\n')?:n.details.drop(1).takeBefore('\n')?:n.details.drop(1).takeBefore(' ')?:n.details.drop(1):null:null +

    +

    +     } +

    +

    + +

    +

    +     def static extensionFromText(n){ +

    +

    +         n.text.reverse().takeBefore('.').reverse() +

    +

    +     } +

    +

    + +

    +

    +     def static extensionFromFilePath(filepath){ +

    +

    +         return filepath.reverse().split("\\.")[0].reverse().toLowerCase() +

    +

    +     } +

    +

    + +

    +

    +     def static setExtension(n, ext){ +

    +

    +         // If it's allready defined --> do nothing +

    +

    +         if(extensionFromAttribute(n)==ext || extensionFromDetails(n)==ext) return +

    +

    +         //I prefer it in this order: +

    +

    +             // only details +

    +

    +             // if details are beeing Used --> attribute +

    +

    +         if(!n.details){ +

    +

    +             n.details = '.' + ext +

    +

    +         } else { +

    +

    +             n[attributeForExtensions] = ext +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     def static extensionFromNodeFile(n){ +

    +

    +         (n.link && n.link.uri && n.link.uri.scheme == 'file')?extensionFromFilePath(n.link.uri.path):null +

    +

    +     } +

    +

    + +

    +

    +     def static isExtensionNode(n, extension){ +

    +

    +         def ext = extensionFromNodeFile(n)?:extensionFromNode(n) +

    +

    +         return ext?ext==extension:false +

    +

    +     } +

    +

    + +

    +

    + //end: +

    +

    + +

    +

    + +

    +

    + //region: groovy Node +

    +

    + +

    +

    +     def static isGroovyNode(n){ +

    +

    +         return (isExtensionNode(n, 'groovy') || n['script1']?true:false) +

    +

    +     } +

    +

    + +

    +

    +     def static scriptFromNode(n){ +

    +

    +         def input = null +

    +

    +         if (isGroovyNode(n)){ +

    +

    +             if ( extensionFromNodeFile(n) == 'groovy' ) { +

    +

    +                 input   = n.link.file.text +

    +

    +             } else if ( n['script1']?true:false ){ +

    +

    +                 input   = n['script1'].plain.toString().trim() +

    +

    +             } else if ( n.note ){ +

    +

    +                 input   = n.note.toString() +

    +

    +             } +

    +

    +         } +

    +

    +         return input +

    +

    +     } +

    +

    + +

    +

    + //end: +

    +

    + +

    +

    + } +

    + +
    +
    + + + + + + + + + + + + + + + + + + + +

    + package edofro.pseudofreeplaneapi +

    +

    + +

    +

    + //region: imports +

    +

    + +

    +

    + import org.freeplane.features.map.MapModel; +

    +

    + import org.freeplane.features.map.NodeModel; +

    +

    + import org.freeplane.features.mode.Controller; +

    +

    + import org.freeplane.features.styles.MapStyleModel; +

    +

    + import org.freeplane.plugin.script.ScriptContext +

    +

    + import org.freeplane.plugin.script.proxy.MapProxy +

    +

    + import org.freeplane.plugin.script.proxy.NodeProxy +

    +

    + import org.freeplane.plugin.script.proxy.ScriptUtils +

    +

    + +

    +

    + +

    +

    + class UserStyles { +

    +

    + +

    +

    + //region: properties +

    +

    + +

    +

    + //end: +

    +

    + +

    +

    + //region: copyUserStyles +

    +

    + +

    +

    +     def copyUserStyles(sourceMap, targetMap, boolean showMessage, groovy.lang.Closure closure){ +

    +

    +         def stylesToImport = getUserDefinedStylesParentNode(sourceMap).children.findAll(closure) +

    +

    +         def styleNamesToImport = stylesToImport*.text +

    +

    +         def texto = new StringBuilder("The following styles were imported \n from map '${sourceMap.name}.mm' \n into current map '${targetMap.name}.mm':\n\n") +

    +

    +         styleNamesToImport.each{styleName -> +

    +

    +             targetMap.copyStyleFrom(sourceMap, styleName) +

    +

    +             def sourceStyleNode = getUserStyleNode(sourceMap, styleName ) +

    +

    +             def targetStyleNode = getUserStyleNode(targetMap, styleName ) +

    +

    +             copyIcons(sourceStyleNode, targetStyleNode) +

    +

    +             copyAttributes(sourceStyleNode, targetStyleNode) +

    +

    +             texto << "   - $styleName\n" +

    +

    +         } +

    +

    +         texto << "\n\n" +

    +

    +         if(showMessage) ui.informationMessage(texto.toString()) +

    +

    +     } +

    +

    + +

    +

    +     def copyUserStyles(sourceMap, targetMap, boolean showMessage = true){ +

    +

    +         copyUserStyles(sourceMap, targetMap, showMessage, {true}) +

    +

    +     } +

    +

    + +

    +

    +     def copyUserStyles(sourceMap, targetMap, groovy.lang.Closure closure){ +

    +

    +         copyUserStyles(sourceMap, targetMap, true, closure) +

    +

    +     } +

    +

    + +

    +

    +     def copyUserStyles(sourceMap, targetMap, String[] lista){ +

    +

    +         copyUserStyles(sourceMap, targetMap, true, lista) +

    +

    +     } +

    +

    + +

    +

    +     def copyUserStyles(sourceMap, targetMap, boolean showMessage, String[] lista){ +

    +

    +         def closure = {it.text in lista} +

    +

    +         copyUserStyles(sourceMap, targetMap, showMessage, closure) +

    +

    +     } +

    +

    + +

    +

    +     def copyUserStyles(sourceMap, targetMap, String texto){ +

    +

    +         copyUserStyles(sourceMap, targetMap, true, texto) +

    +

    +     } +

    +

    + +

    +

    +     def copyUserStyles(sourceMap, targetMap, boolean showMessage, String texto){ +

    +

    +         def closure = {it.text == texto} +

    +

    +         copyUserStyles(sourceMap, targetMap, showMessage, closure) +

    +

    +     } +

    +

    + +

    +

    + //end: +

    +

    + +

    +

    + //region: copy other things from node to node +

    +

    + +

    +

    +     def copyIcons(sourceNode, targetNode, boolean doClear = true){ +

    +

    +         if(doClear) targetNode.icons.clear() +

    +

    +         targetNode.icons.addAll(sourceNode.icons.icons) +

    +

    +     } +

    +

    + +

    +

    +     def copyAttributes(sourceNode, targetNode, boolean doClear = true){ +

    +

    +         if(doClear) targetNode.attributes.clear() +

    +

    +         sourceNode.attributes.each{a -> +

    +

    +             targetNode.attributes.add(a.key, a.value) +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    + //end: +

    +

    + +

    +

    + //region: getting an UserStyleNode as NodeProxy from active map +

    +

    + +

    +

    + // public +

    +

    +     def static getUserStyleNode( String userStyle ){ +

    +

    +         return getUserStyleNode( null, userStyle ) +

    +

    +     } +

    +

    + +

    +

    +     def static getUserStyleNode(MapProxy mapaProxy, String userStyle ){ +

    +

    +         return getUserDefinedStylesParentNode(mapaProxy).children.find{it.text == userStyle} +

    +

    +     } +

    +

    + +

    +

    + +

    +

    +     def static getUserDefinedStylesParentNode(x = null){ +

    +

    +         return getUserDefinedStylesParentNode((ScriptContext) null) +

    +

    +     } +

    +

    + +

    +

    +     def static getUserDefinedStylesParentNode(MapModel mapa){ +

    +

    +         return getUserDefinedStylesParentNode(mapa, null) +

    +

    +     } +

    +

    + +

    +

    +     def static getUserDefinedStylesParentNode(MapProxy mapaProxy){ +

    +

    +         return getUserDefinedStylesParentNode(mapaProxy.delegate, null) +

    +

    +     } +

    +

    + +

    +

    + +

    +

    +     def static getUserDefinedStylesParentNode(ScriptContext scriptContext){ +

    +

    +         MapModel mapa = Controller.getCurrentController().getMap(); +

    +

    +         return getUserDefinedStylesParentNode(mapa, scriptContext) +

    +

    +     } +

    +

    +      +

    +

    +     def static getUserDefinedStylesParentNode(MapProxy mapaProxy, ScriptContext scriptContext){ +

    +

    +         return getUserDefinedStylesParentNode(mapaProxy.delegate, scriptContext) +

    +

    +     } +

    +

    + +

    +

    +     def static getUserDefinedStylesParentNode(MapModel mapa, ScriptContext scriptContext){ +

    +

    +         if(!mapa) { +

    +

    +             return getUserDefinedStylesParentNode(scriptContext) +

    +

    +         } +

    +

    +         MapStyleModel styleModel = MapStyleModel.getExtension(mapa); +

    +

    +         MapModel styleMap = styleModel.getStyleMap(); +

    +

    +         NodeModel userStyleParentNode = styleModel.getStyleNodeGroup(styleMap, MapStyleModel.STYLES_USER_DEFINED); +

    +

    +         def userDefinedParentNode = new NodeProxy(userStyleParentNode, scriptContext) +

    +

    +         return userDefinedParentNode +

    +

    +     } +

    +

    +      +

    +

    + //end: +

    +

    + +

    +

    + } +

    +

    + +

    + +
    +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + +

    + .groovy +

    + +
    + + + + + + + + + + +

    + import edofro.tutorialomatic.ToM_ui as tomui +

    +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + //region: opens tutorial map +

    +

    + +

    +

    +     def sep         = File.separator +

    +

    +     def userDir     = c.userDirectory.path +

    +

    +     def mapFileName = "SimpleTutorialSample.mm" +

    +

    +     def pathName    = userDir + sep + "doc" + sep + "Tutorial-o-Matic" + sep + mapFileName +

    +

    +     def tutMap      = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto) +

    +

    + +

    +

    +     tom.showTutorials( tutMap ) +

    +

    + +

    +

    +     return 'tutorial started' +

    +

    + +

    +

    + //end: +

    + +
    +
    + + + + + + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + //region: opens tutorial map +

    +

    + +

    +

    +     def sep         = File.separator +

    +

    +     def userDir     = c.userDirectory.path +

    +

    +     def mapFileName = "HowToTutorial-o-Matic.mm" +

    +

    +     def pathName    = userDir + sep + "doc" + sep + "Tutorial-o-Matic" + sep + mapFileName +

    +

    +     def tutMap      = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto) +

    +

    + +

    +

    +     tom.showTutorials( tutMap ) +

    +

    + +

    +

    + //end: +

    + +
    +
    + + + + + + + + + + + +

    + //opens demo map +

    +

    + +

    +

    + //region: defining path +

    +

    +     def mapFile = "SimpleTutorialSample.mm" +

    +

    +     def dir = c.userDirectory.path +

    +

    +     def sep = File.separator +

    +

    +     def helpFile = "Tutorial-o-Matic" + sep + mapFile +

    +

    +     def pathName = dir + sep + "doc" + sep + helpFile +

    +

    + // end: +

    +

    + +

    +

    + //region: opening mindmap file +

    +

    +     if(exists(pathName)){ +

    +

    +         c.mapLoader(pathName).withView().load() +

    +

    +     } +

    +

    + //end: +

    +

    + +

    +

    + +

    +

    + //region: methods +

    +

    + +

    +

    +     def exists(String path){new File(path).isFile()} +

    +

    + +

    +

    + //end: +

    + +
    +
    + + + + + + + + + + + +

    + import edofro.menuomatic.MenuAction as MA +

    +

    + +

    +

    + MA.menuCommandToNode(node) +

    + +
    +
    + + + + + + + + + + + + +

    + def cP = new ConfigProperties() +

    +

    + +

    +

    + def sep = File.separator +

    +

    + def path = cP.freeplaneUserDirectory + sep + 'templates,Tutorial-o-Matic,tutorial_styles_template.mm'.split(',').join(sep) +

    +

    + +

    +

    + def templateFile = new File(path) +

    +

    + +

    +

    + def newTutorialMindMap = c.mapLoader(templateFile).unsetMapLocation().withView().getMindMap() +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + def mapa = node.map //usar mapa activo +

    +

    + +

    +

    + tom.showTutorials( mapa ) +

    +

    + +

    +

    + return 'tutorial started' +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + +
    + + + + + + + + +

    + import groovy.swing.SwingBuilder +

    +

    + import javax.swing.* +

    +

    + // import java.util.Timer +

    +

    + // import java.awt.Color +

    +

    + // import java.awt.Font +

    +

    + // import java.awt.Insets +

    +

    + // import javax.swing.border.EmptyBorder +

    +

    + +

    +

    + import javax.swing.border.* +

    +

    + //import javax.swing.border.LineBorder; +

    +

    + +

    +

    + //import javax.swing.border.EmptyBorder +

    +

    + +

    +

    + import java.awt.Color; +

    +

    + import java.awt.* //Insets +

    +

    + +

    +

    + def msgHtml = 'Este es el <b> mensaje</b> Principal' +

    +

    + def bttnText    = 'Continuar' +

    +

    + def bttnToolTip =  'This is the button' +

    +

    + def bttnAction = {e -> +

    +

    + //        node.createChild('resultado').note =(e.source.properties*.toString().join('\n -->   ')) +

    +

    +         def boton = e.source +

    +

    +         def contenedor = boton +

    +

    +         do { +

    +

    +             contenedor = contenedor.parent +

    +

    +         } while (contenedor.name != 'contenedor') +

    +

    +         def editor = contenedor.components.find{it.name == 'mensajero'} +

    +

    +         def padre = contenedor.parent +

    +

    +         //node.createChild('resultado').note =(padre.properties*.toString().join('\n -->   ')) +

    +

    +         padre.removeAll() +

    +

    +         padre.repaint() +

    +

    +         padre.add(getButtonPanel('Hola','boton','ayuda',  +

    +

    +              { +

    +

    +                  c.statusInfo = 'Option A chosen' +

    +

    +                  ui.informationMessage('hola, hola!') +

    +

    +               } +

    +

    +           ) +

    +

    +         ) +

    +

    +         padre.revalidate() +

    +

    +         padre.repaint() +

    +

    +         //ui.informationMessage(padre.parent.name) +

    +

    +     } +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + swing = new SwingBuilder() +

    +

    + +

    +

    + def miPanel = getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction) +

    +

    + +

    +

    + // ----------------------- dialogo de prueba -------------------------------------         +

    +

    +          +

    +

    +     def dialog = swing.dialog( +

    +

    +            title: 'Frame', +

    +

    +            defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, +

    +

    +            size: [400, 400], +

    +

    +     ){ +

    +

    +     } +

    +

    +      +

    +

    +     dialog.add(miPanel) +

    +

    +     dialog.show() +

    +

    +     +

    +

    +    return 'ok'  +

    +

    + +

    +

    + // ----------------------- methods -------------------------- +

    +

    + +

    +

    + // genera panel con botón +

    +

    + def getButtonPanel(html, buttonLabel, buttonToolTip, buttonAction){ +

    +

    +     def panel = swing.panel( +

    +

    +         name: 'contenedor'          +

    +

    +     ) { +

    +

    +         borderLayout() +

    +

    +         editorPane( +

    +

    +             name        : 'mensajero', +

    +

    +             editable    : false, +

    +

    +             contentType : "text/html", +

    +

    +             text        : html, +

    +

    +             margin      : new Insets(30,10,30,10), +

    +

    +             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +

    +

    +             border: new CompoundBorder(new LineBorder(Color.green, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde +

    +

    +             constraints : CENTER, +

    +

    +         ) +

    +

    +         panel(         +

    +

    +             constraints    : SOUTH, +

    +

    +             // border      : new LineBorder(Color.black, 1), +

    +

    +             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +

    +

    +             border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde +

    +

    +             //insets      : new Insets(30,10,30,10), +

    +

    +         ) { +

    +

    +             borderLayout() +

    +

    +             button( +

    +

    +                 label       : buttonLabel,  +

    +

    +                 constraints : EAST,  +

    +

    +                 margin      : new Insets(10,15,10,15),  +

    +

    +                 toolTipText : buttonToolTip, +

    +

    +                 actionPerformed : buttonAction, +

    +

    +             ) +

    +

    +         } +

    +

    +     } +

    +

    +     return panel +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import groovy.swing.SwingBuilder +

    +

    + import javax.swing.* +

    +

    + // import java.util.Timer +

    +

    + // import java.awt.Color +

    +

    + // import java.awt.Font +

    +

    + // import java.awt.Insets +

    +

    + // import javax.swing.border.EmptyBorder +

    +

    + +

    +

    + import javax.swing.border.* +

    +

    + //import javax.swing.border.LineBorder; +

    +

    + +

    +

    + //import javax.swing.border.EmptyBorder +

    +

    + +

    +

    + import java.awt.Color; +

    +

    + import java.awt.* //Insets +

    +

    + +

    +

    + import org.freeplane.core.ui.components.UITools as ui +

    +

    + +

    +

    + def primerNodo= node.children[0] +

    +

    + +

    +

    + def msgHtml = 'Este es el <b> mensaje</b> Principal' +

    +

    + def bttnText    = 'Continuar' +

    +

    + def bttnToolTip =  'This is the button' +

    +

    + def bttnAction = {e ->    muestraNodo(e.source, primerNodo)} +

    +

    + +

    +

    + +

    +

    + //        padre.removeAll() +

    +

    + //        padre.revalidate() +

    +

    + //        padre.repaint() +

    +

    + +

    +

    + def muestraNodo(c, n){ +

    +

    +     def p = n.parent +

    +

    +     def nextNode = p.children[p.getChildPosition(n)+1] +

    +

    +     def html = n.text +

    +

    +     ui.informationMessage(html) +

    +

    +     def buttonLabel = 'Next' +

    +

    +     def buttonToolTip = 'click to show next page' +

    +

    +     def buttonAction = {e ->    muestraNodo(e.source, nextNode) } +

    +

    +     changeButtonPanel(c, html, buttonLabel, buttonToolTip, buttonAction) +

    +

    + } +

    +

    +      +

    +

    + def changeButtonPanel(c, html, buttonLabel, buttonToolTip, buttonAction){ +

    +

    +         def boton = c +

    +

    +         boton.label = buttonLabel  +

    +

    +         boton.toolTipText = buttonToolTip +

    +

    +         boton.actionPerformed = buttonAction +

    +

    +         def contenedor = c +

    +

    +         do { +

    +

    +             contenedor = contenedor.parent +

    +

    +         } while (contenedor.name != 'contenedor')         +

    +

    +         def editor = contenedor.components.find{it.name == 'mensajero'} +

    +

    +         editor.text = html +

    +

    +         contenedor.revalidate() +

    +

    +         contenedor.repaint() +

    +

    + +

    +

    + } +

    +

    +      +

    +

    + +

    +

    + +

    +

    + swing = new SwingBuilder() +

    +

    + +

    +

    + def miPanel = getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction) +

    +

    + +

    +

    + // ----------------------- dialogo de prueba -------------------------------------         +

    +

    +          +

    +

    +     def dialog = swing.dialog( +

    +

    +            title: 'Frame', +

    +

    +            defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, +

    +

    +            size: [400, 400], +

    +

    +     ){ +

    +

    +     } +

    +

    +      +

    +

    +     dialog.add(miPanel) +

    +

    +     dialog.show() +

    +

    +     +

    +

    +    return 'ok'  +

    +

    + +

    +

    + // ----------------------- methods -------------------------- +

    +

    + +

    +

    + // genera panel con botón +

    +

    + def getButtonPanel(html, buttonLabel, buttonToolTip, buttonAction){ +

    +

    +     def panel = swing.panel( +

    +

    +         name: 'contenedor'          +

    +

    +     ) { +

    +

    +         borderLayout() +

    +

    +         editorPane( +

    +

    +             name        : 'mensajero', +

    +

    +             editable    : false, +

    +

    +             contentType : "text/html", +

    +

    +             text        : html, +

    +

    +             margin      : new Insets(30,10,30,10), +

    +

    +             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +

    +

    +             border: new CompoundBorder(new LineBorder(Color.green, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde +

    +

    +             constraints : CENTER, +

    +

    +         ) +

    +

    +         panel(         +

    +

    +             constraints    : SOUTH, +

    +

    +             // border      : new LineBorder(Color.black, 1), +

    +

    +             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +

    +

    +             border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde +

    +

    +             //insets      : new Insets(30,10,30,10), +

    +

    +         ) { +

    +

    +             borderLayout() +

    +

    +             button( +

    +

    +                 label       : buttonLabel,  +

    +

    +                 toolTipText : buttonToolTip, +

    +

    +                 actionPerformed : buttonAction, +

    +

    +                 constraints : EAST,  +

    +

    +                 margin      : new Insets(10,15,10,15),  +

    +

    +             ) +

    +

    +         } +

    +

    +     } +

    +

    +     return panel +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + + + + + + + + + + +

    + import groovy.swing.SwingBuilder +

    +

    + import javax.swing.JFrame +

    +

    + import javax.swing.border.* +

    +

    + import java.awt.Color; +

    +

    + import java.awt.Insets +

    +

    + +

    +

    + +

    +

    + // -------------------- main ------------------------ +

    +

    + swing = new SwingBuilder() +

    +

    + +

    +

    + def msgHtml = 'Este es el <b> mensaje</b> inicial' +

    +

    + def bttnText    = 'Continuar' +

    +

    + def bttnToolTip =  'Click para continuar' +

    +

    + +

    +

    + miPanel = getButtonPanel(msgHtml, bttnText, bttnToolTip) +

    +

    + +

    +

    + miPanel.metaClass.nextNode = node.children[0]  // primer nodo es el primer hijo de nodo seleccionado. +

    +

    + +

    +

    + +

    +

    + // ----------------------- dialogo de prueba -------------------------------------                 +

    +

    + +

    +

    + def dialog = swing.dialog( +

    +

    +        title: 'Frame', +

    +

    +        defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, +

    +

    +        size: [400, 400], +

    +

    +     ){}     +

    +

    + dialog.add(miPanel) +

    +

    + dialog.show() +

    +

    + +

    +

    + return 'ok'  +

    +

    + +

    +

    + +

    +

    + // ----------------------- methods ------------------------------------------------------------ +

    +

    + +

    +

    + // genera panel con botón +

    +

    + def getButtonPanel(html, buttonLabel, buttonToolTip){ //, buttonAction){ +

    +

    +     return swing.panel( +

    +

    +         name: 'contenedor'          +

    +

    +     ) { +

    +

    +         borderLayout() +

    +

    +         editorPane( +

    +

    +             name        : 'mensajero', +

    +

    +             editable    : false, +

    +

    +             contentType : "text/html", +

    +

    +             text        : html, +

    +

    +             margin      : new Insets(30,10,30,10), +

    +

    +             border: new CompoundBorder(new LineBorder(Color.gray, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde +

    +

    +             constraints : CENTER, +

    +

    +         ) +

    +

    +         panel(         +

    +

    +             constraints    : SOUTH, +

    +

    +             border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +

    +

    +         ) { +

    +

    +             borderLayout() +

    +

    +             button( +

    +

    +                 label           : buttonLabel,  +

    +

    +                 toolTipText     : buttonToolTip, +

    +

    +                 actionPerformed : {e ->   if(miPanel.nextNode){ muestraNodo(e.source, miPanel.nextNode)} else {e.source.topLevelAncestor.dispose()}}, +

    +

    +                 constraints     : EAST,  +

    +

    +                 margin          : new Insets(10,15,10,15),  +

    +

    +             ) +

    +

    +         } +

    +

    +     } +

    +

    + } +

    +

    +          +

    +

    + def muestraNodo(c, n){ +

    +

    +     def p        = n.parent +

    +

    +     def nextNode = p.getChildPosition(n)<p.children.size()?p.children[p.getChildPosition(n)+1]:null  // siguiente nodo hermano de n (si es último entonces null) +

    +

    +     def mhtml    = n.text +

    +

    +     def mbuttonLabel   = nextNode?'Next':'Close' +

    +

    +     def mbuttonToolTip = nextNode?'click to show next page':'click to close the dialog' +

    +

    +      +

    +

    +     changeButtonPanel(c, mhtml, mbuttonLabel, mbuttonToolTip) +

    +

    +     miPanel.nextNode = nextNode +

    +

    + } +

    +

    +      +

    +

    + def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ +

    +

    +         def boton = c +

    +

    +         boton.label = buttonLabel  +

    +

    +         boton.toolTipText = buttonToolTip +

    +

    +         def contenedor = c.parent +

    +

    +         while (contenedor.name != 'contenedor') { +

    +

    +             contenedor = contenedor.parent +

    +

    +         }          +

    +

    +         def editor = contenedor.components.find{it.name == 'mensajero'} +

    +

    +         editor.text = html +

    +

    +      //   contenedor.revalidate() +

    +

    +      //   contenedor.repaint() +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + + + + + + + +

    + verifyInputWhenFocusTarget=true +

    +

    + mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@13d47ecb +

    +

    + focusTraversalPolicy=null +

    +

    + registeredKeyStrokes=[Ljavax.swing.KeyStroke;@642c4bcc +

    +

    + alignmentX=0.0 +

    +

    + location=java.awt.Point[x=286,y=6] +

    +

    + rolloverSelectedIcon=null +

    +

    + alignmentY=0.5 +

    +

    + hierarchyListeners=[Ljava.awt.event.HierarchyListener;@6f6eebd5 +

    +

    + managingFocus=false +

    +

    + rolloverIcon=null +

    +

    + defaultButton=true +

    +

    + insets=java.awt.Insets[top=12,left=17,bottom=12,right=17] +

    +

    + baselineResizeBehavior=CENTER_OFFSET +

    +

    + icon=null +

    +

    + optimizedDrawingEnabled=true +

    +

    + action=null +

    +

    + minimumSize=java.awt.Dimension[width=87,height=39] +

    +

    + toolTipText=This is the button +

    +

    + focusTraversalKeysEnabled=true +

    +

    + ignoreRepaint=false +

    +

    + inheritsPopupMenu=false +

    +

    + margin=java.awt.Insets[top=10,left=15,bottom=10,right=15] +

    +

    + parent=javax.swing.JPanel[,0,0,384x51,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.CompoundBorder@12ba5800,flags=9,maximumSize=,minimumSize=,preferredSize=] +

    +

    + rootPane=javax.swing.JRootPane[,8,31,384x361,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] +

    +

    + displayedMnemonicIndex=-1 +

    +

    + width=87 +

    +

    + keyListeners=[Ljava.awt.event.KeyListener;@22285eba +

    +

    + toolkit=sun.awt.windows.WToolkit@46f11618 +

    +

    + actionCommand=Continuar +

    +

    + size=java.awt.Dimension[width=87,height=39] +

    +

    + vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@24dc1318 +

    +

    + maximumSizeSet=false +

    +

    + class=class javax.swing.JButton +

    +

    + changeListeners=[Ljavax.swing.event.ChangeListener;@3c746415 +

    +

    + borderPainted=true +

    +

    + maximumSize=java.awt.Dimension[width=87,height=39] +

    +

    + pressedIcon=null +

    +

    + selectedObjects=null +

    +

    + contentAreaFilled=true +

    +

    + text=Continuar +

    +

    + focusTraversable=true +

    +

    + componentPopupMenu=null +

    +

    + componentListeners=[Ljava.awt.event.ComponentListener;@7cce51c3 +

    +

    + focusTraversalPolicyProvider=false +

    +

    + focusListeners=[Ljava.awt.event.FocusListener;@1cf30d6e +

    +

    + background=javax.swing.plaf.ColorUIResource[r=240,g=240,b=240] +

    +

    + mnemonic=0 +

    +

    + ancestorListeners=[Ljavax.swing.event.AncestorListener;@5873893b +

    +

    + requestFocusEnabled=true +

    +

    + backgroundSet=true +

    +

    + actionMap=javax.swing.ActionMap@47381aec +

    +

    + multiClickThreshhold=0 +

    +

    + mouseListeners=[Ljava.awt.event.MouseListener;@49761b81 +

    +

    + label=Continuar +

    +

    + foregroundSet=true +

    +

    + validateRoot=false +

    +

    + componentOrientation=java.awt.ComponentOrientation@59bfd7b4 +

    +

    + fontSet=true +

    +

    + locationOnScreen=java.awt.Point[x=294,y=347] +

    +

    + colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 +

    +

    + mousePosition=java.awt.Point[x=73,y=19] +

    +

    + paintingTile=false +

    +

    + disabledSelectedIcon=null +

    +

    + accessibleContext=javax.swing.JButton$AccessibleJButton@4deaf7bc +

    +

    + preferredSize=java.awt.Dimension[width=87,height=39] +

    +

    + inputMap=javax.swing.InputMap@914956b +

    +

    + minimumSizeSet=false +

    +

    + disabledIcon=null +

    +

    + selected=false +

    +

    + itemListeners=[Ljava.awt.event.ItemListener;@e7c11df +

    +

    + focusTraversalPolicySet=false +

    +

    + y=6 +

    +

    + x=286 +

    +

    + cursorSet=false +

    +

    + inputMethodRequests=null +

    +

    + containerListeners=[Ljava.awt.event.ContainerListener;@772fa982 +

    +

    + componentCount=0 +

    +

    + components=[Ljava.awt.Component;@5b941b09 +

    +

    + inputVerifier=null +

    +

    + hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@6d62f7cc +

    +

    + border=com.sun.java.swing.plaf.windows.XPStyle$XPEmptyBorder@93e2d77 +

    +

    + selectedIcon=null +

    +

    + name=null +

    +

    + graphics=sun.java2d.SunGraphics2D[font=java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=12],color=java.awt.SystemColor[i=9]] +

    +

    + rolloverEnabled=true +

    +

    + focusPainted=true +

    +

    + foreground=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0] +

    +

    + horizontalTextPosition=11 +

    +

    + hideActionText=false +

    +

    + focusable=true +

    +

    + preferredSizeSet=false +

    +

    + defaultCapable=true +

    +

    + visible=true +

    +

    + focusCycleRootAncestor=javax.swing.JDialog[dialog36,0,0,400x400,invalid,layout=java.awt.BorderLayout,MODELESS,title=Frame,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,384x361,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + model=javax.swing.DefaultButtonModel@40f098c6 +

    +

    + lightweight=true +

    +

    + inputContext=sun.awt.im.InputMethodContext@2eec9bee +

    +

    + layout=null +

    +

    + opaque=true +

    +

    + font=java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=12] +

    +

    + locale=en +

    +

    + cursor=java.awt.Cursor[Default Cursor] +

    +

    + inputMethodListeners=[Ljava.awt.event.InputMethodListener;@24054408 +

    +

    + iconTextGap=4 +

    +

    + doubleBuffered=false +

    +

    + visibleRect=java.awt.Rectangle[x=0,y=0,width=87,height=39] +

    +

    + horizontalAlignment=0 +

    +

    + valid=true +

    +

    + focusCycleRoot=false +

    +

    + mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@5e231bd3 +

    +

    + verticalTextPosition=0 +

    +

    + treeLock=java.awt.Component$AWTTreeLock@1a61254f +

    +

    + bounds=java.awt.Rectangle[x=286,y=6,width=87,height=39] +

    +

    + propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@1a518e79 +

    +

    + autoscrolls=false +

    +

    + paintingForPrint=false +

    +

    + showing=true +

    +

    + verticalAlignment=0 +

    +

    + actionListeners=[Ljava.awt.event.ActionListener;@50285536 +

    +

    + dropTarget=null +

    +

    + nextFocusableComponent=null +

    +

    + height=39 +

    +

    + topLevelAncestor=javax.swing.JDialog[dialog36,0,0,400x400,invalid,layout=java.awt.BorderLayout,MODELESS,title=Frame,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,384x361,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + displayable=true +

    +

    + focusOwner=true +

    +

    + defaultLocale=en +

    +

    + debugGraphicsOptions=0 +

    +

    + enabled=true +

    +

    + UI=com.sun.java.swing.plaf.windows.WindowsButtonUI@ed7adea +

    +

    + UIClassID=ButtonUI +

    + +
    +
    + + +
    +
    + + + + + + + +

    + def texto = new StringBuilder() +

    +

    + def sep = " | " +

    +

    + +

    +

    +     texto +

    +

    +         << '-> ' +

    +

    +         << sep << 'returnType' +

    +

    +         << sep << 'declaringClass' +

    +

    +         << sep << 'name' +

    +

    +         << sep << 'parameterTypes' +

    +

    +         << '\n' +

    +

    + +

    +

    + def objeto = ui.freeplaneTabbedPanel  //  <---- éste se deb cambiar para otras pruebas +

    +

    + +

    +

    + objeto.class.methods.each{ +

    +

    + +

    +

    + +

    +

    +     def returnType = it.returnType.name +

    +

    +     def declaringClass = it.declaringClass.name +

    +

    +     def name = it.name +

    +

    +     def parameterTypes = it.parameterTypes*.name.join(', ') +

    +

    + +

    +

    +     texto +

    +

    +         << '-> ' +

    +

    +         << sep << returnType +

    +

    +         << sep << declaringClass +

    +

    +         << sep << name +

    +

    +         << sep << parameterTypes +

    +

    +         << '\n' +

    +

    + } +

    +

    + +

    +

    + //texto +

    +

    + +

    +

    + def nodo = node.createChild('result') +

    +

    + +

    +

    + nodo.note = texto +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + +

    + ->  | returnType | declaringClass | name | parameterTypes +

    +

    + ->  | void | javax.swing.JTabbedPane | add | java.awt.Component, java.lang.Object, int +

    +

    + ->  | void | javax.swing.JTabbedPane | add | java.awt.Component, java.lang.Object +

    +

    + ->  | java.awt.Component | javax.swing.JTabbedPane | add | java.awt.Component, int +

    +

    + ->  | java.awt.Component | javax.swing.JTabbedPane | add | java.lang.String, java.awt.Component +

    +

    + ->  | java.awt.Component | javax.swing.JTabbedPane | add | java.awt.Component +

    +

    + ->  | void | javax.swing.JTabbedPane | remove | int +

    +

    + ->  | void | javax.swing.JTabbedPane | remove | java.awt.Component +

    +

    + ->  | void | javax.swing.JTabbedPane | removeAll |  +

    +

    + ->  | java.lang.String | javax.swing.JTabbedPane | getToolTipText | java.awt.event.MouseEvent +

    +

    + ->  | java.lang.String | javax.swing.JTabbedPane | getUIClassID |  +

    +

    + ->  | javax.accessibility.AccessibleContext | javax.swing.JTabbedPane | getAccessibleContext |  +

    +

    + ->  | java.awt.Component | javax.swing.JTabbedPane | getComponentAt | int +

    +

    + ->  | void | javax.swing.JTabbedPane | removeChangeListener | javax.swing.event.ChangeListener +

    +

    + ->  | javax.swing.plaf.TabbedPaneUI | javax.swing.JTabbedPane | getUI |  +

    +

    + ->  | void | javax.swing.JTabbedPane | addChangeListener | javax.swing.event.ChangeListener +

    +

    + ->  | javax.swing.SingleSelectionModel | javax.swing.JTabbedPane | getModel |  +

    +

    + ->  | void | javax.swing.JTabbedPane | addTab | java.lang.String, java.awt.Component +

    +

    + ->  | void | javax.swing.JTabbedPane | addTab | java.lang.String, javax.swing.Icon, java.awt.Component +

    +

    + ->  | void | javax.swing.JTabbedPane | addTab | java.lang.String, javax.swing.Icon, java.awt.Component, java.lang.String +

    +

    + ->  | java.awt.Color | javax.swing.JTabbedPane | getBackgroundAt | int +

    +

    + ->  | java.awt.Rectangle | javax.swing.JTabbedPane | getBoundsAt | int +

    +

    + ->  | [Ljavax.swing.event.ChangeListener; | javax.swing.JTabbedPane | getChangeListeners |  +

    +

    + ->  | javax.swing.Icon | javax.swing.JTabbedPane | getDisabledIconAt | int +

    +

    + ->  | int | javax.swing.JTabbedPane | getDisplayedMnemonicIndexAt | int +

    +

    + ->  | java.awt.Color | javax.swing.JTabbedPane | getForegroundAt | int +

    +

    + ->  | javax.swing.Icon | javax.swing.JTabbedPane | getIconAt | int +

    +

    + ->  | int | javax.swing.JTabbedPane | getMnemonicAt | int +

    +

    + ->  | int | javax.swing.JTabbedPane | getSelectedIndex |  +

    +

    + ->  | java.awt.Component | javax.swing.JTabbedPane | getTabComponentAt | int +

    +

    + ->  | int | javax.swing.JTabbedPane | getTabCount |  +

    +

    + ->  | int | javax.swing.JTabbedPane | getTabLayoutPolicy |  +

    +

    + ->  | int | javax.swing.JTabbedPane | getTabPlacement |  +

    +

    + ->  | int | javax.swing.JTabbedPane | getTabRunCount |  +

    +

    + ->  | java.lang.String | javax.swing.JTabbedPane | getTitleAt | int +

    +

    + ->  | java.lang.String | javax.swing.JTabbedPane | getToolTipTextAt | int +

    +

    + ->  | int | javax.swing.JTabbedPane | indexAtLocation | int, int +

    +

    + ->  | int | javax.swing.JTabbedPane | indexOfComponent | java.awt.Component +

    +

    + ->  | int | javax.swing.JTabbedPane | indexOfTab | javax.swing.Icon +

    +

    + ->  | int | javax.swing.JTabbedPane | indexOfTab | java.lang.String +

    +

    + ->  | int | javax.swing.JTabbedPane | indexOfTabComponent | java.awt.Component +

    +

    + ->  | void | javax.swing.JTabbedPane | insertTab | java.lang.String, javax.swing.Icon, java.awt.Component, java.lang.String, int +

    +

    + ->  | boolean | javax.swing.JTabbedPane | isEnabledAt | int +

    +

    + ->  | void | javax.swing.JTabbedPane | removeTabAt | int +

    +

    + ->  | void | javax.swing.JTabbedPane | setBackgroundAt | int, java.awt.Color +

    +

    + ->  | void | javax.swing.JTabbedPane | setComponentAt | int, java.awt.Component +

    +

    + ->  | void | javax.swing.JTabbedPane | setDisabledIconAt | int, javax.swing.Icon +

    +

    + ->  | void | javax.swing.JTabbedPane | setDisplayedMnemonicIndexAt | int, int +

    +

    + ->  | void | javax.swing.JTabbedPane | setEnabledAt | int, boolean +

    +

    + ->  | void | javax.swing.JTabbedPane | setForegroundAt | int, java.awt.Color +

    +

    + ->  | void | javax.swing.JTabbedPane | setIconAt | int, javax.swing.Icon +

    +

    + ->  | void | javax.swing.JTabbedPane | setMnemonicAt | int, int +

    +

    + ->  | void | javax.swing.JTabbedPane | setModel | javax.swing.SingleSelectionModel +

    +

    + ->  | void | javax.swing.JTabbedPane | setSelectedComponent | java.awt.Component +

    +

    + ->  | void | javax.swing.JTabbedPane | setSelectedIndex | int +

    +

    + ->  | void | javax.swing.JTabbedPane | setTabComponentAt | int, java.awt.Component +

    +

    + ->  | void | javax.swing.JTabbedPane | setTabLayoutPolicy | int +

    +

    + ->  | void | javax.swing.JTabbedPane | setTabPlacement | int +

    +

    + ->  | void | javax.swing.JTabbedPane | setTitleAt | int, java.lang.String +

    +

    + ->  | void | javax.swing.JTabbedPane | setToolTipTextAt | int, java.lang.String +

    +

    + ->  | void | javax.swing.JTabbedPane | setUI | javax.swing.plaf.TabbedPaneUI +

    +

    + ->  | void | javax.swing.JTabbedPane | updateUI |  +

    +

    + ->  | java.awt.Component | javax.swing.JTabbedPane | getSelectedComponent |  +

    +

    + ->  | void | javax.swing.JComponent | update | java.awt.Graphics +

    +

    + ->  | boolean | javax.swing.JComponent | contains | int, int +

    +

    + ->  | java.awt.Point | javax.swing.JComponent | getLocation | java.awt.Point +

    +

    + ->  | void | javax.swing.JComponent | print | java.awt.Graphics +

    +

    + ->  | java.awt.Dimension | javax.swing.JComponent | getSize | java.awt.Dimension +

    +

    + ->  | boolean | javax.swing.JComponent | isOpaque |  +

    +

    + ->  | void | javax.swing.JComponent | disable |  +

    +

    + ->  | void | javax.swing.JComponent | enable |  +

    +

    + ->  | void | javax.swing.JComponent | setVisible | boolean +

    +

    + ->  | int | javax.swing.JComponent | getHeight |  +

    +

    + ->  | int | javax.swing.JComponent | getWidth |  +

    +

    + ->  | java.awt.Rectangle | javax.swing.JComponent | getBounds | java.awt.Rectangle +

    +

    + ->  | void | javax.swing.JComponent | paint | java.awt.Graphics +

    +

    + ->  | java.awt.FontMetrics | javax.swing.JComponent | getFontMetrics | java.awt.Font +

    +

    + ->  | [Ljava.util.EventListener; | javax.swing.JComponent | getListeners | java.lang.Class +

    +

    + ->  | int | javax.swing.JComponent | getX |  +

    +

    + ->  | int | javax.swing.JComponent | getY |  +

    +

    + ->  | void | javax.swing.JComponent | addAncestorListener | javax.swing.event.AncestorListener +

    +

    + ->  | void | javax.swing.JComponent | addVetoableChangeListener | java.beans.VetoableChangeListener +

    +

    + ->  | void | javax.swing.JComponent | computeVisibleRect | java.awt.Rectangle +

    +

    + ->  | javax.swing.JToolTip | javax.swing.JComponent | createToolTip |  +

    +

    + ->  | java.awt.event.ActionListener | javax.swing.JComponent | getActionForKeyStroke | javax.swing.KeyStroke +

    +

    + ->  | javax.swing.ActionMap | javax.swing.JComponent | getActionMap |  +

    +

    + ->  | [Ljavax.swing.event.AncestorListener; | javax.swing.JComponent | getAncestorListeners |  +

    +

    + ->  | boolean | javax.swing.JComponent | getAutoscrolls |  +

    +

    + ->  | javax.swing.border.Border | javax.swing.JComponent | getBorder |  +

    +

    + ->  | java.lang.Object | javax.swing.JComponent | getClientProperty | java.lang.Object +

    +

    + ->  | javax.swing.JPopupMenu | javax.swing.JComponent | getComponentPopupMenu |  +

    +

    + ->  | int | javax.swing.JComponent | getConditionForKeyStroke | javax.swing.KeyStroke +

    +

    + ->  | int | javax.swing.JComponent | getDebugGraphicsOptions |  +

    +

    + ->  | java.util.Locale | javax.swing.JComponent | getDefaultLocale |  +

    +

    + ->  | boolean | javax.swing.JComponent | getInheritsPopupMenu |  +

    +

    + ->  | javax.swing.InputMap | javax.swing.JComponent | getInputMap | int +

    +

    + ->  | javax.swing.InputMap | javax.swing.JComponent | getInputMap |  +

    +

    + ->  | javax.swing.InputVerifier | javax.swing.JComponent | getInputVerifier |  +

    +

    + ->  | java.awt.Component | javax.swing.JComponent | getNextFocusableComponent |  +

    +

    + ->  | java.awt.Point | javax.swing.JComponent | getPopupLocation | java.awt.event.MouseEvent +

    +

    + ->  | [Ljavax.swing.KeyStroke; | javax.swing.JComponent | getRegisteredKeyStrokes |  +

    +

    + ->  | java.awt.Point | javax.swing.JComponent | getToolTipLocation | java.awt.event.MouseEvent +

    +

    + ->  | java.lang.String | javax.swing.JComponent | getToolTipText |  +

    +

    + ->  | java.awt.Container | javax.swing.JComponent | getTopLevelAncestor |  +

    +

    + ->  | javax.swing.TransferHandler | javax.swing.JComponent | getTransferHandler |  +

    +

    + ->  | boolean | javax.swing.JComponent | getVerifyInputWhenFocusTarget |  +

    +

    + ->  | [Ljava.beans.VetoableChangeListener; | javax.swing.JComponent | getVetoableChangeListeners |  +

    +

    + ->  | java.awt.Rectangle | javax.swing.JComponent | getVisibleRect |  +

    +

    + ->  | void | javax.swing.JComponent | grabFocus |  +

    +

    + ->  | boolean | javax.swing.JComponent | isLightweightComponent | java.awt.Component +

    +

    + ->  | boolean | javax.swing.JComponent | isManagingFocus |  +

    +

    + ->  | boolean | javax.swing.JComponent | isOptimizedDrawingEnabled |  +

    +

    + ->  | boolean | javax.swing.JComponent | isPaintingForPrint |  +

    +

    + ->  | boolean | javax.swing.JComponent | isPaintingTile |  +

    +

    + ->  | boolean | javax.swing.JComponent | isRequestFocusEnabled |  +

    +

    + ->  | void | javax.swing.JComponent | setToolTipText | java.lang.String +

    +

    + ->  | java.awt.Graphics | javax.swing.JComponent | getGraphics |  +

    +

    + ->  | void | javax.swing.JComponent | addNotify |  +

    +

    + ->  | float | javax.swing.JComponent | getAlignmentX |  +

    +

    + ->  | float | javax.swing.JComponent | getAlignmentY |  +

    +

    + ->  | int | javax.swing.JComponent | getBaseline | int, int +

    +

    + ->  | java.awt.Component$BaselineResizeBehavior | javax.swing.JComponent | getBaselineResizeBehavior |  +

    +

    + ->  | java.awt.Insets | javax.swing.JComponent | getInsets | java.awt.Insets +

    +

    + ->  | java.awt.Insets | javax.swing.JComponent | getInsets |  +

    +

    + ->  | java.awt.Dimension | javax.swing.JComponent | getMaximumSize |  +

    +

    + ->  | java.awt.Dimension | javax.swing.JComponent | getMinimumSize |  +

    +

    + ->  | java.awt.Dimension | javax.swing.JComponent | getPreferredSize |  +

    +

    + ->  | void | javax.swing.JComponent | hide |  +

    +

    + ->  | boolean | javax.swing.JComponent | isDoubleBuffered |  +

    +

    + ->  | boolean | javax.swing.JComponent | isValidateRoot |  +

    +

    + ->  | void | javax.swing.JComponent | printAll | java.awt.Graphics +

    +

    + ->  | void | javax.swing.JComponent | removeNotify |  +

    +

    + ->  | void | javax.swing.JComponent | repaint | java.awt.Rectangle +

    +

    + ->  | void | javax.swing.JComponent | repaint | long, int, int, int, int +

    +

    + ->  | boolean | javax.swing.JComponent | requestFocusInWindow |  +

    +

    + ->  | void | javax.swing.JComponent | reshape | int, int, int, int +

    +

    + ->  | void | javax.swing.JComponent | setBackground | java.awt.Color +

    +

    + ->  | void | javax.swing.JComponent | setFocusTraversalKeys | int, java.util.Set +

    +

    + ->  | void | javax.swing.JComponent | setFont | java.awt.Font +

    +

    + ->  | void | javax.swing.JComponent | setForeground | java.awt.Color +

    +

    + ->  | void | javax.swing.JComponent | setMaximumSize | java.awt.Dimension +

    +

    + ->  | void | javax.swing.JComponent | setMinimumSize | java.awt.Dimension +

    +

    + ->  | void | javax.swing.JComponent | setPreferredSize | java.awt.Dimension +

    +

    + ->  | void | javax.swing.JComponent | setDefaultLocale | java.util.Locale +

    +

    + ->  | void | javax.swing.JComponent | firePropertyChange | java.lang.String, boolean, boolean +

    +

    + ->  | void | javax.swing.JComponent | firePropertyChange | java.lang.String, char, char +

    +

    + ->  | void | javax.swing.JComponent | firePropertyChange | java.lang.String, int, int +

    +

    + ->  | void | javax.swing.JComponent | setEnabled | boolean +

    +

    + ->  | void | javax.swing.JComponent | requestFocus |  +

    +

    + ->  | boolean | javax.swing.JComponent | requestFocus | boolean +

    +

    + ->  | void | javax.swing.JComponent | revalidate |  +

    +

    + ->  | void | javax.swing.JComponent | paintImmediately | int, int, int, int +

    +

    + ->  | void | javax.swing.JComponent | paintImmediately | java.awt.Rectangle +

    +

    + ->  | void | javax.swing.JComponent | putClientProperty | java.lang.Object, java.lang.Object +

    +

    + ->  | void | javax.swing.JComponent | registerKeyboardAction | java.awt.event.ActionListener, java.lang.String, javax.swing.KeyStroke, int +

    +

    + ->  | void | javax.swing.JComponent | registerKeyboardAction | java.awt.event.ActionListener, javax.swing.KeyStroke, int +

    +

    + ->  | void | javax.swing.JComponent | removeAncestorListener | javax.swing.event.AncestorListener +

    +

    + ->  | void | javax.swing.JComponent | removeVetoableChangeListener | java.beans.VetoableChangeListener +

    +

    + ->  | boolean | javax.swing.JComponent | requestDefaultFocus |  +

    +

    + ->  | void | javax.swing.JComponent | resetKeyboardActions |  +

    +

    + ->  | void | javax.swing.JComponent | scrollRectToVisible | java.awt.Rectangle +

    +

    + ->  | void | javax.swing.JComponent | setActionMap | javax.swing.ActionMap +

    +

    + ->  | void | javax.swing.JComponent | setAlignmentX | float +

    +

    + ->  | void | javax.swing.JComponent | setAlignmentY | float +

    +

    + ->  | void | javax.swing.JComponent | setAutoscrolls | boolean +

    +

    + ->  | void | javax.swing.JComponent | setBorder | javax.swing.border.Border +

    +

    + ->  | void | javax.swing.JComponent | setComponentPopupMenu | javax.swing.JPopupMenu +

    +

    + ->  | void | javax.swing.JComponent | setDebugGraphicsOptions | int +

    +

    + ->  | void | javax.swing.JComponent | setDoubleBuffered | boolean +

    +

    + ->  | void | javax.swing.JComponent | setInheritsPopupMenu | boolean +

    +

    + ->  | void | javax.swing.JComponent | setInputMap | int, javax.swing.InputMap +

    +

    + ->  | void | javax.swing.JComponent | setInputVerifier | javax.swing.InputVerifier +

    +

    + ->  | void | javax.swing.JComponent | setNextFocusableComponent | java.awt.Component +

    +

    + ->  | void | javax.swing.JComponent | setOpaque | boolean +

    +

    + ->  | void | javax.swing.JComponent | setRequestFocusEnabled | boolean +

    +

    + ->  | void | javax.swing.JComponent | setTransferHandler | javax.swing.TransferHandler +

    +

    + ->  | void | javax.swing.JComponent | setVerifyInputWhenFocusTarget | boolean +

    +

    + ->  | void | javax.swing.JComponent | unregisterKeyboardAction | javax.swing.KeyStroke +

    +

    + ->  | javax.swing.JRootPane | javax.swing.JComponent | getRootPane |  +

    +

    + ->  | void | java.awt.Container | list | java.io.PrintWriter, int +

    +

    + ->  | void | java.awt.Container | list | java.io.PrintStream, int +

    +

    + ->  | void | java.awt.Container | setFocusTraversalPolicy | java.awt.FocusTraversalPolicy +

    +

    + ->  | java.awt.Component | java.awt.Container | locate | int, int +

    +

    + ->  | [Ljava.awt.Component; | java.awt.Container | getComponents |  +

    +

    + ->  | void | java.awt.Container | applyComponentOrientation | java.awt.ComponentOrientation +

    +

    + ->  | boolean | java.awt.Container | areFocusTraversalKeysSet | int +

    +

    + ->  | int | java.awt.Container | countComponents |  +

    +

    + ->  | void | java.awt.Container | deliverEvent | java.awt.Event +

    +

    + ->  | void | java.awt.Container | doLayout |  +

    +

    + ->  | java.awt.Component | java.awt.Container | findComponentAt | int, int +

    +

    + ->  | java.awt.Component | java.awt.Container | findComponentAt | java.awt.Point +

    +

    + ->  | java.awt.Component | java.awt.Container | getComponentAt | java.awt.Point +

    +

    + ->  | java.awt.Component | java.awt.Container | getComponentAt | int, int +

    +

    + ->  | int | java.awt.Container | getComponentZOrder | java.awt.Component +

    +

    + ->  | java.util.Set | java.awt.Container | getFocusTraversalKeys | int +

    +

    + ->  | java.awt.FocusTraversalPolicy | java.awt.Container | getFocusTraversalPolicy |  +

    +

    + ->  | java.awt.LayoutManager | java.awt.Container | getLayout |  +

    +

    + ->  | java.awt.Point | java.awt.Container | getMousePosition | boolean +

    +

    + ->  | boolean | java.awt.Container | isFocusCycleRoot |  +

    +

    + ->  | boolean | java.awt.Container | isFocusCycleRoot | java.awt.Container +

    +

    + ->  | void | java.awt.Container | layout |  +

    +

    + ->  | java.awt.Dimension | java.awt.Container | minimumSize |  +

    +

    + ->  | java.awt.Dimension | java.awt.Container | preferredSize |  +

    +

    + ->  | void | java.awt.Container | invalidate |  +

    +

    + ->  | void | java.awt.Container | validate |  +

    +

    + ->  | void | java.awt.Container | addPropertyChangeListener | java.beans.PropertyChangeListener +

    +

    + ->  | void | java.awt.Container | addPropertyChangeListener | java.lang.String, java.beans.PropertyChangeListener +

    +

    + ->  | int | java.awt.Container | getComponentCount |  +

    +

    + ->  | java.awt.Component | java.awt.Container | getComponent | int +

    +

    + ->  | void | java.awt.Container | addContainerListener | java.awt.event.ContainerListener +

    +

    + ->  | [Ljava.awt.event.ContainerListener; | java.awt.Container | getContainerListeners |  +

    +

    + ->  | java.awt.Insets | java.awt.Container | insets |  +

    +

    + ->  | boolean | java.awt.Container | isAncestorOf | java.awt.Component +

    +

    + ->  | boolean | java.awt.Container | isFocusTraversalPolicyProvider |  +

    +

    + ->  | boolean | java.awt.Container | isFocusTraversalPolicySet |  +

    +

    + ->  | void | java.awt.Container | paintComponents | java.awt.Graphics +

    +

    + ->  | void | java.awt.Container | printComponents | java.awt.Graphics +

    +

    + ->  | void | java.awt.Container | removeContainerListener | java.awt.event.ContainerListener +

    +

    + ->  | void | java.awt.Container | setComponentZOrder | java.awt.Component, int +

    +

    + ->  | void | java.awt.Container | setFocusCycleRoot | boolean +

    +

    + ->  | void | java.awt.Container | setFocusTraversalPolicyProvider | boolean +

    +

    + ->  | void | java.awt.Container | setLayout | java.awt.LayoutManager +

    +

    + ->  | void | java.awt.Container | transferFocusDownCycle |  +

    +

    + ->  | void | java.awt.Component | add | java.awt.PopupMenu +

    +

    + ->  | void | java.awt.Component | remove | java.awt.MenuComponent +

    +

    + ->  | java.lang.String | java.awt.Component | toString |  +

    +

    + ->  | java.lang.String | java.awt.Component | getName |  +

    +

    + ->  | boolean | java.awt.Component | contains | java.awt.Point +

    +

    + ->  | java.awt.Dimension | java.awt.Component | size |  +

    +

    + ->  | java.awt.Point | java.awt.Component | getLocation |  +

    +

    + ->  | java.awt.Container | java.awt.Component | getParent |  +

    +

    + ->  | void | java.awt.Component | setName | java.lang.String +

    +

    + ->  | void | java.awt.Component | list | java.io.PrintWriter +

    +

    + ->  | void | java.awt.Component | list |  +

    +

    + ->  | void | java.awt.Component | list | java.io.PrintStream +

    +

    + ->  | java.awt.Dimension | java.awt.Component | getSize |  +

    +

    + ->  | java.awt.Point | java.awt.Component | location |  +

    +

    + ->  | void | java.awt.Component | setSize | java.awt.Dimension +

    +

    + ->  | void | java.awt.Component | setSize | int, int +

    +

    + ->  | void | java.awt.Component | resize | java.awt.Dimension +

    +

    + ->  | void | java.awt.Component | resize | int, int +

    +

    + ->  | void | java.awt.Component | enable | boolean +

    +

    + ->  | boolean | java.awt.Component | isValid |  +

    +

    + ->  | boolean | java.awt.Component | imageUpdate | java.awt.Image, int, int, int, int, int +

    +

    + ->  | boolean | java.awt.Component | isLightweight |  +

    +

    + ->  | boolean | java.awt.Component | postEvent | java.awt.Event +

    +

    + ->  | java.awt.Rectangle | java.awt.Component | getBounds |  +

    +

    + ->  | int | java.awt.Component | checkImage | java.awt.Image, java.awt.image.ImageObserver +

    +

    + ->  | int | java.awt.Component | checkImage | java.awt.Image, int, int, java.awt.image.ImageObserver +

    +

    + ->  | java.awt.Image | java.awt.Component | createImage | java.awt.image.ImageProducer +

    +

    + ->  | java.awt.Image | java.awt.Component | createImage | int, int +

    +

    + ->  | java.awt.image.ColorModel | java.awt.Component | getColorModel |  +

    +

    + ->  | boolean | java.awt.Component | prepareImage | java.awt.Image, int, int, java.awt.image.ImageObserver +

    +

    + ->  | boolean | java.awt.Component | prepareImage | java.awt.Image, java.awt.image.ImageObserver +

    +

    + ->  | java.awt.peer.ComponentPeer | java.awt.Component | getPeer |  +

    +

    + ->  | boolean | java.awt.Component | isFocusable |  +

    +

    + ->  | java.awt.Font | java.awt.Component | getFont |  +

    +

    + ->  | java.util.Locale | java.awt.Component | getLocale |  +

    +

    + ->  | void | java.awt.Component | setLocale | java.util.Locale +

    +

    + ->  | java.awt.Color | java.awt.Component | getBackground |  +

    +

    + ->  | java.awt.Color | java.awt.Component | getForeground |  +

    +

    + ->  | java.awt.GraphicsConfiguration | java.awt.Component | getGraphicsConfiguration |  +

    +

    + ->  | void | java.awt.Component | addComponentListener | java.awt.event.ComponentListener +

    +

    + ->  | void | java.awt.Component | addFocusListener | java.awt.event.FocusListener +

    +

    + ->  | void | java.awt.Component | addHierarchyBoundsListener | java.awt.event.HierarchyBoundsListener +

    +

    + ->  | void | java.awt.Component | addHierarchyListener | java.awt.event.HierarchyListener +

    +

    + ->  | void | java.awt.Component | addInputMethodListener | java.awt.event.InputMethodListener +

    +

    + ->  | void | java.awt.Component | addKeyListener | java.awt.event.KeyListener +

    +

    + ->  | void | java.awt.Component | addMouseListener | java.awt.event.MouseListener +

    +

    + ->  | void | java.awt.Component | addMouseMotionListener | java.awt.event.MouseMotionListener +

    +

    + ->  | void | java.awt.Component | addMouseWheelListener | java.awt.event.MouseWheelListener +

    +

    + ->  | java.awt.Rectangle | java.awt.Component | bounds |  +

    +

    + ->  | java.awt.image.VolatileImage | java.awt.Component | createVolatileImage | int, int +

    +

    + ->  | java.awt.image.VolatileImage | java.awt.Component | createVolatileImage | int, int, java.awt.ImageCapabilities +

    +

    + ->  | void | java.awt.Component | dispatchEvent | java.awt.AWTEvent +

    +

    + ->  | void | java.awt.Component | enableInputMethods | boolean +

    +

    + ->  | [Ljava.awt.event.ComponentListener; | java.awt.Component | getComponentListeners |  +

    +

    + ->  | java.awt.ComponentOrientation | java.awt.Component | getComponentOrientation |  +

    +

    + ->  | java.awt.Cursor | java.awt.Component | getCursor |  +

    +

    + ->  | java.awt.dnd.DropTarget | java.awt.Component | getDropTarget |  +

    +

    + ->  | java.awt.Container | java.awt.Component | getFocusCycleRootAncestor |  +

    +

    + ->  | [Ljava.awt.event.FocusListener; | java.awt.Component | getFocusListeners |  +

    +

    + ->  | boolean | java.awt.Component | getFocusTraversalKeysEnabled |  +

    +

    + ->  | [Ljava.awt.event.HierarchyBoundsListener; | java.awt.Component | getHierarchyBoundsListeners |  +

    +

    + ->  | [Ljava.awt.event.HierarchyListener; | java.awt.Component | getHierarchyListeners |  +

    +

    + ->  | boolean | java.awt.Component | getIgnoreRepaint |  +

    +

    + ->  | java.awt.im.InputContext | java.awt.Component | getInputContext |  +

    +

    + ->  | [Ljava.awt.event.InputMethodListener; | java.awt.Component | getInputMethodListeners |  +

    +

    + ->  | java.awt.im.InputMethodRequests | java.awt.Component | getInputMethodRequests |  +

    +

    + ->  | [Ljava.awt.event.KeyListener; | java.awt.Component | getKeyListeners |  +

    +

    + ->  | java.awt.Point | java.awt.Component | getLocationOnScreen |  +

    +

    + ->  | [Ljava.awt.event.MouseListener; | java.awt.Component | getMouseListeners |  +

    +

    + ->  | [Ljava.awt.event.MouseMotionListener; | java.awt.Component | getMouseMotionListeners |  +

    +

    + ->  | java.awt.Point | java.awt.Component | getMousePosition |  +

    +

    + ->  | [Ljava.awt.event.MouseWheelListener; | java.awt.Component | getMouseWheelListeners |  +

    +

    + ->  | java.awt.Toolkit | java.awt.Component | getToolkit |  +

    +

    + ->  | java.lang.Object | java.awt.Component | getTreeLock |  +

    +

    + ->  | boolean | java.awt.Component | gotFocus | java.awt.Event, java.lang.Object +

    +

    + ->  | boolean | java.awt.Component | handleEvent | java.awt.Event +

    +

    + ->  | boolean | java.awt.Component | hasFocus |  +

    +

    + ->  | boolean | java.awt.Component | isBackgroundSet |  +

    +

    + ->  | boolean | java.awt.Component | isCursorSet |  +

    +

    + ->  | boolean | java.awt.Component | isDisplayable |  +

    +

    + ->  | boolean | java.awt.Component | isFocusOwner |  +

    +

    + ->  | boolean | java.awt.Component | isFocusTraversable |  +

    +

    + ->  | boolean | java.awt.Component | isFontSet |  +

    +

    + ->  | boolean | java.awt.Component | isForegroundSet |  +

    +

    + ->  | boolean | java.awt.Component | isMaximumSizeSet |  +

    +

    + ->  | boolean | java.awt.Component | isMinimumSizeSet |  +

    +

    + ->  | boolean | java.awt.Component | isPreferredSizeSet |  +

    +

    + ->  | boolean | java.awt.Component | isShowing |  +

    +

    + ->  | boolean | java.awt.Component | keyDown | java.awt.Event, int +

    +

    + ->  | boolean | java.awt.Component | keyUp | java.awt.Event, int +

    +

    + ->  | boolean | java.awt.Component | lostFocus | java.awt.Event, java.lang.Object +

    +

    + ->  | boolean | java.awt.Component | mouseDown | java.awt.Event, int, int +

    +

    + ->  | boolean | java.awt.Component | mouseDrag | java.awt.Event, int, int +

    +

    + ->  | boolean | java.awt.Component | mouseEnter | java.awt.Event, int, int +

    +

    + ->  | boolean | java.awt.Component | mouseExit | java.awt.Event, int, int +

    +

    + ->  | boolean | java.awt.Component | mouseMove | java.awt.Event, int, int +

    +

    + ->  | boolean | java.awt.Component | mouseUp | java.awt.Event, int, int +

    +

    + ->  | void | java.awt.Component | move | int, int +

    +

    + ->  | void | java.awt.Component | nextFocus |  +

    +

    + ->  | void | java.awt.Component | paintAll | java.awt.Graphics +

    +

    + ->  | void | java.awt.Component | removeComponentListener | java.awt.event.ComponentListener +

    +

    + ->  | void | java.awt.Component | removeFocusListener | java.awt.event.FocusListener +

    +

    + ->  | void | java.awt.Component | removeHierarchyBoundsListener | java.awt.event.HierarchyBoundsListener +

    +

    + ->  | void | java.awt.Component | removeHierarchyListener | java.awt.event.HierarchyListener +

    +

    + ->  | void | java.awt.Component | removeInputMethodListener | java.awt.event.InputMethodListener +

    +

    + ->  | void | java.awt.Component | removeKeyListener | java.awt.event.KeyListener +

    +

    + ->  | void | java.awt.Component | removeMouseListener | java.awt.event.MouseListener +

    +

    + ->  | void | java.awt.Component | removeMouseMotionListener | java.awt.event.MouseMotionListener +

    +

    + ->  | void | java.awt.Component | removeMouseWheelListener | java.awt.event.MouseWheelListener +

    +

    + ->  | void | java.awt.Component | repaint |  +

    +

    + ->  | void | java.awt.Component | repaint | long +

    +

    + ->  | void | java.awt.Component | repaint | int, int, int, int +

    +

    + ->  | void | java.awt.Component | setBounds | java.awt.Rectangle +

    +

    + ->  | void | java.awt.Component | setBounds | int, int, int, int +

    +

    + ->  | void | java.awt.Component | setComponentOrientation | java.awt.ComponentOrientation +

    +

    + ->  | void | java.awt.Component | setCursor | java.awt.Cursor +

    +

    + ->  | void | java.awt.Component | setDropTarget | java.awt.dnd.DropTarget +

    +

    + ->  | void | java.awt.Component | setFocusTraversalKeysEnabled | boolean +

    +

    + ->  | void | java.awt.Component | setFocusable | boolean +

    +

    + ->  | void | java.awt.Component | setIgnoreRepaint | boolean +

    +

    + ->  | void | java.awt.Component | setLocation | int, int +

    +

    + ->  | void | java.awt.Component | setLocation | java.awt.Point +

    +

    + ->  | void | java.awt.Component | show | boolean +

    +

    + ->  | void | java.awt.Component | show |  +

    +

    + ->  | void | java.awt.Component | transferFocus |  +

    +

    + ->  | void | java.awt.Component | transferFocusBackward |  +

    +

    + ->  | void | java.awt.Component | transferFocusUpCycle |  +

    +

    + ->  | boolean | java.awt.Component | action | java.awt.Event, java.lang.Object +

    +

    + ->  | boolean | java.awt.Component | inside | int, int +

    +

    + ->  | void | java.awt.Component | removePropertyChangeListener | java.beans.PropertyChangeListener +

    +

    + ->  | void | java.awt.Component | removePropertyChangeListener | java.lang.String, java.beans.PropertyChangeListener +

    +

    + ->  | [Ljava.beans.PropertyChangeListener; | java.awt.Component | getPropertyChangeListeners | java.lang.String +

    +

    + ->  | [Ljava.beans.PropertyChangeListener; | java.awt.Component | getPropertyChangeListeners |  +

    +

    + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, short, short +

    +

    + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, byte, byte +

    +

    + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, long, long +

    +

    + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, float, float +

    +

    + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, double, double +

    +

    + ->  | boolean | java.awt.Component | isEnabled |  +

    +

    + ->  | boolean | java.awt.Component | isVisible |  +

    +

    + ->  | void | java.lang.Object | wait |  +

    +

    + ->  | void | java.lang.Object | wait | long, int +

    +

    + ->  | void | java.lang.Object | wait | long +

    +

    + ->  | boolean | java.lang.Object | equals | java.lang.Object +

    +

    + ->  | int | java.lang.Object | hashCode |  +

    +

    + ->  | java.lang.Class | java.lang.Object | getClass |  +

    +

    + ->  | void | java.lang.Object | notify |  +

    +

    + ->  | void | java.lang.Object | notifyAll |  +

    + +
    +
    +
    + + + + + + +

    + def tabPane = ui.freeplaneTabbedPanel +

    +

    + def texto = new StringBuilder() +

    +

    + +

    +

    + texto << tabPane.properties*.toString().join('\n') +

    +

    + +

    +

    + node.createChild('properties of Tabbed panel').note = texto +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + +

    + verifyInputWhenFocusTarget=true +

    +

    + mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@1ca46b6 +

    +

    + focusTraversalPolicy=null +

    +

    + registeredKeyStrokes=[Ljavax.swing.KeyStroke;@1ff9cb8 +

    +

    + alignmentX=0.5 +

    +

    + location=java.awt.Point[x=7,y=0] +

    +

    + alignmentY=0.5 +

    +

    + hierarchyListeners=[Ljava.awt.event.HierarchyListener;@c2572 +

    +

    + managingFocus=false +

    +

    + painting=false +

    +

    + insets=java.awt.Insets[top=0,left=0,bottom=0,right=0] +

    +

    + baselineResizeBehavior=CONSTANT_ASCENT +

    +

    + optimizedDrawingEnabled=true +

    +

    + minimumSize=java.awt.Dimension[width=231,height=134] +

    +

    + toolTipText=null +

    +

    + focusTraversalKeysEnabled=true +

    +

    + ignoreRepaint=false +

    +

    + inheritsPopupMenu=false +

    +

    + tabPlacement=1 +

    +

    + rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] +

    +

    + parent=javax.swing.Box[,0,0,468x918,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] +

    +

    + width=461 +

    +

    + toolkit=sun.awt.windows.WToolkit@12eb0c5 +

    +

    + keyListeners=[Ljava.awt.event.KeyListener;@3d86ba +

    +

    + transferHandler=null +

    +

    + size=java.awt.Dimension[width=461,height=918] +

    +

    + vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@18f91fd +

    +

    + maximumSizeSet=false +

    +

    + class=class javax.swing.JTabbedPane +

    +

    + changeListeners=[Ljavax.swing.event.ChangeListener;@16c0a8 +

    +

    + maximumSize=java.awt.Dimension[width=32767,height=32767] +

    +

    + focusTraversable=true +

    +

    + componentPopupMenu=null +

    +

    + componentListeners=[Ljava.awt.event.ComponentListener;@11e55ad +

    +

    + focusTraversalPolicyProvider=false +

    +

    + focusListeners=[Ljava.awt.event.FocusListener;@10a0962 +

    +

    + background=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229] +

    +

    + graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0] +

    +

    + ancestorListeners=[Ljavax.swing.event.AncestorListener;@cb7147 +

    +

    + requestFocusEnabled=true +

    +

    + actionMap=javax.swing.ActionMap@e97e2e +

    +

    + backgroundSet=true +

    +

    + mouseListeners=[Ljava.awt.event.MouseListener;@50fbf6 +

    +

    + foregroundSet=true +

    +

    + validateRoot=false +

    +

    + componentOrientation=java.awt.ComponentOrientation@9cc218 +

    +

    + fontSet=true +

    +

    + createdDoubleBuffer=false +

    +

    + locationOnScreen=java.awt.Point[x=2825,y=-220] +

    +

    + selectedComponent=javax.swing.JPanel[,2,25,456x890,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=297,maximumSize=,minimumSize=,preferredSize=] +

    +

    + colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 +

    +

    + mousePosition=null +

    +

    + tabRunCount=1 +

    +

    + paintingTile=false +

    +

    + accessibleContext=javax.swing.JTabbedPane$AccessibleJTabbedPane@100181d +

    +

    + managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB] +

    +

    + preferredSize=java.awt.Dimension[width=461,height=1] +

    +

    + inputMap=javax.swing.InputMap@7793a4 +

    +

    + minimumSizeSet=false +

    +

    + focusTraversalPolicySet=false +

    +

    + y=0 +

    +

    + x=7 +

    +

    + cursorSet=false +

    +

    + inputMethodRequests=null +

    +

    + containerListeners=[Ljava.awt.event.ContainerListener;@1007dec +

    +

    + componentCount=5 +

    +

    + components=[Ljava.awt.Component;@1c3177 +

    +

    + inputVerifier=null +

    +

    + tabCount=5 +

    +

    + border=null +

    +

    + hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@1ca263a +

    +

    + name=null +

    +

    + paintingOrigin=false +

    +

    + graphics=sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12],color=java.awt.Color[r=0,g=0,b=0]] +

    +

    + tabLayoutPolicy=0 +

    +

    + managingFocusForwardTraversalKeys=[ctrl pressed TAB] +

    +

    + foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51] +

    +

    + focusable=true +

    +

    + preferredSizeSet=true +

    +

    + visible=true +

    +

    + model=javax.swing.DefaultSingleSelectionModel@12cc957 +

    +

    + focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + lightweight=true +

    +

    + layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout@67cf92 +

    +

    + inputContext=sun.awt.im.InputMethodContext@138a03 +

    +

    + opaque=false +

    +

    + font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12] +

    +

    + locale=en +

    +

    + cursor=java.awt.Cursor[Default Cursor] +

    +

    + inputMethodListeners=[Ljava.awt.event.InputMethodListener;@86ef3e +

    +

    + doubleBuffered=false +

    +

    + visibleRect=java.awt.Rectangle[x=0,y=0,width=461,height=918] +

    +

    + valid=true +

    +

    + focusCycleRoot=false +

    +

    + mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@cd081f +

    +

    + bounds=java.awt.Rectangle[x=7,y=0,width=461,height=918] +

    +

    + treeLock=java.awt.Component$AWTTreeLock@1875b2 +

    +

    + propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@14117b8 +

    +

    + paintingForPrint=false +

    +

    + autoscrolls=false +

    +

    + showing=true +

    +

    + selectedIndex=4 +

    +

    + dropTarget=null +

    +

    + paintingChild=null +

    +

    + nextFocusableComponent=null +

    +

    + height=918 +

    +

    + peer=sun.awt.NullComponentPeer@123725b +

    +

    + topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + displayable=true +

    +

    + defaultLocale=en +

    +

    + focusOwner=false +

    +

    + debugGraphicsOptions=0 +

    +

    + enabled=true +

    +

    + UI=javax.swing.plaf.metal.MetalTabbedPaneUI@140e5f3 +

    +

    + UIClassID=TabbedPaneUI +

    + +
    +
    + + + + + + +

    + verifyInputWhenFocusTarget=true +

    +

    + mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@1ad35df +

    +

    + focusTraversalPolicy=null +

    +

    + registeredKeyStrokes=[Ljavax.swing.KeyStroke;@69a3b5 +

    +

    + alignmentX=0.5 +

    +

    + location=java.awt.Point[x=7,y=0] +

    +

    + alignmentY=0.5 +

    +

    + hierarchyListeners=[Ljava.awt.event.HierarchyListener;@fd9129 +

    +

    + managingFocus=false +

    +

    + painting=false +

    +

    + insets=java.awt.Insets[top=0,left=0,bottom=0,right=0] +

    +

    + baselineResizeBehavior=CONSTANT_ASCENT +

    +

    + optimizedDrawingEnabled=true +

    +

    + minimumSize=java.awt.Dimension[width=231,height=134] +

    +

    + toolTipText=null +

    +

    + focusTraversalKeysEnabled=true +

    +

    + ignoreRepaint=false +

    +

    + inheritsPopupMenu=false +

    +

    + tabPlacement=1 +

    +

    + rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] +

    +

    + parent=javax.swing.Box[,0,0,391x918,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] +

    +

    + width=384 +

    +

    + toolkit=sun.awt.windows.WToolkit@12eb0c5 +

    +

    + keyListeners=[Ljava.awt.event.KeyListener;@61210a +

    +

    + transferHandler=null +

    +

    + size=java.awt.Dimension[width=384,height=918] +

    +

    + vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@5ceb54 +

    +

    + maximumSizeSet=false +

    +

    + class=class javax.swing.JTabbedPane +

    +

    + changeListeners=[Ljavax.swing.event.ChangeListener;@1d99761 +

    +

    + maximumSize=java.awt.Dimension[width=32767,height=32767] +

    +

    + focusTraversable=true +

    +

    + componentPopupMenu=null +

    +

    + componentListeners=[Ljava.awt.event.ComponentListener;@18d272a +

    +

    + focusTraversalPolicyProvider=false +

    +

    + focusListeners=[Ljava.awt.event.FocusListener;@cf26e0 +

    +

    + background=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229] +

    +

    + graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0] +

    +

    + ancestorListeners=[Ljavax.swing.event.AncestorListener;@1327726 +

    +

    + requestFocusEnabled=true +

    +

    + actionMap=javax.swing.ActionMap@e97e2e +

    +

    + backgroundSet=true +

    +

    + mouseListeners=[Ljava.awt.event.MouseListener;@71897e +

    +

    + foregroundSet=true +

    +

    + validateRoot=false +

    +

    + componentOrientation=java.awt.ComponentOrientation@9cc218 +

    +

    + fontSet=true +

    +

    + createdDoubleBuffer=false +

    +

    + locationOnScreen=java.awt.Point[x=2902,y=-220] +

    +

    + selectedComponent=javax.swing.JScrollPane[,2,25,379x890,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=com.sun.java.swing.plaf.windows.XPStyle$XPFillBorder@b9e7d6,flags=328,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,1,872,360x17,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=20],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,361,1,17x871,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=20],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_ALWAYS,viewport=javax.swing.JViewport[,1,1,360x871,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=java.awt.Point[x=0,y=0],scrollUnderway=false],viewportBorder=] +

    +

    + colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 +

    +

    + mousePosition=null +

    +

    + tabRunCount=1 +

    +

    + paintingTile=false +

    +

    + accessibleContext=javax.swing.JTabbedPane$AccessibleJTabbedPane@100181d +

    +

    + managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB] +

    +

    + preferredSize=java.awt.Dimension[width=384,height=1] +

    +

    + inputMap=javax.swing.InputMap@7793a4 +

    +

    + minimumSizeSet=false +

    +

    + focusTraversalPolicySet=false +

    +

    + y=0 +

    +

    + x=7 +

    +

    + cursorSet=false +

    +

    + inputMethodRequests=null +

    +

    + containerListeners=[Ljava.awt.event.ContainerListener;@614dad +

    +

    + componentCount=5 +

    +

    + components=[Ljava.awt.Component;@1068067 +

    +

    + inputVerifier=null +

    +

    + tabCount=5 +

    +

    + border=null +

    +

    + hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@1034ce6 +

    +

    + name=null +

    +

    + paintingOrigin=false +

    +

    + graphics=sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12],color=java.awt.Color[r=0,g=0,b=0]] +

    +

    + tabLayoutPolicy=0 +

    +

    + managingFocusForwardTraversalKeys=[ctrl pressed TAB] +

    +

    + foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51] +

    +

    + focusable=true +

    +

    + preferredSizeSet=true +

    +

    + visible=true +

    +

    + model=javax.swing.DefaultSingleSelectionModel@12cc957 +

    +

    + focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + lightweight=true +

    +

    + layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout@67cf92 +

    +

    + inputContext=sun.awt.im.InputMethodContext@138a03 +

    +

    + opaque=false +

    +

    + font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12] +

    +

    + locale=en +

    +

    + cursor=java.awt.Cursor[Default Cursor] +

    +

    + inputMethodListeners=[Ljava.awt.event.InputMethodListener;@1891ec1 +

    +

    + doubleBuffered=false +

    +

    + visibleRect=java.awt.Rectangle[x=0,y=0,width=384,height=918] +

    +

    + valid=true +

    +

    + focusCycleRoot=false +

    +

    + mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@1173078 +

    +

    + bounds=java.awt.Rectangle[x=7,y=0,width=384,height=918] +

    +

    + treeLock=java.awt.Component$AWTTreeLock@1875b2 +

    +

    + propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@2198c5 +

    +

    + paintingForPrint=false +

    +

    + autoscrolls=false +

    +

    + showing=true +

    +

    + selectedIndex=0 +

    +

    + dropTarget=null +

    +

    + paintingChild=null +

    +

    + nextFocusableComponent=null +

    +

    + height=918 +

    +

    + peer=sun.awt.NullComponentPeer@123725b +

    +

    + topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + displayable=true +

    +

    + defaultLocale=en +

    +

    + focusOwner=false +

    +

    + debugGraphicsOptions=0 +

    +

    + enabled=true +

    +

    + UI=javax.swing.plaf.metal.MetalTabbedPaneUI@140e5f3 +

    +

    + UIClassID=TabbedPaneUI +

    + +
    +
    + + + + + + +

    + verifyInputWhenFocusTarget=true +

    +

    + mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@196141d +

    +

    + focusTraversalPolicy=null +

    +

    + registeredKeyStrokes=[Ljavax.swing.KeyStroke;@1c3129c +

    +

    + alignmentX=0.5 +

    +

    + location=java.awt.Point[x=7,y=0] +

    +

    + alignmentY=0.5 +

    +

    + hierarchyListeners=[Ljava.awt.event.HierarchyListener;@102950b +

    +

    + managingFocus=false +

    +

    + painting=false +

    +

    + insets=java.awt.Insets[top=0,left=0,bottom=0,right=0] +

    +

    + baselineResizeBehavior=CONSTANT_ASCENT +

    +

    + optimizedDrawingEnabled=true +

    +

    + minimumSize=java.awt.Dimension[width=231,height=134] +

    +

    + toolTipText=null +

    +

    + focusTraversalKeysEnabled=true +

    +

    + ignoreRepaint=false +

    +

    + inheritsPopupMenu=false +

    +

    + tabPlacement=1 +

    +

    + rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] +

    +

    + parent=javax.swing.Box[,0,0,7x918,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] +

    +

    + width=0 +

    +

    + toolkit=sun.awt.windows.WToolkit@12eb0c5 +

    +

    + keyListeners=[Ljava.awt.event.KeyListener;@1440a6b +

    +

    + transferHandler=null +

    +

    + size=java.awt.Dimension[width=0,height=0] +

    +

    + vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@6fc562 +

    +

    + maximumSizeSet=false +

    +

    + class=class javax.swing.JTabbedPane +

    +

    + changeListeners=[Ljavax.swing.event.ChangeListener;@1d96641 +

    +

    + maximumSize=java.awt.Dimension[width=32767,height=32767] +

    +

    + focusTraversable=true +

    +

    + componentPopupMenu=null +

    +

    + componentListeners=[Ljava.awt.event.ComponentListener;@541bfc +

    +

    + focusTraversalPolicyProvider=false +

    +

    + focusListeners=[Ljava.awt.event.FocusListener;@14c404f +

    +

    + background=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229] +

    +

    + graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0] +

    +

    + ancestorListeners=[Ljavax.swing.event.AncestorListener;@144ce91 +

    +

    + requestFocusEnabled=true +

    +

    + actionMap=javax.swing.ActionMap@e97e2e +

    +

    + backgroundSet=true +

    +

    + mouseListeners=[Ljava.awt.event.MouseListener;@1b75d56 +

    +

    + foregroundSet=true +

    +

    + validateRoot=false +

    +

    + componentOrientation=java.awt.ComponentOrientation@9cc218 +

    +

    + fontSet=true +

    +

    + createdDoubleBuffer=false +

    +

    + selectedComponent=javax.swing.JScrollPane[,2,101,-5x-104,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=com.sun.java.swing.plaf.windows.XPStyle$XPFillBorder@b9e7d6,flags=328,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,1,872,360x17,hidden,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=20],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,361,1,17x871,hidden,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=20],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_ALWAYS,viewport=javax.swing.JViewport[,1,1,-7x-106,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=java.awt.Point[x=0,y=0],scrollUnderway=false],viewportBorder=] +

    +

    + colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 +

    +

    + mousePosition=null +

    +

    + tabRunCount=5 +

    +

    + paintingTile=false +

    +

    + accessibleContext=javax.swing.JTabbedPane$AccessibleJTabbedPane@100181d +

    +

    + managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB] +

    +

    + preferredSize=java.awt.Dimension[width=0,height=0] +

    +

    + inputMap=javax.swing.InputMap@7793a4 +

    +

    + minimumSizeSet=false +

    +

    + focusTraversalPolicySet=false +

    +

    + y=0 +

    +

    + x=7 +

    +

    + cursorSet=false +

    +

    + inputMethodRequests=null +

    +

    + containerListeners=[Ljava.awt.event.ContainerListener;@16838a7 +

    +

    + componentCount=5 +

    +

    + components=[Ljava.awt.Component;@bf51bd +

    +

    + inputVerifier=null +

    +

    + tabCount=5 +

    +

    + border=null +

    +

    + hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@11e2b3d +

    +

    + name=null +

    +

    + paintingOrigin=false +

    +

    + graphics=sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12],color=java.awt.Color[r=0,g=0,b=0]] +

    +

    + tabLayoutPolicy=0 +

    +

    + managingFocusForwardTraversalKeys=[ctrl pressed TAB] +

    +

    + foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51] +

    +

    + focusable=true +

    +

    + preferredSizeSet=true +

    +

    + visible=false +

    +

    + model=javax.swing.DefaultSingleSelectionModel@12cc957 +

    +

    + focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + lightweight=true +

    +

    + layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout@67cf92 +

    +

    + inputContext=sun.awt.im.InputMethodContext@138a03 +

    +

    + opaque=false +

    +

    + font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12] +

    +

    + locale=en +

    +

    + cursor=java.awt.Cursor[Default Cursor] +

    +

    + inputMethodListeners=[Ljava.awt.event.InputMethodListener;@5685e5 +

    +

    + doubleBuffered=false +

    +

    + visibleRect=java.awt.Rectangle[x=0,y=0,width=0,height=0] +

    +

    + valid=true +

    +

    + focusCycleRoot=false +

    +

    + mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@413488 +

    +

    + bounds=java.awt.Rectangle[x=7,y=0,width=0,height=0] +

    +

    + treeLock=java.awt.Component$AWTTreeLock@1875b2 +

    +

    + propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@ebb404 +

    +

    + paintingForPrint=false +

    +

    + autoscrolls=false +

    +

    + showing=false +

    +

    + selectedIndex=0 +

    +

    + dropTarget=null +

    +

    + paintingChild=null +

    +

    + nextFocusableComponent=null +

    +

    + height=0 +

    +

    + peer=sun.awt.NullComponentPeer@123725b +

    +

    + topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + displayable=true +

    +

    + defaultLocale=en +

    +

    + focusOwner=false +

    +

    + debugGraphicsOptions=0 +

    +

    + enabled=true +

    +

    + UI=javax.swing.plaf.metal.MetalTabbedPaneUI@140e5f3 +

    +

    + UIClassID=TabbedPaneUI +

    + +
    +
    +
    +
    + + + + + + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + import edofro.pseudofreeplaneapi.UserStyles as us +

    +

    + +

    +

    + //region: opens tutorial map +

    +

    + +

    +

    +     def sep         = File.separator +

    +

    +     def userDir     = c.userDirectory.path +

    +

    +     def mapFileName = "tutorial_styles_template.mm" +

    +

    +     def pathName    = userDir + sep + "templates" + sep + "Tutorial-o-Matic" + sep + mapFileName +

    +

    +     def sourceMap   = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto) +

    +

    + +

    +

    + // return tutMap.class +

    +

    +     def targetMap = node.map +

    +

    +     us.copyUserStyles(sourceMap, targetMap) +

    +

    + +

    +

    + //Other use case examples on how to use UserStyles.copyUserStyles +

    +

    + /* +

    +

    +     def myString = 'ToM_goto' +

    +

    +     def myList = 'ToM_nextPage,ToM_goto,ToM_showNode'.split(',') +

    +

    +     def myClosure =  {it.text.contains('u')} +

    +

    + +

    +

    + +

    +

    +     us.copyUserStyles(sourceMap, targetMap, myString) +

    +

    +     us.copyUserStyles(sourceMap, targetMap, myList) +

    +

    +     us.copyUserStyles(sourceMap, targetMap, myClosure) +

    +

    + */ +

    +

    + +

    +

    + +

    +

    + +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + +

    +

    + def newPageUri = node.link?.uri +

    +

    + def mapa       = node.map +

    +

    + +

    +

    + c.statusInfo   = tom.openTutorialPage(newPageUri, mapa) +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + en caso de incluir algún documento o mapa adicional +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + en caso de incluir mapa template +

    + +
    + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + #Sun Feb 27 18:12:08 CLST 2022 +

    +

    + addons.${name}.ActionInstruction1=<html>In submenu  <b>{0}</b> <br>click on  <b>{1}</b></html> +

    +

    + addons.${name}=Tutorial-o-Matic +

    +

    + addons.${name}.ActionInstruction2=<html>You can also use de keyboard shortcut <b>{0}</b> for this command</html> +

    +

    + addons.${name}.openDemoMap=open Demo map +

    +

    + addons.${name}.ToMDemo=Tutorial-o-Matic Demo +

    +

    + addons.${name}.executeTutorial=execute Demo tutorial +

    + +
    +
    + + + + + + +

    + #Sun Feb 27 18:12:08 CLST 2022 +

    + +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + +

    + aquí voy reuniendo los que se generan automáticamente +

    +

    + NO es folder +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + //Tutorial-o-Matic +

    +

    + +

    +

    + +

    +

    + +

    +

    + apply plugin: 'groovy' +

    +

    + +

    +

    + targetCompatibility='1.8' +

    +

    + +

    +

    + // 1. I have to define which freeplane version is going to be used to look at the libreries (freeplane and groovy) +

    +

    + def FPversion = 'v9_15' +

    +

    + def freeplaneDirs = [ +

    +

    +         instaled     : "C:/Program Files/Freeplane", +

    +

    +         protableApps : "C:/PortableApps/FreeplanePortable/App/Freeplane", +

    +

    +         v9_15         : "C:/Freeplane/freeplane-1.9.15-pre01", +

    +

    +         v10_1         : "C:/Freeplane/freeplane-1.10.2" +

    +

    +     ] +

    +

    + def freeplaneDir = freeplaneDirs[FPversion] +

    +

    + +

    +

    + def groovyGroupId = FPversion.startsWith('v10')?'org.apache.groovy':'org.codehaus.groovy' +

    +

    + def groovyVersion = FPversion.startsWith('v10')?'4.0.1':'3.0.8' +

    +

    + +

    +

    + +

    +

    + libsDirName = "${rootDir}/lib" +

    +

    + //clean.doFirst { delete "${rootDir}/lib" } // para eliminar todas las .jar +

    +

    + clean.doFirst { delete "${rootDir}/lib/Tutorial-o-Matic.jar" } //para eliminar sólo una de las .jar y que no me borrara markedj ni jsoup +

    +

    + +

    +

    + repositories { +

    +

    +     mavenCentral() +

    +

    +     flatDir name: 'localGitDepsRepository', +

    +

    +     dirs: [ +

    +

    +         "${freeplaneDir}", +

    +

    +         "${freeplaneDir}/core/org.freeplane.core/lib", +

    +

    +         "${freeplaneDir}/plugins/org.freeplane.plugin.script/lib", +

    +

    +         // "${freeplaneDir}/plugins/org.freeplane.plugin.markdown/lib", // para incluir markedj.jar +

    +

    +         "${rootDir}/lib" //ahí puse markedj y jsoup +

    +

    +     ] +

    +

    + } +

    +

    + +

    +

    + +

    +

    + // I had this error: +

    +

    +     // Could not find method compile() for arguments [{name=freeplanelauncher}] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler +

    +

    + // answer: +

    +

    +     // https://stackoverflow.com/questions/69733508/couldnt-find-compile-for-arguments-directory-libs-on-object-of-type-org-g +

    +

    +      +

    +

    + dependencies { +

    +

    +     implementation name : 'freeplanelauncher' +

    +

    +     implementation name : 'freeplaneviewer' +

    +

    +     implementation group: 'org.freeplane.core',   name: 'freeplaneeditor', version:"+" +

    +

    +     implementation group: 'org.freeplane.script', name: 'plugin', version: '+' +

    +

    +     implementation name : 'markedj', version: '+' //<---- para markedj +

    +

    +     implementation name : 'jsoup'  , version: '+' //<---- para jsoup +

    +

    +     //Freeplane now comes with groovy 3.0.8 +

    +

    +     if(FPversion.startsWith('v10')){ +

    +

    +         implementation platform ("${groovyGroupId}:groovy-all:${groovyVersion}".toString()) { +

    +

    +             exclude group:groovyGroupId, module:'groovy-test' +

    +

    +             exclude group:groovyGroupId, module:'groovy-test-junit5' +

    +

    +             exclude group:groovyGroupId, module:'groovy-testng' +

    +

    +             exclude group:groovyGroupId, module:'groovy-ant' +

    +

    +             exclude group:groovyGroupId, module:'groovy-docgenerator' +

    +

    +             exclude group:groovyGroupId, module:'groovy-groovydoc' +

    +

    +             exclude group:groovyGroupId, module:'groovy-cli-commons' +

    +

    +             exclude group:groovyGroupId, module:'groovy-cli-picocli' +

    +

    +         } +

    +

    +     } else { +

    +

    +         implementation ("${groovyGroupId}:groovy-all:${groovyVersion}".toString()) { +

    +

    +             exclude group:groovyGroupId, module:'groovy-test' +

    +

    +             exclude group:groovyGroupId, module:'groovy-test-junit5' +

    +

    +             exclude group:groovyGroupId, module:'groovy-testng' +

    +

    +             exclude group:groovyGroupId, module:'groovy-ant' +

    +

    +             exclude group:groovyGroupId, module:'groovy-docgenerator' +

    +

    +             exclude group:groovyGroupId, module:'groovy-groovydoc' +

    +

    +             exclude group:groovyGroupId, module:'groovy-cli-commons' +

    +

    +             exclude group:groovyGroupId, module:'groovy-cli-picocli' +

    +

    +         }     +

    +

    +     } +

    +

    +     implementation "${groovyGroupId}:groovy-dateutil:${groovyVersion}".toString() +

    +

    + } +

    + +
    + + + + + + + + + +

    + se deberían poder borrar +

    + +
    + + + + + + + + + + + + + + + + + +

    + .gitignore +

    + +
    + + + + + + + + + + + +

    + .gradle +

    +

    + **/build/ +

    +

    + !src/**/build/ +

    +

    + +

    +

    + # Ignore Gradle GUI config +

    +

    + gradle-app.setting +

    +

    + +

    +

    + # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +

    +

    + !gradle-wrapper.jar +

    +

    + +

    +

    + # Cache of project +

    +

    + .gradletasknamecache +

    +

    + +

    +

    + # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +

    +

    + # gradle/wrapper/gradle-wrapper.properties +

    +

    + +

    +

    + # Addon maps +

    +

    + *.addon.mm +

    +

    + *.mm.bak +

    +

    + # version.properties +

    +

    + +

    +

    + # ignore .jar files +

    +

    + *.jar +

    + +
    +
    +
    + + + + + + + + + + + + + + + +

    + hacer en otro mapa +

    + +
    + + + + + You can make that **ToM** shows **where in the menu** the user can find a specific command. + + + + + + + + + + You can add to your tutorial buttons that **apply menu actions**. + + + + + + + + You can add buttons to **jump to other tutorial pages** in the same mindmap (and jump back). + + + + + + + + You can add buttons to **open other tutorials** or **tutorial's pages** from the same or another mindmap. + + + + + + + + + + You can add a button to **show nodes** in the same or in another MindMap. + +It may be any node. It doesn't need to be in a tutorial. + + + + + + + + + + You can add a button to **open other mindmaps** needed for the tutorial. + + + + + + + You can add actions to **insert example nodes** or specific node structures **to the user's mindmap**. + + + + + + + + After inserting an example branch, you can have a **button that selects the nodes** that you want so the user can easily go further with the tutorial. + + + + + + + + + + You can add to your tutorial panels that show blocks of **groovy code ** +and / or +**buttons** that apply those **groovy scripts** to the selected nodes. + + + + + + + + You can add an "_**inspect**_" button to the tutorial that directly goes to the map that +contains the current tutorial information and selects the node where the current page starts. + + + + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + //había algunos con minúsculas entremedio que hacían que no funcionara +

    +

    + +

    +

    + //def nodo=node +

    +

    + def nodos=c.selecteds +

    +

    + +

    +

    + nodos.each{nodo -> +

    +

    +     def t = nodo.text +

    +

    +     def newT = "emoji-${t.takeAfter('-').takeBefore('.').toUpperCase()}.svg" +

    +

    +     nodo.text = newT +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + +

    + =node.icons.icons +

    + +
    + + =node.icons.icons + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + import edofro.tutorialomatic.ToM_ui as tomui +

    +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + +

    +

    + //acceder mapa +

    +

    + def mapa = node.map +

    +

    + +

    +

    + //saca listado de tutotiales de mapa +

    +

    + def nodosTutoriales = mapa.root.find{it.style.name == tom.styles.tutorial} +

    +

    + +

    +

    + // se elige tutorial +

    +

    +     //TODO: hacer que usuario elija tutorial a realizar +

    +

    + def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null +

    +

    + +

    +

    + // listado de componentes de tutorial +

    +

    + def tutNodes = tom.getTutNodes(nTutorial) +

    +

    + if(!tutNodes) ui.informationMessage( 'no tutorial components(nodes) found') +

    +

    + +

    +

    + // ---- crear / abrir panel ----- +

    +

    + def myPanel = tomui.getContentPaneFromMyTab(tom.tabName, true) +

    +

    + +

    +

    + tom.fillContentPane(myPanel, tutNodes) +

    + +
    +
    + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.textBlock(node) +

    + +
    + + + + + + +

    + Here I'm developing a $1 that will help users to create Tutorials for $2. +

    +

    + +

    +

    + It is in "work in progress" state, but I loaded a first addOn version that shows how it will work. It is a demo version. +

    +

    + +

    +

    + Look under $3 in this repository. +

    +

    + +

    + +
    + + + + + + +

    + = edofro.MarkDownHelper.MDH.webLink(node) +

    + +
    + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webLink(node) +

    + +
    + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.webLink(node) +

    + +
    + + +
    +
    + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + .gitignore +

    + +
    + + + + + + +

    + .gradle +

    +

    + **/build/ +

    +

    + !src/**/build/ +

    +

    + +

    +

    + # Ignore Gradle GUI config +

    +

    + gradle-app.setting +

    +

    + +

    +

    + # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +

    +

    + !gradle-wrapper.jar +

    +

    + +

    +

    + # Cache of project +

    +

    + .gradletasknamecache +

    +

    + +

    +

    + # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +

    +

    + # gradle/wrapper/gradle-wrapper.properties +

    +

    + +

    +

    + # Addon maps +

    +

    + *.addon.mm +

    +

    + *.mm.bak +

    +

    + # version.properties +

    +

    + +

    +

    + # ignore .jar files +

    +

    + *.jar +

    +

    + +

    +

    + # ignore some folders +

    +

    + ignoredByGitHub/ +

    +

    + delete/ +

    +

    + +

    + +
    +
    + + + + + + + + + + +

    + Inated:   2022-07-24  20:22:59 +

    +

    + +

    +

    + ------- Files: --------  +

    +

    +  0 node(s) pointing to unexisting/filtered files (marked as 'broken') +

    +

    +  0 link(s) corrected in nodes +

    +

    +  0 new file(s) imported as node(s)  +

    +

    +  0 node(s) moved/renamed in drive +

    +

    + +

    +

    + ------- Folders: --------  +

    +

    + 20 folders didn't need to be moved  +

    +

    + 1 folders were not found  +

    +

    + +

    +

    + +

    +

    + 2.7 seconds +

    +

    + +

    +

    + ===================================== +

    +

    + +

    + + +
    +
    + + + + + + +

    + repositorio compilado +

    + +
    + + + + + + + + + + +

    + def tabPane = ui.freeplaneTabbedPanel +

    +

    + +

    +

    + def previousTab = tabPane.selectedIndex +

    +

    + +

    +

    + if (tabPane.hasProperty('previousTab')){ +

    +

    +     tabPane.previousTab = previousTab +

    +

    + } else { +

    +

    +     tabPane.metaClass.previousTab = previousTab +

    +

    + } +

    +

    + +

    +

    + return tabPane.previousTab +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + def tabPane = ui.freeplaneTabbedPanel +

    +

    + +

    +

    + def previousTab = tabPane.previousTab +

    +

    + +

    +

    + tabPane.setSelectedIndex(previousTab) +

    +

    + +

    +

    + //return tabPane.class.methods*.name.unique().findAll{it.contains('Sel')} +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + import edofro.tutorialomatic.ToM     as tom +

    +

    + +

    +

    + def pane = tomui.getTabContentPane(tom.tabName) +

    +

    + +

    +

    + pane.idDictionary +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    + + + + + + + + +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + import edofro.tutorialomatic.ToM      as tom +

    +

    + +

    +

    + /*static final*/ String tabName        = 'Tutorial' +

    +

    + +

    +

    + def myP = tomui.getContentPaneFromMyTab(tabName, false) +

    +

    + +

    +

    + tom.addNotes(myP,c.selecteds) +

    +

    + tomui.adjustHeight(myP, false) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + import edofro.tutorialomatic.ToM      as tom +

    +

    + +

    +

    + /*static final*/ String tabName        = 'Tutorial' +

    +

    + +

    +

    + def myP = tomui.getContentPaneFromMyTab(tabName, false) +

    +

    + +

    +

    + //tom.addNotes(myP,c.selecteds) +

    +

    + +

    +

    + addListenerPane(myP) +

    +

    + +

    +

    + tomui.adjustHeight(myP, false) +

    +

    + +

    +

    + // -------------------------------------------- +

    +

    + +

    +

    + def addListenerPane(myP){ +

    +

    +     def msgHtml     = "Here comes the selected node's text" +

    +

    +     def bttnText    = "capture selected node's text" +

    +

    +     def bttnToolTip = "Click to capture selected node's text" +

    +

    +     def bttnAction  = { e -> +

    +

    +         def bttn = e.source +

    +

    +         def bPane = tomui.getButtonPanel(bttn) +

    +

    +         bPane.components[0].text = c.selected.text +

    +

    +     } +

    +

    +     def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +

    +

    +     myP.add(buttonPanel, tomui.GBC) +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + import edofro.tutorialomatic.ToM      as tom +

    +

    + +

    +

    + import org.freeplane.features.map.INodeSelectionListener; +

    +

    + import org.freeplane.features.map.NodeModel; +

    +

    + import org.freeplane.features.mode.Controller; +

    +

    + +

    +

    + String tabName = 'Tutorial' +

    +

    + def doClear = true +

    +

    + def myP = tomui.getContentPaneFromMyTab(tabName, doClear ) +

    +

    + +

    +

    + addListenerPane(myP) +

    +

    + +

    +

    + def stopButton = tomui.createButton('Close Tab', {tomui.closeTab(tabName)}) +

    +

    + myP.add(stopButton, tomui.GBC) +

    +

    + +

    +

    + tomui.adjustHeight(myP, doClear ) +

    +

    + +

    +

    + // -------------------------------------------- +

    +

    + +

    +

    + def addListenerPane(myP){ +

    +

    +     def msgHtml     = "Here comes the selected node's text" +

    +

    +     def bttnText    = "activate/deativate listener" +

    +

    +     def bttnToolTip = "Click to activate/deativate listener" +

    +

    +     def bttnAction  = { e -> +

    +

    +         def bttn = e.source +

    +

    +         def bEditPane = tomui.getButtonPanel(bttn).components[0] +

    +

    +         activateListener(bEditPane) +

    +

    +     } +

    +

    +     def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, true) +

    +

    +     myP.add(buttonPanel, tomui.GBC) +

    +

    + } +

    +

    + +

    +

    + class MySelectionListener implements INodeSelectionListener { +

    +

    +     def comp; +

    +

    +     def node; +

    +

    + +

    +

    +     MySelectionListener(def component) { +

    +

    +         comp = component; +

    +

    +     } +

    +

    + +

    +

    +     void onSelect(NodeModel selNode) { +

    +

    +         if (node != selNode){ +

    +

    +             comp.text = selNode.text +

    +

    +             node = selNode +

    +

    +         } +

    +

    +     } +

    +

    + +

    +

    +     void onDeselect(NodeModel deselNode) { +

    +

    +         // +

    +

    +     } +

    +

    + } +

    +

    + +

    +

    + def activateListener(comp){ +

    +

    +     def mapController = Controller.currentModeController.mapController; +

    +

    +     def listenerFound = false; +

    +

    + +

    +

    +     (mapController.nodeSelectionListeners.findAll { it.class.name == "MySelectionListener" }).each { +

    +

    +         mapController.removeNodeSelectionListener(it); +

    +

    +         listenerFound = true; +

    +

    +     } +

    +

    + +

    +

    +     if (listenerFound) { +

    +

    +         comp.text = 'Listener deactivated..' +

    +

    +         return; +

    +

    +     } +

    +

    + +

    +

    +     def mySelListener = new MySelectionListener(comp); +

    +

    +     mapController.addNodeSelectionListener(mySelListener); +

    +

    +     comp.text = 'Listener activated..' +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + import edofro.tutorialomatic.ToM      as tom +

    +

    + +

    +

    + 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.core.ui.components.UITools as ui; +

    +

    + +

    +

    + String tabName = 'Tutorial' +

    +

    + def doClear = true +

    +

    + def myP = tomui.getContentPaneFromMyTab(tabName, doClear ) +

    +

    + +

    +

    + addListenerPane(myP) +

    +

    + +

    +

    + def stopButton = tomui.createButton('Close Tab', {tomui.closeTab(tabName)}) +

    +

    + myP.add(stopButton, tomui.GBC) +

    +

    + +

    +

    + tomui.adjustHeight(myP, doClear ) +

    +

    + +

    +

    + // -------------------------------------------- +

    +

    + +

    +

    + def addListenerPane(myP){ +

    +

    +     def msgHtml     = "Here comes the selected node's text" +

    +

    +     def bttnText    = "activate/deativate listener" +

    +

    +     def bttnToolTip = "Click to activate/deativate listener" +

    +

    +     def bttnAction  = { e -> +

    +

    +         def bttn = e.source +

    +

    +         def bEditPane = tomui.getButtonPanel(bttn).components[0] +

    +

    +         activateListener(bEditPane) +

    +

    +     } +

    +

    +     def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, true) +

    +

    +     myP.add(buttonPanel, tomui.GBC) +

    +

    + } +

    +

    + +

    +

    + class MyNodeChangeListener implements INodeChangeListener { +

    +

    +     def comp; +

    +

    +     def node; +

    +

    + +

    +

    +     MyNodeChangeListener(def component) { +

    +

    +         comp = component; +

    +

    +     } +

    +

    + +

    +

    +     public void nodeChanged(NodeChangeEvent event) { +

    +

    +         Object property = event.property +

    +

    +        if (NodeModel.NODE_TEXT.equals(property)) { +

    +

    +             def n = event.node +

    +

    +             comp.text =  "${event.property} of node ${n.id} has changed from '${event.oldValue}' to '${event.newValue}'. ------------------------------" +

    +

    +            // ui.informationMessage('xxx') +

    +

    +         } +

    +

    +     } +

    +

    + } +

    +

    + +

    +

    + def activateListener(comp){ +

    +

    +     def mapController = Controller.currentModeController.mapController; +

    +

    +     def listenerFound = false; +

    +

    + +

    +

    +     (mapController.nodeChangeListeners.findAll { it.class.name == MyNodeChangeListener.class.name }).each { +

    +

    +         mapController.removeNodeChangeListener(it); +

    +

    +         listenerFound = true; +

    +

    +     } +

    +

    + +

    +

    +     if (listenerFound) { +

    +

    +         comp.text = 'Listener deactivated..' +

    +

    +         return; +

    +

    +     } +

    +

    + +

    +

    +     def myChgListener = new MyNodeChangeListener(comp); +

    +

    +     mapController.addNodeChangeListener(myChgListener); +

    +

    +     comp.text = 'Listener activated..' +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + +

    + 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.core.ui.components.UITools; +

    +

    + +

    +

    + // add INodeChangeListener +

    +

    + // +

    +

    + def mapController = Controller.currentModeController.mapController +

    +

    + def listenerFound = false; +

    +

    + +

    +

    + mapController.nodeChangeListeners.findAll { +

    +

    +     it.getClass().name == MyNodeChangeListener.class.name +

    +

    + }.each { +

    +

    +     mapController.removeNodeChangeListener(it) +

    +

    +     listenerFound = true; +

    +

    + } +

    +

    + +

    +

    + +

    +

    + if (listenerFound) { +

    +

    +     UITools.informationMessage('Listener deactivated..') +

    +

    +     return; +

    +

    + } +

    +

    + +

    +

    + mapController.addNodeChangeListener(new MyNodeChangeListener(c)) // le agregué el c para que tenga acceso al controller y pueda usar c.statusInfo +

    +

    + UITools.informationMessage('Listener activated..') +

    +

    + +

    +

    + +

    +

    + // --------------------------------classes---------------------------------- +

    +

    + +

    +

    + // see org.freeplane.plugin.formula.FormulaUpdateChangeListener for an example of a INodeChangeListener +

    +

    + class MyNodeChangeListener implements INodeChangeListener { +

    +

    +     //esto lo agregué yo +

    +

    +     def c +

    +

    +     MyNodeChangeListener(def controller) { +

    +

    +         c = controller +

    +

    +     } +

    +

    +     // <-- +

    +

    + +

    +

    + +

    +

    +     public void nodeChanged(NodeChangeEvent event) { +

    +

    +         Object property = event.property +

    +

    +         if (NodeModel.NODE_TEXT.equals(property)) { +

    +

    +             def n = event.node +

    +

    +             c.statusInfo =  "text of node ${n.id} has changed from '${event.oldValue}' to '${event.newValue}'." +

    +

    +         } +

    +

    +     } +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + import edofro.tutorialomatic.ToM      as tom +

    +

    + +

    +

    + 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.core.ui.components.UITools as ui; +

    +

    + import org.freeplane.plugin.script.proxy.ScriptUtils +

    +

    + +

    +

    + String tabName = 'Tutorial' +

    +

    + def doClear = true +

    +

    + def myP = tomui.getContentPaneFromMyTab(tabName, doClear ) +

    +

    + +

    +

    + addListenerPane(myP) +

    +

    + +

    +

    + def stopButton = tomui.createButton('Close Tab', {tomui.closeTab(tabName)}) +

    +

    + myP.add(stopButton, tomui.GBC) +

    +

    + +

    +

    + tomui.adjustHeight(myP, doClear ) +

    +

    + +

    +

    + // -------------------------------------------- +

    +

    + +

    +

    + def addListenerPane(myP){ +

    +

    +     def msgHtml     = "Here comes the selected node's text" +

    +

    +     def bttnText    = "activate/deativate listener" +

    +

    +     def bttnToolTip = "Click to activate/deativate listener" +

    +

    +     def bttnAction  = { e -> +

    +

    +         def bttn = e.source +

    +

    +         def bEditPane = tomui.getButtonPanel(bttn).components[0] +

    +

    +         activateListener(bEditPane, c.selected) +

    +

    +     } +

    +

    +     def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, true) +

    +

    +     myP.add(buttonPanel, tomui.GBC) +

    +

    + } +

    +

    + +

    +

    + class MyNodeChangeListener implements INodeChangeListener { +

    +

    +     def comp; +

    +

    +     def node; +

    +

    +     def c = ScriptUtils.c() +

    +

    + +

    +

    +     MyNodeChangeListener(def component, nodo) { +

    +

    +         comp = component; +

    +

    +         node = nodo; +

    +

    +     } +

    +

    + +

    +

    +     public void nodeChanged(NodeChangeEvent event) { +

    +

    +        Object property = event.property +

    +

    +        def id = event.node.id +

    +

    +        if (id == node.id) { +

    +

    +           // if (NodeModel.NODE_TEXT.equals(property)){ +

    +

    +                // comp.text =  "${event.property} of node ${id} has changed from '${event.oldValue}' to '${event.newValue}'. ------------------------------${node.transformedText}" +

    +

    +                comp.text = node.transformedText +

    +

    +               //  ui.informationMessage('nodo cambió') +

    +

    +           // } +

    +

    +         } +

    +

    +     } +

    +

    + } +

    +

    + +

    +

    + def activateListener(comp, nodo){ +

    +

    +     def mapController = Controller.currentModeController.mapController; +

    +

    +     def listenerFound = false; +

    +

    + +

    +

    +     (mapController.nodeChangeListeners.findAll { it.class.name == MyNodeChangeListener.class.name }).each { +

    +

    +         mapController.removeNodeChangeListener(it); +

    +

    +         listenerFound = true; +

    +

    +     } +

    +

    + +

    +

    +     if (listenerFound) { +

    +

    +         comp.text = 'Listener deactivated..' +

    +

    +         return; +

    +

    +     } +

    +

    + +

    +

    +     def myChgListener = new MyNodeChangeListener(comp, nodo); +

    +

    +     mapController.addNodeChangeListener(myChgListener); +

    +

    +     comp.text = 'Listener activated..' +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + import groovy.swing.SwingBuilder +

    +

    + import javax.swing.* +

    +

    + import java.awt.* +

    +

    + +

    +

    + 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.core.ui.components.UITools +

    +

    + import org.freeplane.plugin.script.proxy.ScriptUtils +

    +

    + +

    +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + +

    +

    + +

    +

    + SwingBuilder swing = new SwingBuilder() +

    +

    + def dialogName = 'frameNota' +

    +

    + def myPaneName = 'myContentPanel' +

    +

    + iniMsg = '----- select the node with the note you want to view and click the button ----' +

    +

    + //def c = ScriptUtils.c() +

    +

    + +

    +

    + def contentPane = swing.panel( +

    +

    +         name: myPaneName, +

    +

    +         layout: new GridBagLayout(), +

    +

    +         background: Color.gray, +

    +

    +     ){} +

    +

    + +

    +

    + def notePane = tomui.createInstructionsPane(iniMsg) +

    +

    + +

    +

    + //return notePane.text +

    +

    + +

    +

    + contentPane.add(notePane, tomui.GBC) +

    +

    + +

    +

    + def sp = tomui.createScrollPaneForContentPane(contentPane) +

    +

    + +

    +

    + +

    +

    + def buttonPanel = { +

    +

    +    swing.panel(constraints : BorderLayout.NORTH) { +

    +

    +       toggleButton( +

    +

    +           text : 'Activate Listener', +

    +

    +           margin      : new Insets(10,15,10,15), +

    +

    +           actionPerformed : {e -> +

    +

    +                 def bttn = e.source +

    +

    +                 //def c = ScriptUtils.c() +

    +

    +                 //def bEditPane = tomui.getButtonPanel(bttn).components[0] +

    +

    +                 bttn.text = activateListener(notePane, c.selected) +

    +

    +          } +

    +

    +       ) +

    +

    +    } +

    +

    + } +

    +

    + +

    +

    + def noteFrame = swing.frame( +

    +

    +     title : 'Markdown Note', +

    +

    +     //id:'myDialog', +

    +

    +     name: dialogName, +

    +

    +    // modal:false, +

    +

    +     locationRelativeTo:UITools.frame, +

    +

    +     preferredSize: new Dimension(450,400), +

    +

    +    // owner:UITools.frame, +

    +

    +     defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, +

    +

    +     pack : true, +

    +

    +     show : true, +

    +

    + ) { +

    +

    +     buttonPanel() +

    +

    + +

    +

    + } +

    +

    + +

    +

    + //noteFrame.add(createActivateButtonPane()) +

    +

    + noteFrame.add(sp) +

    +

    + +

    +

    + def activateListener(comp, nodo){ +

    +

    +     def mapController = Controller.currentModeController.mapController; +

    +

    +     def listenerFound = false; +

    +

    + +

    +

    +     (mapController.nodeChangeListeners.findAll { it.class.name == MyNodeChangeListener.class.name }).each { +

    +

    +         mapController.removeNodeChangeListener(it); +

    +

    +         listenerFound = true; +

    +

    +     } +

    +

    + +

    +

    +     if (listenerFound) { +

    +

    +         comp.text = iniMsg +

    +

    +         return 'Listener deactivated..' +

    +

    +     } +

    +

    + +

    +

    +     def myChgListener = new MyNodeChangeListener(comp, nodo ); +

    +

    +     mapController.addNodeChangeListener(myChgListener); +

    +

    +     comp.text = tomui.getHtmlFromNote(nodo) +

    +

    +     return nodo.text.take(30) +

    +

    + } +

    +

    + +

    +

    + class MyNodeChangeListener implements INodeChangeListener { +

    +

    +     def comp; +

    +

    +     def node; +

    +

    + +

    +

    +     MyNodeChangeListener(def component, nodo) { +

    +

    +         comp = component; +

    +

    +         node = nodo; +

    +

    +     } +

    +

    + +

    +

    +     public void nodeChanged(NodeChangeEvent event) { +

    +

    +        Object property = event.property +

    +

    +        def id = event.node.id +

    +

    +        if (id == node.id) { +

    +

    +           // if (NodeModel.NODE_TEXT.equals(property)){ +

    +

    +                // comp.text =  "${event.property} of node ${id} has changed from '${event.oldValue}' to '${event.newValue}'. ------------------------------${node.transformedText}" +

    +

    +                comp.text = tomui.getHtmlFromNote(node) +

    +

    +               //  ui.informationMessage('nodo cambió') +

    +

    +           // } +

    +

    +         } +

    +

    +     } +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    + + + + + + +

    + borrar clones y descartados +

    + +
    + + + + + + +

    + antes de version FP v1.9.8 +

    + +
    + + + + + + +

    + import groovy.swing.SwingBuilder +

    +

    + import javax.swing.* +

    +

    + import java.awt.* +

    +

    + +

    +

    + import org.freeplane.features.mode.Controller; +

    +

    + +

    +

    + def toolbars = [ +

    +

    +     status : '/status', +

    +

    +     filter :'/fbuttons', +

    +

    +     icons :'/icon_toolbar', +

    +

    +     main :'/main_toolbar', +

    +

    +     panel :'/format' +

    +

    + ] +

    +

    + +

    +

    + def sB = new SwingBuilder() +

    +

    + def panelEjemplo = sB.panel(layout: new GridLayout(3, 2, 5, 5)) { +

    +

    +          label(text : 'Student Name:', horizontalAlignment : JLabel.RIGHT) +

    +

    +          textField(text : '', columns : 10) +

    +

    + +

    +

    +          label(text : 'Subject Name:', horizontalAlignment : JLabel.RIGHT) +

    +

    +          textField(text : '', columns : 10) +

    +

    + +

    +

    +          label(text : 'School Name:', horizontalAlignment : JLabel.RIGHT) +

    +

    +          textField(text : '', columns : 10) +

    +

    +       } +

    +

    + +

    +

    + +

    +

    + def tabPnl = getToolbar(toolbars.panel).components[1] +

    +

    + tabPnl.addTab("Edo", panelEjemplo) +

    +

    + +

    +

    + +

    +

    + def getToolbar(toolbarName) { +

    +

    +         JComponent toolBar = Controller.getCurrentModeController().getUserInputListenerFactory().getToolBar(toolbarName); +

    +

    +         return toolBar; +

    +

    +     } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import groovy.swing.SwingBuilder +

    +

    + import javax.swing.* +

    +

    + import java.awt.* +

    +

    + +

    +

    + import org.freeplane.features.mode.Controller; +

    +

    + +

    +

    + def toolbars = [ +

    +

    +     status : '/status', +

    +

    +     filter :'/fbuttons', +

    +

    +     icons :'/icon_toolbar', +

    +

    +     main :'/main_toolbar', +

    +

    +     panel :'/format' +

    +

    + ] +

    +

    + +

    +

    + +

    +

    + def tabPnl = getToolbar(toolbars.panel).components[1] +

    +

    + def index = tabPnl.indexOfTab("Edo") +

    +

    + +

    +

    + if (index>=0){ +

    +

    +     new SwingBuilder().edt {tabPnl.removeTabAt(index)} +

    +

    + } +

    +

    + +

    +

    + def getToolbar(toolbarName) { +

    +

    +         JComponent toolBar = Controller.getCurrentModeController().getUserInputListenerFactory().getToolBar(toolbarName); +

    +

    +         return toolBar; +

    +

    +     } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + +

    + import javax.swing.*  +

    +

    + +

    +

    + def panel = new JPanel() +

    +

    + +

    +

    + ui.freeplaneTabbedPanel.addTab('probando', panel) +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    +
    + + + + + + + + +

    + attrMenu = 'tbMenu' +

    +

    + +

    +

    + def nodo = node +

    +

    + def nMainMenu = nodo.pathToRoot.find({it[attrMenu].toString()=='main_menu'}) +

    +

    + if(!nMainMenu){ +

    +

    +     nMainMenu = node.createChild('Main menu') +

    +

    +     nMainMenu[attrMenu]='main_menu' +

    +

    +     nodo = nMainMenu +

    +

    + } +

    +

    + +

    +

    + if(!nMainMenu || !nodo.isDescendantOf(nMainMenu) || !nodo.attributes.containsKey(attrMenu)) return 'no es menu o submenu' +

    +

    + +

    +

    + def ruta = nodo.pathToRoot[nMainMenu.getNodeLevel(true) .. -1] +

    +

    + +

    +

    + def menuName = "main_menu" +

    +

    + def menuTree = menuUtils.createMenuEntryTree(menuName) +

    +

    + +

    +

    + ruta.drop(1).each{p -> +

    +

    +     menuTree = menuTree.children.find{it.toString() == p.text} +

    +

    + } +

    +

    + +

    +

    + +

    +

    + def subMenusMap = nodo.children.findAll{it.attributes.containsKey(attrMenu)}*.text.unique().sort() +

    +

    + def subMenusTree = menuTree.children.findAll{!it.leaf}*.toString().sort() +

    +

    + def buttonsMap =  nodo.children.findAll{it.link?.uri?.scheme == 'menuitem'}*.text.unique().sort() +

    +

    + def buttonsTree  = menuTree.children.findAll{it.leaf}*.toString().sort() +

    +

    + +

    +

    + +

    +

    + +

    +

    + if(subMenusTree && (subMenusTree - subMenusMap != []) ){ +

    +

    +     menuTree.children.findAll{!it.leaf}.findAll{!(it.toString() in subMenusMap)}.each{ +

    +

    +         def nMenuItem = nodo.createChild(it.toString()) +

    +

    +         nMenuItem[attrMenu] = 'sub_menu' +

    +

    +     } +

    +

    + } else if (buttonsTree && (buttonsTree - buttonsMap != []) ){ +

    +

    +     menuTree.children.findAll{it.leaf}.findAll{!(it.toString() in buttonsMap)}.each{ +

    +

    +         def nMenuItem = nodo.createChild(it.toString()) +

    +

    +         //nMenuItem[attrMenu] = 'sub_menu' +

    +

    +         def menuEntry = it.userObject +

    +

    +         nMenuItem.details = menuEntry.toolTipText +

    +

    +         nMenuItem.link.text = "menuitem:_${menuEntry.key}" +

    +

    +         //nMenuItem.note = menuEntry.toolTipText +

    +

    +     } +

    +

    + } else { +

    +

    +     def nodes2Delete = (nodo.parent.children.findAll{it.leaf} - nodo) +

    +

    +     nodes2Delete += nodo.children.findAll{it.link?.uri?.scheme == 'menuitem'} +

    +

    +     nodes2Delete*.delete() +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + + + + +

    + maxTextLength = 25 +

    +

    + noActionMessage = 'no action encountered' +

    +

    + +

    +

    + def nodo = node +

    +

    + def accion = nodo.link?.uri?.scheme == 'menuitem'?nodo.link.uri.schemeSpecificPart.drop(1):null +

    +

    + //return textUtils.getText(accion.replace('/','/').plus('.text'),'no encontrado') +

    +

    + +

    +

    + +

    +

    + def label = accion?textoLabel(accion):null +

    +

    + +

    +

    + if(label)nodo.text = label +

    +

    + +

    +

    + c.statusInfo = accion?label?" Node text changed to '$label'":" No label encountered for '$accion' ":noActionMessage +

    +

    + +

    +

    + def textoLabel(acc) { +

    +

    +   def texto = textUtils.getText("${acc}.text", null) +

    +

    +   texto = (texto && texto!='null')?textUtils.getShortText(texto, maxTextLength,'.'):null +

    +

    +   return texto +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + +
    + + + + + + +

    + focusTraversalPolicy=null +

    +

    +   rolloverSelectedIcon=null +

    +

    +   rolloverIcon=null +

    +

    +   icon=null +

    +

    +   transferHandler=null +

    +

    +   pressedIcon=null +

    +

    +   selectedObjects=null +

    +

    +   componentPopupMenu=null +

    +

    +   mousePosition=null +

    +

    +   disabledSelectedIcon=null +

    +

    +   disabledIcon=null +

    +

    +   inputMethodRequests=null +

    +

    +   inputVerifier=null +

    +

    +   selectedIcon=null +

    +

    +   name=null +

    +

    +   layout=null +

    +

    +   dropTarget=null +

    +

    +   nextFocusableComponent=null +

    +

    +   UI=com.sun.java.swing.plaf.windows.WindowsMenuItemUI@1d6c415 +

    +

    +   componentListeners=[Ljava.awt.event.ComponentListener;@a1b135 +

    +

    +   accessibleContext=javax.swing.JMenuItem$AccessibleJMenuItem@1757299 +

    +

    +   mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@42cbfa +

    +

    +   font=java.awt.Font[family=Segoe UI,name=Segoe UI,style=plain,size=13] +

    +

    +   mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@15347cb +

    +

    +   actionMap=javax.swing.ActionMap@4a7c4d +

    +

    +   insets=java.awt.Insets[top=0,left=0,bottom=0,right=0] +

    +

    +   managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB] +

    +

    +   managingFocusForwardTraversalKeys=[ctrl pressed TAB] +

    +

    +   alignmentX=0.5 +

    +

    +   alignmentY=0.5 +

    +

    +   vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@232be7 +

    +

    +   ancestorListeners=[Ljavax.swing.event.AncestorListener;@9a3082 +

    +

    +   component=org.freeplane.core.ui.components.JFreeplaneMenuItem[,3,3,357x22,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.basic.BasicBorders$MarginBorder@1384b45,flags=416,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Add / Remove a bookmark ...] +

    +

    +   rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] +

    +

    +   parent=javax.swing.JPopupMenu[,0,0,363x204,layout=javax.swing.plaf.basic.DefaultMenuLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@a7e7fb,flags=264,maximumSize=,minimumSize=,preferredSize=,desiredLocationX=2028,desiredLocationY=-276,label=,lightWeightPopupEnabled=true,margin=,paintBorder=true] +

    +

    +   cursor=java.awt.Cursor[Default Cursor] +

    +

    +   containerListeners=[Ljava.awt.event.ContainerListener;@12e9e1b +

    +

    +   locale=en +

    +

    +   defaultLocale=en +

    +

    +   keyListeners=[Ljava.awt.event.KeyListener;@a9a81c +

    +

    +   inputMap=javax.swing.InputMap@18eb2af +

    +

    +   inputMethodListeners=[Ljava.awt.event.InputMethodListener;@99065a +

    +

    +   menuKeyListeners=[Ljavax.swing.event.MenuKeyListener;@1769cd4 +

    +

    +   action=org.freeplane.core.ui.AccelerateableAction@e396e +

    +

    +   mouseListeners=[Ljava.awt.event.MouseListener;@f9feca +

    +

    +   components=[Ljava.awt.Component;@8c8819 +

    +

    +   itemListeners=[Ljava.awt.event.ItemListener;@18f3460 +

    +

    +   visibleRect=java.awt.Rectangle[x=0,y=0,width=357,height=22] +

    +

    +   bounds=java.awt.Rectangle[x=3,y=3,width=357,height=22] +

    +

    +   actionListeners=[Ljava.awt.event.ActionListener;@8dbab6 +

    +

    +   minimumSize=java.awt.Dimension[width=1,height=1] +

    +

    +   size=java.awt.Dimension[width=357,height=22] +

    +

    +   maximumSize=java.awt.Dimension[width=32767,height=32767] +

    +

    +   preferredSize=java.awt.Dimension[width=357,height=22] +

    +

    +   displayedMnemonicIndex=0 +

    +

    +   width=357 +

    +

    +   mnemonic=65 +

    +

    +   y=3 +

    +

    +   x=3 +

    +

    +   componentCount=0 +

    +

    +   horizontalTextPosition=11 +

    +

    +   iconTextGap=4 +

    +

    +   horizontalAlignment=10 +

    +

    +   verticalTextPosition=0 +

    +

    +   verticalAlignment=0 +

    +

    +   height=22 +

    +

    +   debugGraphicsOptions=0 +

    +

    +   border=javax.swing.plaf.basic.BasicBorders$MarginBorder@1384b45 +

    +

    +   colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 +

    +

    +   background=javax.swing.plaf.ColorUIResource[r=240,g=240,b=240] +

    +

    +   foreground=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0] +

    +

    +   margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0] +

    +

    +   hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@11701c3 +

    +

    +   changeListeners=[Ljavax.swing.event.ChangeListener;@13b8538 +

    +

    +   menuDragMouseListeners=[Ljavax.swing.event.MenuDragMouseListener;@17989cb +

    +

    +   componentOrientation=java.awt.ComponentOrientation@9cc218 +

    +

    +   toolkit=sun.awt.windows.WToolkit@12eb0c5 +

    +

    +   registeredKeyStrokes=[Ljavax.swing.KeyStroke;@178cc11 +

    +

    +   inputContext=sun.awt.im.InputMethodContext@138a03 +

    +

    +   peer=sun.awt.NullComponentPeer@123725b +

    +

    +   verifyInputWhenFocusTarget=true +

    +

    +   managingFocus=false +

    +

    +   painting=false +

    +

    +   optimizedDrawingEnabled=true +

    +

    +   focusTraversalKeysEnabled=true +

    +

    +   ignoreRepaint=false +

    +

    +   inheritsPopupMenu=false +

    +

    +   maximumSizeSet=false +

    +

    +   keyBindingProcessed=false +

    +

    +   borderPainted=false +

    +

    +   contentAreaFilled=true +

    +

    +   focusTraversable=false +

    +

    +   focusTraversalPolicyProvider=false +

    +

    +   requestFocusEnabled=true +

    +

    +   backgroundSet=true +

    +

    +   foregroundSet=true +

    +

    +   validateRoot=false +

    +

    +   fontSet=true +

    +

    +   createdDoubleBuffer=false +

    +

    +   paintingTile=false +

    +

    +   minimumSizeSet=false +

    +

    +   selected=false +

    +

    +   focusTraversalPolicySet=false +

    +

    +   cursorSet=false +

    +

    +   paintingOrigin=false +

    +

    +   rolloverEnabled=false +

    +

    +   focusPainted=false +

    +

    +   hideActionText=false +

    +

    +   focusable=false +

    +

    +   preferredSizeSet=false +

    +

    +   visible=true +

    +

    +   lightweight=true +

    +

    +   opaque=false +

    +

    +   doubleBuffered=false +

    +

    +   valid=true +

    +

    +   focusCycleRoot=false +

    +

    +   autoscrolls=false +

    +

    +   paintingForPrint=false +

    +

    +   showing=true +

    +

    +   displayable=true +

    +

    +   armed=true +

    +

    +   focusOwner=false +

    +

    +   enabled=true +

    +

    +   propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@13fe2e5 +

    +

    +   hierarchyListeners=[Ljava.awt.event.HierarchyListener;@6ab217 +

    +

    +   model=javax.swing.DefaultButtonModel@47668b +

    +

    +   treeLock=java.awt.Component$AWTTreeLock@1875b2 +

    +

    +   focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    +   topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    +   multiClickThreshhold=0 +

    +

    +   graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0] +

    +

    +   focusListeners=[Ljava.awt.event.FocusListener;@aa829e +

    +

    +   graphics=sun.java2d.SunGraphics2D[font=java.awt.Font[family=Segoe UI,name=Segoe UI,style=plain,size=13],color=java.awt.Color[r=0,g=0,b=0]] +

    +

    +   accelerator=shift ctrl pressed B +

    +

    +   toolTipText=Execute Add / Remove a bookmark ... on one selected node +

    +

    +   actionCommand=Add / Remove a bookmark ... +

    +

    +   text=Add / Remove a bookmark ... +

    +

    +   label=Add / Remove a bookmark ... +

    +

    +   UIClassID=MenuItemUI +

    +

    +   baselineResizeBehavior=OTHER +

    +

    +   subElements=[Ljavax.swing.MenuElement;@12d74d6 +

    +

    +   location=java.awt.Point[x=3,y=3] +

    +

    +   locationOnScreen=java.awt.Point[x=2031,y=-273] +

    +

    +   class=class org.freeplane.core.ui.components.JFreeplaneMenuItem +

    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + feedback Quickfold +

    + +
    + + + + + + + + + + + + + + +

    + next steps Sample Map +

    + +
    +
    + + + + + + +

    + next steps Sample Map +

    + +
    +
    +
    + + + + + + + + + + +

    + feedback Quickfold +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + safelist +

    + +
    + + + + + + + + + + + + + + + + + + + + +

    + next steps Sample Map +

    + +
    + + + + + + + + + + + + + +

    + Command not encountered in Menu for active map +

    + +
    + + + + + + + + +

    + next steps Sample Map +

    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + next steps Sample Map +

    + +
    + + + + + + + +

    + def nodoSource = N('ID_883263835') +

    +

    + +

    +

    + def nodoParent = node +

    +

    + +

    +

    + def nodoTarget = nodoParent.appendBranch(nodoSource) +

    +

    + +

    +

    + def idSource = nodoSource.findAll()*.id +

    +

    + def idTarget = nodoTarget.findAll()*.id +

    +

    + +

    +

    + //return idSource.get(0) +

    +

    + +

    +

    + Map ids = [:] +

    +

    + +

    +

    + for (i=0; i < idSource.size() ; i++){ +

    +

    +     ids[ idSource[i] ] = idTarget[i] +

    +

    + } +

    +

    + +

    +

    + ids +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + + + + + + + + +

    + def nodoSource = N('ID_1183316477') +

    +

    + +

    +

    + def nodoTarget = N( 'ID_886454957') +

    +

    + +

    +

    + nodoSource.children.each{n -> +

    +

    +     nodoTarget.appendBranch(n) +

    +

    + } +

    +

    + +

    +

    + //def nodoTarget = nodoParent.appendBranch(nodoSource) +

    +

    + +

    +

    + def idSource = ( nodoSource.findAll() - nodoSource )*.id +

    +

    + //return idSource +

    +

    + +

    +

    + def idTarget = ( nodoTarget.findAll() - nodoTarget )*.id +

    +

    + //return idTarget +

    +

    + +

    +

    + //return idSource.get(0) +

    +

    + +

    +

    + Map ids = [:] +

    +

    + +

    +

    + for (i=0; i < idSource.size() ; i++){ +

    +

    +     ids[ idSource[i] ] = idTarget[i] +

    +

    + } +

    +

    + +

    +

    + ids +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + +

    + In the next pages you will see: +

    +
      +
    • + An example of a note in markdown that includes tables and images + +
        +
      • + It has also links to webpages, but I don't know how to make them work +
      • +
      • + The content is just a demo markdown document I made a time ago about the "Calvin and Hobbes" comic strip. It has no relation with Freeplane, but it helps to see what can be shown +
      • +
      +
    • +
    • + The page after that has three markdown examples with animated gif, code block and a table with images + +
        +
      • + I don't know why (at least in my computer) I can see the images in the nodes notes but they are not shown in the Tutorial panel +
      • +
      +
    • +
    • + The next section has pages with examples about teaching how to make some format modifications to a selected node and other Freeplane tips +
    • +
    • + The last page shows a list of "next steps" and "nice to haves" for this AddOn +
    • +
    + +
    + + + + + + + + +

    + The whole information shown in this tutorial is taken from the "Tutorial Sample" mindmap. +

    +

    + +

    +

    + If you modify it and relaunch the tutorial it will include those changes. +

    + +
    +
    + + ## a codeBlock example + +Code: **'pasar texto a nota e indicar formato Markdown'** + +```groovy +// import org.freeplane.features.text.TextController +import org.freeplane.features.note.NoteController + + +def nodos = c.selecteds + +nodos.each{nodo -> + nodo.note = nodo.text + setNoteMarkdown(nodo) +} + +def setNoteMarkdown(n){ + return NoteController.getController().setNoteContentType(n.delegate, 'markdown') +} +``` + + + +
    + + + + + + + + +

    + Click the "Next page" button to go to the first example +

    + +
    + +
    +
    + + + + + + + +

    + In the next pages you will see: +

    +
      +
    • + An example of a note in markdown that includes tables and images + +
        +
      • + It has also links to webpages, but I don't know how to make them work +
      • +
      • + The content is just a demo markdown document I made a time ago about the "Calvin and Hobbes" comic strip. It has no relation with Freeplane, but it helps to see what can be shown +
      • +
      +
    • +
    • + The page after that has three markdown examples with animated gif, code block and a table with images + +
        +
      • + I don't know why (at least in my computer) I can see the images in the nodes notes but they are not shown in the Tutorial panel +
      • +
      +
    • +
    • + The next section has pages with examples about teaching how to make some format modifications to a selected node and other Freeplane tips +
    • +
    • + The last page shows a list of "next steps" and "nice to haves" for this AddOn +
    • +
    + +
    + + + + + + + + +

    + The whole information shown in this tutorial is taken from the "Tutorial Sample" mindmap. +

    +

    + +

    +

    + If you modify it and relaunch the tutorial it will include those changes. +

    + +
    +
    + + ## a codeBlock example + +Code: **'pasar texto a nota e indicar formato Markdown'** + +```groovy +// import org.freeplane.features.text.TextController +import org.freeplane.features.note.NoteController + + +def nodos = c.selecteds + +nodos.each{nodo -> + nodo.note = nodo.text + setNoteMarkdown(nodo) +} + +def setNoteMarkdown(n){ + return NoteController.getController().setNoteContentType(n.delegate, 'markdown') +} +``` + + + +
    + + + + + + + + +

    + Click the "Next page" button to go to the first example +

    + +
    + +
    +
    +
    +
    + + + + + + +

    + next steps Sample Map +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + feedback Quickfold +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + +

    + def msg(t){ +

    +

    +     ui.informationMessage(t.toString()) +

    +

    + } +

    +

    + +

    +

    + // armar un diccionario ejemplo +

    +

    + def miDicc = [:] +

    +

    + def m = node.map +

    +

    + +

    +

    + node.children.each{ n -> +

    +

    +     miDicc[n.id] = n.text   //id.toLowerCase() +

    +

    + } +

    +

    + +

    +

    + // -------------------------------------------------- +

    +

    + +

    +

    + def texto = new StringBuilder() +

    +

    + def sepEntries  = '|-|' +

    +

    + def sepKeyValue = '|:|' +

    +

    + +

    +

    + miDicc.each{k,v -> +

    +

    +     texto << "${k}${sepKeyValue}${v}${sepEntries}" +

    +

    + } +

    +

    + +

    +

    + // guardar en map.storage +

    +

    + m.storage['pruebaDiccionario'] = texto +

    +

    + +

    +

    + // ----------------------------------------------------------------------------- +

    +

    + +

    +

    + def texto2 = m.storage['pruebaDiccionario'].text +

    +

    + +

    +

    + def miDicc2 = [:] +

    +

    + +

    +

    + def sepEntries2  = /\|-\|/ +

    +

    + def sepKeyValue2 = /\|:\|/ +

    +

    + texto2.split(sepEntries2).each{e -> +

    +

    +     def a, b +

    +

    +     (a,b) = e.split(sepKeyValue2) +

    +

    +     miDicc2[a] = b +

    +

    + } +

    +

    + +

    +

    + +

    +

    + return miDicc == miDicc2 +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + def msg(t){ +

    +

    +     ui.informationMessage(t.toString()) +

    +

    + } +

    +

    + +

    +

    + // armar un diccionario ejemplo +

    +

    + def miDicc = [:] +

    +

    + def mapa = node.map +

    +

    + +

    +

    + node.children.each{ n -> +

    +

    +     miDicc[n.id] = n.text   //id.toLowerCase() +

    +

    + } +

    +

    + +

    +

    + // return miDicc +

    +

    + +

    +

    + // -------------------------------------------------- +

    +

    + +

    +

    + tom.setIdDictionary(mapa, miDicc) +

    +

    + +

    +

    + def storeVar = tom.idDictStorage +

    +

    + +

    +

    + node.createChild(storeVar).note = mapa.storage[storeVar] +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + def mapa = node.map +

    +

    + +

    +

    + //def storeVar = tom.idDictStorage +

    +

    + //node.createChild(storeVar).note = mapa.storage[storeVar] +

    +

    + +

    +

    + def myDict = tom.getIdDictionary(mapa) +

    +

    + +

    +

    + return myDict +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + def msg(t){ +

    +

    +     ui.informationMessage(t.toString()) +

    +

    + } +

    +

    + +

    +

    + // armar un diccionario ejemplo +

    +

    + def sourceDict = [:] +

    +

    + def mapa = node.map +

    +

    + +

    +

    + node.children.each{ n -> +

    +

    +     sourceDict[n.id] = n.text.replace(':','.').replace(';',',')  // los replace son para que no se confunda con los separadores definidos en los métodos de set y getIdDictionary +

    +

    + } +

    +

    + +

    +

    + // -------------------------------------------------- +

    +

    + +

    +

    + tom.setIdDictionary(mapa, sourceDict) +

    +

    + +

    +

    + /* +

    +

    + def storeVar = tom.idDictStorage +

    +

    + node.createChild(storeVar).note = mapa.storage[storeVar] +

    +

    + */ +

    +

    + +

    +

    + def idDict = tom.getIdDictionary(mapa) +

    +

    + +

    +

    + return sourceDict && idDict == sourceDict +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + import edofro.tutorialomatic.ToM_ui      as tomui +

    +

    + +

    +

    + +

    +

    + def nodo = node +

    +

    + def myUri = nodo.link?.uri +

    +

    + +

    +

    + //return 'hola'.class +

    +

    + +

    +

    + c.statusInfo = openTutorialPage(myUri, nodo.map) +

    +

    + //openTutorialPage(myUri) +

    +

    + //openTutorialPage(nodo.text, nodo.map) +

    +

    + //openTutorialPage(nodo.text) +

    +

    + +

    +

    + +

    +

    + //----- +

    +

    + def openTutorialPage(nodeDirection , mapa = null){ +

    +

    +     if(nodeDirection instanceof java.net.URI) { +

    +

    +         return openTutorialPageUri(nodeDirection, mapa) +

    +

    +     } +

    +

    +     if(nodeDirection instanceof java.lang.String) { +

    +

    +         return openTutorialPageString(nodeDirection, mapa) +

    +

    +     } +

    +

    +     return 'No tutorial node found' +

    +

    + } +

    +

    + +

    +

    + +

    +

    + def openTutorialPageUri(URI uri, mapa){ +

    +

    + //    if(!uri) return null +

    +

    +     def isMindmap =  uri.scheme == 'file' && uri.path.endsWith('.mm') +

    +

    +     def nodeId = (!uri.scheme || isMindmap) && uri.fragment?.startsWith('ID_')? +

    +

    +                     uri.fragment +

    +

    +                     :null +

    +

    +     if (!nodeId) return 'No node ID defined in URI' +

    +

    +     def tutMapPath = nodeId && isMindmap? +

    +

    +                         uri.path.drop(1) +

    +

    +                         :null +

    +

    +     def tutMap = tutMapPath? +

    +

    +                     tom.getMapFromPath(tutMapPath, false)    //open mind map not visible +

    +

    +                     :mapa +

    +

    +     openTutorialPageString(nodeId, tutMap) +

    +

    + } +

    +

    + +

    +

    + +

    +

    + def openTutorialPageString(String nodeId, tutMap){ +

    +

    +     def attributeTabLabel = tom.attributeTabLabel +

    +

    +     def defaultMapTutorialsTabLabel = tom.defaultMapTutorialsTabLabel +

    +

    + +

    +

    +     if(!tutMap) return 'No tutorial mindmap defined' +

    +

    +     def targetNode = tutMap.node(nodeId) +

    +

    +     //return targetNode +

    +

    +     //return tom.isTutNode(targetNode) +

    +

    +     if(!tom.isTutNode(targetNode)) return 'Indicated node is not part of a tutorial' +

    +

    +     def tutorialTabName = targetNode[attributeTabLabel] ?: tutMap.root[attributeTabLabel] ?: defaultMapTutorialsTabLabel +

    +

    +     def myP = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true) +

    +

    +     tom.fillPage(myP, targetNode, true, true) +

    +

    +     return 'tutorial displayed' +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + +

    +

    + def nodo = node +

    +

    + def myUri = nodo.link?.uri +

    +

    + +

    +

    + //return 'hola'.class +

    +

    + +

    +

    + c.statusInfo = tom.openTutorialPage(myUri, nodo.map) +

    +

    + //c.statusInfo = tom.openTutorialPage(myUri) +

    +

    + //c.statusInfo = tom.openTutorialPage(nodo.text, nodo.map) +

    +

    + //c.statusInfo = tom.openTutorialPage(nodo.text) //must fail +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + +
    +
    + + + + + + + + + + + +

    + def newPageNode = node +

    +

    + def selectedNode = c.selected +

    +

    + +

    +

    + +

    +

    + def linkNode = selectedNode.createChild(newPageNode.text) +

    +

    + linkNode['ToM_LinkToPage'] = getUriFromNode(newPageNode) +

    +

    + linkNode.link.uri = new URI('menuitem:_addons.tutorialOMatic.openTutorialPageFromLink_on_single_node')  +

    +

    + +

    +

    + //getUriFromNode(node) +

    +

    + +

    +

    + def getUriFromNode(nodo, String sch = 'tutorial'){ +

    +

    +     def ssp = nodo.map.file.toURI().schemeSpecificPart +

    +

    +     def frg = nodo.id +

    +

    +     return new URI(sch, ssp, frg) +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + + + + +
    + + + + + + + + +

    + def D = [:] +

    +

    + +

    +

    + D.a =45 +

    +

    + +

    +

    + D.a / 9 +

    +

    + D.b = 'ghg' +

    +

    + D.c = {it.texr } +

    +

    + +

    +

    + def L =[] +

    +

    + L << D << D +

    +

    + +

    +

    + L +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + y no aplica +

    + +
    + + + + + + +

    + feedback Quickfold +

    + +
    + + + + + + + + +

    + feedback Quickfold +

    + +
    + + + + + + + + +

    + feedback Quickfold +

    + +
    + + + + + + + + +

    + feedback Quickfold +

    + +
    + + + + + + + + +

    + feedback Quickfold +

    + +
    + + + + + + + + +

    + feedback Quickfold +

    + +
    + + +
    +
    + + + + + + + +

    + feedback Quickfold +

    + +
    + + +
    + + + + + + + +

    + desde otro mapa +

    + +
    +
    +
    + + + + + + + + + + + +

    + = +

    +

    + (node['tasksStyles']?:'pendingTask,nextTask').split(',').collect{st -> "${node.find{it.style.name == st}.size()}  ${st}(s)"}.join('\n') +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 5d85a43..4528c45 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -244,7 +244,7 @@ - + @@ -260,7 +260,10 @@ - + + + + @@ -412,7 +415,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -523,6 +526,7 @@ For each menu item with an icon add an attribute with the icon key (use develope + diff --git a/Tutorial-o-Matic/build.gradle b/Tutorial-o-Matic/build.gradle index 99469e5..c31e16f 100644 --- a/Tutorial-o-Matic/build.gradle +++ b/Tutorial-o-Matic/build.gradle @@ -7,7 +7,7 @@ apply plugin: 'groovy' targetCompatibility='1.8' // 1. I have to define which freeplane version is going to be used to look at the libreries (freeplane and groovy) -def FPversion = 'v9_15' +def FPversion = 'v10_1' def freeplaneDirs = [ instaled : "C:/Program Files/Freeplane", protableApps : "C:/PortableApps/FreeplanePortable/App/Freeplane", @@ -46,7 +46,7 @@ dependencies { implementation name : 'freeplanelauncher' implementation name : 'freeplaneviewer' implementation group: 'org.freeplane.core', name: 'freeplaneeditor', version:"+" - implementation group: 'org.freeplane.script', name: 'plugin', version: '+' + implementation group: 'org.freeplane.script', name: 'plugin', version: '+' implementation name : 'markedj', version: '+' //<---- para markedj implementation name : 'jsoup' , version: '+' //<---- para jsoup //Freeplane now comes with groovy 3.0.8 diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index f4f9f66..f2631a3 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -2,6 +2,8 @@ ## v0.0.7 +* getMenuCommand renamed to getMenuCommandToM.groovy +* bugs fix ## v0.0.6 diff --git a/Tutorial-o-Matic/src/main/groovy/ToM.groovy b/Tutorial-o-Matic/src/main/groovy/ToM.groovy index 8dbc67b..ddcead3 100644 --- a/Tutorial-o-Matic/src/main/groovy/ToM.groovy +++ b/Tutorial-o-Matic/src/main/groovy/ToM.groovy @@ -631,8 +631,8 @@ class ToM{ myP.add(pane, tomui.GBC) } - def static addTutorialsPane(myP, ApiMindMap mapa){ - def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial && !isBlocked(it) } + def static addTutorialsPane(myP, ApiMindMap mapa, nodosTutoriales){ + //def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial && !isBlocked(it) } if ( nodosTutoriales.size() != 1 ){ def pane = tomui.createEmptyGridBagPanel() def pre = nodosTutoriales.size() == 0 ? "No t" : "T" @@ -679,11 +679,19 @@ class ToM{ } def static showTutorials(mapa){ - def tutorialTabName = mapa.root[attributeTabLabel] ?: defaultMapTutorialsTabLabel + def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial && !isBlocked(it) } + if (!nodosTutoriales){ + ui.informationMessage( "no tutorials found for mindmap '${mapa.name}'".toString() ) + } + def tutorialTabName + if ( nodosTutoriales.size()==1 ) { + tutorialTabName = nodosTutoriales[0][attributeTabLabel] + } + tutorialTabName ?= mapa.root[attributeTabLabel] ?: defaultMapTutorialsTabLabel def myP = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true) myP.removeAll() tomui.resizeContentPanel(myP,tomui.maxContentPaneHeigth) - addTutorialsPane(myP, mapa) + addTutorialsPane(myP, mapa, nodosTutoriales) tomui.adjustHeight(myP, true) } diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm new file mode 100644 index 0000000..c4ee8f3 --- /dev/null +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm @@ -0,0 +1,977 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + # Cute Origami Bookmarks +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FEG/OIPK/L06PT77G/FEGOIPKL06PT77G.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds) +

    + + +
    +
    + + + + + + + + +

    + Hello internet people, today I will show you how to create corner bookmarks out of coloured paper. They always turn out really cute and they're perfect for giving as gifts :) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Although these are very easy and simple crafts, it can be hard to get some creative inspiration to figure out how you want to design them. I will also give some tips that I think will be helpful. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + I made the bookmarks shown above earlier, but for this instructable I am going to make some new and fresh ones. +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + + +

    + # Supplies +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FDD/YAIK/L06PT6OG/FDDYAIKL06PT6OG.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds) +

    + + +
    +
    + + + + + + + + +

    + To make these bookmarks you will need: +

    +

    + +

    +

    + - A ruler (at least 10cm or 4in) +

    +

    + - A pencil +

    +

    + - Scissors +

    +

    + - Paper or card (a few different colours) +

    +

    + - Glue stick or squeezy glue +

    +

    + - Some inspiration for bookmark designs +

    +

    + - A will to cut and stick paper +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Optional: +

    +

    + +

    +

    + - Black pen +

    +

    + - Coloured pencils/markers +

    +

    + - Paper knife/cutter (for scoring card) +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + + +

    + # Step 1: Decide Your Design +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + First, decide what design you would like to make: I mainly make different types of animals, but you could also make humans or your favourite (book) characters. However, if you are feeling spontaneous, it is perfectly fine to not plan any design at all! +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Make sure that you have paper in the necessary colours and sizes to make your design, or you might become very disappointed when you realise you are missing something :/ +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + # Step 2: Measure and Cut Paper +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + We are now going to make the base of the bookmark. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + To do this, you need to measure out a square piece of paper that is (at least) 10cm each side -- a bookmark smaller than this will probably be difficult to fold and decorate. 10cm is roughly 4 inches. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Use your ruler to measure out 10cm from each side, then mark it with a pencil. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FE7/N8W6/L06PT6OX/FE7N8W6L06PT6OX.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=aaaf0b8a070a15f59177952615be4a7c) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Draw two faint lines connecting the marks you made. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FOK/9C7Z/L06PT6OY/FOK9C7ZL06PT6OY.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=fd3e2ca353277244ec55143f1950ddd5) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Cut through the lines as accurately as you can. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/F0D/OFSO/L06PT6OZ/F0DOFSOL06PT6OZ.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=04c3a616a3d7923f2a961440522628ca) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Realise that the end size of the bookmark will be a quarter of the square's area... this can help you decide how big to cut your square. Also, if you already have a square piece of paper that is a suitable size for you, you can skip this step. +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + # Step 3: Fold Paper +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + We now have to fold the paper to make it into a corner bookmark. It might be easier to take a look at the pictures above rather than trying to interpret the instructions. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Fold the square into quarters (fold once horizontally and once vertically.) +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FL6/YUHP/L06PT6P9/FL6YUHPL06PT6P9.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=34132bf0e55a204f144a7a8a6acf9251) +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + +

    + Fold your paper diagonally once to make a triangle. Rotate it so the base is facing upwards. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FAJ/5KUG/L06PT6PA/FAJ5KUGL06PT6PA.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=add530039e1b153ced492c86c31636fc) +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + +

    + Fold the bottom corner upwards to make a little pocket (there are two layers -- only fold the top one.) +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FHC/EW5L/L06PT6PB/FHCEW5LL06PT6PB.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=1f84256ea9c64323167933d3de92ec51) +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + +

    + Fold the left and right corners downwards, to make a smaller square. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTE/UEWE/L06PT6PC/FTEUEWEL06PT6PC.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=93246151a1a78bbc87006e2506bcbe2e) +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + +

    + Tuck the left and right corners underneath the little pocket you made, and then fold them. You now have the base of your bookmark! +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FE9/RLNT/L06PT6PD/FE9RLNTL06PT6PD.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=a88fad583bde511ee08844eb2e9f1676) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + If you are using card, you probably need to score the card first in order to fold it neatly. Use a ruler and a paper knife or cutter to do this. Make sure you do it safely! +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + # Step 4: Decorate Bookmark +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FMV/XRZC/L06PT9QS/FMVXRZCL06PT9QS.jpg?auto=webp&frame=1&fit=bounds&md=d0b67e4507fddf246d311ff018cd22a8) +

    + + +
    +
    + + + + + + + + +

    + We have now reached the very fun part, which is decorating your bookmark. If you are a minimalist and/or very lazy, this step may not be necessary and your bookmark is now finished! :) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + As you can see, I turned the pink bookmark into a slightly creepy axolotl, by sticking some gills to the back and making blue eyes. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Tips for decorating your bookmarks: +

    +

    + +

    +

    + - Cut out small details (eyes, noses, ears, hair, etc.) out of pieces of scrap paper and stick them on. +

    +

    + - Use a black pen/fineliner to make some details. It might also be easier to draw eyes with a pen than sticking paper. +

    +

    + - You could use coloured pencils/markers to draw on some designs (but this will only work if you draw on light-coloured paper.) +

    +

    + - Maybe add texture to spice it up a bit -- feathers and stickers and shiny stuff! +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + If you are adding extra parts to your bookmark, keep in mind that some may stick out of the book a bit and maybe get damaged (like the gills on my axolotl.) +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + # Step 5: Voilà! +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTG/QP3N/L06PT76P/FTGQP3NL06PT76P.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=c7ed44f4d0772f0e72a8e37abc3e6924) +

    + + +
    +
    + + + + + + + + +

    + Congratulations! You have created a child! +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + I also made a fox and whale along with my axolotl :) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Now you could gift your creation to anyone who likes to read books. It's also a good idea to make these for kids as they can encourage them to read more. Of course, there is also the option of keeping it for yourself :D +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Thanks for reading my instructable -- it is my first one and it has been very fun to make. I hope it was entertaining and somewhat helpful! And also please share some pictures of your children below! +

    +

    + +

    + + +
    +
    +
    +
    +
    +
    +
    diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm index 6beb0d5..838f91c 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm @@ -184,6 +184,7 @@ + @@ -1349,6 +1350,907 @@ Write some text to its note (this is the information that will be shown) + + + + + + + + + + + + + +

    + # Cute Origami Bookmarks +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FEG/OIPK/L06PT77G/FEGOIPKL06PT77G.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds) +

    + + +
    +
    + + + + + + + + +

    + Hello internet people, today I will show you how to create corner bookmarks out of coloured paper. They always turn out really cute and they're perfect for giving as gifts :) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Although these are very easy and simple crafts, it can be hard to get some creative inspiration to figure out how you want to design them. I will also give some tips that I think will be helpful. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + I made the bookmarks shown above earlier, but for this instructable I am going to make some new and fresh ones. +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + + +

    + # Supplies +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FDD/YAIK/L06PT6OG/FDDYAIKL06PT6OG.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds) +

    + + +
    +
    + + + + + + + + +

    + To make these bookmarks you will need: +

    +

    + +

    +

    + - A ruler (at least 10cm or 4in) +

    +

    + - A pencil +

    +

    + - Scissors +

    +

    + - Paper or card (a few different colours) +

    +

    + - Glue stick or squeezy glue +

    +

    + - Some inspiration for bookmark designs +

    +

    + - A will to cut and stick paper +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Optional: +

    +

    + +

    +

    + - Black pen +

    +

    + - Coloured pencils/markers +

    +

    + - Paper knife/cutter (for scoring card) +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + + +

    + # Step 1: Decide Your Design +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + First, decide what design you would like to make: I mainly make different types of animals, but you could also make humans or your favourite (book) characters. However, if you are feeling spontaneous, it is perfectly fine to not plan any design at all! +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Make sure that you have paper in the necessary colours and sizes to make your design, or you might become very disappointed when you realise you are missing something :/ +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + # Step 2: Measure and Cut Paper +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + We are now going to make the base of the bookmark. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + To do this, you need to measure out a square piece of paper that is (at least) 10cm each side -- a bookmark smaller than this will probably be difficult to fold and decorate. 10cm is roughly 4 inches. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Use your ruler to measure out 10cm from each side, then mark it with a pencil. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FE7/N8W6/L06PT6OX/FE7N8W6L06PT6OX.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=aaaf0b8a070a15f59177952615be4a7c) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Draw two faint lines connecting the marks you made. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FOK/9C7Z/L06PT6OY/FOK9C7ZL06PT6OY.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=fd3e2ca353277244ec55143f1950ddd5) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Cut through the lines as accurately as you can. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/F0D/OFSO/L06PT6OZ/F0DOFSOL06PT6OZ.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=04c3a616a3d7923f2a961440522628ca) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Realise that the end size of the bookmark will be a quarter of the square's area... this can help you decide how big to cut your square. Also, if you already have a square piece of paper that is a suitable size for you, you can skip this step. +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + # Step 3: Fold Paper +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + We now have to fold the paper to make it into a corner bookmark. It might be easier to take a look at the pictures above rather than trying to interpret the instructions. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Fold the square into quarters (fold once horizontally and once vertically.) +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FL6/YUHP/L06PT6P9/FL6YUHPL06PT6P9.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=34132bf0e55a204f144a7a8a6acf9251) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Fold your paper diagonally once to make a triangle. Rotate it so the base is facing upwards. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FAJ/5KUG/L06PT6PA/FAJ5KUGL06PT6PA.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=add530039e1b153ced492c86c31636fc) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Fold the bottom corner upwards to make a little pocket (there are two layers -- only fold the top one.) +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FHC/EW5L/L06PT6PB/FHCEW5LL06PT6PB.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=1f84256ea9c64323167933d3de92ec51) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Fold the left and right corners downwards, to make a smaller square. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTE/UEWE/L06PT6PC/FTEUEWEL06PT6PC.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=93246151a1a78bbc87006e2506bcbe2e) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Tuck the left and right corners underneath the little pocket you made, and then fold them. You now have the base of your bookmark! +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FE9/RLNT/L06PT6PD/FE9RLNTL06PT6PD.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=a88fad583bde511ee08844eb2e9f1676) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + If you are using card, you probably need to score the card first in order to fold it neatly. Use a ruler and a paper knife or cutter to do this. Make sure you do it safely! +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + # Step 4: Decorate Bookmark +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FMV/XRZC/L06PT9QS/FMVXRZCL06PT9QS.jpg?auto=webp&frame=1&fit=bounds&md=d0b67e4507fddf246d311ff018cd22a8) +

    + + +
    +
    + + + + + + + + +

    + We have now reached the very fun part, which is decorating your bookmark. If you are a minimalist and/or very lazy, this step may not be necessary and your bookmark is now finished! :) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + As you can see, I turned the pink bookmark into a slightly creepy axolotl, by sticking some gills to the back and making blue eyes. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Tips for decorating your bookmarks: +

    +

    + +

    +

    + - Cut out small details (eyes, noses, ears, hair, etc.) out of pieces of scrap paper and stick them on. +

    +

    + - Use a black pen/fineliner to make some details. It might also be easier to draw eyes with a pen than sticking paper. +

    +

    + - You could use coloured pencils/markers to draw on some designs (but this will only work if you draw on light-coloured paper.) +

    +

    + - Maybe add texture to spice it up a bit -- feathers and stickers and shiny stuff! +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + If you are adding extra parts to your bookmark, keep in mind that some may stick out of the book a bit and maybe get damaged (like the gills on my axolotl.) +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + # Step 5: Voilà! +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTG/QP3N/L06PT76P/FTGQP3NL06PT76P.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=c7ed44f4d0772f0e72a8e37abc3e6924) +

    + + +
    +
    + + + + + + + + +

    + Congratulations! You have created a child! +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + I also made a fox and whale along with my axolotl :) +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Now you could gift your creation to anyone who likes to read books. It's also a good idea to make these for kids as they can encourage them to read more. Of course, there is also the option of keeping it for yourself :D +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + Thanks for reading my instructable -- it is my first one and it has been very fun to make. I hope it was entertaining and somewhat helpful! And also please share some pictures of your children below! +

    +

    + +

    + + +
    +
    +
    +
    +
    + + + + + + + +

    + def nodos = c.selecteds +

    +

    + +

    +

    + nodos.each{n -> +

    +

    +     n.text = 'image Origami Bookmarks' +

    +

    +     n.link.text = n.link.text.takeBefore('?') + '?auto=webp&frame=1&width=500&height=500&fit=bounds' +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + def nodos = node.find{n -> n.style.name && n.style.name == 'MarkdownHelperNode' && n.text == 'Markdown document.md'} +

    +

    + +

    +

    + //def n = node +

    +

    + nodos.each{ n -> +

    +

    +    def newText = n.children.first().text.split(' ').take(5).join(' ') + ' ...' +

    +

    +    n.text = newText +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    +
    +
    From 618e191001eb696ea4f24bccd1628072b1669ba6 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Sun, 24 Jul 2022 20:49:58 -0400 Subject: [PATCH 36/42] Update README.MD --- README.MD | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.MD b/README.MD index 5401385..a01b366 100644 --- a/README.MD +++ b/README.MD @@ -27,6 +27,7 @@ nullPendientesnull - [ ] Crear mapa Tutorial-o-MaticStepByStepActions.mm - Tutoriale.acciones - [ ] ToM_showMenu + - [x] Hacer que se copia a carpeta docs - [ ] script de ayuda que llame a funcionalidad MDH para copiar mapas MDH clean - [ ] *debe además quitar "Crayon" de mapa?* - [ ] *si mapa no tiene nodos MDH, debería copiarlo igualmente, para asegurar que todos los mapas que están en una carpeta se copian a la otra definitiva* @@ -36,8 +37,23 @@ nullPendientesnull - [ ] Tutorial Crayon - [ ] **Tutorial : organizing a tutorial in multiple pages (working on it)** - [ ] **Ojo:
    puede ser que requiera que sea copiado pra poder usar opción "select node"** + - [x] create example tutorial map one long page + - [x] crear mapa nuevo + - [x] agregarle ToM Styles + - [x] copiarle Origami tut + - [x] exportable a carpeta zip sin MDH - [ ] Link a tutoriales Acciones en WIP + - [x] Tutorial 1: one page tutorial in a new mindmap + - [x] Tutorial 2: one page tutorial in an existing mindmap - [ ] Mejorar ReadMe.MD + - ToM + - ToM addon + - [x] actualizar changeLog + - [x] cambié getMenuCommandToM + - [x] tuve que crear nueva versión para superar bug de children vs children() + - [x] actualizar texto versiones en estos nodos + - build.gradle + - [x] usar build.gradle para java 17 - ToM Future A - Freepla.Tutoria.Add.On - ToM @@ -55,6 +71,7 @@ nullPendientesnull - [ ] ToM_openMap: debe usar texto de la nota del nodo - ToM_showNode - [ ] ToM_showNode: se usa el texto de los nodo hijos para armar el texto del panel (REVISAR) + - [ ] *revisar* - ToM_openTutMap - [ ] ToM_openTutMap: debería usar texto de nota y si no existe tirar el texto por default - nuevas From 890fb39789cf6971b54120ddcba843de2050e0dc Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Sun, 24 Jul 2022 20:58:42 -0400 Subject: [PATCH 37/42] Update README.MD --- README.MD | 260 ++++++++++++++++++++++++++---------------------------- 1 file changed, 124 insertions(+), 136 deletions(-) diff --git a/README.MD b/README.MD index a01b366..84a3505 100644 --- a/README.MD +++ b/README.MD @@ -22,145 +22,133 @@ edo nullPendientesnull - ToM v0.0.7 - - Freepla.Tutoria.Add.On - - Tuts w/ MDH - - [ ] Crear mapa Tutorial-o-MaticStepByStepActions.mm - - Tutoriale.acciones - - [ ] ToM_showMenu - - [x] Hacer que se copia a carpeta docs - - [ ] script de ayuda que llame a funcionalidad MDH para copiar mapas MDH clean - - [ ] *debe además quitar "Crayon" de mapa?* - - [ ] *si mapa no tiene nodos MDH, debería copiarlo igualmente, para asegurar que todos los mapas que están en una carpeta se copian a la otra definitiva* - - [ ] *script que lo aplique a todos los mapas de una carpeta* - - [ ] Delete MDH Styles from map - - hacer.tutoria.paso.paso - - [ ] Tutorial Crayon - - [ ] **Tutorial : organizing a tutorial in multiple pages (working on it)** - - [ ] **Ojo:
    puede ser que requiera que sea copiado pra poder usar opción "select node"** - - [x] create example tutorial map one long page - - [x] crear mapa nuevo - - [x] agregarle ToM Styles - - [x] copiarle Origami tut - - [x] exportable a carpeta zip sin MDH - - [ ] Link a tutoriales Acciones en WIP - - [x] Tutorial 1: one page tutorial in a new mindmap - - [x] Tutorial 2: one page tutorial in an existing mindmap - - [ ] Mejorar ReadMe.MD - - ToM - - ToM addon - - [x] actualizar changeLog - - [x] cambié getMenuCommandToM - - [x] tuve que crear nueva versión para superar bug de children vs children() - - [x] actualizar texto versiones en estos nodos - - build.gradle - - [x] usar build.gradle para java 17 + - ToM addon + - [x] actualizar changeLog + - [x] cambié getMenuCommandToM + - [x] tuve que crear nueva versión para superar bug de children vs children() + - [x] actualizar texto versiones en estos nodos + - build.gradle + - [x] usar build.gradle para java 17 + - Tuts w/ MDH + - [ ] Crear mapa Tutorial-o-MaticStepByStepActions.mm + - Tutoriale.acciones + - [ ] ToM_showMenu + - [x] Hacer que se copia a carpeta docs + - [ ] script de ayuda que llame a funcionalidad MDH para copiar mapas MDH clean + - [ ] *debe además quitar "Crayon" de mapa?* + - [ ] *si mapa no tiene nodos MDH, debería copiarlo igualmente, para asegurar que todos los mapas que están en una carpeta se copian a la otra definitiva* + - [ ] *script que lo aplique a todos los mapas de una carpeta* + - [ ] Delete MDH Styles from map + - hacer.tutoria.paso.paso + - [x] Tutorial 1: one page tutorial in a new mindmap + - [x] Tutorial 2: one page tutorial in an existing mindmap + - [ ] Tutorial Crayon + - [ ] **Tutorial : organizing a tutorial in multiple pages (working on it)** + - [x] create example tutorial map one long page + - [x] crear mapa nuevo + - [x] agregarle ToM Styles + - [x] copiarle Origami tut + - [x] exportable a carpeta zip sin MDH + - [ ] **Ojo:
    puede ser que requiera que sea copiado pra poder usar opción "select node"** + - [ ] Link a tutoriales Acciones en WIP + - [ ] Mejorar ReadMe.MD - ToM Future A - - Freepla.Tutoria.Add.On - - ToM - - lib - - ToM_actions.groovy - - ToM_showMenu - - [ ] ToM_showMenu: tras un par de segundos debe desaparecer - - ToM_groovy - - [ ] ToM_groovy: usa texto de nodos para panel - - ToM_copy - - [ ] ToM_copy: debe usar texto de la nota del nodo tom_copy - - ToM_select - - [ ] ToM_select: debe usar texto de la nota del nodo tom_select - - ToM_openMap - - [ ] ToM_openMap: debe usar texto de la nota del nodo - - ToM_showNode - - [ ] ToM_showNode: se usa el texto de los nodo hijos para armar el texto del panel (REVISAR) - - [ ] *revisar* - - ToM_openTutMap - - [ ] ToM_openTutMap: debería usar texto de nota y si no existe tirar el texto por default - - nuevas - - [ ] botón Previous page - - icons - - [ ] agregar icono Tutorial-o-Matic - - Tuts w/ MDH - - [ ] Agregar mapa con nodos ejemplos + - lib + - ToM_actions.groovy + - ToM_showMenu + - [ ] ToM_showMenu: tras un par de segundos debe desaparecer + - ToM_groovy + - [ ] ToM_groovy: usa texto de nodos para panel + - ToM_copy + - [ ] ToM_copy: debe usar texto de la nota del nodo tom_copy + - ToM_select + - [ ] ToM_select: debe usar texto de la nota del nodo tom_select + - ToM_openMap + - [ ] ToM_openMap: debe usar texto de la nota del nodo + - ToM_showNode + - [ ] ToM_showNode: se usa el texto de los nodo hijos para armar el texto del panel (REVISAR) + - [ ] *revisar* + - ToM_openTutMap + - [ ] ToM_openTutMap: debería usar texto de nota y si no existe tirar el texto por default + - nuevas + - [ ] botón Previous page + - icons + - [ ] agregar icono Tutorial-o-Matic + - Tuts w/ MDH + - [ ] Agregar mapa con nodos ejemplos - ToM Future B - - Freepla.Tutoria.Add.On - - ToM - - lib - - ToM_actions.groovy - - [ ] Manage errors (message) - - [ ] *ActionNode* - - [ ] *groovyNode* - - [ ] *mensaje de error* - - [ ] *Log a log.0* - - nuevas - - [ ] accion displayMarkdownFile - - [ ] *desde disco* - - [ ] *desde web* - - [ ] *acción displayWebPage* - - ToM_ui.groovy - - [ ] Crear nuevo buttonPanel más compacto - - Tuts w/ MDH - - [ ] copiar panel de MoM - - Apuntes - - [ ] definir si un mapa para practica:
    ¿se permite sobreescribir (para guardar avance)? - - [ ] Funcionalidad MDH:
    Comando para 'actualizar' la nota a un nodo con link a un nodo MDH y copia su contenido + - lib + - ToM_actions.groovy + - [ ] Manage errors (message) + - [ ] *ActionNode* + - [ ] *groovyNode* + - [ ] *mensaje de error* + - [ ] *Log a log.0* + - nuevas + - [ ] accion displayMarkdownFile + - [ ] *desde disco* + - [ ] *desde web* + - [ ] *acción displayWebPage* + - ToM_ui.groovy + - [ ] Crear nuevo buttonPanel más compacto + - Tuts w/ MDH + - [ ] copiar panel de MoM + - Apuntes + - [ ] definir si un mapa para practica:
    ¿se permite sobreescribir (para guardar avance)? + - [ ] Funcionalidad MDH:
    Comando para 'actualizar' la nota a un nodo con link a un nodo MDH y copia su contenido - ToM Future C - - Freepla.Tutoria.Add.On - - ToM - - lib - - ToM_actions.groovy - - ToM_groovy - - [ ] agregar botón opcional en groovyPanel que permita abrir script en groovyConsole - - [ ] Agregar comado que abra console con script en texto pero sin asociar nodo y que fuente sea opcional - - [ ] incluye dentro del marco - - [ ] incluir permisos aceptados en preferencias - - [ ] encapsular ejecución de script sólo con permisos aceptados - - [ ] exe scripts - - nuevas - - [ ] groovy console - - [ ] *agregar como acceder a listado de tutoriales de mapa* - - [ ] *crear estilo que inserte addTutorialsPane en página* - - [ ] *como pane automáticamente en última página* - - [ ] *crear estilo que agregue un buttonPane ...* - - ToM_ui.groovy - - [ ] Tutorial debe poder partir en toolPane o en Window propia - - [ ] Build a buttonPanel - - [ ] Tomar formatos panel desde userStyles - - [ ] revisar textos UI - - [ ] *revisar y hacer listado* - - [ ] *transformar en variables* - - [ ] *transformar en textos traducibles* - - [ ] *definir Opción* - - [ ] *definir lógica* - - [ ] *Acción Editorpane* - - [ ] *Acción newPage* - - doc - - [ ] Actualizar Tutorial Sample.mm - - Tuts w/ MDH - - [ ] modificar MoM + - lib + - ToM_actions.groovy + - ToM_groovy + - [ ] agregar botón opcional en groovyPanel que permita abrir script en groovyConsole + - [ ] Agregar comado que abra console con script en texto pero sin asociar nodo y que fuente sea opcional + - [ ] incluye dentro del marco + - [ ] incluir permisos aceptados en preferencias + - [ ] encapsular ejecución de script sólo con permisos aceptados + - [ ] exe scripts + - nuevas + - [ ] groovy console + - [ ] *agregar como acceder a listado de tutoriales de mapa* + - [ ] *crear estilo que inserte addTutorialsPane en página* + - [ ] *como pane automáticamente en última página* + - [ ] *crear estilo que agregue un buttonPane ...* + - ToM_ui.groovy + - [ ] Tutorial debe poder partir en toolPane o en Window propia + - [ ] Build a buttonPanel + - [ ] Tomar formatos panel desde userStyles + - [ ] revisar textos UI + - [ ] *revisar y hacer listado* + - [ ] *transformar en variables* + - [ ] *transformar en textos traducibles* + - [ ] *definir Opción* + - [ ] *definir lógica* + - [ ] *Acción Editorpane* + - [ ] *Acción newPage* + - doc + - [ ] Actualizar Tutorial Sample.mm + - Tuts w/ MDH + - [ ] modificar MoM - ToM Future D - - Freepla.Tutoria.Add.On - - ToM - - lib - - ToM_actions.groovy - - ToM_showMenu - - [ ] *si dos acciones seguidas coinciden en algún menu entonces no se cierra menu completamente* - - nuevas - - [ ] *Desplegar mensaje inferior a pedido* - - [ ] - I agree with your goals of showing a mouse cursor and allowing the tutorial to execute actions. Even better, though, would be a way to wait and "listen" for the user to click on the action and have the tutorial pause until they do the right thing. If it's just showing the user what to do rather than teaching them what to do and having them do it, it's not really a tutorial, but more like a way to create instructional videos using Freeplane (which would not be a bad thing, of course!). Tutorial means the user is following along and doing stuff. - - [ ] *agregar comentarios en código con descripción de cda método* - - build.gradle - - [ ] hacer que Gradle acceda a librerías desde Freeplane o desde Maven - - [ ] jsoup - - [ ] markedj - - [ ] groovyNode - - Apuntes - - [ ] *hacer wiki?* - - [ ] Lastly, the only way to get proper feedback on this addon is to ask some people to actually use it to create tutorials for things. You might use it to try to create a tutorial for something that is *not* directly related to this addon, like a tutorial on how to change node width and save that change to the standard template. Only then will you get a sense of what this type of tool must be able to do. + - lib + - ToM_actions.groovy + - ToM_showMenu + - [ ] *si dos acciones seguidas coinciden en algún menu entonces no se cierra menu completamente* + - nuevas + - [ ] *Desplegar mensaje inferior a pedido* + - [ ] - I agree with your goals of showing a mouse cursor and allowing the tutorial to execute actions. Even better, though, would be a way to wait and "listen" for the user to click on the action and have the tutorial pause until they do the right thing. If it's just showing the user what to do rather than teaching them what to do and having them do it, it's not really a tutorial, but more like a way to create instructional videos using Freeplane (which would not be a bad thing, of course!). Tutorial means the user is following along and doing stuff. + - [ ] *agregar comentarios en código con descripción de cda método* + - build.gradle + - [ ] hacer que Gradle acceda a librerías desde Freeplane o desde Maven + - [ ] jsoup + - [ ] markedj + - [ ] groovyNode + - Apuntes + - [ ] *hacer wiki?* + - [ ] Lastly, the only way to get proper feedback on this addon is to ask some people to actually use it to create tutorials for things. You might use it to try to create a tutorial for something that is *not* directly related to this addon, like a tutorial on how to change node width and save that change to the standard template. Only then will you get a sense of what this type of tool must be able to do. - ToM Future E - - Freepla.Tutoria.Add.On - - ToM - - lib - - ToM_actions.groovy - - nuevas - - [ ] *Tutorial mouse arrow moves on the screen and shows where to click (not the actual mouse arrow, a simulated one)* - - [ ] *imita escribir en nodo* + - lib + - ToM_actions.groovy + - nuevas + - [ ] *Tutorial mouse arrow moves on the screen and shows where to click (not the actual mouse arrow, a simulated one)* + - [ ] *imita escribir en nodo* From 347f230f8eeda4e0d886aba814ea56df2eb93c69 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Sun, 24 Jul 2022 21:15:14 -0400 Subject: [PATCH 38/42] wip --- README.MD | 37 +-- Tutorial-o-Matic.mm | 689 ++++++++++++++++++++++++++++++++------------ 2 files changed, 513 insertions(+), 213 deletions(-) diff --git a/README.MD b/README.MD index 84a3505..55aa3a7 100644 --- a/README.MD +++ b/README.MD @@ -21,6 +21,10 @@ edo # Next tasks nullPendientesnull + - No milestone + - [ ] **eliminar tareas finalizadas antiguas** + - [ ] **translate tasks to english** + - [ ] filter maybe tasks from Readme file - ToM v0.0.7 - ToM addon - [x] actualizar changeLog @@ -35,9 +39,6 @@ nullPendientesnull - [ ] ToM_showMenu - [x] Hacer que se copia a carpeta docs - [ ] script de ayuda que llame a funcionalidad MDH para copiar mapas MDH clean - - [ ] *debe además quitar "Crayon" de mapa?* - - [ ] *si mapa no tiene nodos MDH, debería copiarlo igualmente, para asegurar que todos los mapas que están en una carpeta se copian a la otra definitiva* - - [ ] *script que lo aplique a todos los mapas de una carpeta* - [ ] Delete MDH Styles from map - hacer.tutoria.paso.paso - [x] Tutorial 1: one page tutorial in a new mindmap @@ -67,7 +68,6 @@ nullPendientesnull - [ ] ToM_openMap: debe usar texto de la nota del nodo - ToM_showNode - [ ] ToM_showNode: se usa el texto de los nodo hijos para armar el texto del panel (REVISAR) - - [ ] *revisar* - ToM_openTutMap - [ ] ToM_openTutMap: debería usar texto de nota y si no existe tirar el texto por default - nuevas @@ -80,15 +80,8 @@ nullPendientesnull - lib - ToM_actions.groovy - [ ] Manage errors (message) - - [ ] *ActionNode* - - [ ] *groovyNode* - - [ ] *mensaje de error* - - [ ] *Log a log.0* - nuevas - [ ] accion displayMarkdownFile - - [ ] *desde disco* - - [ ] *desde web* - - [ ] *acción displayWebPage* - ToM_ui.groovy - [ ] Crear nuevo buttonPanel más compacto - Tuts w/ MDH @@ -108,22 +101,11 @@ nullPendientesnull - [ ] exe scripts - nuevas - [ ] groovy console - - [ ] *agregar como acceder a listado de tutoriales de mapa* - - [ ] *crear estilo que inserte addTutorialsPane en página* - - [ ] *como pane automáticamente en última página* - - [ ] *crear estilo que agregue un buttonPane ...* - ToM_ui.groovy - [ ] Tutorial debe poder partir en toolPane o en Window propia - [ ] Build a buttonPanel - [ ] Tomar formatos panel desde userStyles - [ ] revisar textos UI - - [ ] *revisar y hacer listado* - - [ ] *transformar en variables* - - [ ] *transformar en textos traducibles* - - [ ] *definir Opción* - - [ ] *definir lógica* - - [ ] *Acción Editorpane* - - [ ] *Acción newPage* - doc - [ ] Actualizar Tutorial Sample.mm - Tuts w/ MDH @@ -131,24 +113,13 @@ nullPendientesnull - ToM Future D - lib - ToM_actions.groovy - - ToM_showMenu - - [ ] *si dos acciones seguidas coinciden en algún menu entonces no se cierra menu completamente* - nuevas - - [ ] *Desplegar mensaje inferior a pedido* - [ ] - I agree with your goals of showing a mouse cursor and allowing the tutorial to execute actions. Even better, though, would be a way to wait and "listen" for the user to click on the action and have the tutorial pause until they do the right thing. If it's just showing the user what to do rather than teaching them what to do and having them do it, it's not really a tutorial, but more like a way to create instructional videos using Freeplane (which would not be a bad thing, of course!). Tutorial means the user is following along and doing stuff. - - [ ] *agregar comentarios en código con descripción de cda método* - build.gradle - [ ] hacer que Gradle acceda a librerías desde Freeplane o desde Maven - [ ] jsoup - [ ] markedj - [ ] groovyNode - Apuntes - - [ ] *hacer wiki?* - [ ] Lastly, the only way to get proper feedback on this addon is to ask some people to actually use it to create tutorials for things. You might use it to try to create a tutorial for something that is *not* directly related to this addon, like a tutorial on how to change node width and save that change to the standard template. Only then will you get a sense of what this type of tool must be able to do. - - ToM Future E - - lib - - ToM_actions.groovy - - nuevas - - [ ] *Tutorial mouse arrow moves on the screen and shows where to click (not the actual mouse arrow, a simulated one)* - - [ ] *imita escribir en nodo* diff --git a/Tutorial-o-Matic.mm b/Tutorial-o-Matic.mm index 4d6adce..ef8d849 100644 --- a/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic.mm @@ -1,7 +1,7 @@ - + @@ -322,7 +322,7 @@
    - + @@ -332,7 +332,6 @@ - @@ -1124,13 +1123,12 @@ - + - @@ -1765,7 +1763,7 @@ - + @@ -3225,7 +3223,7 @@ - + @@ -3255,13 +3253,13 @@ - + - + @@ -10763,7 +10761,7 @@ def fillContentPane(myPanel, nextTutNodes){ - + @@ -15002,7 +15000,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -15191,7 +15189,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -15813,7 +15811,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -15847,7 +15845,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -16046,7 +16044,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -16180,6 +16178,250 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + + +
    + + + + + + + + +

    + = +

    +

    + (node['tasksStyles']?:'pendingTask,nextTask').split(',').collect{st -> "${node.find{it.style.name == st}.size()}  ${st}(s)"}.join('\n') +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + desde otro mapa +

    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + feedback Quickfold +

    + +
    +
    +
    +
    + + + + + + + + + + + + +
    @@ -16298,6 +16540,23 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ + + + + + + + + +

    + and make it easy understandable +

    + + +
    +
    + + @@ -18918,7 +19177,7 @@ def textoLabel(acc) { - + @@ -18926,7 +19185,7 @@ def textoLabel(acc) { - + @@ -20574,238 +20833,308 @@ def getUriFromNode(nodo, String sch = 'tutorial'){ - - - - - - -

    - feedback Quickfold -

    - -
    + - - - - - - -

    - desde otro mapa -

    - -
    -
    + - - - - - - -

    - = -

    -

    - (node['tasksStyles']?:'pendingTask,nextTask').split(',').collect{st -> "${node.find{it.style.name == st}.size()}  ${st}(s)"}.join('\n') -

    - -
    - - - - - - - - - + + + + + + + + + + - - - - - + + + + - - - + + + + + - - - - + + + + + + + + + + + - + - + - - - - - - - - + - - + + + + + - - + + - - + + - - + + - - + + - - + + + + + - - + + - - + + - - - - - - - - - + + - - - - - + + + + + + + + + + + + - - + + + - - - - - + + + + + - - - - - - - - - - - + + + + + + - - - - - - + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - + + - - + + - - - - - - + + + + + - - - + + + - + - - - - - + + + + + + + + - - - + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + +

    + customMenu   +

    +

    +   - icons only +

    +

    +   - return to mindmap +

    + +
    +
    + + + + + + + + + + + + + + + + +

    + customMenu   +

    +

    +   - icons only +

    +

    +   - return to mindmap +

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + customMenu   +

    +

    +   - icons only +

    +

    +   - return to mindmap +

    + +
    +
    From 3c7b4ac05fd0c49e81fdd151ff096fa7162f53c2 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Sun, 7 Aug 2022 19:43:26 -0400 Subject: [PATCH 39/42] modifiers images --- .../Tutorial-o-Matic/ToM Modifiers 001.png | Bin 0 -> 1288 bytes .../Tutorial-o-Matic/ToM Modifiers 002.png | Bin 0 -> 1304 bytes .../Tutorial-o-Matic/ToM Modifiers 003.png | Bin 0 -> 1262 bytes .../Tutorial-o-Matic/ToM Modifiers 004.png | Bin 0 -> 1646 bytes .../Tutorial-o-Matic/ToM Modifiers 005.png | Bin 0 -> 982 bytes .../Tutorial-o-Matic/ToM Modifiers 006.png | Bin 0 -> 1018 bytes .../Tutorial-o-Matic/ToM Modifiers 007.png | Bin 0 -> 1036 bytes .../Tutorial-o-Matic/ToM Modifiers 008.png | Bin 0 -> 1789 bytes .../Tutorial-o-Matic/ToM Modifiers 009.png | Bin 0 -> 678 bytes .../Tutorial-o-Matic/ToM Modifiers 010.png | Bin 0 -> 1094 bytes .../Tutorial-o-Matic/ToM Modifiers 011.png | Bin 0 -> 1223 bytes .../Tutorial-o-Matic/ToM Modifiers 012.png | Bin 0 -> 1450 bytes .../Tutorial-o-Matic/ToM Modifiers 013.png | Bin 0 -> 1620 bytes .../Tutorial-o-Matic/ToM Modifiers 014.png | Bin 0 -> 15785 bytes 14 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 001.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 002.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 003.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 004.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 005.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 006.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 007.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 008.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 009.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 010.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 011.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 012.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 013.png create mode 100644 Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 014.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 001.png b/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 001.png new file mode 100644 index 0000000000000000000000000000000000000000..3345d93ec4b06503d1708089fb0617bad3346ec5 GIT binary patch literal 1288 zcmV+j1^4=iP)EPJgk_On<=I zm>R8GBO!`W@P$#Lf?_l;1VNtm%rITIyUViRLOLDK4-EI-bJ@?Hv-f+>!aO=UV*K}v zd5U$471n%y|JL&t*4>wGkC(${C-b;P`8h%X|E*yix;@&trMcxb*P$D;Bq_*ky5 zs)M-Fi4`eR(1srBW)@bEVO@o^tzJ$WmeFM1*xpIuCqp7YHqF*u>)xxdObnce)Raj& z8f)o{7RFw_*-uXshIRXWRBKo{e!MUOb|Ne&c5vXK-Z`8u7{VbJXJu5C7D4dHH$r{< z`g^t8<3VO_z0;O|F6*RN05q(b0U-Pmi^YNm1?mbE=1|+AF3m2jB10ZG>8soCaX82R z5o3Y>*yFj!`epKs*%_jnT`l}%E`AArL?C^TMD$E#Sm3N4o`l3vafY0J@_su+f}DxZ z<9_i`H#aFUO00;Of>t2T{zCL3 zfdJa!dW*7BS{RC{skX8~UXH&UB`iWF7K_=@SXXti2tB#?>di0rM(qbKWCjYNvZ^#v z$qkPcis{`p74!w5q8NWTo_+lf{QdxP;V8;L7%Xz8-~QBeH7gT1SRnxIm^K)rW(tEv z&JuBj9l$&DE6watF#=K=IgyQ)@RE(x{SdFURV)Ge-V5Uv)V z7hkQHrwIj-GGVbm13?LqVOGYO&w9JU{se^0U^Hzb&0uOuPG-7HQXrzxqf)|x1BkwL z==q_cBi|ng9N8QWl0P|U!0J;!uI!}KAq9}V`BQr;!|Xpmvi=Z&(-)dVX;6O zKp@b|*BTTGSxKCkuvqZ@&QAlc_wC2aOlEUkCHf6+-{Bk_*FLlC#Eyx9ms6A33L=Sd zf-^6@kO$fbTClpg6>RZh$HXA4i6fesDT9&X{#YRxi0000$sV@1y=*4i%QU!) zI%IK^8FZO1&TI^gMAU7r>bS`*R0@UC+CmGZlmb16eRy2$%Hj01oWo4U|ACzE>;IhZ z$9Fql0a{*Oe(u=|Xp^~J2 z5UbZb+V^m!ZzLjtB2Do5H%)W?c~C6W>r;jQn(Pn+8Fv`?TsGybkO>Ws$J5c#i7X>% zakZ={PqR%Xrj`|9Lc=vV+0)&FDFeN=yR0yY$DxpgX~LB0@^Y0*B@KddvsCG;x{6E| zjwwQxK&RIouGQygagxblMKy(F{k?rh4jsfdk;5WrLW9F%R_`nUy9Twam`rF$MS>lL zxezXFT`aTJ;h1vUol~*ixTpMiK8KBy5I+l;m|K|O!aCuINv4#fZP!sVx4_uBJl<^z z89ElkWlD*tBwq_b6wIyB38$%N3!<9hWLd@?_j-rWYvMBBoPT;| z_DJn3JWe7dEO1Nx*$WD}g18KroRe;Fq07$PTTwy@Yt}dS!O_pO8jV6hNH*v9KXSRB zvE_F!2g=04Lp8f& zW_3L1Z)o}td$`cpE%L@ zy?=f_K3SGZTAQut31k_wdwqUzEEWq>IEk#5o2J0RVkm+9cOt&bViN^(B#n5Z;{>j&7 zNJN4dSa*8{+y3~A;I9>T(CM_d4(v@$<`ZQ#U%8II{g4$emKloISeqEEUvHYa1|Dtz z>tJzg68`u9T-jt%7JmbUxGKu9A4?7Z O0000{&GwJ literal 0 HcmV?d00001 diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 003.png b/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 003.png new file mode 100644 index 0000000000000000000000000000000000000000..4df7bc16d5fafc3e4463582757c995e69873262b GIT binary patch literal 1262 zcmVeF^N&%36Bq(vwdE;w(KGzG=~V*q!Ctf1Hf; zB*Mcc$i*te&Gw(+|NF1M-+%l4=F2Zq4FRUJ-G!Feon_N`gh*4^S(vO;ge;W=EtQ3U zZbFj5 zUU=-$ri(9r|0P@uk>IR-#a2sBJeha&5rk_X%U|uSD#_15WB@?G^N&ATx8A<+_#<_k z#lz0Bqrd{ln0Mq6&}IGx5{0hHEKH0fxd{UP{QKX(`|idIFYu@#)>(2woXb*;A?zzp zKkG>IVwwd>Mo&Ndc=hQgkSoT=E+fckp(Kcz;DBJ&nP-#s-lNo6z$lv%rHjjy%TGSd zIr8Y-!w;CL1{j`3@&YL~a=J2nXi~EeKU{e1F-6XD)DUS#EqoyWScm{i-96V|GY|qU znxepR5}5hnBLDs~6s@{)=D`Q@ofTp%Rp6q8ruoayKiNw!-+ld+pqn5-S(LjwL<<Il|?b1_>hB$V=01i(^b zL$;YP4;zFFEb78%o*8&&0YO`!rk$EFoa;aJ)LW#s1_{mr*2jFDtiU20sQ=Ns?-V*K z#zH2;UIEUHpLZU)pdrdxXhnSQuDk2cKc~=H0frJKZYpqY#*&M`I*l}E0c*e+G5TzDpMjR0FbFl)s;(YADd<|p+o2+SzE|TLcV6&vbPaV#^{Pa`i zl1s!pE6G|e$wm&B?9n^#%GX{a$63HSe_fU-KPRG{*}Ub}&a1De;xb^rql@gyC&5ZK z#a1591=jh%0K4__3*{~Ywo!pCRWhB$!OFBO#Tcy-SGwjJNzFiDcbS`=8BHA6<5+tR zrFPBc*v=nK<9?(cva%{%Yxxkf~zSxdCs9i`C>2elh->_;7gA-SrKw~|doib@C| zuZsZ(Xhl3Z&H{owXQeO`DNJ!-Qw-RtfBOFWOK{r@nE#~(IW3h01+aCRo1OWwCP!wNiEr=pdEAwPrsxfJkwkFj?`)>NKP17c= zj~bgQRs+^$4J>`MBPw+YI0PqDPSf0F@b0#P2d z{JxpW)dCbgp2_&0>=SX1u+)|s;qX)J(xT1`#N)3^C7)Sm4=^)}enowwdml>?xV_T| znPZoic4i`1WD7s9w6#&lNM=bMX$ev2pe{ zy^F=|N>-cB6C^S{e~~nW>!3TX!Y;`}=83(9rL{F!wvU2eXwy?ZF^pT|(G0c6={#orKO=0ZPlO)^E#YSze;C81Fs_e9kG03#KwzD_aH!Q8Sp6nCp zgjIW#&w0{*iNeM)8GFdU!Hz@tALqi+|i&Xjro%)&+*0mx&dxq0^ zLjaChj0YwYm{uE4%jb4zVynjqnR)wg^z80p3AxXp$TS!4(fC`IEkkU+<*P7r_u%1k zyM<+YSjNY9QzPcNsJK1pYU5viVP)ar8QsDHzXtDS7XE|>rMsx4qW8tZ_x=Mc`|HMJ zWaD9TT(xz1{DJxYU@ba|BU1dw5{^74SMG-f{pd%A__Z!t^;$8PJ>7RI(zK?QWJ25( zn&mpgjIOXW)v`5OpZiug_JYq)frCsd$~~&2;*Sl9>mY3CVW|zL zxV=;CT6W1XWKQf*D?FDqS#7@HD;AEL&ODLhQ3dZ7ow5;`6ZEj8lFj1rH#*d8KjZW- z@vz5W8pNguIvJGT)*-2sOY=B1*b` zjZhVj26Wn+)+gmoRegv*oJqy5Fi!hi4-1UI)K@GV(vKM%r%9q%T`AwZ;Q=dUqak^N zdq1RZYQsr5X5p~a#mb%m5yn?60;7PGbb=(IDP6fN)?RYeyDdyu-=3Yqu@|k{fyvC` z-}JD!tV!yPvp!=HgeiFvX`pRwp{hb|xay=PF|#liN2YZ!RUNcuunJFDLw+2ad0cn5 z{;dxDz+xvPAya^@ttkq3sz?(BCktet9(o#^lRz)md2moLIJL@I+*Kq+nNlV@_NW#MSL&^g!s$Ry zdP@&WuKYnb@~nr2jSL$OK_ z*a|Jn+^IrMk~+rIMrLd*3J7#xjV~`#nr^yu;*e0~RwhlK1Wa8Y=~RcHI^o| zaXZF9e%yXH0fFpzA4)vC$c@*9%JYsrHW%d2lqz>`w=d6xuq(=;Am|#)x?#m1i3RVp z-%V7sA!?`}Sdb&}WoMK-Ew(FbfEqKFK-keip@cCcz3M)+lM+MbEZ-$+cWR-@#Kz;k zA%vfz!J7-u9R>Bp!R?bMw_Er!Yc)Uy4KXb{Nl>iUSk~k?pU+tUckJj`JtA=WTZ&IW z-p4G+!BJB^+US+9V!^vo@rS0=bQ0qp#De6f?Zoefr1f;_rp`?Ci+xS_WtB0sfk24p zK~Ytq*=(G(4OaIL3#O3Nf=t8+M9+!J8&PT&L~b1$FFuVxK2W?GQ#Xj75Je8dNn0V$ z(Kqw4_9bk{qliL#2L(CBq!&`6(F@&CKLT6a)u%qPV<2=3r2w&!boQr6ms s)#xZPd@72X=ilW2n?F|`VBK^12awPM$_NxEF#rGn07*qoM6N<$g8Ne_(EtDd literal 0 HcmV?d00001 diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 005.png b/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 005.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d548bac0b7c6f25e53a4143edd9c249c383b7e GIT binary patch literal 982 zcmV;{11bE8P)Nkl3GVTEv1ctk^>ZMJ%FNDX0fUp|_qC6(8tH@ByNtH&HK&g7`pu zfd@fEP@^Ce#e*jmm5S1uHqCpRZjyb>INL@yO+}Klc_{fV$?SgfpI^S2`MxiZ5CUq? zU>&QD^>1L24>y5(G4!pdAuN*kil6NO49Bdy1RSlkf`$8zl0cs!>YRrt8PiaGEE4^I z{rl)=R(Jkp)N!!dSXjf)caubat}o4{Kb?nb?ZL^pSw*h1-i24#o`%h9X?ute7Zo+L<_C|TvO@S9U)z;BKj2DZ2<6B&*I9p|jTFdOdy-ct!IGWZg|J~8Q$ z&kecp{3&P1NG$ga>No)BZ>a_GvbtpbZlzQafohSVdvjeAK zkmX~I0x6sN(aPg+&e}>~83FU}0;7Y5gw+C?r=+Dom?)a@*4vKOoGZ5eOe4#uB1YdA z`(&uN?7(R^Llu)i!q`FRZbO}CfVHt$?djD-tkJE+pYMWH7_bbWVWX8tQH?vuxzVB? zxL_MVYze|M(QgqP|MuqbgKM*S*@EzbrJc=ftD&bIz*0J`60suEn4HcS6ERL@GOa!@ zXKe@sM^2u-IN`9fw`W=Vl4<_Z;;=HR7Nj?S++vAQP1l=Tj=4T>HL)-zKf*Ch#|%OS zmXy>qO|bEeqM)hDR*S&%HH1Y?PAlO=a^ia( zt0=5rrP{_>YY2-LV_K?ttF^#xuZ&o!j2eoM7Ve*G0%!G1`QJ7(STsU`aH6z6+wBnS zd_mh?G!_^SSUf4KnqK%6+HBEK72eg9f>jx-V-;gR0qi7gyC~~nrT_o{07*qoM6N<$ Eg3lGyq5uE@ literal 0 HcmV?d00001 diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 006.png b/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 006.png new file mode 100644 index 0000000000000000000000000000000000000000..f252249155802c2621cb697828e1ca2606e5a384 GIT binary patch literal 1018 zcmVUe{>H&CPqeE6J2!$8SKtlx@F(j??345CJ5l>A%U;q61#mULV%Ek^<|M}Agpdc@w03#zKRa6q?tpET1&70c)`O`;WaS{}h z2ozbjWInJkL{Woz>q75pneJ0h0T7 zY=L^HuzcIPl}{c%0J3G|6}*DNsiKmLi<_{sfZ2G~gbrY#0%ZG!MgqyrtCs^wV3Ctn zP_bw0#v4~I0=XJG`Yzu7_*8D$aO3JFkV276amkB?vQ!M!^#o;>E@ z;?grR0SaC^cjm{pZxS-H3Q8(ut0XNaLcpfgOYhyf31ld#se1;5PU~p{<^~|w!#@~E z?%22%q@Rf?tE6iChSg-K^b3t9$60Ha%zymwK9C_RujmyVKC`a_Ynn|js@S%6B^fG% z!C8`IXPrH9^vM3*K!%N@tC6|YnkDm|K6=Q($r%!p1QY~ve|-NgEhi7;o;!IAS>@`* z^PW9MS1Bbc9~z6I(%8b99B0uPkmjtT2ln2&cIp2=P-eDs@sLqa+O=ujv&WB!v`k7? z&do3A$%A``_Ur)WO-3dLH7z}B2WLv1HL0y0-dZ2AjsCozDFPzyVU1=A*yJf!do zIl_vt!kVSl>7Vzj!NG zgJd`=l`otx4QW&!_e@55dQp*xkr2;Fhzl*tIW?`-8?^cnquJ_mxxpE^?7HUtJO0X5 z66wDAw%<-tC@`Bz=OM{FghP#9L?jDE(O%W3e$Aj)^EZK?lU`pIKRs8t9D*PMSZ+5e zf7)XhGyho%h~*6@ktx}d2g3`<7G`z7`S4n;^;rsn1(Ge`<*!+Rmv#BB!r`1EkVT_L zAF34NWnH{+|8J$>SRhCCmj6#IaFx|!R@`sWf7bCbSM1z-V7_$c##Qad4@eqUTwXTHSzVXmG$ZI*Ot{7YkZkT+OlLQBkvN(#*_s!})U#o6TE-Aefbul$xHw z&EPNN@`z`BRP}c%A6v~PpFKz_H*b>&9Q3p+^+P(JJ#;3kP*j{L%p!(W-zaa9H>qCt z&2~c&CwVEt<*}D=zy!J6F4>h!V1$0V1dN>Y;9&|(0TXTfX3*=jhLNux6a^(=c223J zs61a!6xCFb+p*nU#k|gsiUn`r%}6HF4F8$PT}$e8;eR9OxCY$ z4!d3T=4EeJ`{bl!vv^zmnbUY#1zSs5N$j!;DK#d>Puuu+EBH)UO!w2{oSbaFCo_#2 zyPmY*WtCO!kshppd_7P>1ib&qt~4|^-NehPJ6oTEEF;9^&9MGU-HBSftP9uf!Z1uA z%k6d_-Cv29)XsI*Sl31rdZ zW2?7|@UreHyN8V?5^+gkvnoXScv-#gG`%Vffvj91KX(-$FKf*5UDnz`AWK@ZF_Ezt zFN;Lz?S4Xs^$gs@5qa(D=b7#7Iw$DKx#6{m^KqVFm$#L|hCHDPz$Qgk|} zrm-~p3^jVuZgF8ew*AWhb^}L7&GM%`=-l7EKm$RLWJ_Lh5))&8V0))P*3#7%=$L_V zDlN#tZVH%1nww2U_bcr88MvRs`D-!GUGOY#z_a<{t=j*p0oH=`s|8q|JHlArfR*<1 zu+cDPwmF;*r;{|h(?^Y?Q8|gsv=sJ&Yi6iep-Y4nNPYnI4Q#ttw=d%W0000Hh_#4TTw0A^HL=kqYNN&_CML#cqQ>PzH8nOS z{ZbPXji#}d)VN?wDwLoF@T z-34DiL`M;SOjs!R9XNz!7FZ-%_nVqoLjxM#aD4?_WVFyXCkHE5xFV|ySUhyjpGQp% z8XKv-4Z*>bl7a~ntOQmL8OUtemk$mgHa4;6WjylO_)x@XMYL_)C?ao6Sk=`ybB2=< z4=GPinvsf$6YYS=5zgW;+gIzBU^b(nft8i>uPh-E5s}!uS@4Y#i!+@*EmY%7k&!fa zjtFP@d1j|)OI9G+VKyLpVxx(bJQZ%^WKq%Bwhb{cBgf*}9Y4J69ShtbQ{s?(_SiRac zES{f^96?Pr84Q%0BXZ*?^cpygY{XV9%N_dqRF9uyd>ETP1AF%l&Syhmojr>Ozf*ZR z&6$O$$g$|u(+^Cmggf+AJSZ|& zXB(xbShfH1D^XfO%!l$nZ09@g5UdAC@%+XHY2P-7%8Yn;=~?85Y~f-YJ*t4UV+Wp; zkhzzpCCGZIPoEod&Kjk)x0&-Z9la&7=1vwG#pW*()ymLVyx1r$k*J@h#L1VbzrNsB zEWLS2#y|mLRh+eUu?ZG$oj9R@wR<-eKcud9N}eLeiu#-H;5p81SZ#Xq;&i(@$AZ<; z&Ek^Sl6)LEpn!Gg5dC%!^{=J0Wcf<&7N4(GPN(wZbN43sYbZM0j(|p! z!JR6zp^SB!m{$PHD;Re2;kEL{Ja)VRQWl zD!MIcBjMxaPQ3=3P|(1ZuEO$9hb?SiEd%NPJ?hjGCv%@(Lnzp4U?CAKH_wGK5SF63 z=nmbxMG+z7>*X%JoSBUMtlh*GFGF^Y3q>=mOALB=AN4iT#1MXt8}xEAiBzoyd^ky@ z23MCDuq?=K{75%%5c(<9f9!fW7=iJS^7LU#3y`-IYt{_m%i)%1QKa-D|0ySgN z%lVNVCe}-AQ65s$uxr;ymaiCC?7w(UzuYDt5Ayfot{;tFPS4|s%3x+$IY>+r1&c!K z#)Z~MWw{_z5e0ce#YRs=Bx1ZDY~DglPQcc!!!&K))=1Ln#K6>5axxfu$bTGpkE$2S z$6aSHyfq@mwUfryNRmx%yH&oT;s>azAP*IX!#K68M7?GX#QM$9#)+DJ(qwnE-DI;h zDVyHVlSg<{2epd4)a2!%$j50+{mf(*Ggw44OHRXt2xMoACZ!8?<)~V^d~sW=LtPE@ zt>QRG^g2uYEtI>^75Y$t(Akvfc=C#*)si=r272AV?pdJK25QIVtrO-=D zKhYATwA51%rAUgXffz|7AyK5HG26~=*43>bS)Cb^*&T(v)0;i){tmU;wrN#7FzkC4^$SlihOGyIF^|h2)USHrZNF9@oSO7FP zWX<}w?%$nyVk>i$40Kxx^0PD%V}&0MB)|Vuo4m$4ZhjnJcB+XOD>ghCf9KJ9eA!th zVyskRKhiZMuB_tAASPn0^UB~Rk}P}~(nOerBf~L~XKAwS&OzW^`@gJpiI4l3t9fdl zNQzeb6{N`!mM;)mSp3@Z{!>XLsy*4|ZY;Oo19rRMyd_ldIG-WUdin8lFdVf5(E7oX zCM&P5q{e#sYH?@px7z4s!JY?Bw~I1MFH1OiFw(Ca?K7Gzy-cnV;zNB%nc=L=WM;53 zkeS5NWNn@=1zRB;nRzU=+?=ES#cS(^A1O1Hr5>lQQb*zV3{qw`OFd56q==MJU>&{% zC8NVa%BZp6GMX%ij56yi8L(Lmx!B;dPL=KTcQ-XPl4SXV;kQf6k|g7^^fJj^RsDP# zf8N9z_W$fBLy?$X2ER0?$<8$iXPZI5M~sYR1fmfmWMmQ>r0m+*w9U7PFC!Kt!DVth z&d)u=PY+1uTkvS)wyPXJJs=#r!Gol<89o2*9d35i3>Jfm-A>9Z*9$AZy)lW!ph8Mj z7JW1!{_qy}b`;%jH;={WBVFRZ>Wu3|0G<-~vI`M_XIVK`j%8FG0Puwb%JXJW{{R30 M07*qoM6N<$f?AqEU;qFB literal 0 HcmV?d00001 diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 010.png b/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 010.png new file mode 100644 index 0000000000000000000000000000000000000000..971cdef33af30ac866881c5aacd0277140cb869f GIT binary patch literal 1094 zcmV-M1iAZ(P)<^0Y$}4YD*8rL zEckCPHWWoB4jdiq)ff}4x_0aEg-+L`X_7W+OfFrTrp=$r`P7W`yxd(bmpd)edvQE@ z?)yCV;dejo0+A$HHT@1~hBd?Df8ZV8#jjk~fBrGn?3^yF$d`x5Zubz$Bp4g^?5b(m z^5R)TZ3mFZ2uTp*K0i;H${A~BVyI|l@Ys->J$clV% zkQ~Op4G&z71j?03#mbxVV*xTrSX7fRnfRsI6T;Nx~{N zjmJkvaXg($!7yU9%m!yRnYLwS(8hMPN})@o04L!9yZT6vvbr_57uc zg`atuYtFp(&a1`YN?BA>*gFvR`q+|s(=5~L^Qkj;;B3>y(~RMYSOpW^x1vSyWTV(;x8#xb6W#w#Ei! zbu~|uKo->miUdlLK~+k{(>9vgv0@V|E93F`x9og+olC~B zofsxo7MV)*uW(l7a%IWHGF6p$h*PQ3G7(Lztnl8WiC=zuHpnFt*Tl>sqA}lw_sMjo zD9bE6yZmiS#~~3-%&gd%3$gQ;SmJb9^BmiO&L6}zF|cyUasNBpiIF(_iYeJWv}*15 zr$jd~u>QMvEqeTXsYR1AWS&{veqv>j6Di-jAAsH}xvXaUR>RkyN@Sw5*h&Q{5Y5_E zTIV`tqa!;M&IE$$)yt$a(OH45pQQV|)XQ=mhP}55Yj(=@I!PT|th8q!xbrIlADILh zYIQqY*tU(3O8GoN46I3++Z*0}M7w!C=5j));`xJ^S<~d0VZ8*bCo>N4yUweWS^xk5 M07*qoM6N<$f=$*M3;+NC literal 0 HcmV?d00001 diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 011.png b/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 011.png new file mode 100644 index 0000000000000000000000000000000000000000..0a789428e32057473a123a4cb71e2d0fb1bfa538 GIT binary patch literal 1223 zcmV;&1UUPNP)z{JD^SM%@RzkBx|T)J}g$&+XA-o1PI z>h<5he{mVb$;BxtE-o)GYin&OBQ1^HS#il3SFTDZkW91(l}!9zHgT}+8b-I7&Uj+uj-k%g0)i|_B(_y7O?`upwE z&lh(;-#Yr|!wWn%u?R@;s#~**t1xr%GBUFoS@0^bpwqcdzH}n#9N?~AP#;N`P z|JS>weY~^_!t?X-YN)Be?kr#;C@QNueDpYwEfd|zA*F#o82e(r0GJ<-)Kfd~OMHMi+Y+SQkT1paG z3QGau8x;QZ*>kCodM-sH{O0}xhSr2IAY=CQNydf-K*s5_=hL(Efeht>RRlxp+x@f8 z)-*{=OKo1e0!<2wv$FGxkDoj(=8?;%>w@20V48irun-u7`*&>t=0u>#$B&;J-F<)z z+4z27j=`_})8*Z-c1*FdFrPA^o3OLGdMB<}y;i`~U&J8^zqy~U?t8gyqMWSEhSi8D z^ACvxmVe@21-#mh__e>;KkvhtjZxttC53r}owa_`mgcrDPI*1)ux9+`zS=SQ)8##A znFx}d`Se`G+;j13f3~vb+oQ|%)#d)a-h`cX=kEQm=y+gmQp{Pz#Kwio(EtDcJ)EBK z=j+GD+A3df54iZIt=k)#+nKoq6f);CGBV-P{_p3v`%_|pxfqzRfXR!nvw$L=ej%@3 zzZP@L0+wF5%>8on*o#e_?Ck8jw{GC!;YP&l=P$0_0l$9zk_@QeR<*>X{o{oluXj&Z zke6GxatWp^_Nscq&`fybXu$bnO)d3b@EPSG%fc*9S z*Zb$+A71$N_6d*+^y}hzGr76B(X@a4`ZYEw{lUXWKsKAOET_Cao1i2k8z+$a=i{p% zPp<=g#qj?hKOf(k6^n(11c`MP5L~)^6_|J*K6;E*7FZ%X+S^u^6$uImU{&z${risY z{{06J18WYf3V>c}tgQsr&{$;&w70HZzj5{Yjn}W=yn6K-$OSfLgaid;Wu*=D^&kZm zegF*bi_wnpDYa0Ys--i1ux@B|Mjv#>8GYAx^~FIQUutb} zI$D9Y7FuKnLxC13OVZG=Wg%oE`|9rmZ$nxjxj@tz{-^W*=iL8(_niNn|D1CP9*-yN zzbAx!ti8c97|jpomo&OHlf`1PSi!<#G8uGQG?y(%aQ_voZ}LOiEbYd32{ zA`z4LF$Fnk2NU8#fi)?9)H8fvzh(;19l%wU2xEBcy~1)hT{pT0rykA+>ybz#96ORP z%uLyRETh?S^=7w1t=a4`go?V{PM5>6Sp#9_p_;M+0)en=SPrN2;8?==3WJjeNmwv--6!%t@;*J-lmJzqa?z%q{p@fFmI_i^YrG%!}LY zQZ39Wq%$s;)7O5ovN$L0nO(pdo09zABl5KX&B2^}5^4MSZ!sDq_lE2iGiHGq+SpLX z3TN&J3x==haw`NDW{Hf76XX_#1soy{n|1onF5dyoJd|{*`pAy3`bQ>VIlxqu5uR35 z5lBDzirJu>9`5nD-RmzP5YC^j4R*=cfc4E!zxggvsrhB$Y+kS*3bH7kRLUfnnxCBt zO9oCX)vE4?t2eNU2yRr0FzC+riqm1A=xxWsKY~er@7zl`vHC|QdWOfbisY=r+_(ey zut22aBCT>6Q{Q;y1f)(pSS@$@A4p_aMPB6#WD0^CYgNARXmSKoA?hLa@nBtQxxFA) zdCO#knpbfGHxr0SubmckV=5%dqTF;mSWQ=2wfZ%084YJ;79ZUSmfdO@@4bbog}Ld~ zB|I~~x%!tgAs-0n($9vl`6}qYlAJ*m8JF;b^w+vAQv9%K{qh2#3>cLb< zj*uepV6}D*!0rmG$Stp>P-(ca)Jrni)EK6|_x1&JA^G@5 zJ%}K$2vRi;EEql*L`*Ht%Q#y6EPkxJ6SE!tcQF;A(KCuGgI!b&nicWrK-fQSiA3UC zXHG(g;m3kQ4s@8#V8kp;HZMh3LL`y`bZ0dgr-!?JH`B1GKmJ@naJ~KHHgH-xf32g> z*TP`21-V6m%*r*bT6$juc^b1&5lUl2J)9+XiUo43S2X%S;%lKG)Hp#pkDs*JkpWQT z(%F?osh>AN6946z3OEbx0+!qDzH+^Dep%&bM^HK^n$P0JASeT&p|H_|y{O5c)vJ{{ zmE3O^4?;(&G#WKIKDIC`wNErcCX>sH^XX_nJ@@njna%Eip`2Tk2m6(npfoCqQlVh6 zm?dI~&1Qo#kHh}x-Sb>_Bu=cbzYklU&cRX9_)M@s2!+h$u;9bIOtaIo4(H<;08AfW zczs*4Z4UeM%Su@K2UN7@w8OmXuDH z>!}SGC{2(QUyz*|#aVxuLZ$xv%O<IkL(=dcN!qsnNzjL%1c9s6(E@~JLAG@XG4k=2$>)`@ss!8 z3^mraWR<0b=T6uC3s_r_kw~OZKWIF_-*BfF(%%I@)^zb_!qk~FrwJ0mOZ-sTNXoyf0xpU4qCJYg^v6G`gs;#7PbV%E7 zMRIkBDMzR#rBUh8Z$H!Q7{`7-#e7=NU(b8~zVG`y@AE$Ik9~M}n2q&>eFp1)h4q3$ zNyZ;4yFdyL2~<;2VhOBsW#yOzTyI}L=yqGJygYVHGuGoLosluvD>c_>HQTH$y*<&> zhV|~6uxtUk}pPuUsLkthnxT5iFOLR#j$ni7~P6G&Dv;$2B##e9>J&#OW71 zw5#(3SOc$K;nOpZ7ZBgSe?J9GAc6t{r1Pi7!>X*l9F0ln>gt{vAe#JDQ^g#sufIPk zHolxxImJK|VA^l~XHu!uDZr9gC{E1FnHUR^`wt$1 zw>8{t{Gv<({QR+zVe1suOcsmnlkX96zp0c&E5?}BG z3t>%}%wWx6&0w*D%wT<0SOvu5vI`_ygRroW&PFZG4H^ssUQj6h0l{_k4c3-sqi;rd zV-oTT;rZ0w-oehnAt|v?M_bd<+=PpZ3-Vqg=T}Ts!@)F)oPdYn6pF2lXUTzf%#dYg;{iF5{ds`b% zw5y(x1+=bOu{=8?719vMl+K(hgU-@Y%K#KUG#(aM4HF#!#fWGOvG^n?XG>4a5fw%H zkSeQv`~o;RIU%=6&&(DQ5-t^LQ?gU6XO3J->fkPgqEzu2_J80@%rkGHvrk-f89UHzSnT0g}c2<_|d*VZ+JKFW#; zDM?tShYP_%tj{*`|41e!5yQ{V$Fwse7JVB`v0g)M-yR=ilk*CQG1x@dxpSpN5s}%D zsU{`kXU&>bcDnd!Z?B2v$jLC&*9#8t8wZP4-2C&Vu%LZ3J4}Fuxcr+p)W)W!n%Y01 zUQuB!{$M;PwvH~4oq{(Y&ezdFcJ&zXci>P{RoS?CWVh5*lyLE}<6wa)0Hvk%9@Ll` z8wB|IP6~_W@*tkR{?(VRfCBpg;mXv?mgy7h6K(uY=vE z=t`kbFo`3vaVL7av7tW1EhLsM6knjCr1*wPy;ggj{P>B|y0xjeczP`81J65WR}U}( z=(~2JZEY->V=;~L5R;NH(ZaKZZS0(&=;q?|tD`-A2k`WVZI9N-%Vpqkt@j?dd--Cu zhlIGem4zwn5RCNNy%*wma$+1r5c*GEtf)#jm}+Te3^xoEU%nj3A>>`GsJ#E64T9f~ zOBQd?P=hG{4KMGJW4R}aPQt?A4AO?*`1@uICUNPK#Sx+VneP@$$qd$4fb{`OlyS;h SB|7N<0000vKLSSlzkK1dmlPFJc3(Nq zgj2^-TO7Q!W}GW@D=1Y)$L6`;urdUS8U37F>{G^6`pL#Tt^V7bt~w&3<6)!5zr&wQ zf>Byyqz7`0J+$B+U81y zgu*;OdN!ZfIMEcoI$L`D$q}MZYdr3+!Jk8OyI2CmI!u%N;Vxn^5(rsL-Px#=sn)Kp z`PcQO`s>be`J3Fj!pIn7XL1?>uBVvG1<}#!!J!h3kT1XcI}sLc5ExNj4^@=nuQ4PX z+}2+3hnpLmfdLs4+LSr5j~%z}JfU0oJ;^S;))teKu()0%8^(O36XMf6n+r0AWRNIg z6X(jZ0~ehe?xDV)9c+h7+bO%M$}aBJ2`wYNR%>(ghP7ADk%#Z~ z6X8Q&G}9t2cQkjqUu;QD&Yw<J=T2|tGsWtX7}|nFL4aRk%3?1WO_|@Z=D&hm z7OTD=?Cp~)xB8hkd#V|zau+E=yPW{d^2Rcr~MdsOIT@zWnC2^L%twB-9E7{{|ca{*J|{% znK|b8YFU6%eyHE_{Sr)e*jCNI}t;#rb)-G%JDb2oo+=uh(v*jXyAWF#q<6|a7U z^Aoni!r+a=XsgJy)n5Hd@X*q4($ZfTctTK!!BHwlx}1GSN8e!8w?xf4Ki^@;@b^h>UZ0a(}5=h1o91CtWfWsk!Gfik)8 zk>&;RWfN2zzDY{v$6u+jjMX=rm#(H%b^WCZS2`}YlFoU)(VvGMm4x$Ov){Igi#eY! z7B8%za^nCE?LLHB`q_gMBEW_{Qg470G&r|Z4 zCI=A9EsGH*U?+gp0e0~598Ob{WC=#cD~@VS(u#kxSmUq%J)| zO7BDNX~3dIpk>j*!}p2D>iQ9rO0v*+nA*;_RsvDgl4Eg{=$zS49O0dz!Ll8#d-+(e z)bwDZ55_!&4t2-JwY$0zOA%zepMMZl%CHbckPUl9LLW{8%zeI?($e$ou9EtWcxTO{ z*xlbP>gwDqKpM6nD-JqGR&IVeWdWI{{-ZR7h5*ubSPZJ~|lQqxEJ08DpAPMMc=9y6 z*Ko>A=pu;_in29go6Hx298>R?#3xH8M4p|S{+%HkULVk}J`nRllD4lLzHxJNYIoR! z)op39j`!u8s>p+O+L-ZW-WnAPTitJcrA(_#)29SCsVQNXuB7IOD86AKlJa>*8Ol6p zCX4Y=^m0GBALW^QM;#9TFiF!oQZ^QjI$Y~~=Vc&HQFIA1G*jG;_+f&WcuZ)E0{+&v zGhOCv?qZK)OiuKM+5%k#WG6dIRRd)4S-X49_ek00OVavxR$~?({*d?^{)f}z&Z9YNpb}XayY*i_$6q44y6Ts@?h=sQc!@Z6Q&jNip>YJlX$ika ze*Lg$_JFq7JBQlvfP=3rz~9q0{EX} ziJ!J|SF^P-)!)mgsE0Dt@_Z#M2$F4Rr#t6#JPQ~FAhTqeCV( z7Ru!Cd99q~w}GhInEN6T)3T7BOTX8roB2Kzk42ksibzgq0-OBJhpef8bJ0Xom@9IX zT^Joi6a}FCqak=dKR?7k(O_uk=dDyeO+cN|%mjU}_>$`yT`(|hY5aD5yBi2*ll}1> zT-lc5^y-ir$4;eCu=7I_HTqi;dJLi0Jzwy7-aKsOM8eqx@)XXb6#Q&Jea&C_zRbkm zs-;zQ5Ic^PGJv;Ek@n}6n}YL_O1Me96%%4`4vs9T(OH7j_s8QOSFc=2*>EC@SIl(mn9q+Y%+?{kl|Vg6v+FKg-a>E#dQP6gbt2o*RJuXOwbUmnU@au8 zSKYo1x!dnEl)Lh|Sq9(kGhVQ=&beU{kvdwj$}LFtM2~=vJcB$!$U-PW1j}ay=jAAZ z({YqrJuq}UUpYDTp`Lf4Y;c}-oB<(?1z5l1LVyx+Sw4SD6!b^1MAQtZqJKKVH+%&n zIg}iW0Dn?G#z4l$G#xjlD$n#b5I&?+MlWl>Omx7e8KGK8(UlE1`$2gz&jgVTtqoJk zgt~PB&E9V-VkEU8Y=ZN~*75>>vv@JUZ9qmSt18m~Dofah$#XEThzUu!^Zd#OSbsW( zqZLfoH~fRCFSc-iKguad&)%)BM+yxn#EJZ~N$0IDpYKJxJz4MNKO6Y|uF#31+4g50 zu#~D?@Zg^Y=rLvkhjlSMdsi(Bs(6Zf>Z?a$PPfcWu$Jgv`;Q31#3stQ>EC#Ez?sQ# zN}L1B*qYRojxz0P@@U6TKYOO}ARTg5)#z9=pdM)=x2eDs^ZGmXOeDo)Zz;N}9=}t2 zGnoLOVl?=;ey&ZHXf6JQx0i#={wO6vc7nH~_UC}SvLa;X2MHFAJ_Z82GgDTzWeDR1 zi1nvTDHRqQiBN7%0WTCU$G0-V$30BSCow7uW0Ww#)qII$5ex+#9hXLJs{HArDu~Xj zYI1_*$+RIY?ymEyaiX`*hhS4g1$Au!FEcgT7^RFvRo$tv#O9$I1E1ZfE>U@f>;A>^ ziw&_E}`*)kf|Krz={ z+MnBJkfL_rybw0F{`vk-bJUL2(RsC|_01l6#lReXEfQt}Jak@PXAra;%VA9(tOLj; zT54X_fH!Bl_F}+^MVUef69jr{dE(Lt@!(Ry#s;ilEsfXKr#HFdXU23ngb2S67TxVU z7ae{<3_003IM}4-Wa6A-tnt8G#sjn4!Ma`QYiOufll)yRXX|XnskX#F_E$!XYo}Oa zI$0#8V^0!BwdnJ6YN24uw`g>#`8VtKg^={S%`b^k=OQlt0(MXwPME05eBhe5g^1In z?d1suT7(;QD^QqMN5}7d?Z#2t(Lbw}+7E+& zZe;k~-ZYcHZ>T02)`yD(x39bV7*RI(%4!1Aa1J}HQ(QTvI)1hoyIIPHv>Z=$+pc97 zg|zW7&1*qZELWVP79gJUt3^}vpbrwYrQ_tCk0zZFha-|`I7F)N-pdCKYPoqe2J3ng zm(Sa?IxdH&=X)Y^L=}va((VW(%$%~u4~~6Koel!nHV-r%SkU-Wlu~w2oRFZ&S*3W4 z>N#b#W1p64KmF==1pDoa@xGlN?+%*`cLpEK(BP2WgGM2&>!)VPgv<~HG`d`Y_nK*L zy$puJIR^f3lyC;Cm}u>u1|eaHaXuE&3=R&O!cF4R_t)nzx%UCagrfwHKGR|q#8 zT>WjMJ zG76N(CZ&7Isq5zHW^%YBv_)!s#{)mTGIna-arOuPoKi&;`UN*EvyH(nh#ow(zZZrk z+}Z}flKO0k-n>MoOJMVhCpMcO9yRJg!=}u*lW7w98kjbTI_j#bDwPjXQC7wuoRvQe z>9IPPne=T*`SegIz}>HyAs$OMS;XT7Y=;TfT?$vlG3m0=6vw%7G`<*CCl+Owf|cxG zp3PCa>bf0h$ruDU}5FP=Pks_CDKCW;rG~Sa7B{hPTx9KRf+7k^kUDb zkVXT6$$IS0TK5_4+R8LJv{+EG8H;&wdJ_7Bd7nARE2DX@|Cy*LXUZKpig3JqR!m_I z>}5O}jfV@T2lc!V751k`Bm6`m)aYz zqv+VVa?arP#<0K|3ZdI@^wntYd;j6yvJQjdm^0jjguj!{YYoX)^CB;MEG=zK56#r9 zvst|DPEdX+VA5Y`=(Foo^bzqVY^odHAG3tXll99P&HQh@`9@r8IH|BbCuLfT4Ets# zG>Oe>!D9I^p{^Gk<|(Yz{p)BPz=C34&tKk36zHgU+>WD~K0-uj7s1H)>ndB zPdjNg)WoOY->InHQ1%?_Wh$YFkZ%uLsZ!)wzB$tQdEcvHf??BdZ7jZGSvX4k(jyz< zcx2u4@bU<2gdgdUQHuFE<+wX3ukN}7(yz~a&6z#6tztmAzgH$u0aTQhR4C#x1nNsD z#GzCEkPWK&p=yC-I`&r;d7pg_k@Z4Hts3Qmcy%=68#}U4j_>td**`P<$`+*fz=!ie z6}<<~>u`NO@YYv3ZP}3_wsKro*P3ir3(f|2Ajjvl$e+ZJ!n^?H*7+Rfu!R+V2$1$n zn({}#cC2}VTo#Dc7lfxzO1IyHkruH3B#2Ehfp08GgkNq%ix$i=11Of4Jw^`0wje3D z#XXxqns7qWmr^JxBQn#J!MCOmJu^l%MmvtdMge+Q<-Vc1(|ATThhz*ZyMgK;WOH|e z9ZqO@@mGtR8fdV7)BDScis&J~=?K!}!x%b|QBA(z=^OT;EYXB-60Dj?t5{ST(>xWu zMKp1(F4i4B?^^%3PhT@N9sBA~Vx;A@fdHJiQDI^M#&C#|co_}!uo~mZa%Lv-LS^qv zHl&+cg>(wCj{~fDloTy`1SCE`4xJXP@ZBPVQa=3AR0;WCwd?&byj5q{%yET+1GIL8 z!ey@cS4GO`pf)!nt2uiiUTy6~pWJ2r6KSWLoAh&xBClUMhy2dCel(GhQ%lM*L1jYW zrF%5B5~@i`53fme1L`cWZ@QFsT^7zVC^-_wF)CDvaL3wpG?;dqOr_L5a zi{`^6S%Vv0`e;@+n0bBWtuCUpX(T&5ggRDOTStFw)FzQYuQ>6zUab5v`f=?=4)o}0 zUOeouJkCWzP|T=`lhFSTrrSZw6(pTZHG(Twy9@P^BVi^RyJ^uyl!A66ECxI5a%qTC zn!&Z@cC;NM+s_D3FQ^&u601)ImZH;+h}LP=LNcf=jBbBuM%0PrkwG?(D}SJEpem*B zvN)If?*e+{uNP!fus&)Ppv3E_NM^XhZ;oY`_dnD$zSKWQ%0@?&bb4&N9 z$B5I@+uJK1oF(dDBQvx3q&~^JJoCOj3nkrD@!CHn$w_2_F=y|)J=Y?h_nBN!F(mz2 zynUDv8JX6{kxGXHWz(ScG9h7V8u8E=2v)N|=I5|#paQhBc>&_rvX?#Lcwikp74fHLX9YAPU&^ zSisfuNzR;wp77H)u@xcu1ahO1QMb9c=N9J8_HYV~_ewMuSO_w|bVWaIb?KrYAEB=| zc?Dx%l2(V&VEcRdqt* z`@KRiWDGji)sRCu#19p9aw0o7*2Dvrze{NI;&GtUX_q`$Hp)X+tXIi}OW4yDzXT@&!{C$60sCvKOTJ8({O_ert6qOP@or7IgT{+S2 zCep!OAoq|}nUW=vEB}fTov-7ifThE9Ip1%`U_Rc6AJ-3<86`)A!JqCj`vAv*6{1#9vBqyQQy z{UNhJ(MF>Y-qkx&cLtZM&X=z_D?IVK*0;mvB9c{viuEQc9dhGO@89rBfrn+y$33UA2;0{A}ILyjMP4Q~@h}IbdN2 z=lUyR7N2UhEZ$1BRgE95otLKPKy7^S!I39kY5VL9J!g(an&3Lw!ynis~!q4q&a0M?W&e&ly+4&-}fw3G@ zMJbA=@kCSnn{$Oq6Y7_VxPuV7!dxi4^#?Y(5qtyLEhICP8Nn-oG0#CQUGD^wfU@%L zR&kE#eL4@^>@;{ZYU5}Dl{-{bF9@$V(@=bCJza2>dvX7m7#=tQ5uMTRn*rXV!X_&i z0xLj_09n8Vt`B3{52u<^|#`s z1ua+RPh~HmT$KhAQropZ9!A>M9L@HZ-T55J?NGRZ$;3<+*b%oR2}I8;gM%-7+dlSp z6Y*w?7r@@$E~}_?xtw`7>X+-xm63zo3K-UbwD`5}Q5Ify7y^5JS>gdxc!VHrhRTXpb z?xRO<)O_zo>*v4UM5gMz=C&Lv9K7g#SxYcRxnlS?;l3q)@rB6ofaZa3f%Ky>y9OAr z{`ysVpw>b8?1Kbyd;L=-t1K<_i@N@>n_k@Y4MGOW3vTd9dPAn&`Qo}`^-+Ab-mRxb zf!!hkD7Np)1m5r?E#U7~cBJEty6RWpux3-HoFJHAC>i)?Wr3Y50V3WxiAKT;RD)Rj zAp!_QymO9zenGnf`L?1HG?IJ*aKg;M!){8AjwJ~%f*_JL$|Uz8rZ5qC=?xEorwP6X z1!>~EP<%UT%srfQZ(RPhPega5o8&=yaRCe)+s8Wic2H&1nhuDdm+Am;K3HvTTz6G{ zAXKR?hW{bvtlY3V96DW_9a%=$W3gDNls>s~$jW~sWVMN(+*n}2{mhc+*^E{a5er#U zbAz7SDVK5|qfVnk`7`&ASbTOz`A7^K{N-x|gx$_h#>Aa%HA1wnQMf&{C;Ob#HB& zkX0`-=AAOYNHXr8#pNO#;r^_ENpkXzSI3S9D}%;U5>o@!$3$wcpL=T@?`nx zm%i^Kubwf%;l6rwwo9$HY_%p=fY&DHJMGzas;`?mz6V3^JAvNKXM|{+rXxSo8}{t& zc}jy6{!Q>~9b;lC8D@&WE6e-6^cDdy%EbD*0B7ra<054z=&@quM~B&WokQ^8KuGVv zb?x)6P5s|um7;N~d?DbTyqh&|%JWj7X0fe8A6i^0QQ)(~d8iK@D$iZU5%-WNaZYOk z?Ygcs7EAjyp6h?jtOM8YR{#8`sd!8{j*BQz>x}cPMM*#~tLBWIY8KdWhY_tJK7#G&|^ZX$L+(rdyLt<@}0$W zX(?hrGmASZE_8E%0e!l6K!#;zMuN%hCD;7P@od|tq7x_b>}S-QeA6q8X51&bOOR`+ z?iS5ONuZ#->>n&jMmgZ0Nc)*PPH^C>4|>Ghw`k2E3VM{%gptFh%hCiXk#lOGroJ-t zAo_z;>Lhtd{tsE7`V(eczF?^-5x0yT@jD`8F>CZ>DGIa;m;IIW_r6L$yDIR9NJ52%(Sg+iu0we{i| z1%jjOOPqdf4$}@FFF&1}XW6!wQo>ozz<0i`WDdG1H5he_k&;@XNq1`Ark8Yr9OPsO zN|noGcpgkl52+JiExsj6_P%z^1lP}$*|%jVAZ=;eC$xCK)?O_n%LmRKz-biC9Q z=`ndArV4B5uK$DnQBkQ>rffTb@}5=2E{gs)d#n7ZKjhx^-Z#_!widuxT-7--xVSl; z3g@8sE3!=;Do~hQ!g{9exQ+)0wCNl9eG~e7zq$1{p|2-?4=Z?}pgb*Qdw;z!DQ1jW z%&7F>Vw~f6Nvv*|&xV))1Y_qnQHo_@TS`a6FgnaSmnBsUCnjEZPG27eZ*sUd?ry>$ zTZsfQKX4K~3G#j*C4S(bm9KcpRqwUHI)b9g>W-t?B+=Z0Z;hGNdZ3K;40=$h!3 z-yiOM@%BzboGz2cA`oNCJJ6k&SY`wM;RrFbZI5cm<==gG8IKsy(o<{YGl2xzUk=ks zPCEW`f@jc^^>qKRC_2!k3PQ)lC)l~{HK><@PW*Lm`65Cuy^DnyDZOC#qD5zcPN&Zw zEezS-=7KU4RVLB?vUk6Guy+!|7(JWTuT5)h@R82voss6NrgC>9*|lyni(#P}i!J2f zc?ZH9&o2V!K`!B^KWSQCxi4^HUJC%g*R&y0*itq`+UVeuT$tYdn#{8nsSxkci4N?< z$C?ZRPz|4PqIPNE=694xp~93Qt(lVtP-9QjoLD^-%}Vz)mjFjwMRR!nwy4{npAj|c zrF6fcoL<-89JF#R%dDy(g$5VeW_uKAInZt%JRI@;A2D zR?j7Cc>h`4)r8%YLTe;bE)Ke3z#B-0@KX@n04%@!+e4&mog== z4ic1n*wOJ%0Ye+!*l`XR_%>gEDtRKw$hNbGd;?}?)tNPO?ekpp1CT`W{RS@U=D z!W&Ses|M3A)~@W2*LPTv7dsO*MuD}wcWlwPnqRh+`)x<;B+-T)XtXps*V)pA2^`)du*hh1Pc$~D6U0r=sx@9w zki%9V$4~CU5`63*m1b_bO-g^PdcZD9DXkzHg-Tq-u&y3TDitqw9MRMu->1*gAslqB zlRmRjae(H#F;aG1f3N@+^%vfM1l4)>TA(~;oTg|~;3i2Sl8lyLIT)JHzIGUWO)l5b zEy&F^n0V#5{c6vF(c2$OjMi&^FO1imSX6;6@ia*`ymh#9v}JF;xyitL{;X9~zwUQn zX%Hc3#S=8X-Qva5>dCaE4I7D^U5mwH5hS6mrJ+j+P(h6^?>Au8pfk;hHJc2t(Rv{1 zfg6Olb|7LsVRgxg$~~HD>C5Oj5VHFZi<>@PM!V#Je2QC~2y0bZkrP+7<)Vot1lM1n z5JPuyJY;*1;q7$t^aKnjRbm^3kCx@7eo-jCLZ!k9Zwfh@km!qv$>-z*Jcit~6IJTK zXLes~U{2#}{^IS7U08&e73Q=vrX+IPjn<5yK#ANwF*hp+Q0@BIy01)+-d}k}CE4KX zyv)_%c?^M}WA|FIUQ35oE5wM1_4}gjEHd=6#in+X!FJ!P;Rjs z5GaR4tE!KB5%`;;K{}^D5esSD+E_h7ius5j=--8%ESIv*appH+#%L^H*%P4b`Pl7g z{H0+aM)wnNUv5$9_s;tsKf3SX#qH&#s2erj5GoR^s5qX||206F&pNh0|o&-A09-DdX6vEYacUnw2EeowbBZPa8JX&C~Bt?KLsmcxKVv#Rm z2_oMeeSl4~+UqGg_URa!T)*L(n4`(1g1e1Dq6*EPS7bg(Wo0uYRr%bv$~`#zVqi15 z`!U+T2@UddWN{J&j^bVnnWm}-zX}1CX2;+ANW~ceW305}SnX=JRIyWCcANb62UxDV z1O!Jg`eBA5dKp#rml@FbeE3m>c8&vyiawPcd)+*EkV48 zntv-T4>QGyA2)2ElV9~jDNTH*qdeCT1Az(!{SOaYny=g^CVYMQ*A4R`L@9OyUFYKy z=6doBb8Cvq5I=HT+S*!LT0YfR7#s7-D&$CQo-flKb3fzFrZIwKowm6!P-up75Ai3l zM-CVu9gp6cbYBK%hRDDd#ipNachLTf6ky`*8Ym+EnKvsT7a=Ns!IoV{< zac5<&0)H10f&EeBH=EmX`kJEzzOOqCRGlwZ@~t4HLmSWUX`^!}5gKmHhgZEgs6x=6 zqSMtqHLZkggTa2KC7BKShFsmO>>#N=EUL(pzI=}-GFW}G$x+oSE#95(q>3ZXO6G3^ zTiM6cb}8Ptng9xlqh{-*)PpV;Ka&Fw#|rEZp#sDNIvCs1 zm?bDzKl%L-Wl1z#IpZV1uF~N?P9jN%yGW@W2^po*p~bWW{tC76p(nUB0+@@{5(0|X zv*QhBCOGEGKj-`>CvPD6)W{PnO*=*qANr;)YQE)9qJYHxHg?C;Uug2Fg(*lDgNr3< zb3ZQgoL^qH*t^OVfwhqPMO9Y*@;IAVDmSZ_#U;~(p%bLu?)H&8s)iW}2BRYuD(U|n zG7vG9%@)p|Mj_&EefXOjQawq?S4Zuj&XDYP`zH4U15@7hva(ukfwVyemerM<0XmG8 zmcqR}tUP;G$~XLZ&KS!_?`mhME>TuyERsi)P+Bs|>hM*gv5H}>ErHdE6)es+6SYKv z-oXTCPj)8Q4g~LP+m4F=Ns-sCoQyTo9yd2=L<96-A^#@UVYZk}NSN9&7}Uf}E5%9} z&1%AnqzFwYkRvHONh4x}A5G=^z!yGD+4&vR^c zI^9Z{uFMvtN08Z7PhsZd;)04XE)&%GN%PS?+S;O|!#SG0ZcXhe(c3(*Z=JiFe|}Or z4Z#wL5|v2!>^MjS*51MnfJb8uZPi?9%3Vyb)pYoO6=Lzg9^<<94a~F(?s|)V0t4iY zEKZS%*@rk+qlvIPA@uSZlm8ijI2c6>ur+Lle>(U;r91eidYqfy?W-7BcEO`YMEC#J|GEp zM>q7|m+#WuE4Gre{a6gFmCn_I04qK_7_T>_YQ-@`coJx@Y#4Vh_txtr zx+3A+ib|{SX!twF-2nDq4g?4wmroHDfg>GSpd4C~>Ot1(;w3UN2XXG4;q-la2=3_f$%`f@9E!3+q+nW&=q~_z9J@OVOm?}op?1ETu zCj<}x<#C7~V%d|&9sDeZ`ow{Gda8bvvKD6;__JPHIRYFSsqkUkN5ho-2IbU6` zEY8Z5UkAh=GHf>6?3rrO%?qlg3w zi;8gWQ){lHO5+9IuXGI6badXNoeq+dwqeY9*VYZ&`lpT?eo)JOjRYS~q~1;ZZW@qH zgLoJa1-;kWV1o1XyzkaiZyzOW78x?hGnN>ikv~)A_KYZ6>*+H0S67Sz1s>(Ns5^#q zrb$}fDzb+FyJFN+=6z83kp=YqFB~8xnK2|;<2pT)LjfS#lzm-9;-olNp~vq07$8b$IGk~ zcn&!Yh4qpc({Y7rxsbf=201Ie)~a|A?5m zbj2Ubk=%T}PWLC5c+mCHUgx{m_*sFSMksfAGlq925nFjk*6Y1#pev2ty&~~STj!O=jv?jE65Q}QCaIF!1$oCdpC){ zVoMY#T3J$7Rf56(UWsyb7jsDxuczLA|B#uctALZ9pM@|U9(sSg(OWY*{rC+Xv(2NE zhd0GkWvmmU-?uZxX~!Xz8*DK5yn0uMlfN?#==p)tMZ?FA;3}8~1!701N{+asf(Y(O zbB;Q(yRg==iOw@hj)$ISWA{!!7|lEcTA1r~v{`d%8(Zf{(3?ZP|HG8ds!;H^hxl3VQ8?ECFLpk1K#*}tS?`zdN`YY zOHa&>$znpzPChKY#Dv|NE;gc)VWg!EgXZ=y?y_~~P9OlS8yUSnT5+slY&4D*MO!uI z2_WSGifi_!T13a`d!GmTL7^6GR#qt8qdZ>wVy?R60i@$PXwzNZ57g}%Pa&_3TJOq} zG?TUU4_Cl#`y6@dNHdu|f(t&G3AMTL$?MtLT-}(Ykdx#EsV<((Lf1hdg7J%U9%Gx| zs;n|tLc{T0Dr-99$E;|z#}!;xwXNjG+#QRKpVes0?^6q%rlLGxIMWi{EzK?-C$F6C z&RF##k#UA_{+@JVflMBAZx)~J^MnaGplG-McJRtO7MX7Y=JFGruQuM3aWkp zcTv%uB2F~qA1P9+=vK(z^>r-|!N#ar2^F=&ms6DE_#$R$5g>-`3iVo@^ar`KIdGQI zeSi4PKOv^>2GRHF(l#D=Nyy+TVwilZ(CV(m>c20+v@| zN8@qefAaO-|2FQ>)tBeKhgX|k%?>kic~STKElXq3 zN4wL-rB$nsDWp7j+s!{8pPgeyY#`at->m60hsiw8>y}fu8?aVF>7PnIWvY@#$8kGN z!ezRouypB%qbqa-8AYPmr zA3sth^N)AMegEvRR@NegM+XPIsd@k7-xgf;yBa!aJlz)gc#0R-)^_J{JO4a+P4g}k zOjPC*Qr(?<`>u`Dd|S0Iso}9o)dr&ouJ3SZ0o*#NwOEU5c{88fp@ogJYs2N*aI9FN zs`8>S?oEWn^;}(x9tz`t=ety8NtRf#*&g=v(G|lqIryE`jHR+L;)|B5GD11%?g!(K zT+?R8s6|AeAC4MT^bAMv;*X&gIi^VsGj$1o>bL(Zi+3WmaFGw5oDZRz%&RdrCFv&0 zRirAMBoVA#61e@q1i2vZ&0-A;!l?CI_KTZk))Y{gtDZS(%br zSOqK)W0T9{p>W`0mEe&eBXO29M1ql~!%P17vxl=;^hq9_x74=4x}NKWl`YsZ-^tn& zOb5LVUz5kPgo)M0>3ppHQ6c_A7C+3&!fLnKZx$YNxomXH=zdqy#IH(==O-WMsu>+^e~WpC)Xj71D~diCZMtGo-sE!jLEO_9-zvK$#zur zO#mn`TXw#KHB)y($~!)XREzrcpUDZUk376dB2=BGac zqh%yx*L-9?2Et-*&HNhz;ngxJ%_;pw%M#K_zuVosVxMwZ+t*UyY{2e;M4@y3{fgxT z(q^k=KpyVCJQrONSM}RN9z3Ei)F(a{sk#5XchC;*zK$xbArI1e6UEV~Cd^Gpmt8Dh zkPISpnKVNihCCRcLdFCg5eX;My>+)}bCf)rs7p}#^}~E7e8-&B{SAKlOZ*7p;Fy96 zf(*%~!@Y7c>ZWDeXIcF%NdN=)OuF2r#cB<4l8MUS>3~Vf=I@+^M7UzPE=+gP+_BqttY>uHSh+rmam|Sssq9n#PaU zN|i?*yM6AGU@QyCzE&>{$=JOUnC?LDx9KN6z2I5vv*+Fm@}re;Foem zq^PY3Rx=f1I1$Jlw-23An&(M`^kb2<%KZ@#X5Ep@tZY4JwusibkUy zfqNAuv;Ns0qMk=4(<=c8&A}sEJ0RlO!VPyugqYw(Lx-S}v6OlLRp^cUK^j zBtoC{9I9<}!1`*##l_hUM6Uynyo4>3Jv9xXMVBa_{E*&E;lIUh3_`K}>64b_OjzB! zvwQCHI<-+7UzGfn1`_J^uwy0TT2oD}$&@dv`uYAh#}7H8kC}`oQC}J-DS0fFEuOQe1rv;$tfJj^tL}C{F79Qk zZG3ovo=bI@TdR3kwdwOaZuWUMWv)R1q5FNjYo0O2OnbP*y8pUj`WHi$p4^$Ctn|-> z5Yvjn5=8V+i?0arv3p^3F%Wla9@3*7@jd|Hke94;~2o;s8|wfKx=EO8nwd#Ss?C$qj+4rhoXQSsRV; zD=Z2$KYt~6sR|8EIRJnyk46B_73w6}5F=IDZ-FVS_RF!1$|z{%lYUNCu6E3`NjX7oA(dY(SO!q8qrU}tWVRCOp7#94RCOB8uNBLjXjQqzU#j-ir zoolX1yg&4=rrqx2#kj{({F!Vx+~`ZiKCNHHjNgT+gb0ULdwujTo2zo&;jaTk#2Iy3 zifqMl6(Qf=^wOBIHHClSjPk!0R8_q%-U(Q!P;@z-Key_!k7uxZ+>bVEDCuq1SY5u; zE@C*{BFbYSBO{OiYd+Sv>N&0Nv;8jlz5hW6FQ+JsfA=Tl^=$VXf3EqpW!Lqbv1Ew< oU*|Cvb^8BT>+%0%uy@pGNb}U(T1&A{3-%XDkgRBxuzukG0vZ<)u>b%7 literal 0 HcmV?d00001 From 28a84e6e51438c56af4f699a4eaf52eeebfce57a Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Sun, 7 Aug 2022 19:46:11 -0400 Subject: [PATCH 40/42] images moved --- .../Tutorial-o-Matic/ToM Modifiers 001.png | Bin .../Tutorial-o-Matic/ToM Modifiers 002.png | Bin .../Tutorial-o-Matic/ToM Modifiers 003.png | Bin .../Tutorial-o-Matic/ToM Modifiers 004.png | Bin .../Tutorial-o-Matic/ToM Modifiers 005.png | Bin .../Tutorial-o-Matic/ToM Modifiers 006.png | Bin .../Tutorial-o-Matic/ToM Modifiers 007.png | Bin .../Tutorial-o-Matic/ToM Modifiers 008.png | Bin .../Tutorial-o-Matic/ToM Modifiers 009.png | Bin .../Tutorial-o-Matic/ToM Modifiers 010.png | Bin .../Tutorial-o-Matic/ToM Modifiers 011.png | Bin .../Tutorial-o-Matic/ToM Modifiers 012.png | Bin .../Tutorial-o-Matic/ToM Modifiers 013.png | Bin .../Tutorial-o-Matic/ToM Modifiers 014.png | Bin 14 files changed, 0 insertions(+), 0 deletions(-) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 001.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 002.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 003.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 004.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 005.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 006.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 007.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 008.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 009.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 010.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 011.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 012.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 013.png (100%) rename {Tutorial-o-Matic/images => resources}/Tutorial-o-Matic/ToM Modifiers 014.png (100%) diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 001.png b/resources/Tutorial-o-Matic/ToM Modifiers 001.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 001.png rename to resources/Tutorial-o-Matic/ToM Modifiers 001.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 002.png b/resources/Tutorial-o-Matic/ToM Modifiers 002.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 002.png rename to resources/Tutorial-o-Matic/ToM Modifiers 002.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 003.png b/resources/Tutorial-o-Matic/ToM Modifiers 003.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 003.png rename to resources/Tutorial-o-Matic/ToM Modifiers 003.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 004.png b/resources/Tutorial-o-Matic/ToM Modifiers 004.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 004.png rename to resources/Tutorial-o-Matic/ToM Modifiers 004.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 005.png b/resources/Tutorial-o-Matic/ToM Modifiers 005.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 005.png rename to resources/Tutorial-o-Matic/ToM Modifiers 005.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 006.png b/resources/Tutorial-o-Matic/ToM Modifiers 006.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 006.png rename to resources/Tutorial-o-Matic/ToM Modifiers 006.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 007.png b/resources/Tutorial-o-Matic/ToM Modifiers 007.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 007.png rename to resources/Tutorial-o-Matic/ToM Modifiers 007.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 008.png b/resources/Tutorial-o-Matic/ToM Modifiers 008.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 008.png rename to resources/Tutorial-o-Matic/ToM Modifiers 008.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 009.png b/resources/Tutorial-o-Matic/ToM Modifiers 009.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 009.png rename to resources/Tutorial-o-Matic/ToM Modifiers 009.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 010.png b/resources/Tutorial-o-Matic/ToM Modifiers 010.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 010.png rename to resources/Tutorial-o-Matic/ToM Modifiers 010.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 011.png b/resources/Tutorial-o-Matic/ToM Modifiers 011.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 011.png rename to resources/Tutorial-o-Matic/ToM Modifiers 011.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 012.png b/resources/Tutorial-o-Matic/ToM Modifiers 012.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 012.png rename to resources/Tutorial-o-Matic/ToM Modifiers 012.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 013.png b/resources/Tutorial-o-Matic/ToM Modifiers 013.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 013.png rename to resources/Tutorial-o-Matic/ToM Modifiers 013.png diff --git a/Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 014.png b/resources/Tutorial-o-Matic/ToM Modifiers 014.png similarity index 100% rename from Tutorial-o-Matic/images/Tutorial-o-Matic/ToM Modifiers 014.png rename to resources/Tutorial-o-Matic/ToM Modifiers 014.png From 33b2b2ca82021ce9f61b8bc92f7530d73db9c1da Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Sun, 7 Aug 2022 22:51:22 -0400 Subject: [PATCH 41/42] wip --- .../LongTutorialExample_MDH.mm | 5 +- .../Tutorial-o-Matic Intro.mm | 123 +- .../Tutorial-o-MaticStepByStep.mm | 2159 +++- README.MD | 220 +- ...-o-Matic.mm => Tutorial-o-Matic project.mm | 10776 ++++++++++------ Tutorial-o-Matic/Tutorial-o-Matic.mm | 137 +- Tutorial-o-Matic/build.gradle | 7 +- Tutorial-o-Matic/scripts/ToMTutorial.groovy | 2 +- .../Tutorial-o-Matic/LongTutorialExample.mm | 275 +- .../Tutorial-o-Matic/SimpleTutorialSample.mm | 51 +- .../Tutorial-o-Matic Intro.mm | 47 +- 11 files changed, 8902 insertions(+), 4900 deletions(-) rename Tutorial-o-Matic.mm => Tutorial-o-Matic project.mm (75%) diff --git a/EditingTutorialsWithMDH/LongTutorialExample_MDH.mm b/EditingTutorialsWithMDH/LongTutorialExample_MDH.mm index ba1720b..4ff2fcc 100644 --- a/EditingTutorialsWithMDH/LongTutorialExample_MDH.mm +++ b/EditingTutorialsWithMDH/LongTutorialExample_MDH.mm @@ -1,5 +1,6 @@ + @@ -179,7 +180,7 @@ - + @@ -1151,7 +1152,7 @@ - + diff --git a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm index 6f10076..fc52c7d 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm @@ -4,17 +4,17 @@ - + - + - + @@ -205,13 +205,13 @@ - + - - - - + + + + @@ -235,7 +235,7 @@

    - + ## Hi!! **Tutorial-o-Matic** is a Freeplane Add-on that helps you build tutorials @@ -243,14 +243,14 @@ - + This very guide was created using this add-on. - + I hope you enjoy this! @@ -259,7 +259,7 @@ - + @@ -274,17 +274,17 @@ =edofro.MarkDownHelper.MDH.document(node) - - - + + + - + - - - + + + @@ -314,9 +314,9 @@ =edofro.MarkDownHelper.MDH.document(node) - - - + + + @@ -329,14 +329,14 @@

    - - - - + + + + - + @@ -359,9 +359,9 @@

    - + - + @@ -384,9 +384,9 @@

    - + - + @@ -416,8 +416,8 @@ =edofro.MarkDownHelper.MDH.document(node) - - + + This document contains **two guides** about the **building components** used to build tutorials with **Tutorial-o-Matic**: @@ -430,7 +430,7 @@ - + @@ -460,11 +460,11 @@ = edofro.MarkDownHelper.MDH.document(node) - - - - - + + + + + @@ -475,51 +475,16 @@

    - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm index d4dc1d0..81d464d 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm @@ -3,8 +3,29 @@ - - + + + + + + + + + + + + + + + + + + + + + @@ -164,6 +185,13 @@ + + + + + + + @@ -207,14 +235,14 @@ - + - + @@ -255,7 +283,7 @@ - + ## 1. Create a basic tutorial in a new mindmap @@ -281,7 +309,7 @@ - + @@ -402,7 +430,7 @@ - + @@ -416,7 +444,7 @@ - + @@ -753,7 +781,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -771,7 +799,9 @@ Write some text to its note (this is the information that will be shown) = edofro.MarkDownHelper.MDH.document(node)
    - Now we will copy to the tutorial some othr 'ToM_note' nodes as examples so you can see other use cases + Now we will copy to the tutorial some other +'ToM_note' nodes as examples so you can +see other use cases @@ -903,7 +933,7 @@ Write some text to its note (this is the information that will be shown)
    - + @@ -1013,7 +1043,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1055,7 +1085,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1069,7 +1099,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1085,7 +1115,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1098,7 +1128,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1126,8 +1156,8 @@ Write some text to its note (this is the information that will be shown) - - + + @@ -1282,200 +1312,249 @@ Write some text to its note (this is the information that will be shown) - + - + + + + + + - - + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + +

    - def nodos = c.selecteds -

    -

    - -

    -

    - nodos.each{n -> -

    -

    -     n.text = 'image Origami Bookmarks' -

    -

    -     n.link.text = n.link.text.takeBefore('?') + '?auto=webp&frame=1&width=500&height=500&fit=bounds' + = edofro.MarkDownHelper.MDH.textBlock(node)

    + +
    + + + + + +

    - } + The creator is $1 and it was published as $2.

    - -
    - + +

    - .groovy + = edofro.MarkDownHelper.MDH.webLink(node)

    - -
    + + - +

    - def nodos = node.find{n -> n.style.name && n.style.name == 'MarkdownHelperNode' && n.text == 'Markdown document.md'} -

    -

    - -

    -

    - //def n = node -

    -

    - nodos.each{ n -> -

    -

    -    def newText = n.children.first().text.split(' ').take(5).join(' ') + ' ...' -

    -

    -    n.text = newText -

    -

    - } + = edofro.MarkDownHelper.MDH.webLink(node)

    - -
    - + + + +
    +
    +
    + + + + + + + + + + + + +

    - .groovy + = edofro.MarkDownHelper.MDH.document(node)

    + + +
    +
    + + + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + To create a new mindmap that has the styles +needed to build a tutorial using **Tutorial-o-Matic** , you can use +the command "**Create new tutorial mind map**". + +You can get the same result by creating a new map using the "tutorial_styles_template" as template map. + + + + + + + + + + ## Step 1: create a new tutorial able mind map + +You can do it yourself by clicking the menu command, +or click the 'Execute' button to let ToM do it for you. + + - + + + + + + + + + + + + + + +

    - information -

    -

    - multiple pages + = edofro.MarkDownHelper.MDH.document(node)

    -
    - - - + +
    + - - - - - - - - - + + + + + + +

    - To prepare any existing mindmap to contain a tutorial, you have to add the special Tutorial-o-Matic styles to it. + # Cute Origami Bookmarks

    -

    - You get that by using the command "Import Tutorial-o-Matic Styles" -

    -
    - - - - - - - = "${node?.children[0]?.text} directly".toString() + + The original creator of this tutorial is [lalabananas](https://www.instructables.com/member/lalabananas/) +and it was published as [Cute-Origami-Bookmarks in Instructables](https://www.instructables.com/Cute-Origami-Bookmarks/). - + +

    - "$0 directly" + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FEG/OIPK/L06PT77G/FEGOIPKL06PT77G.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds)

    - -
    - - - +

    - If you want to divide your tutorial in multiple pages  you have two different options: + Hello internet people, today I will show you how to create corner bookmarks out of coloured paper. They always turn out really cute and they're perfect for giving as gifts :)

    -
      -
    • - inserting "New page" nodes -
    • -
    • - inserting "Next page" nodes -
    • -

    - You have to insert these nodes to indicate where the next page starts. +

    - +

    - "New page" nodes are used to indicate where a new page starts AND the title of this new page. -

    -

    - This title gets shown at the top of the page + Although these are very easy and simple crafts, it can be hard to get some creative inspiration to figure out how you want to design them. I will also give some tips that I think will be helpful.

    @@ -1483,38 +1562,33 @@ Write some text to its note (this is the information that will be shown) - +

    - "Next page" nodes only indicates where a new page starts but doesn't insert a new title to the tutorial + I made the bookmarks shown above earlier, but for this instructable I am going to make some new and fresh ones.

    - -
    -
    - - - - - -

    - With the same logic, when showing the Table of Content only "New page" titles are listed there. +

    - + + + + +

    - These nodes can be set between the other nodes or as parents of them. They just have to be "before" the others ("in breadth-first order") + # Supplies

    @@ -1522,308 +1596,1841 @@ Write some text to its note (this is the information that will be shown) - - - - +

    - New Pages nodes + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FDD/YAIK/L06PT6OG/FDDYAIKL06PT6OG.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds)

    - +

    - To insert "New page" nodes, you have to + To make these bookmarks you will need: +

    +

    + +

    +

    + - A ruler (at least 10cm or 4in) +

    +

    + - A pencil +

    +

    + - Scissors +

    +

    + - Paper or card (a few different colours) +

    +

    + - Glue stick or squeezy glue +

    +

    + - Some inspiration for bookmark designs +

    +

    + - A will to cut and stick paper +

    +

    +

    -
      -
    • - Select the desired node (its text will be used as title for that page) -
    • -
    • - Assign the style "ToM_newPage" to that node -
    • -
    -
    - - - - - - - = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() - - +

    - "Assign $0 style to selected node(s) directly" + Optional: +

    +

    + +

    +

    + - Black pen +

    +

    + - Coloured pencils/markers +

    +

    + - Paper knife/cutter (for scoring card) +

    +

    +

    - - - - - = "Insert new **${node?.children[1]?.text}** node directly".toString() - - + + + +

    - "Insert new $1 node directly" + # Step 1: Decide Your Design +

    +

    +

    - - - - - - - +

    - Next Pages nodes + First, decide what design you would like to make: I mainly make different types of animals, but you could also make humans or your favourite (book) characters. However, if you are feeling spontaneous, it is perfectly fine to not plan any design at all! +

    +

    +

    - + +

    - Edo + Make sure that you have paper in the necessary colours and sizes to make your design, or you might become very disappointed when you realise you are missing something :/ +

    +

    +

    - + + + +

    - To insert "Next page" nodes, you have to + # Step 2: Measure and Cut Paper +

    +

    +

    -
      -
    • - Select the desired node (its text doesn't affect the tutorial) -
    • -
    • - Assign the style "ToM_nextPage" to that node -
    • -
    -
    - - - - - - - = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() - - +

    - "Assign $0 style to selected node(s) directly" + We are now going to make the base of the bookmark. +

    +

    +

    - - - - - = "Insert new **${node?.children[1]?.text}** node directly".toString() - - +

    - "Insert new $1 node directly" + To do this, you need to measure out a square piece of paper that is (at least) 10cm each side -- a bookmark smaller than this will probably be difficult to fold and decorate. 10cm is roughly 4 inches. +

    +

    +

    - - - - - - - - - - - - - - +

    - To add a Table of Content (TOC) to your tutorial, you just have to: + Use your ruler to measure out 10cm from each side, then mark it with a pencil. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FE7/N8W6/L06PT6OX/FE7N8W6L06PT6OX.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=aaaf0b8a070a15f59177952615be4a7c) +

    +

    + +

    + +
    +
    + + + + + + +

    + Draw two faint lines connecting the marks you made. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FOK/9C7Z/L06PT6OY/FOK9C7ZL06PT6OY.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=fd3e2ca353277244ec55143f1950ddd5) +

    +

    + +

    + +
    +
    + + + + + + +

    + Cut through the lines as accurately as you can. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/F0D/OFSO/L06PT6OZ/F0DOFSOL06PT6OZ.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=04c3a616a3d7923f2a961440522628ca) +

    +

    + +

    + +
    +
    + + + + + + +

    + Realise that the end size of the bookmark will be a quarter of the square's area... this can help you decide how big to cut your square. Also, if you already have a square piece of paper that is a suitable size for you, you can skip this step. +

    +

    + +

    + +
    +
    +
    +
    + + + + + + + + + +

    + # Step 3: Fold Paper +

    +

    + +

    + +
    +
    + + + + + + +

    + We now have to fold the paper to make it into a corner bookmark. It might be easier to take a look at the pictures above rather than trying to interpret the instructions. +

    +

    + +

    + +
    +
    + + + + + + +

    + Fold the square into quarters (fold once horizontally and once vertically.) +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FL6/YUHP/L06PT6P9/FL6YUHPL06PT6P9.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=34132bf0e55a204f144a7a8a6acf9251) +

    +

    + +

    + +
    +
    +
    +
    + + + + + + + + +

    + Fold your paper diagonally once to make a triangle. Rotate it so the base is facing upwards. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FAJ/5KUG/L06PT6PA/FAJ5KUGL06PT6PA.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=add530039e1b153ced492c86c31636fc) +

    +

    + +

    + +
    +
    +
    +
    + + + + + + + + +

    + Fold the bottom corner upwards to make a little pocket (there are two layers -- only fold the top one.) +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FHC/EW5L/L06PT6PB/FHCEW5LL06PT6PB.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=1f84256ea9c64323167933d3de92ec51) +

    +

    + +

    + +
    +
    +
    +
    + + + + + + + + +

    + Fold the left and right corners downwards, to make a smaller square. +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTE/UEWE/L06PT6PC/FTEUEWEL06PT6PC.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=93246151a1a78bbc87006e2506bcbe2e) +

    +

    + +

    + +
    +
    +
    +
    + + + + + + + + +

    + Tuck the left and right corners underneath the little pocket you made, and then fold them. You now have the base of your bookmark! +

    +

    + +

    +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FE9/RLNT/L06PT6PD/FE9RLNTL06PT6PD.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=a88fad583bde511ee08844eb2e9f1676) +

    +

    + +

    + +
    +
    + + + + + + +

    + If you are using card, you probably need to score the card first in order to fold it neatly. Use a ruler and a paper knife or cutter to do this. Make sure you do it safely! +

    +

    + +

    + +
    +
    +
    +
    +
    + + + + + + + + +

    + # Step 4: Decorate Bookmark +

    +

    + +

    + +
    +
    + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FMV/XRZC/L06PT9QS/FMVXRZCL06PT9QS.jpg?auto=webp&frame=1&fit=bounds&md=d0b67e4507fddf246d311ff018cd22a8) +

    + +
    +
    + + + + + + +

    + We have now reached the very fun part, which is decorating your bookmark. If you are a minimalist and/or very lazy, this step may not be necessary and your bookmark is now finished! :) +

    +

    + +

    + +
    +
    + + + + + + +

    + As you can see, I turned the pink bookmark into a slightly creepy axolotl, by sticking some gills to the back and making blue eyes. +

    +

    + +

    + +
    +
    + + + + + + +

    + Tips for decorating your bookmarks: +

    +

    + +

    +

    + - Cut out small details (eyes, noses, ears, hair, etc.) out of pieces of scrap paper and stick them on. +

    +

    + - Use a black pen/fineliner to make some details. It might also be easier to draw eyes with a pen than sticking paper. +

    +

    + - You could use coloured pencils/markers to draw on some designs (but this will only work if you draw on light-coloured paper.) +

    +

    + - Maybe add texture to spice it up a bit -- feathers and stickers and shiny stuff! +

    +

    + +

    + +
    +
    + + + + + + +

    + If you are adding extra parts to your bookmark, keep in mind that some may stick out of the book a bit and maybe get damaged (like the gills on my axolotl.) +

    +

    + +

    + +
    +
    +
    +
    + + + + + + + + +

    + # Step 5: Voilà! +

    +

    + +

    + +
    +
    + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTG/QP3N/L06PT76P/FTGQP3NL06PT76P.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=c7ed44f4d0772f0e72a8e37abc3e6924) +

    + +
    +
    + + + + + + +

    + Congratulations! You have created a child! +

    +

    + +

    + +
    +
    + + + + + + +

    + I also made a fox and whale along with my axolotl :) +

    +

    + +

    + +
    +
    + + + + + + +

    + Now you could gift your creation to anyone who likes to read books. It's also a good idea to make these for kids as they can encourage them to read more. Of course, there is also the option of keeping it for yourself :D +

    +

    + +

    + +
    +
    + + + + + + +

    + Thanks for reading my instructable -- it is my first one and it has been very fun to make. I hope it was entertaining and somewhat helpful! And also please share some pictures of your children below! +

    +

    + +

    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + + +
    + + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + If you want to **divide** your tutorial **in multiple pages** + you have two different options: + + * "**New page**" nodes + * "**Next page**" nodes + +You have to **insert** these nodes **between the others** + to indicate where the next page starts. + + + + "**New page**" nodes are used to indicate +where a **new page starts** AND the **title** of this new page. +This title gets shown at the **top of the page** + + + + + "**Next page**" nodes only indicates where a **new page** starts +but **doesn't insert** a new **title** to the tutorial + + + + With the same logic, when showing the +**Table of Content** only **"New page" titles** are listed there. + + + + These nodes can be set **between** the other nodes +**or as parents** of them. They just have to be +"**before**" the others ("in **breadth-first order**") + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + + +
    + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.document(node) +

    + +
    + + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + + +
    + + + + +
    +
    + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + --- +## Table of contents: +--- + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + ### Let's look at the changes. + +Click at the button to show how the page looks now: + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + ### Let's look at the changes. + +Click at the button to show how the page looks now: + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + + +
    + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + + + ### Let's look at the changes. + +Click at the button to show how the page looks now: + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.imageLink(node,true) +

    + +
    + + + + + + +

    + ="![](${node.link.uri})" +

    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + + +
    + + + + + + + + + + +

    +  (you can do any of these:) +

    + + +
    + + + + + + +
    + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + ### Let's look at the changes. + +Click at the button to show how the page looks now: + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.table(node) +

    + + +
    + + + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.imageLink(node,true) +

    + + +
    + + + + + + +

    + ="![](${node.link.uri})"

    -
      -
    • - Add a node -
    • -
    • - Assign the style "ToM-TOC" to that node -
    • -
    - - - - - - = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.imageLink(node,true) +

    + +
    - +

    - "Assign $0 style to selected node(s) directly" + ="![](${node.link.uri})"

    - - - - - = "Insert new **${node?.children[1]?.text}** node directly".toString() + +
    + + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.imageLink(node,true) +

    + +
    - +

    - "Insert new $1 node directly" + ="![](${node.link.uri})"

    - - - - - - - + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + + +
    + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + +

    - bla bla bla + = edofro.MarkDownHelper.MDH.imageLink(node,true)

    + + + + + + +

    + ="![](${node.link.uri})" +

    + +
    +
    - - + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + + +
    + + + + + + - - - - + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.imageLink(node,true) +

    + +
    +

    - bla bla bla + ="![](${node.link.uri})"

    - - + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + +
    + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + +

    + = edofro.MarkDownHelper.MDH.list(node) +

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + ### Let's look at the changes. + +Click at the button to show how the page looks now: + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + # Congratulations!! + +## You have completed this tutorial!! + +(you can save your test map if you want, but you don't need to) + + + - + + - + @@ -1840,7 +3447,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + @@ -1907,7 +3514,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + diff --git a/README.MD b/README.MD index 55aa3a7..6afd75b 100644 --- a/README.MD +++ b/README.MD @@ -18,108 +18,122 @@ Bye, edo -# Next tasks +# Currently working on -nullPendientesnull - - No milestone - - [ ] **eliminar tareas finalizadas antiguas** - - [ ] **translate tasks to english** - - [ ] filter maybe tasks from Readme file - - ToM v0.0.7 - - ToM addon - - [x] actualizar changeLog - - [x] cambié getMenuCommandToM - - [x] tuve que crear nueva versión para superar bug de children vs children() - - [x] actualizar texto versiones en estos nodos - - build.gradle - - [x] usar build.gradle para java 17 - - Tuts w/ MDH - - [ ] Crear mapa Tutorial-o-MaticStepByStepActions.mm - - Tutoriale.acciones - - [ ] ToM_showMenu - - [x] Hacer que se copia a carpeta docs - - [ ] script de ayuda que llame a funcionalidad MDH para copiar mapas MDH clean - - [ ] Delete MDH Styles from map - - hacer.tutoria.paso.paso - - [x] Tutorial 1: one page tutorial in a new mindmap - - [x] Tutorial 2: one page tutorial in an existing mindmap - - [ ] Tutorial Crayon - - [ ] **Tutorial : organizing a tutorial in multiple pages (working on it)** - - [x] create example tutorial map one long page - - [x] crear mapa nuevo - - [x] agregarle ToM Styles - - [x] copiarle Origami tut - - [x] exportable a carpeta zip sin MDH - - [ ] **Ojo:
    puede ser que requiera que sea copiado pra poder usar opción "select node"** - - [ ] Link a tutoriales Acciones en WIP - - [ ] Mejorar ReadMe.MD - - ToM Future A - - lib - - ToM_actions.groovy - - ToM_showMenu - - [ ] ToM_showMenu: tras un par de segundos debe desaparecer - - ToM_groovy - - [ ] ToM_groovy: usa texto de nodos para panel - - ToM_copy - - [ ] ToM_copy: debe usar texto de la nota del nodo tom_copy - - ToM_select - - [ ] ToM_select: debe usar texto de la nota del nodo tom_select - - ToM_openMap - - [ ] ToM_openMap: debe usar texto de la nota del nodo - - ToM_showNode - - [ ] ToM_showNode: se usa el texto de los nodo hijos para armar el texto del panel (REVISAR) - - ToM_openTutMap - - [ ] ToM_openTutMap: debería usar texto de nota y si no existe tirar el texto por default - - nuevas - - [ ] botón Previous page - - icons - - [ ] agregar icono Tutorial-o-Matic - - Tuts w/ MDH - - [ ] Agregar mapa con nodos ejemplos - - ToM Future B - - lib - - ToM_actions.groovy - - [ ] Manage errors (message) - - nuevas - - [ ] accion displayMarkdownFile - - ToM_ui.groovy - - [ ] Crear nuevo buttonPanel más compacto - - Tuts w/ MDH - - [ ] copiar panel de MoM - - Apuntes - - [ ] definir si un mapa para practica:
    ¿se permite sobreescribir (para guardar avance)? - - [ ] Funcionalidad MDH:
    Comando para 'actualizar' la nota a un nodo con link a un nodo MDH y copia su contenido - - ToM Future C - - lib - - ToM_actions.groovy - - ToM_groovy - - [ ] agregar botón opcional en groovyPanel que permita abrir script en groovyConsole - - [ ] Agregar comado que abra console con script en texto pero sin asociar nodo y que fuente sea opcional - - [ ] incluye dentro del marco - - [ ] incluir permisos aceptados en preferencias - - [ ] encapsular ejecución de script sólo con permisos aceptados - - [ ] exe scripts - - nuevas - - [ ] groovy console - - ToM_ui.groovy - - [ ] Tutorial debe poder partir en toolPane o en Window propia - - [ ] Build a buttonPanel - - [ ] Tomar formatos panel desde userStyles - - [ ] revisar textos UI - - doc - - [ ] Actualizar Tutorial Sample.mm - - Tuts w/ MDH - - [ ] modificar MoM - - ToM Future D - - lib - - ToM_actions.groovy - - nuevas - - [ ] - I agree with your goals of showing a mouse cursor and allowing the tutorial to execute actions. Even better, though, would be a way to wait and "listen" for the user to click on the action and have the tutorial pause until they do the right thing. If it's just showing the user what to do rather than teaching them what to do and having them do it, it's not really a tutorial, but more like a way to create instructional videos using Freeplane (which would not be a bad thing, of course!). Tutorial means the user is following along and doing stuff. - - build.gradle - - [ ] hacer que Gradle acceda a librerías desde Freeplane o desde Maven - - [ ] jsoup - - [ ] markedj - - [ ] groovyNode - - Apuntes - - [ ] Lastly, the only way to get proper feedback on this addon is to ask some people to actually use it to create tutorials for things. You might use it to try to create a tutorial for something that is *not* directly related to this addon, like a tutorial on how to change node width and save that change to the standard template. Only then will you get a sense of what this type of tool must be able to do. +- **No milestone** + - [ ] **Redefine Add-on menu and Add-on tutorials links for better user experience (working on it: ~75%)** +- **ToM v0.0.7** + - Add-on tutorials (w/MDH) + - StepByStep Tutorial + - [ ] **Update "Introduction" tutorial in StepByStep map (working on it: ~0%)** + +# Tasks + +- **No milestone** + - [ ] **Redefine Add-on menu and Add-on tutorials links for better user experience (working on it: ~75%)** + - [x] Translate tasks to english
    and make it easy understandable + - [x] Filter 'maybeTasks' from Readme file +- **ToM v0.0.7** + - scripts + - [x] getMenuCommand renamed to "getMenuCommandToM.groovy" + - build.gradle + - [x] using build.gradle for java 17 + - [x] update it to FP 1.10.4 + - Add-on tutorials (w/MDH) + - StepByStep Tutorial + - [x] Tutorial 1: one page tutorial in a new mindmap + - [x] Tutorial 2: one page tutorial in an existing mindmap + - [x] Tutorial 3: "Organizing a tutorial in multiple pages" + - [x] Add "Crayon" functionality to add-on's tutorial + - [ ] **Update "Introduction" tutorial in StepByStep map (working on it: ~0%)** + - [ ] Add links to StepbyStepActions tutorial (to WIP repository for this stage) + - StepByStepActions Tutorial + - [ ] Create basic version of "Tutorial-o-MaticStepByStepActions.mm" mindmap where ToM actions styles will be explained + - practice.maps + - [ ] Delete MDH Styles from "myExistingMindMap.mm" map + - [ ] Delete MDH Styles from "LongTutorialExample_MDH.mm" map + - README.MD + - [ ] Redefine instructions + - [ ] Improve ReadMe.MD +- **ToM v0.0.8** + - lib + - ToM_actions.grvy + - ToM_showMenu + - [ ] Explain that ToM_showMenu accepts the modifier "Fire" + - [ ] ToM_showMenu must use the modifier "candle" too (when using "Fire"). So that if it can be executed only once if wanted. + - ToM.grvy + - [ ] Improve "TutorialsPane" so it can have a title, text and images. + - Add-on tutorials (w/MDH) + - [ ] Help script that calls "Save as MDH clean mindmap" (MDH add-on) to automatize updating process + - StepByStepActions Tutorial + - [ ] Create "Tutorial-o-MaticStepByStepActions.mm" mindmap where all ToM actions styles are explained +- **ToM xFuture A** + - lib + - ToM_actions.grvy + - ToM_showMenu + - [ ] ToM_showMenu: After a few seconds opened menus should automatically close + - ToM_groovy + - [ ] ToM_groovy: should use node text for the panel + - ToM_copy + - [ ] ToM_copy: should use note text from tom_copy node for the panel + - ToM_select + - [ ] ToM_select: should use note text from tom_select node for the panel + - ToM_openMap + - [ ] ToM_openMap: should use note text from node for the panel + - ToM_showNode + - [ ] ToM_showNode:
    should use childnodes text for the panel? check this + - ToM_openTutMap + - [ ] ToM_openTutMap: should use note text from node for the panel. and if not available, it should use default text + - new + - [ ] implement "Previous page" button + - ToM_ui.grvy + - [ ] ToM_buttonBoard: create a new style that creates a panel that simulates a toolbar (like Menu-o-Matic) + - icons + - [ ] Create and add a "**Tutorial-o-Matic**" icon + - doc + - [ ] Change current links to tutorialmaps into links to a second demo map + - Add-on tutorials (w/MDH) + - [ ] Add to tutorial map (or create a new one) sample nodes with the different ToM styles, so the user can insert them and modify them to learn +- **ToM xFuture B** + - lib + - ToM_actions.grvy + - [ ] poner try catch
    y que catch despliege mensaje de error + - new + - [ ] nodo con link a file .md
    -->
    lo despliega en panel de editor + - ToM_ui.grvy + - [ ] Improve buttonPanel layout to make it more compact + - Add-on tutorials (w/MDH) + - Commands + - [ ] add buttonBoards to map + - Apuntes + - [ ] practice maps: Should the user be able to save changes or should the user have to use "save as" option? + - [ ] new MDH feature:
    Command to 'update' the note of a node that has a link to a MDH node and it copy/pastes its contain (from another map)
    desde otro mapa + - scripts + - [ ] init Script that reacts to the opening of mindmaps that have tutorials and automatically shows the Tutorials dialog +- **ToM xFuture C** + - lib + - ToM_actions.grvy + - ToM_groovy + - [ ] add an optional **button** to **groovyPanel** that opens the script in **Groovy Console** + - [ ] improve **groovyPanel** with more features
    posibilidades + - [ ] make sure that scripts apply security levels defined in Freeplane preferences + - new + - [ ] add Groovy Output Console to groovyPanel? + - ToM_ui.grvy + - [ ] Option to start Tutorial in TabPanel or in own window (dialog) + - [ ] Panel style should be read from a special userStyles (including css) + - [ ] Transform al UI texts in variables that can be translated + - doc + - [ ] Update **Tutorial Sample.mm** so it includes all the features changes +- **ToM xFuture D** + - lib + - ToM_actions.grvy + - new + - [ ] "Listen" to user actions and verify if he/she did the steps as explained in the tutorial (or if the user's result is equivalent to the expected result) + - [ ] Add comments to all groovy files (a description to each method) + - build.gradle + - [ ] Make that Gradle access libraries from Freeplane or from Maven when building the add-on + - [ ] jsoup + - [ ] markedj + - [ ] groovyNode diff --git a/Tutorial-o-Matic.mm b/Tutorial-o-Matic project.mm similarity index 75% rename from Tutorial-o-Matic.mm rename to Tutorial-o-Matic project.mm index ef8d849..d8294d5 100644 --- a/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic project.mm @@ -1,7 +1,7 @@ - + @@ -99,14 +99,14 @@ - + - + @@ -120,7 +120,7 @@ - + @@ -279,7 +279,7 @@ - + @@ -322,7 +322,7 @@ - + @@ -508,7 +508,7 @@

    - + @@ -519,7 +519,7 @@

    - + @@ -535,7 +535,7 @@ - + @@ -548,19 +548,19 @@ - - + + - + - + @@ -1123,36 +1123,36 @@ - + - + - + - + - + - + - + @@ -1202,10 +1202,43 @@     def static removeTab(String tabName, boolean hideTabPane = false){

    -         def index   = tabPane.indexOfTab(tabName) +         int index = tabPane.indexOfTab(tabName)

    -         //eliminar +         //msg("removeTab String - index: $index") +

    +

    +         removeTab(index, hideTabPane) +

    +

    +     } +

    +

    +      +

    +

    +     def static removeTab(javax.swing.JComponent comp, boolean hideTabPane = false){ +

    +

    +         int index = tabPane.indexOfComponent(comp) +

    +

    +         //msg("removeTab Component - index: $index") +

    +

    +         removeTab(index, hideTabPane) +

    +

    +     } +

    +

    +      +

    +

    +     def static removeTab(int index, boolean hideTabPane = false){ +

    +

    +         //msg("removeTab index - index: $index")

            if (index >= 0) { @@ -1366,6 +1399,18 @@

        }

    +

    +      +

    +

    +     def static msg(texto){ +

    +

    +         ui.informationMessage(texto.toString()) +

    +

    +     } +

    //end:

    @@ -1374,9 +1419,19 @@

    - - - + + + + + + + +

    + completedTask +

    + +
    + @@ -1423,7 +1478,7 @@ - + @@ -1476,7 +1531,7 @@ - + @@ -1563,8 +1618,18 @@ - - + + + + + + +

    + discardedTask +

    + +
    + @@ -1619,8 +1684,8 @@
    - - + + @@ -1697,7 +1762,7 @@ - + @@ -1729,7 +1794,7 @@ - + @@ -1763,12 +1828,12 @@ - + - + @@ -1786,6 +1851,9 @@

    +

    +

    + import org.freeplane.api.Node                           as ApiNode

    import org.freeplane.core.ui.components.UITools         as ui @@ -2148,7 +2216,7 @@

    -     def static getActionInfoMap(org.freeplane.plugin.script.proxy.NodeProxy nodo){ +     def static getActionInfoMap(ApiNode nodo){

            def accion = action(nodo) @@ -2322,7 +2390,10 @@         // ver si hijos leaf contiene accion

    -         def menuCommand = mTree.children.findAll{it.leaf}?.find{it.userObject.key == miAccion} +         //def menuCommand = mTree.children.findAll{it.leaf}?.find{it.userObject.key == miAccion}     //JAVA 8 +

    +

    +         def menuCommand = mTree.children().findAll{it.leaf}?.find{it.userObject.key == miAccion} //JAVA 17

            // alguno? @@ -2349,7 +2420,7 @@             // sacar lista hijos no leaf

    -         def hijosNoLeaf = mTree.children.findAll{!it.leaf} +         def hijosNoLeaf = mTree.children().findAll{!it.leaf}

            // si hay @@ -2674,9 +2745,9 @@

    - - - + + + @@ -2717,7 +2788,7 @@ - + @@ -2758,7 +2829,7 @@ - + @@ -2832,7 +2903,7 @@ - + @@ -2879,7 +2950,7 @@ - + @@ -2941,7 +3012,7 @@ - + @@ -3029,12 +3100,12 @@

    - + - - - + + + @@ -3048,7 +3119,7 @@ - + @@ -3063,7 +3134,7 @@ - + @@ -3077,7 +3148,7 @@ - + @@ -3093,9 +3164,9 @@ - + - + @@ -3110,7 +3181,7 @@ - + @@ -3126,7 +3197,7 @@ - + @@ -3142,9 +3213,9 @@ - - - + + + @@ -3160,8 +3231,8 @@ - - + + @@ -3176,7 +3247,7 @@ - + @@ -3191,7 +3262,7 @@ - + @@ -3207,26 +3278,26 @@ - - + + - + - - + + - - + + - - + + - - - - + + + + @@ -3243,47 +3314,47 @@

    - - - + + + - - - + + + - + - - - - - - - - - + + + + + + + + + - + - - - - + + + + - + - + - + - + @@ -3294,42 +3365,57 @@ + + + - + + + + + + + + +

    + completedTask +

    + +
    - + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - + + + + - + - + @@ -3340,12 +3426,12 @@

    - - + + - - + + @@ -3356,12 +3442,12 @@

    - - - + + + - + @@ -3372,10 +3458,10 @@

    - + - + @@ -3386,9 +3472,9 @@

    - + - + @@ -3399,8 +3485,8 @@

    - - + + @@ -3413,13 +3499,14 @@ - + - + - + + @@ -3430,13 +3517,12 @@

    - - - - - - + + + + + @@ -3491,7 +3577,7 @@ - + @@ -3547,7 +3633,7 @@ - + @@ -3572,13 +3658,13 @@

    - - - - - + + + + + - + @@ -3608,71 +3694,80 @@ - + + + + + + + +

    + completedTask +

    + +
    - + - - - - + + + + - - + + - + - - - - + + + + - - + + - + - - - - + + + + - - + + - + - - - - - - - - + + + + + + - + - - - - + + + + - - - + + + - - - + + + @@ -3681,24 +3776,27 @@

    me parece que ya no es necesario con Crayon

    +

    + discardedTask +

    - - - - - - + + + + + + - - - - + + + + - + - + @@ -3707,17 +3805,20 @@

    me parece que ya no es necesario con Crayon

    +

    + discardedTask +

    - - - - - + + + + + - + @@ -3726,13 +3827,16 @@

    feedback Quickfold

    +

    + completedTask +

    - + - - - + + + @@ -3743,12 +3847,12 @@

    - +
    - - + + @@ -3771,10 +3875,12 @@

    - - + + + + - + @@ -3797,12 +3903,12 @@

    - - - - - - + + + + + + @@ -3815,8 +3921,8 @@ - - + + @@ -3829,31 +3935,31 @@ - - + + - - - - + + + + - - - - + + + + - - - - + + + + - + - + @@ -3869,16 +3975,16 @@ - + - - - + + + - - + + @@ -3889,12 +3995,12 @@

    - + - - + + - + @@ -3940,8 +4046,8 @@ assert cumple(dato) - - + + @@ -3953,7 +4059,7 @@ assert cumple(dato) - + @@ -4005,32 +4111,32 @@ assert cumple(dato)

    - + - - + + - - - - + + + + - - + + - + - + - + @@ -4079,6 +4185,9 @@ assert cumple(dato)

    import java.awt.GridBagLayout

    +

    + import java.awt.GridLayout +

    import java.awt.Point

    @@ -4147,6 +4256,18 @@ assert cumple(dato)

    import io.github.gitbucket.markedj.Options +

    +

    + +

    +

    + import org.jsoup.Jsoup +

    +

    + import org.jsoup.nodes.Document +

    +

    +

    //end: @@ -4507,6 +4628,30 @@ assert cumple(dato)

    +

    +

    +     def static mergeHtml(baseHtml, addedHtml){ +

    +

    +         if(!baseHtml) return addedHtml +

    +

    +         if(!addedHtml) return baseHtml +

    +

    +         Document doc = Jsoup.parse(baseHtml) +

    +

    +         doc.body().append('<p/>').append(addedHtml) +

    +

    +         return doc.html()         +

    +

    +     } +

    +

    +     

        //end: @@ -4677,13 +4822,142 @@ assert cumple(dato)     }

    - +      +

    +

    +     def static createPageTitlePane(String htmlMsg, botones){ +

    +

    +         def panel = swing.panel() { +

    +

    +             borderLayout() +

    +

    +             editorPane( +

    +

    +                 editable    : false, +

    +

    +                 contentType : "text/html", +

    +

    +                 text        : htmlMsg, +

    +

    +                 margin      : new Insets(30,10,30,10), +

    +

    +                 border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +

    +

    +                 //border: new CompoundBorder(new LineBorder(Color.green, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde +

    +

    +                 constraints : CENTER, +

    +

    +                 clientProperties: [(JEditorPane.HONOR_DISPLAY_PROPERTIES):true] +

    +

    +             ) +

    +

    +             if(botones.size()>0){ +

    +

    +                 vbox(constraints:WEST) { +

    +

    +                     botones.each{b -> +

    +

    +                         button( +

    +

    +                             label           : b[0], +

    +

    +                             // constraints : WEST, +

    +

    +                             margin          : new Insets(0,2,0,2), +

    +

    +                             toolTipText     : b[1], +

    +

    +                             actionPerformed : b[2], +

    +

    +                             icon            : b[3], +

    +

    +                         ) +

    +

    +                     } +

    +

    +                     // button( +

    +

    +                         // label       : bttnText2, +

    +

    +                         // // constraints : EAST, +

    +

    +                         // // margin      : new Insets(10,15,10,15), +

    +

    +                         // toolTipText : bttnToolTip2, +

    +

    +                         // actionPerformed : bttnAction2, +

    +

    +                     // ) +

    +

    +                 } +

    +

    +             } +

    +

    +         } +

    +

    +         return panel +

    +

    +     } +

    +

    +     

    // genera panel con botón

    -     def static createButtonPanel(htmlMsg, buttonLabel, buttonToolTip, buttonAction, boolean isToggleButton = false){ +     def static createButtonPanel(String htmlMsg, buttonLabel, buttonToolTip, buttonAction, boolean isToggleButton = false){ +

    +

    +         def botones = [] << [buttonLabel, buttonToolTip, buttonAction, null, isToggleButton] +

    +

    +         createButtonPanel(htmlMsg, botones) +

    +

    +     } +

    +

    + +

    +

    +     def static createButtonPanel(String htmlMsg, botones){

            def panel = swing.panel( @@ -4731,49 +5005,76 @@ assert cumple(dato)               )

    -               vbox(constraints:SOUTH) { +             if(botones.size()>0){ +

    +

    +                 panel( +

    +

    +                     constraints:EAST, +

    +

    +                     background: Color.white, +

    +

    +                 ) { +

    +

    +                     borderLayout()

                        panel(

    -                            // border      : new LineBorder(Color.black, 1), +                         constraints:SOUTH, +

    +

    +                         background: Color.white, +

    +

    +                        // // border      : new LineBorder(Color.black, 1),

    -                             border      : new EmptyBorder(2, 10, 2, 10),  // <------- éste +                         border      : new EmptyBorder(2, 2, 2, 2),  // <------- éste

    -                             //border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde +                         // //border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde

    -                             //insets      : new Insets(30,10,30,10), +                         // //insets      : new Insets(30,10,30,10),

    -                         ) { +                     ) { +

    +

    +                         gridLayout(new GridLayout(0,1))

    -                             borderLayout() +                         botones.each{ b ->

    -                             if (isToggleButton){ +                             if ( b[4] == true ){

                                    toggleButton(

    -                                     label       : buttonLabel, +                                     label       :  b[0], +

    +

    +                                     // constraints : EAST,

    -                                     constraints : EAST, +                                     margin      : new Insets(3,6,3,6),

    -                                     margin      : new Insets(10,15,10,15), +                                     toolTipText : b[1],

    -                                     toolTipText : buttonToolTip, +                                     actionPerformed : b[2],

    -                                     actionPerformed : buttonAction, +                                     icon            : b[3],

                                    ) @@ -4785,19 +5086,22 @@ assert cumple(dato)                                 button(

    -                                     label       : buttonLabel, +                                     label       : b[0], +

    +

    +                                     // constraints : EAST,

    -                                     constraints : EAST, +                                     margin      : new Insets(3,6,3,6),

    -                                     margin      : new Insets(10,15,10,15), +                                     toolTipText : b[1],

    -                                     toolTipText : buttonToolTip, +                                     actionPerformed : b[2],

    -                                     actionPerformed : buttonAction, +                                     icon            : b[3],

                                    ) @@ -4809,7 +5113,13 @@ assert cumple(dato)                         }

    -               } +                     } +

    +

    +                 } +

    +

    +             }

            } @@ -4830,7 +5140,7 @@ assert cumple(dato)         //nextButtonAction == null --> no 'Next page' button

    -     def static createNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip, nextButtonAction, tocLabel = '', tocToolTip = '', tocButtonAction = null ){ +     def static createNextButtonPanel(closeLabel, closeToolTip, nextLabel, nextToolTip, nextButtonAction, tocLabel = '', tocToolTip = '', tocButtonAction = null ){

            def panel = swing.panel( @@ -4878,7 +5188,7 @@ assert cumple(dato)                             toolTipText : closeToolTip,

    -                             actionPerformed : {closeTab(tabName)}, +                             actionPerformed : { e -> closeTab(e.source) },

                            ) @@ -5190,7 +5500,7 @@ assert cumple(dato)

    -     def static closeTab(tabName, boolean hideTabPane = false) { +     def static closeTab(String tabName, boolean hideTabPane = false) {

            TabPane.removeTab(tabName, hideTabPane) @@ -5202,28 +5512,49 @@ assert cumple(dato)

    -     def static setNextPagePanelEnabled(JPanel myP, boolean isEnabled){ +     def static closeTab(javax.swing.JComponent comp, boolean hideTabPane = false) {

    -         setPanelEnabled(getNextButtonPanel(myP), isEnabled) +         //msg(comp.class)

    -     } +         def componente = getScrollPaneViewport(comp).parent

    - +         //msg(componente.class)

    -     def static setPanelEnabled(JPanel panel, boolean isEnabled) { +         TabPane.removeTab(componente, hideTabPane)

    -         panel.setEnabled(isEnabled) +     }

    -         panel.components.each{ comp -> +     def static setNextPagePanelEnabled(JPanel myP, boolean isEnabled){ +

    +

    +         setPanelEnabled(getNextButtonPanel(myP), isEnabled) +

    +

    +     } +

    +

    + +

    +

    +     def static setPanelEnabled(JPanel panel, boolean isEnabled) { +

    +

    +         panel.setEnabled(isEnabled) +

    +

    + +

    +

    +         panel.components.each{ comp ->

                if (comp instanceof JPanel) { @@ -5269,6 +5600,18 @@ assert cumple(dato)

    +

    +

    +     def static msg(texto){ +

    +

    +         ui.informationMessage(texto.toString()) +

    +

    +     } +

    +

    +     

        //end: @@ -5353,8 +5696,149 @@ assert cumple(dato)

    - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + pre { +

    +

    +     background-color: #e5e7ff; +

    +

    +     border-left: 5px solid #ccc; +

    +

    +     display: block; +

    +

    +     padding: 8px; +

    +

    +     margin: 5px; +

    +

    + } +

    +

    + code { +

    +

    +     font-family: Consolas,"courier new"; +

    +

    +     font-size: 11px; +

    +

    +     color: #999; +

    +

    + } +

    +

    + +

    +

    + blockquote { +

    +

    +     border-left: 5px solid #cccccc; +

    +

    +     background-color: #eeeeee; +

    +

    +     padding: 8px; +

    +

    + } +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5389,7 +5873,7 @@ assert cumple(dato) - + @@ -5426,7 +5910,7 @@ assert cumple(dato)

    - + # titulo **hola** como estás? @@ -5449,14 +5933,14 @@ assert cumple(dato)

    - - - - - + + + + + - + @@ -5529,7 +6013,7 @@ assert cumple(dato)

    - + @@ -5554,14 +6038,14 @@ assert cumple(dato)

    - - - - - + + + + + - + # titulo **hola** como estás? @@ -5584,13 +6068,13 @@ assert cumple(dato)

    - - - - - + + + + + - + @@ -5615,10 +6099,10 @@ assert cumple(dato)

    - - + + - + @@ -5654,7 +6138,7 @@ assert cumple(dato) - + =node.children*.text.join('\n') @@ -5671,19 +6155,19 @@ assert cumple(dato)

    - - - - - - - - - - + + + + + + + + + + - + # Markdown Helper Add On for Freeplane @@ -5774,7 +6258,7 @@ assert cumple(dato) - + # Description **'Map Saving Options'** is a **Freeplane AddOn** that gives you the possibility to add **saving preferences** to **each** of your **maps**. @@ -5879,7 +6363,7 @@ assert cumple(dato) - + @@ -5995,7 +6479,7 @@ assert cumple(dato) - + @@ -6144,7 +6628,7 @@ assert cumple(dato) - + @@ -6267,7 +6751,7 @@ assert cumple(dato) - + @@ -6276,9 +6760,12 @@ assert cumple(dato)

    next steps Sample Map

    +

    + completedTask +

    - + @@ -6337,8 +6824,8 @@ def repite(a,b){ - - + + @@ -6475,10 +6962,13 @@ def repite(a,b){

    .groovy

    +

    + discardedTask +

    - + @@ -6615,10 +7105,13 @@ def addShowMenuItemPane(myP, nodos){

    .groovy

    +

    + discardedTask +

    - + @@ -6704,10 +7197,13 @@ def addShowMenuItemPane(myP, nodos){

    .groovy

    +

    + discardedTask +

    - + @@ -6820,7 +7316,7 @@ def addShowMenuItemPane(myP, nodos){ - + @@ -6931,42 +7427,95 @@ def addShowMenuItemPane(myP, nodos){ - - - - + + + + + + +

    + completedTask +

    + +
    + + + - - - + + + - + + + + + + + + + + + + +

    + completedTask +

    + +
    +
    + + + + + + +

    + completedTask +

    + +
    - - - + + + + + + + +

    + completedTask +

    + +
    - - - - - + - - - - - + + + + + + +

    + completedTask +

    + +
    + + + + - - - + + + - + @@ -6977,11 +7526,11 @@ def addShowMenuItemPane(myP, nodos){

    - +
    - + @@ -7145,10 +7694,13 @@ def changeButtonPanel(boton, html, buttonLabel, buttonToolTip, buttonAction){

    .groovy

    +

    + discardedTask +

    - + @@ -7438,10 +7990,13 @@ def changeButtonPanel(boton, html, buttonLabel, buttonToolTip, buttonAction){

    .groovy

    +

    + discardedTask +

    - + @@ -7555,7 +8110,7 @@ def changeButtonPanel(boton, html, buttonLabel, buttonToolTip, buttonAction){ - + @@ -7644,222 +8199,105 @@ def setPanelEnabled(panel, Boolean isEnabled) { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + +

    - pre { + package edofro.tutorialomatic

    -     background-color: #e5e7ff; +

    -     border-left: 5px solid #ccc; + import edofro.tutorialomatic.ToM_ui      as tomui

    -     display: block; + import edofro.tutorialomatic.ToM_actions as toma

    -     padding: 8px; +

    -     margin: 5px; + import edofro.menuomatic.WSE_redux              as WSE

    - } +

    - code { + import org.freeplane.core.ui.components.UITools as ui

    -     font-family: Consolas,"courier new"; + import org.freeplane.plugin.script.proxy.ScriptUtils

    -     font-size: 11px; + import org.freeplane.core.util.MenuUtils            as menuUtils

    -     color: #999; + //import org.freeplane.core.util.HtmlUtils            as htmlUtils

    - } +

    - blockquote { + import org.freeplane.api.Node as ApiNode

    -     border-left: 5px solid #cccccc; + import org.freeplane.api.MindMap as ApiMindMap

    -     background-color: #eeeeee; +

    -     padding: 8px; +

    - } + class ToM{

    - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - package edofro.tutorialomatic +

    - +     // region: properties

    - import edofro.tutorialomatic.ToM_ui      as tomui -

    -

    - import edofro.tutorialomatic.ToM_actions as toma -

    -

    - -

    -

    - import edofro.menuomatic.WSE_redux              as WSE -

    -

    - -

    -

    - import org.freeplane.core.ui.components.UITools as ui -

    -

    - import org.freeplane.plugin.script.proxy.ScriptUtils -

    -

    - -

    -

    - -

    -

    - -

    -

    - class ToM{ +         // this region has all the properties for the ToM class

    -     // region: properties +     static final String version           = '0.0.6'

    -         // this region has all the properties for the ToM class +     static final c                        = ScriptUtils.c()

    - +     static final String idDictStorage     = 'ToM_idDictionary'

    -     static final String version        = '0.0.4' +     static final String attributeTabLabel = 'ToM_TabLabel'

    -     static final c                     = ScriptUtils.c() +     static final String defaultTabLabel   = 'Tutorial'

    -     static final String tabName        = 'Tutorial' +     static final String defaultMapTutorialsTabLabel = 'Tutorials'

    -     static final String idDictStorage  = 'ToM_idDictionary' +     static final String attributeNewPageLink        = 'ToM_LinkToPage'

    @@ -7912,6 +8350,9 @@ def setPanelEnabled(panel, Boolean isEnabled) {

            showNode  : 'ToM_showNode'  ,

    +

    +         openTutorialPage : 'ToM_openTutPage', +

        ]

    @@ -7940,7 +8381,7 @@ def setPanelEnabled(panel, Boolean isEnabled) {

    -     def static getNextTutNodes(n, boolean included = false){ +     def static getNextTutNodes( n, boolean included = false){

            def tutNodes  = getTutNodes(getTutorialNode(n)) @@ -7961,10 +8402,58 @@ def setPanelEnabled(panel, Boolean isEnabled) {

    -     def static getTutNodes(nTutorial){ +     def static getTutNodes( nTutorial){ +

    +

    +         return nTutorial.find{isTutNode(it) && !isBlocked(it)} +

    +

    +     } +

    +

    +      +

    +

    +     def static isTutNode( n){ +

    +

    +         return n?.style?.name?.startsWith(styles.ini)?:false +

    +

    +     } +

    +

    +      +

    +

    +     def static isBlocked(n){ +

    +

    +         return (n && (n.pathToRoot - n).any{it.icons.icons.contains('closed')}) +

    +

    +     } +

    +

    + +

    +

    +     def static getTutorialNode( n){ +

    +

    +         return n.pathToRoot.find{isTutorialNode(it)} +

    +

    +     } +

    +

    + +

    +

    +     def static isTutorialNode( n){

    -         return nTutorial.find{it.style.name?.startsWith(styles.ini)?:false} +         return n.style.name == styles.tutorial

        } @@ -7973,10 +8462,22 @@ def setPanelEnabled(panel, Boolean isEnabled) {

    -     def static getTutorialNode(n){ +     def static getNewPageNodes( nTutorial){ +

    +

    +         return nTutorial.find{isNewPageNode(it)} +

    +

    +     } +

    +

    +      +

    +

    +     def static isNewPageNode( n){

    -         return n.pathToRoot.find{it.style.name == styles.tutorial} +         return n.style.name == styles.newPage

        } @@ -7985,10 +8486,13 @@ def setPanelEnabled(panel, Boolean isEnabled) {

    -     def static getNewPageNodes(nTutorial){ +     def static isEditingMode( n){ +

    +

    +         def nodo = getTutorialNode(n)

    -         return nTutorial.find{it.style.name == styles.newPage} +         return nodo.icons.contains('emoji-1F58D')

        } @@ -8014,6 +8518,9 @@ def setPanelEnabled(panel, Boolean isEnabled) {

        def static fillContentPane(myPanel, nextTutNodes, boolean doClear = true){

    +

    +         def options = tomui.tomMarkedjOptions() +

            def interruptLoop = false

    @@ -8036,7 +8543,7 @@ def setPanelEnabled(panel, Boolean isEnabled) {                 case styles.note:

    -                     addNotes(myPanel, tutNode.children) +                     addNotes(myPanel, tutNode.children, options)

                        break @@ -8081,7 +8588,7 @@ def setPanelEnabled(panel, Boolean isEnabled) {                 case styles.showMenu:

    -                     addShowMenuItemPane(myPanel, tutNode.children) +                     addShowMenuItemPane(myPanel, tutNode.children, options)

                        break @@ -8099,7 +8606,16 @@ def setPanelEnabled(panel, Boolean isEnabled) {                 case styles.goto:

    -                     addGotoPane(myPanel, tutNode.children, nextTutNodes[0]) +                     addGotoPane(myPanel, tutNode, nextTutNodes[0], options) +

    +

    +                     break +

    +

    +                 case styles.openTutorialPage: +

    +

    +                     addOpenTutorialPage(myPanel, tutNode, options)

                        break @@ -8108,7 +8624,7 @@ def setPanelEnabled(panel, Boolean isEnabled) {                 case styles.action:

    -                     addActionPane(myPanel, tutNode) +                     addActionPane(myPanel, tutNode, options)

                        break @@ -8144,7 +8660,7 @@ def setPanelEnabled(panel, Boolean isEnabled) {                 case styles.openMap:

    -                     addOpenMapPane(myPanel, tutNode) +                     addOpenMapPane(myPanel, tutNode, options)

                        break @@ -8201,7 +8717,7 @@ def setPanelEnabled(panel, Boolean isEnabled) {

    -     def static fillPage(myP, nodo, included, doClear){ +     def static fillPage(myP,  nodo, boolean included, boolean doClear){

            def nextNodes = getNextTutNodes(nodo, included) @@ -8231,7 +8747,7 @@ def setPanelEnabled(panel, Boolean isEnabled) {

    -     def static addNotes(myP, nodos){ +     def static addNotes(myP, nodos, options){

            nodos.each{n -> @@ -8240,7 +8756,7 @@ def setPanelEnabled(panel, Boolean isEnabled) {             if(n.note) {

    -                 myP.add(tomui.createInstructionsPane(n), tomui.GBC) +                 myP.add(tomui.createInstructionsPane(n, options), tomui.GBC)

                } @@ -8253,12 +8769,24 @@ def setPanelEnabled(panel, Boolean isEnabled) {

    +

    +

    +     def static htmlTitle(String texto){ +

    +

    +         return "<html><style>h1 {color: rgb(240, 240, 240);background-color: rgb(100, 100, 150);display: block;padding: 10px;}</style><body><h1>${texto}</h1></body></html>" +

    +

    +     } +

    +

    +

        def static addPageTitle(myP, String texto){

    -         def html = "<html><style>h1 {color: rgb(240, 240, 240);background-color: rgb(100, 100, 150);display: block;padding: 10px;}</style><body><h1>${texto}</h1></body></html>" +         def html = htmlTitle(texto)

            myP.add(tomui.createInstructionsPane(html), tomui.GBC) @@ -8267,154 +8795,154 @@ def setPanelEnabled(panel, Boolean isEnabled) {     }

    - +         

    -     def static addPageTitle(myP, nodo){ +     def static addPageTitle(myP,  ApiNode nodo){

    -         addPageTitle(myP, nodo.text) +         def html = htmlTitle(nodo.text)

    -     } +         def bttnText   

    - +         def bttnToolTip

    -     def static addNextPagePane(myP, lastNode, boolean included = false, boolean showNextButton = true){ +         def bttnAction 

    -         def closeLabel   = 'Stop tutorial' +         def bttnIcon

    -         def closeToolTip = 'Click to stop the tutorial and close the tutorial tab' +         def botones = []

    -         def nextLabel    = showNextButton?'Next page':'Show tutorials' +

    -         def nextToolTip  = showNextButton?'Click to continue to the next page of the tutorial':'Click to see the list of tutorials' +         bttnText    = null //'link'

    -         def bttnAction   = showNextButton? { e -> fillPage(myP, lastNode, included, true) } : { e -> showTutorials(lastNode.mindMap) }  +         bttnToolTip = "Click to insert node with link to '${nodo.text}' section"

    -         def tocLabel     = 'Table of Contents' +         bttnAction  = { e -> 

    -         def tocToolTip   = 'Click to show the Table of Contents of the tutorial' +             def newPageNode = nodo

    -         def tocBttnAction   = { e -> showTOC(myP,lastNode) } +             def selectedNode = c.selected

    - +             def linkNode = selectedNode.createChild(newPageNode.text)

    -         def nextButtonPanel = tomui.createNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction, tocLabel, tocToolTip, tocBttnAction) +             linkNode[attributeNewPageLink] = getUriFromNode(newPageNode)

    -         myP.add(nextButtonPanel, tomui.GBC) +             linkNode.link.uri = new URI('menuitem:_addons.tutorialOMatic.openTutorialPageFromLink_on_single_node')

    -     } +         }

    - +         bttnIcon    = menuUtils.getMenuItemIcon('IconAction.emoji-1F517')

    -     def static addShowMenuItemPane(myP, nodos){ +         botones << [bttnText, bttnToolTip, bttnAction, bttnIcon]

    -         nodos.findAll{n -> toma.hasAction(n)}.each{nodo -> +         

    -             def infoAccion  = toma.getActionInfoMap(nodo) +         if (isEditingMode(nodo)) {

    -             if (infoAccion){ +             bttnText    = null //"inspect"

    -                 def msgHtml     = infoAccion.instructions +             bttnToolTip = "Click to select the page's source nodes"

    -                 def bttnText    = 'Show it in the menu' +             bttnAction  = { e ->

    -                 def bttnToolTip = "Click to see where is ${toma.apos(infoAccion.label)} in Freeplane Menu" +                 def pageNode = nodo   //.parent

    -                 def bttnAction  = { e -> +                 def m = c.mapLoader(nodo.map.file).withView()//.selectNodeById(pageNodeId)

    -                         def bttn = e.source +                 m.load()

    -                         def sel = bttn.isSelected() +                 pageNode.pathToRoot*.folded = false

    -                         def bttnPanel = tomui.getButtonPanel(bttn) +                 c.select(pageNode)

    -                         bttnPanel.pending = sel +             }

    -                         toma.closeMenus(infoAccion.action) +             bttnIcon    = menuUtils.getMenuItemIcon('IconAction.emoji-1F52C')

    -                         if (sel) { +             botones << [bttnText, bttnToolTip, bttnAction, bttnIcon]

    -                             toma.openMenus(infoAccion.action, 400) +             

    -                             bttn.label = 'Close menu' +             bttnText    = null //'reload'

    -                             tomui.setNextPagePanelEnabled(myP, false) +             bttnToolTip = "Click to reload '${nodo.text}' section"

    -                         } else { +             bttnAction  = { e -> fillPage(myP, nodo, true, true)}

    -                             bttn.label = 'Show me' +             bttnIcon    = menuUtils.getMenuItemIcon('IconAction.emoji-1F504')

    -                             if(! tomui.anyCompPending(myP) ) tomui.setNextPagePanelEnabled(myP, true) +             botones << [bttnText, bttnToolTip, bttnAction, bttnIcon]

    -                         } +         } 

    -                     } +         // else {

    - +             // addPageTitle(myP, nodo.text)

    -                 def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, true) +         // }

    -                 buttonPanel.metaClass.pending = false +         myP.add(tomui.createPageTitlePane(html, botones), tomui.GBC)

    -                 myP.add(buttonPanel, tomui.GBC) +     }

    -             } else { +     

    -                 def textoHtml = '<html><body><p>Command not encountered in Menu for active map</p></body></html>' +     def static getUriFromNode(ApiNode nodo, String sch = 'tutorial'){

    -                 myP.add(tomui.createInstructionsPane(textoHtml), tomui.GBC) +         def ssp = nodo.map.file.toURI().schemeSpecificPart

    -             } +         def frg = nodo.id

    -         } +         return new URI(sch, ssp, frg)

        } @@ -8423,499 +8951,505 @@ def setPanelEnabled(panel, Boolean isEnabled) {

    -     def static addGotoPane(myP, nodos, backNode){ +     def static addNextPagePane(myP, ApiNode lastNode, boolean included = false, boolean showNextButton = true){

    -         nodos.findAll{n -> n.link.node?true:false}.each{nodo -> +         def closeLabel   = 'Stop tutorial'

    -             def targetNode  = nodo.link.node +         def closeToolTip = 'Click to stop the tutorial and close the tutorial tab' +

    +

    +         def nextLabel    = showNextButton?'Next page':'Show tutorials'

    -             def msgHtml     = nodo.note?tomui.getHtmlFromNote(nodo):null +         def nextToolTip  = showNextButton?'Click to continue to the next page of the tutorial':'Click to see the list of tutorials'

    -             def bttnText    = nodo.text +         def bttnAction   = showNextButton? { e -> fillPage(myP, lastNode, included, true) } : { e -> showTutorials(lastNode.mindMap) } 

    -             def bttnToolTip = "Click to go to '${bttnText}' section" +         def tocLabel     = 'Table of Contents'

    -             def bttnAction  = { e -> gotoAction(myP, targetNode, backNode) } +         def tocToolTip   = 'Click to show the Table of Contents of the tutorial'

    -             def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +         def tocBttnAction   = { e -> showTOC(myP,lastNode) }

    -             myP.add(buttonPanel, tomui.GBC) +

    -         } +         def nextButtonPanel = tomui.createNextButtonPanel(closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction, tocLabel, tocToolTip, tocBttnAction) +

    +

    +         myP.add(nextButtonPanel, tomui.GBC)

        }

    -      +

    -      def static gotoAction(myP,targetNode, backNode){ +     def static addShowMenuItemPane(myP, nodos, options){

    -          myP.removeAll() +         nodos.findAll{n -> toma.hasAction(n)}.each{nodo ->

    -          addReturnPane(myP, backNode) +             def infoAccion  = toma.getActionInfoMap(nodo)

    -          fillPage(myP, targetNode, true, false) +             if (infoAccion){

    -          addReturnPane(myP, backNode) +                 def msgHtmlA    = nodo.note?tomui.getHtmlFromNote(nodo, options):null

    -      } +                 def msgHtmlB    = infoAccion.instructions

    -      +                 def msgHtml     = tomui.mergeHtml(msgHtmlA,msgHtmlB)

    -     def static addReturnPane(myP, backNode){ +                 def botones = []

    -         def msgHtml     = "Return to '${backNode.text}' page" +                 def bttnText    

    -         def bttnText    = 'go back' +                 def bttnToolTip 

    -         def bttnToolTip = "Click to go to '${backNode.text}' section" +                 def bttnAction  

    -         def bttnAction  = { e -> fillPage(myP, backNode, true, true)} +                 def bttnIcon

    -         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +                 

    -         myP.add(buttonPanel, tomui.GBC) +                 bttnText    = null //'Show me'

    -     } +                 bttnToolTip = "Click to see where is ${toma.apos(infoAccion.label)} in Freeplane Menu"

    - +                 bttnAction  = { e ->

    -     def static addGroovyPane(myP, nodoT){ +                         def bttn = e.source

    -         def enabled = !disableBttn(nodoT) +                         def sel = bttn.isSelected()

    -         nodoT.children.findAll{n -> WSE.isGroovyNode(n)}.each{nodo -> +                         def bttnPanel = tomui.getButtonPanel(bttn)

    -             def script = WSE.scriptFromNode(nodo) +                         bttnPanel.pending = sel

    -             if (script){ +                         toma.closeMenus(infoAccion.action)

    -                 def scrText     = script + "\n c.statusInfo = '---- ready ----'".toString() +                         if (sel) {

    -                 def msgHtml     = getGroovyHtml(nodo, script) +                             toma.openMenus(infoAccion.action, 400)

    -                 def bttnText    = 'Execute' +                             bttn.label = 'Close menu'

    -                 def bttnToolTip = "Click to execute script on selected nodes" +                             tomui.setNextPagePanelEnabled(myP, false)

    -                 def bttnAction  = { e -> +                         } else {

    -                         def bttn = e.source +                             bttn.label = null // 'Show me'

    -                         bttn.setEnabled(enabled) +                             if(! tomui.anyCompPending(myP) ) tomui.setNextPagePanelEnabled(myP, true)

    -                         c.script(scrText, "groovy").executeOn(c.selected) +                         }

                        }

    - +                 bttnIcon = menuUtils.getMenuItemIcon('IconAction.emoji-1F50D')

    -                 def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +                 

    -                 buttonPanel.metaClass.pending = false +                 botones << [bttnText, bttnToolTip, bttnAction, bttnIcon, true]

    -                 myP.add(buttonPanel, tomui.GBC) +                 

    -             } else { +                 if(withExecute(nodo)){

    -                 def textoHtml = '<html><body><p>No script encountered in tutorial node</p></body></html>' +                     def enabled = !disableBttn(nodo)

    -                 myP.add(tomui.createInstructionsPane(textoHtml), tomui.GBC) +                     def exeHow  = exeActionsHow(nodo)

    -             } +                     bttnText    = null // 'Execute'

    -         } +                     bttnToolTip =  "Click to execute the command on the selected nodes"

    -     } +                     bttnAction  = { e ->

    - +                             def bttn = e.source

    -      def static getGroovyHtml(nodo, script){ +                             bttn.setEnabled(enabled)

    -          def showScript = nodo.icons.icons.contains('emoji-1F50D') +                             toma.executeActions([] << infoAccion, exeHow)

    -          uiMsg("showScript ${showScript}") +                         }

    -          def html = showScript? tomui.getHtmlFromGroovyNode(nodo, script) : nodo.text +                     bttnIcon = menuUtils.getMenuItemIcon('IconAction.launch')

    -          uiMsg("html ${html}") +

    -          return html +                     botones << [bttnText, bttnToolTip, bttnAction, bttnIcon, true]

    -      } +                 }

    -     def static addActionPane(myP, nodo){ +                 

    -         def infoAcciones = [] +                 def buttonPanel = tomui.createButtonPanel(msgHtml, botones)

    -         nodo.children.findAll{n -> toma.hasAction(n)}.each{n -> +                 

    -             def infoAccion = toma.getActionInfoMap(n) +                 

    -             infoAcciones << infoAccion +                 buttonPanel.metaClass.pending = false

    -         } +                 myP.add(buttonPanel, tomui.GBC)

    -         def msgHtml = nodo.note?tomui.getHtmlFromNote(nodo):null +             } else {

    -         def bttnText    = 'Execute' +                 def textoHtml = '<html><body><p>Command not encountered in Menu for active map</p></body></html>'

    -         def bttnToolTip =  "Click to execute the command on the selected nodes" +                 myP.add(tomui.createInstructionsPane(textoHtml), tomui.GBC)

    -         def enabled = !disableBttn(nodo) +             }

    -         def exeHow  = exeActionsHow(nodo) +         }

    -         def bttnAction = { e -> +     }

    -                 def bttn = e.source +     

    -                 bttn.setEnabled(enabled) +     def static withExecute( ApiNode nodo){

    -                 toma.executeActions(infoAcciones, exeHow) +         return nodo.icons.icons.contains('emoji-1F525')

    -             } +     }

    - +     

    -         def buttonPanel = ToM_ui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +     

    -         myP.add(buttonPanel, tomui.GBC) +

    -     } +     def static addGotoPane(myP, ApiNode tNode, ApiNode backNode, options){

    - +         backNode = withGoBack(tNode)?backNode:null

    -      def static exeActionsHow(nodo){ +         def nodos = tNode.children

    -          def iconos = nodo.icons.icons +         nodos.findAll{n -> n.link.node?true:false}.each{nodo ->

    -          def iconitos = iconos.intersect(exeHowIcons) +             def targetNode  = nodo.link.node

    -          if(iconitos){ +             def msgHtml     = nodo.note?tomui.getHtmlFromNote(nodo, options):null

    -              def index = exeHowIcons.indexOf(iconitos[0]) +             def bttnText    = nodo.htmlText

    -              return toma.ex.values()[index] +             def bttnToolTip = "Click to go to '${nodo.plainText.replace('\n',' ')}' section"

    -          } else { +             def bttnAction  = { e -> 

    -              return toma.ex.showHotKeys +                 if(targetNode.style.name == styles.tutorial){

    -          } +                     def tutorialTabName = targetNode[attributeTabLabel] ?: defaultTabLabel

    -      } +                     def myP_thisTutorial = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true)

    - +                     gotoAction(myP_thisTutorial, targetNode, myP.equals(myP_thisTutorial) ? backNode : null) 

    -      def static disableBttn(nodo){ +                 } else {

    -          def iconos = nodo.icons.icons +                     gotoAction(myP, targetNode, backNode) 

    -          return iconos.contains('emoji-1F56F') +                 }            

    -      } +              }

    - +             def buttonPanel = tomui.createButtonPanel(msgHtml, bttnText, bttnToolTip, bttnAction, false)

    -     def static addPastePane(myP, nodoSource){ +             myP.add(buttonPanel, tomui.GBC)

    -         def enabled     = !disableBttn(nodoSource) +         }

    -         def msgHtml     = "Click to paste the example nodes to the selected node" +     }

    -         def bttnText    = "Insert nodes" +     

    -         def bttnToolTip = "Click to paste the example nodes to the selected node" +     def static withGoBack( ApiNode nodo){

    -         def bttnAction  = { e -> +         return nodo.icons.icons.contains('emoji-1F519')

    -             def bttn = e.source +     }

    -             bttn.setEnabled(enabled) +     

    -             def nodoTarget = c.selected +      def static gotoAction(myP, ApiNode targetNode, ApiNode backNode){

    -             def existentesNodoTarget = nodoTarget.findAll() +          myP.removeAll()

    -             nodoSource.children.each{n -> +          if (backNode) addReturnPane(myP, backNode)

    -                 nodoTarget.appendBranch(n) +          fillPage(myP, targetNode, true, false)

    -             } +          if (backNode) addReturnPane(myP, backNode)

    -             def idSource = ( nodoSource.findAll() - nodoSource )*.id +      }

    -             def idTarget = ( nodoTarget.findAll() - existentesNodoTarget )*.id +     

    -             //carga idDictionary desde mapa.storage +     def static addReturnPane(myP,  ApiNode backNode){

    -             def mapa = nodoTarget.map +         def msgHtml     = "Return to '${backNode.text}' page"

    -             def idDictionary = getIdDictionary(mapa) +         def bttnText    = 'go back'

    -             //actualiza idDictionary +         def bttnToolTip = "Click to go to '${backNode.plainText.replace('\n',' ')}' section"

    -             for (def i = 0; i < idSource.size() ; i++){ +         def bttnAction  = { e -> fillPage(myP, backNode, true, true)}

    -                 idDictionary[ idSource[i] ] = idTarget[i] +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false)

    -             } +         myP.add(buttonPanel, tomui.GBC)

    -             //guarda idDictionary en mapa +     }

    -             setIdDictionary(mapa, idDictionary) +     

    -         } +     def static addOpenTutorialPage(myP, ApiNode tNode, options){

    -         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +         def nodos = tNode.children.findAll{ n -> isValidUri(n.link?.uri) || isValidUri(n[attributeNewPageLink].uri)}

    -         myP.add(buttonPanel, tomui.GBC) +         nodos.each{nodo ->

    -     } +             def msgHtml     = nodo.note?tomui.getHtmlFromNote(nodo, options):null

    - +             def bttnText    = nodo.htmlText

    -     def static addSelectPane(myP, nodo){ +             def bttnToolTip = "Click to go to '${nodo.plainText.replace('\n',' ')}' section"

    -         def enabled     = !disableBttn(nodo) +             def bttnAction  = { e -> 

    -         def msgHtml     = "Click to select the node(s)" +                 openTutorialPage(nodo)

    -         def bttnText    = "Select node(s)" +             }

    -         def bttnToolTip = "Click to select the nodes" +             def buttonPanel = tomui.createButtonPanel(msgHtml, bttnText, bttnToolTip, bttnAction, false)

    -         def bttnAction  = { e -> +             myP.add(buttonPanel, tomui.GBC)

    -             def bttn = e.source +         }

    -             bttn.setEnabled(enabled) +     }

    -             //carga idDictionary desde mapa.storage +

    -             def mapa = c.selected.map +     def static addGroovyPane(myP, ApiNode nodoT){

    -             def idDictionary = getIdDictionary(mapa) +         def parentEnabled = !disableBttn(nodoT)

    -             def nodos = [] +         def parentReadOnly = isReadOnly(nodoT)

    -             (nodo.findAll()- nodo).each{ n -> +         nodoT.children.findAll{n -> WSE.isGroovyNode(n)}.each{nodo ->

    -                 //get list of clones ids +             def enabled = parentEnabled && !disableBttn(nodo)

    -                 uiMsg("n.Id ${n.id}") +             def readOnly = parentReadOnly || isReadOnly(nodo)

    -                 def clonesIds = n.getNodesSharingContent()*.id +             def script = WSE.scriptFromNode(nodo)

    -                 uiMsg("clonesIds $clonesIds") +             if (script){

    -                 //intersect with list of dist.keySet +                 def scrText     = script + "\n c.statusInfo = '---- ready ----'".toString()

    -                 def keySet = idDictionary.keySet() +                 def msgHtml     = getGroovyHtml(nodo, script)

    -                 uiMsg("keySet $keySet") +                 if(readOnly){

    -                 def sourceId = keySet.intersect(clonesIds) +                     myP.add(tomui.createInstructionsPane(msgHtml), tomui.GBC)

    -                 uiMsg("sourceId $sourceId") +                 } else {

    -                 //get Target id +                     def bttnText    = enabled ? 'Execute' : 'Execute 1 time'

    -                 def targetId = sourceId?idDictionary[ sourceId[0] ]:null +                     def bttnToolTip = "Click to execute script on selected nodes"

    -                 uiMsg("targetId $targetId") +                     def bttnAction  = { e ->

    -                 //get node +                             def bttn = e.source

    -                 def targetNode = targetId?mapa.node(targetId):null +                             bttn.setEnabled(enabled)

    -                 uiMsg("targetNode $targetNode") +                             c.script(scrText, "groovy").executeOn(c.selected)

    -                 //add node to nodes list +                         }

    -                 if(targetNode) nodos += targetNode +                     def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false)

    -                 uiMsg("nodos $nodos") +                     buttonPanel.metaClass.pending = false

    -             } +                     myP.add(buttonPanel, tomui.GBC)

    -             //select nodes list +                 }

    -             uiMsg("nodos $nodos") +             } else {

    -             c.select(nodos) +                 def textoHtml = '<html><body><p>No script encountered in tutorial node</p></body></html>'

    -         } +                 myP.add(tomui.createInstructionsPane(textoHtml), tomui.GBC)

    -         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +             }

    -         myP.add(buttonPanel, tomui.GBC) +         }

        } @@ -8924,1201 +9458,1126 @@ def setPanelEnabled(panel, Boolean isEnabled) {

    -      def static getIdDictionary(mapa){ +      def static getGroovyHtml( ApiNode nodo, script){

    -          def dict = [:] +          def showScript = nodo.icons.icons.contains('emoji-1F50D')  ||  nodo.icons.icons.contains('emoji-1F453') 

    -          def textoDict = mapa.storage[idDictStorage] +          uiMsg("showScript ${showScript}")

    -          if(textoDict){ +          def html = showScript? tomui.getHtmlFromGroovyNode(nodo, script) : nodo.htmlText

    -              textoDict.toString().split(';').each{e -> +          uiMsg("html ${html}")

    -                  def (k,v) = e.split(':') +          return html

    -                  dict[k] = v +      }

    -              } +

    -          } +     def static addActionPane(myP, ApiNode nodo, options){

    -          return dict +         def infoAcciones = []

    -      } +         nodo.children.findAll{n -> toma.hasAction(n)}.each{n ->

    - +             def infoAccion = toma.getActionInfoMap(n)

    -      def static setIdDictionary(mapa, dict){ +             infoAcciones << infoAccion

    -          def texto = new StringBuilder() +         }

    -          dict.each{k,v -> +         def msgHtml = nodo.note?tomui.getHtmlFromNote(nodo, options):null

    -              texto << "${k}:${v};" +         def bttnText    = 'Execute'

    -          } +         def bttnToolTip =  "Click to execute the command on the selected nodes"

    -          mapa.storage[idDictStorage] = texto +         def enabled = !disableBttn(nodo)

    -      } +         def exeHow  = exeActionsHow(nodo)

    - +         def bttnAction = { e ->

    -     def static addOpenMapPane(myP, tutNode){ +                 def bttn = e.source

    -         def sep         = File.separator +                 bttn.setEnabled(enabled)

    -         def nodoMapa    = tutNode.children.find{it.text.endsWith('.mm')} +                 toma.executeActions(infoAcciones, exeHow)

    -         def mapFileName = nodoMapa?.text +             }

    -         def Dir         = tutNode.map.file.parent +

    -         def pathName    = Dir + sep + mapFileName +         def buttonPanel = ToM_ui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false)

    -         def enabled     = !disableBttn(tutNode) +         myP.add(buttonPanel, tomui.GBC)

    -         def msgHtml     = tomui.getHtmlFromNote(nodoMapa)?:"Click to open '${mapFileName}'" +     }

    -         def bttnText    = "Open map '${mapFileName}'" +

    -         def bttnToolTip = "Click to open '${mapFileName}'" +      def static exeActionsHow( ApiNode nodo){

    -         def bttnAction  = { e -> +          def iconos = nodo.icons.icons

    -             def bttn = e.source +          def iconitos = iconos.intersect(exeHowIcons)

    -             bttn.setEnabled(enabled) +          if(iconitos){

    -             def mapa = getMapFromPath(pathName, true) //usar mapa indicado (pero oculto) +              def index = exeHowIcons.indexOf(iconitos[0])

    -         } +              return toma.ex.values()[index]

    -         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +          } else {

    -         myP.add(buttonPanel, tomui.GBC) +              return toma.ex.showHotKeys

    -     } +          } +

    +

    +      }

    -     def static addInspectPane(myP, nodo){ +      def static disableBttn( ApiNode nodo){

    -         def msgHtml     = "Click to inspect this page in the tutorial map" +          def iconos = nodo.icons.icons

    -         def bttnText    = "inspect" +          return iconos.contains('emoji-1F56F')

    -         def bttnToolTip = "Click to select the page's source nodes" +      }

    -         def bttnAction  = { e -> +      

    -             def pageNode = nodo.parent +      def static isReadOnly( ApiNode nodo){

    -             def m = c.mapLoader(nodo.map.file).withView()//.selectNodeById(pageNodeId) +          def iconos = nodo.icons.icons

    -             m.load() +          return iconos.contains('emoji-1F453')

    -             pageNode.pathToRoot*.folded = false +      }

    -             c.select(pageNode) +

    -         } +     def static addPastePane(myP, ApiNode nodoSource){

    -         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +         def enabled     = !disableBttn(nodoSource)

    -         myP.add(buttonPanel, tomui.GBC) +         def msgHtml     = "Click to paste the example nodes to the selected node"

    -     } +         def bttnText    = "Insert nodes"

    - +         def bttnToolTip = "Click to paste the example nodes to the selected node"

    -     def static addShowNodePane(myP, nodo){ +         def bttnAction  = { e ->

    -         def nodos = nodo.children.findAll{ n -> n.link && (n.link.node || (!n.link.node && !n.link.file && n.link.uri.scheme == 'file'))} +             def bttn = e.source

    -         nodos.each{ n -> +             bttn.setEnabled(enabled)

    -             def msgHtml     = "Click to show ${n.text}" +             def nodoTarget = c.selected

    -             def bttnText    = "goto Node" +             def existentesNodoTarget = nodoTarget.findAll()

    -             def bttnToolTip = "Click to show ${n.text}" +             nodoSource.children.each{n ->

    -             def bttnAction   +                 nodoTarget.appendBranch(n)

    -             if(n.link.node){ +             }

    -                 bttnAction = { e -> +             def idSource = ( nodoSource.findAll() - nodoSource )*.id

    -                     def tNode = n.link.node +             def idTarget = ( nodoTarget.findAll() - existentesNodoTarget )*.id

    -                     def m = c.mapLoader(tNode.map.file).withView()//.selectNodeById(pageNodeId) +             //carga idDictionary desde mapa.storage

    -                     m.load() +             def mapa = nodoTarget.map

    -                     tNode.pathToRoot*.folded = false +             def idDictionary = getIdDictionary(mapa)

    -                     c.select(tNode) +             //actualiza idDictionary

    -                     c.centerOnNode(tNode) +             for (def i = 0; i < idSource.size() ; i++){

    -                 } +                 idDictionary[ idSource[i] ] = idTarget[i]

    -             } else { +             }

    -                 bttnAction = { e -> +             //guarda idDictionary en mapa

    -                     def path = n.link.uri.path.drop(1) +             setIdDictionary(mapa, idDictionary)

    -                     def id = n.link.uri.fragment +         }

    -                     def m = c.mapLoader(path).withView()//.selectNodeById(pageNodeId) +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false)

    -                     m.load() +         myP.add(buttonPanel, tomui.GBC)

    -                     def tNode = m.mindMap.node(id) +     }

    -                     tNode.pathToRoot*.folded = false +

    -                     c.select(tNode) +     def static addSelectPane(myP, ApiNode nodo){

    -                     c.centerOnNode(tNode) +         def enabled     = !disableBttn(nodo)

    -                 } +         def msgHtml     = "Click to select the node(s)"

    -             } +         def bttnText    = "Select node(s)"

    -             def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false) +         def bttnToolTip = "Click to select the nodes"

    -             myP.add(buttonPanel, tomui.GBC) +         def bttnAction  = { e ->

    -         } +             def bttn = e.source

    -     } +             bttn.setEnabled(enabled)

    - +             //carga idDictionary desde mapa.storage

    -     def static addTOCPane(myP,nodo){ +             def mapa = c.selected.map

    -         def titleNodes  = getNewPageNodes(getTutorialNode(nodo)) +             def idDictionary = getIdDictionary(mapa)

    -         def pane = tomui.createEmptyGridBagPanel() +             def nodos = []

    -         titleNodes.each{ tn -> +             (nodo.findAll()- nodo).each{ n ->

    -             def title = tn.text +                 //get list of clones ids

    -             def bttnAction   = { e -> fillPage(myP, tn, true, true) } +                 uiMsg("n.Id ${n.id}")

    -             def button = tomui.createButton(title, bttnAction) +                 def clonesIds = n.getNodesSharingContent()*.id

    -             pane.add(button, tomui.GBC) +                 uiMsg("clonesIds $clonesIds")

    -         } +                 //intersect with list of dist.keySet

    -         myP.add(pane, tomui.GBC) +                 def keySet = idDictionary.keySet()

    -     } +                 uiMsg("keySet $keySet")

    - +                 def sourceId = keySet.intersect(clonesIds)

    -     def static addTutorialsPane(myP, mapa){ +                 uiMsg("sourceId $sourceId")

    -         def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial} +                 //get Target id

    -         if ( nodosTutoriales.size() != 1 ){ +                 def targetId = sourceId?idDictionary[ sourceId[0] ]:null

    -             def pane = tomui.createEmptyGridBagPanel() +                 uiMsg("targetId $targetId")

    -             def pre  = nodosTutoriales.size() == 0 ? "No t" : "T" +                 //get node

    -             addPageTitle(myP, "${pre}utorials present in '${mapa.name}' map".toString()) +                 def targetNode = targetId?mapa.node(targetId):null

    -             nodosTutoriales.each{ nT -> +                 uiMsg("targetNode $targetNode")

    -                 def title = nT.text +                 //add node to nodes list

    -                 def bttnAction   = { e -> +                 if(targetNode) nodos += targetNode

    -                     def tutNodes = getTutNodes(nT) +                 uiMsg("nodos $nodos")

    -                     if(tutNodes) { +             }

    -                         fillContentPane(myP, tutNodes) +             //select nodes list

    -                     } else { +             uiMsg("nodos $nodos")

    -                         ui.informationMessage( "no tutorial components(nodes) found for tutorial '${nT.text}'".toString() ) +             c.select(nodos)

    -                     } +         }

    -                 } +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false)

    -                 def button = tomui.createButton(title, bttnAction) +         myP.add(buttonPanel, tomui.GBC)

    -                 pane.add(button, tomui.GBC) +     }

    -             } +

    -             def stopButton = tomui.createButton('Exit tutorial', {tomui.closeTab(tabName)}) +      def static getIdDictionary(ApiMindMap mapa){

    -             pane.add(stopButton, tomui.GBC) +          def dict = [:]

    -             myP.add(pane, tomui.GBC) +          def textoDict = mapa.storage[idDictStorage]

    -         } else { +          if(textoDict){

    -             def nT = nodosTutoriales[0] +              textoDict.toString().split(';').each{e ->

    -             def tutNodes = getTutNodes(nT) +                  def (k,v) = e.split(':')

    -             if(tutNodes) { +                  dict[k] = v

    -                 fillContentPane(myP, tutNodes) +              }

    -             } else { +          }

    -                 ui.informationMessage( "no tutorial components(nodes) found for tutorial '${nT.text}'".toString() ) +          return dict

    -             } +      }

    -         } +

    -     } +      def static setIdDictionary(ApiMindMap mapa, dict){

    - +          def texto = new StringBuilder()

    -     // end: +          dict.each{k,v ->

    - +              texto << "${k}:${v};"

    -     // region: showing other content in Tutorial Tab +          }

    -         //this region contains the methods that uses the tab to show other content leaving the Tutorial itself +          mapa.storage[idDictStorage] = texto +

    +

    +      }

    -     def static showTOC(myP,nodo){ +     def static addOpenMapPane(myP,  ApiNode tutNode, options){

    -         myP.removeAll() +         def sep         = File.separator

    -         tomui.resizeContentPanel(myP,tomui.maxContentPaneHeigth) +         def nodoMapa    = tutNode.children.find{it.text.endsWith('.mm')}

    -         addTOCPane(myP,nodo) +         def mapFileName = nodoMapa?.text

    -         tomui.adjustHeight(myP, true) +         def Dir         = tutNode.map.file.parent

    -     } +         def pathName    = Dir + sep + mapFileName

    - +         def enabled     = !disableBttn(tutNode)

    -     def static showTutorials(mapa){ +         def msgHtml     = tomui.getHtmlFromNote(nodoMapa, options)?:"Click to open '${mapFileName}'"

    -         def myP = tomui.getContentPaneFromMyTab(tabName, true) +         def bttnText    = "Open map '${mapFileName}'"

    -         myP.removeAll() +         def bttnToolTip = "Click to open '${mapFileName}'"

    -         tomui.resizeContentPanel(myP,tomui.maxContentPaneHeigth) +         def bttnAction  = { e ->

    -         addTutorialsPane(myP, mapa) +             def bttn = e.source

    -         tomui.adjustHeight(myP, true) +             bttn.setEnabled(enabled)

    -     } +             def mapa = getMapFromPath(pathName, true) //usar mapa indicado (pero oculto)

    - +         }

    - +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false)

    -     // end: +         myP.add(buttonPanel, tomui.GBC) +

    +

    +     }

    -     // region: Getting map +     def static addInspectPane(myP,  ApiNode nodo){

    -         //this region contains the methods used to open mindmaps +         def msgHtml     = "Click to inspect this page in the tutorial map"

    - +         def bttnText    = "inspect"

    -     def static getMapFromPath(filePath, withView){ +         def bttnToolTip = "Click to select the page's source nodes"

    -         if(exists(filePath)){ +         def bttnAction  = { e ->

    -             def m = c.mapLoader(filePath) +             def pageNode = nodo.parent

    -             if(withView) m.withView() +             def m = c.mapLoader(nodo.map.file).withView()//.selectNodeById(pageNodeId)

    -             return m.load() +             m.load() +

    +

    +             pageNode.pathToRoot*.folded = false +

    +

    +             c.select(pageNode)

            }

    -     } +         def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false)

    - +         myP.add(buttonPanel, tomui.GBC)

    -     def static exists(String path){new File(path).isFile()} +     }

    -     // end: +     def static addShowNodePane(myP, ApiNode nodo){

    - +         def nodos = nodo.children.findAll{ n -> n.link && (n.link.node || (!n.link.node && !n.link.file && n.link.uri.scheme == 'file'))}

    -     // region: help / debug +         nodos.each{ n ->

    - +             def msgHtml     = "Click to show ${n.plainText.replace('\n',' ')}"

    -     def static uiMsg(texto){ +             def bttnText    = "goto Node"

    -        //ui.informationMessage(texto.toString()) +             def bttnToolTip = "Click to show ${n.plainText.replace('\n',' ')}"

    -     } +             def bttnAction  

    - +             if(n.link.node){

    -     // end: +                 bttnAction = { e ->

    - +                     def tNode = n.link.node

    - +                     def m = c.mapLoader(tNode.map.file).withView()//.selectNodeById(pageNodeId)

    - } +                     m.load()

    - -
    - - - - - - - - - - - - - - -

    - // para probar en mapa Tutorial Sample.mm +                     tNode.pathToRoot*.folded = false

    -     // para la prueba seleccionar uno de los nodos comonentes 'ToM_' +                     c.select(tNode)

    - +                     c.centerOnNode(tNode)

    - def tomTutorial = 'ToM-Tutorial' +                 }

    - def tomIni      = 'ToM_' +             } else {

    - +                 bttnAction = { e ->

    - //saca listado de tutotiales de mapa +                     def path = n.link.uri.path.drop(1)

    - def nodosTutoriales = node.map.root.find{it.style.name == tomTutorial} +                     def id = n.link.uri.fragment

    - //return nodosTutoriales +                     def m = c.mapLoader(path).withView()//.selectNodeById(pageNodeId)

    - +                     m.load()

    - // se elige tutorial +                     def tNode = m.mindMap.node(id)

    -     //en este ejemplo se toma el primero +                     tNode.pathToRoot*.folded = false

    -     //TODO: hacer que usuario elija tutorial a realizar +                     c.select(tNode)

    - def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null +                     c.centerOnNode(tNode)

    - //return nTutorial +                 }

    - +             }

    - // listado de componentes de tutorial +             def buttonPanel = tomui.createButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction, false)

    - def nodosTut = nTutorial.find{it.style.name?.startsWith(tomIni)?:false} +             myP.add(buttonPanel, tomui.GBC)

    - +         }

    - if(!nodosTut) return 'no tutorial components(nodes) found' +     }

    - // prueba: ver posicion de nodo seleccionado en el listado +     def static addTOCPane(myP, ApiNode nodo){

    -  def pos = nodosTut.indexOf(node) +         def titleNodes  = getNewPageNodes(getTutorialNode(nodo))

    - +         def pane = tomui.createEmptyGridBagPanel()

    - // prueba: obtener listado de nodos restantes +         titleNodes.each{ tn ->

    - def restoDeNodos = nodosTut.drop(pos + 1) +             def title = tn.htmlText

    - +             def bttnAction   = { e -> fillPage(myP, tn, true, true) }

    - +             def button = tomui.createButton(title, bttnAction)

    - // prueba: obtener siguiente nodo +             pane.add(button, tomui.GBC)

    - def sigNodo = nodosTut.get(pos + 1) +         }

    - -
    - - - - - -

    - .groovy +         myP.add(pane, tomui.GBC)

    - -
    -
    - - - - - - -

    - import edofro.tutorialomatic.ToM_ui      as tomui +     }

    - import edofro.tutorialomatic.ToM         as tom +

    - +     def static addTutorialsPane(myP, ApiMindMap mapa, nodosTutoriales){

    - def nodos = node.children +         //def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial && !isBlocked(it) }

    - +         if ( nodosTutoriales.size() != 1 ){

    - // --------------------- crear / abrir panel ---------- +             def pane = tomui.createEmptyGridBagPanel()

    - def myPanel = tomui.getContentPaneFromMyTab('Tutorial', true) +             def pre  = nodosTutoriales.size() == 0 ? "No t" : "T"

    - +             addPageTitle(myP, "${pre}utorials present in '${mapa.name}' map".toString())

    - tom.addShowMenuItemPane(myPanel, nodos) +             nodosTutoriales.each{ nT ->

    - +                 def title = nT.htmlText

    - tomui.adjustHeight(myPanel) +                 def bttnAction   = { e ->

    - +                     def tutNodes = getTutNodes(nT)

    - +                     if(tutNodes) {

    - return 'listo' +                         def tutorialTabName = nT[attributeTabLabel] ?: defaultTabLabel

    - -
    - - - - - -

    - .groovy +                         def myP_thisTutorial = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true)

    - -
    -
    -
    -
    - - - - - - -

    - import edofro.tutorialomatic.ToM_ui +                         fillContentPane(myP_thisTutorial, tutNodes)

    - +                     } else {

    - // para probar en mapa Tutorial Sample.mm +                         ui.informationMessage( "no tutorial components(nodes) found for tutorial '${nT.text}'".toString() )

    -     // para la prueba seleccionar uno de los nodos comonentes 'ToM_' +                     }

    - +                 }

    - tomTutorial = 'ToM-Tutorial' +                 def button = tomui.createButton(title, bttnAction)

    - tomIni      = 'ToM_' +                 pane.add(button, tomui.GBC)

    - tabName     = 'Tutorial' +             }

    - +             def stopButton = tomui.createButton('CLOSE', { e -> tomui.closeTab(e.source)})

    - +             pane.add(stopButton, tomui.GBC)

    - //saca listado de tutotiales de mapa +             myP.add(pane, tomui.GBC)

    - def nodosTutoriales = node.map.root.find{it.style.name == tomTutorial} +         } else {

    - +             def nT = nodosTutoriales[0]

    - // se elige tutorial +             def tutNodes = getTutNodes(nT)

    -     //en este ejemplo se toma el primero +             if(tutNodes) {

    -     //TODO: hacer que usuario elija tutorial a realizar +                 fillContentPane(myP, tutNodes)

    - def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null +             } else {

    - +                 ui.informationMessage( "no tutorial components(nodes) found for tutorial '${nT.text}'".toString() )

    - // listado de componentes de tutorial +             }

    - def tutNodes = getTutNodes(nTutorial) +         }

    - if(!tutNodes) return 'no tutorial components(nodes) found' +     }

    - // ---- crear / abrir panel ----- +     // end:

    - def myPanel = ToM_ui.getContentPaneFromMyTab(tabName, true) +

    - +     // region: showing other content in Tutorial Tab

    - fillContentPane(myPanel, tutNodes) +         //this region contains the methods that uses the tab to show other content leaving the Tutorial itself

    - +     def static showTOC(myP,nodo){

    - +         myP.removeAll()

    - +         tomui.resizeContentPanel(myP,tomui.maxContentPaneHeigth)

    - // ---------- Methods ------------------------------- +         addTOCPane(myP,nodo)

    - def addNotes(myP, nodos){ +         tomui.adjustHeight(myP, true)

    -     nodos.each{n -> +     }

    -         if(n.note) { +

    -             myP.add(ToM_ui.createInstructionsPane(n), ToM_ui.GBC) +     def static showTutorials(mapa){ +

    +

    +         def nodosTutoriales = mapa.root.find{it.style.name == styles.tutorial && !isBlocked(it) } +

    +

    +         if (!nodosTutoriales){ +

    +

    +             ui.informationMessage( "no tutorials found for mindmap '${mapa.name}'".toString() )

            }

    -     }    +         def tutorialTabName

    - } +         if ( nodosTutoriales.size()==1 ) {

    - +                 tutorialTabName = nodosTutoriales[0][attributeTabLabel]

    - def addNextPagePane(myP, lastNode){ +         }

    -     def closeLabel   = 'Close tutorial' +         tutorialTabName ?= mapa.root[attributeTabLabel] ?: defaultMapTutorialsTabLabel

    -     def closeToolTip = 'Click to exit the tutorial and close the tutorial tab' +         def myP = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true)

    -     def nextLabel    = 'Next page' +         myP.removeAll()

    -     def nextToolTip  = 'Click to continue to the next page of the tutorial' +         tomui.resizeContentPanel(myP,tomui.maxContentPaneHeigth)

    -     def bttnAction   = lastNode?{ e -> +         addTutorialsPane(myP, mapa, nodosTutoriales)

    -             myP.removeAll() +         tomui.adjustHeight(myP, true)

    -             def nextNodes = getNextTutNodes(lastNode) +     }

    -             fillContentPane(myP, nextNodes) +

    -         }:null +

    -     def nextButtonPanel = ToM_ui.getNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction) +     // end:

    -     myP.add(nextButtonPanel, ToM_ui.GBC) +

    - } +     // region: Getting map +

    +

    +         //this region contains the methods used to open mindmaps

    - def getTutorialNode(n){ +     def static getMapFromPath(filePath, withView){

    -     return n.pathToRoot.find{it.style.name == tomTutorial} +         if(exists(filePath)){

    - } +             def m = c.mapLoader(filePath) +

    +

    +             if(withView) m.withView() +

    +

    +             return m.load() +

    +

    +         } +

    +

    +     }

    - def getTutNodes(nTutorial){ +     def static exists(String path){

    -     return nTutorial.find{it.style.name?.startsWith(tomIni)?:false} +         exists(new File(path))

    - } +     }

    - def getNextTutNodes(n){ +     def static exists(File file){

    -     def tutNodes  = getTutNodes(getTutorialNode(n)) +         file.isFile()

    -     def pos = tutNodes.indexOf(n) +     }

    -     return tutNodes.drop(pos + 1) +

    - } +     // end:

    - def fillContentPane(myPanel, nextTutNodes){ +     // region: Linking tutorial pages from other mindmaps

    -     def interruptLoop = false +     

    -     // loop TutNodes +     def static openTutorialPage(nodeDirection , ApiMindMap mapa = null){

    -     for (tutNode in nextTutNodes){ +         if(nodeDirection instanceof java.net.URI) {

    -         switch(tutNode.style.name){ +             return openTutorialPageUri(nodeDirection, mapa)

    -             case 'ToM_note': +         }

    -                 addNotes(myPanel, tutNode.children) +         if(nodeDirection instanceof java.lang.String) {

    -                 break +             return openTutorialPageString(nodeDirection, mapa)

    -             case 'ToM_nextPage': +         }

    -                 addNextPagePane(myPanel, tutNode) +         if(nodeDirection instanceof ApiNode) {

    -                 interruptLoop = true +             def newPageFile= nodeDirection.link?.file // TODO: probar que tome link de nodo si no existe el del attributo

    -                 break +             def newPageUri = nodeDirection[attributeNewPageLink].uri ?: nodeDirection.link?.uri // TODO: probar que tome link de nodo si no existe el del attributo

    -             default: +             mapa           = mapa ?: (newPageFile && !newPageUri.absolute && !newPageUri.scheme && newPageUri.path.endsWith('.mm'))? getMapFromPath(newPageFile.path, false) : null

    -                 ui.informationMessage('node style not defined') +             mapa           = mapa ?: nodeDirection.map

    -                 break +             return openTutorialPage(newPageUri, mapa)

            }

    -         if(interruptLoop) break +         return 'No tutorial node found'

        }

    -     if(!interruptLoop) addNextPagePane(myPanel, null) +

    -     ToM_ui.adjustHeight(myPanel) +

    - } +     def static openTutorialPageUri(URI uri, ApiMindMap mapa){

    - -
    - - - - - -

    - .groovy +     //    if(!uri) return null

    - -
    -
    - - - - - -

    - import edofro.tutorialomatic.ToM_ui as tomui +         def isMM = isMindmap(uri)

    - import edofro.tutorialomatic.ToM    as tom +         def nodeId = (!uri.scheme || isMM) && uri.fragment?.startsWith('ID_')?

    - +                         uri.fragment

    - //saca listado de tutotiales de mapa +                         : null

    - def nodosTutoriales = node.map.root.find{it.style.name == tom.styles.tutorial} +         // if (!nodeId) return 'No node ID defined in URI'

    - +         def tutMapPath = /* nodeId && */ isMM ?

    - // se elige tutorial +                             uri.path.drop(1)

    -     //TODO: hacer que usuario elija tutorial a realizar +                             :null

    - def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null +         def tutMap = tutMapPath ?

    - +                         getMapFromPath(tutMapPath, false)    //open mind map not visible

    - // listado de componentes de tutorial +                         : mapa

    - def tutNodes = tom.getTutNodes(nTutorial) +         openTutorialPageString(nodeId, tutMap)

    - if(!tutNodes) return 'no tutorial components(nodes) found' +     }

    - +     

    - // ---- crear / abrir panel ----- +     def static isMindmap(uri){

    - def myPanel = tomui.getContentPaneFromMyTab(tom.tabName, true) +         uri && uri.scheme in ['file','tutorial']  && uri.path.endsWith('.mm') +

    +

    +     }

    - tom.fillContentPane(myPanel, tutNodes) +     def static isValidUri(uri){

    - -
    - - - - - - -

    - .groovy -

    - -
    -
    - - - - - -

    - import edofro.tutorialomatic.ToM_ui as tomui +         return uri && (!uri.scheme && (uri.fragment?.startsWith('ID_') || uri.path?.endsWith('.mm'))|| isMindmap(uri)) 

    - import edofro.tutorialomatic.ToM    as tom +     }

    - def myPanel = tomui.getContentPaneFromMyTab(tom.tabName, false) -

    -

    - +     def static openTutorialPageString(String nodeId, ApiMindMap tutMap){

    - myPanel.components.findAll{it.hasProperty('pending') && it.pending}.size() +         if(!tutMap) return 'No tutorial mindmap defined'

    - -
    - - - - - -

    - .groovy +         def targetNode = nodeId ? tutMap.node(nodeId) : null

    - -
    -
    - - - - - - - - - - - - - -

    - package edofro.menuomatic +         // if(!targetNode) return 'No tutorial node found'

    - import org.freeplane.plugin.script.FreeplaneScriptBaseClass.ConfigProperties +         if(targetNode){

    - +             if(!(isTutNode(targetNode) || isTutorialNode(targetNode) )) return 'Indicated node is not part of a tutorial'

    - +             def tutorialTabName = getTutorialNode(targetNode)[attributeTabLabel] ?: tutMap.root[attributeTabLabel] ?: defaultMapTutorialsTabLabel

    - class WSE_redux{ +             //uiMsg(tutorialTabName)

    -     static final String attributeForExtensions =  new ConfigProperties().getProperty('wikdShellExtension_attributeForExtensions','file_ext') +             def myP = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true)

    - +             fillPage(myP, targetNode, true, true)

    - //region: get/set/is extension from selected node +         } else {

    - +             showTutorials(tutMap)

    -     def static extensionFromNode(n){ +         }

    -         extensionFromAttribute(n)?:extensionFromDetails(n)?:extensionFromText(n)?:null +         return 'tutorial displayed'

        }

    - +         

    -     def static extensionFromAttribute(n){ +     

    -         n[attributeForExtensions]?:null +     // end:

    -     } +      +

    +

    +     // region: help / debug

    -     def static extensionFromDetails(n){ +     def static uiMsg(texto){

    -         n.details?.size()>1?n.details?[0]=='.'?n.details.drop(1).takeBefore(' ').takeBefore('\n')?:n.details.drop(1).takeBefore('\n')?:n.details.drop(1).takeBefore(' ')?:n.details.drop(1):null:null +         // ui.informationMessage(texto.toString())

        } @@ -10127,761 +10586,835 @@ def fillContentPane(myPanel, nextTutNodes){

    -     def static extensionFromText(n){ -

    -

    -         n.text.reverse().takeBefore('.').reverse() +     // end:

    -     } +

    -     def static extensionFromFilePath(filepath){ + }

    + +
    + + + + + +

    -         return filepath.reverse().split("\\.")[0].reverse().toLowerCase() + completedTask

    + +
    +
    + + + + + + +

    -     } + completedTask

    + +
    + + + + + + + +

    - + completedTask

    + +
    +
    + + + + + +

    -     def static setExtension(n, ext){ + completedTask

    + +
    +
    +
    + + + + + + +

    -         // If it's allready defined --> do nothing + // para probar en mapa Tutorial Sample.mm

    -         if(extensionFromAttribute(n)==ext || extensionFromDetails(n)==ext) return +     // para la prueba seleccionar uno de los nodos comonentes 'ToM_'

    -         //I prefer it in this order: +

    -             // only details + def tomTutorial = 'ToM-Tutorial'

    -             // if details are beeing Used --> attribute + def tomIni      = 'ToM_'

    -         if(!n.details){ +

    -             n.details = '.' + ext + //saca listado de tutotiales de mapa

    -         } else { + def nodosTutoriales = node.map.root.find{it.style.name == tomTutorial}

    -             n[attributeForExtensions] = ext + //return nodosTutoriales

    -         } +

    -     } + // se elige tutorial

    - +     //en este ejemplo se toma el primero

    -     def static extensionFromNodeFile(n){ +     //TODO: hacer que usuario elija tutorial a realizar

    -         (n.link && n.link.uri && n.link.uri.scheme == 'file')?extensionFromFilePath(n.link.uri.path):null + def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null

    -     } + //return nTutorial

    -     def static isExtensionNode(n, extension){ + // listado de componentes de tutorial

    -         def ext = extensionFromNodeFile(n)?:extensionFromNode(n) + def nodosTut = nTutorial.find{it.style.name?.startsWith(tomIni)?:false}

    -         return ext?ext==extension:false +

    -     } + if(!nodosTut) return 'no tutorial components(nodes) found'

    - //end: + // prueba: ver posicion de nodo seleccionado en el listado

    - +  def pos = nodosTut.indexOf(node)

    - //region: groovy Node + // prueba: obtener listado de nodos restantes

    - + def restoDeNodos = nodosTut.drop(pos + 1)

    -     def static isGroovyNode(n){ +

    -         return (isExtensionNode(n, 'groovy') || n['script1']?true:false) +

    -     } + // prueba: obtener siguiente nodo

    - + def sigNodo = nodosTut.get(pos + 1)

    + +
    + + + + + +

    -     def static scriptFromNode(n){ + .groovy

    -         def input = null + discardedTask

    + +
    +
    + + + + + + +

    -         if (isGroovyNode(n)){ + import edofro.tutorialomatic.ToM_ui      as tomui

    -             if ( extensionFromNodeFile(n) == 'groovy' ) { + import edofro.tutorialomatic.ToM         as tom

    -                 input   = n.link.file.text +

    -             } else if ( n['script1']?true:false ){ + def nodos = node.children

    -                 input   = n['script1'].plain.toString().trim() +

    -             } else if ( n.note ){ + // --------------------- crear / abrir panel ----------

    -                 input   = n.note.toString() + def myPanel = tomui.getContentPaneFromMyTab('Tutorial', true)

    -             } +

    -         } + tom.addShowMenuItemPane(myPanel, nodos)

    -         return input +

    -     } + tomui.adjustHeight(myPanel)

    - //end: +

    - + return 'listo'

    + +
    + + + + + +

    - } + .groovy

    - - - - - - - - - - - - - + + +

    - package edofro.pseudofreeplaneapi + import edofro.tutorialomatic.ToM_ui

    - //region: imports + // para probar en mapa Tutorial Sample.mm

    - +     // para la prueba seleccionar uno de los nodos comonentes 'ToM_'

    - import org.freeplane.features.map.MapModel; +

    - import org.freeplane.features.map.NodeModel; + tomTutorial = 'ToM-Tutorial'

    - import org.freeplane.features.mode.Controller; + tomIni      = 'ToM_'

    - import org.freeplane.features.styles.MapStyleModel; + tabName     = 'Tutorial'

    - import org.freeplane.plugin.script.ScriptContext +

    - import org.freeplane.plugin.script.proxy.MapProxy +

    - import org.freeplane.plugin.script.proxy.NodeProxy + //saca listado de tutotiales de mapa

    - import org.freeplane.plugin.script.proxy.ScriptUtils + def nodosTutoriales = node.map.root.find{it.style.name == tomTutorial}

    - + // se elige tutorial

    - class UserStyles { +     //en este ejemplo se toma el primero

    - +     //TODO: hacer que usuario elija tutorial a realizar

    - //region: properties + def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null

    - //end: + // listado de componentes de tutorial

    - + def tutNodes = getTutNodes(nTutorial)

    - //region: copyUserStyles + if(!tutNodes) return 'no tutorial components(nodes) found'

    -     def copyUserStyles(sourceMap, targetMap, boolean showMessage, groovy.lang.Closure closure){ + // ---- crear / abrir panel -----

    -         def stylesToImport = getUserDefinedStylesParentNode(sourceMap).children.findAll(closure) + def myPanel = ToM_ui.getContentPaneFromMyTab(tabName, true)

    -         def styleNamesToImport = stylesToImport*.text +

    -         def texto = new StringBuilder("The following styles were imported \n from map '${sourceMap.name}.mm' \n into current map '${targetMap.name}.mm':\n\n") + fillContentPane(myPanel, tutNodes)

    -         styleNamesToImport.each{styleName -> +

    -             targetMap.copyStyleFrom(sourceMap, styleName) +

    -             def sourceStyleNode = getUserStyleNode(sourceMap, styleName ) +

    -             def targetStyleNode = getUserStyleNode(targetMap, styleName ) +

    -             copyIcons(sourceStyleNode, targetStyleNode) + // ---------- Methods -------------------------------

    -             copyAttributes(sourceStyleNode, targetStyleNode) + def addNotes(myP, nodos){

    -             texto << "   - $styleName\n" +     nodos.each{n ->

    -         } +         if(n.note) {

    -         texto << "\n\n" +             myP.add(ToM_ui.createInstructionsPane(n), ToM_ui.GBC)

    -         if(showMessage) ui.informationMessage(texto.toString()) +         }

    -     } +     }    +

    +

    + }

    -     def copyUserStyles(sourceMap, targetMap, boolean showMessage = true){ + def addNextPagePane(myP, lastNode){

    -         copyUserStyles(sourceMap, targetMap, showMessage, {true}) +     def closeLabel   = 'Close tutorial'

    -     } +     def closeToolTip = 'Click to exit the tutorial and close the tutorial tab'

    - +     def nextLabel    = 'Next page'

    -     def copyUserStyles(sourceMap, targetMap, groovy.lang.Closure closure){ +     def nextToolTip  = 'Click to continue to the next page of the tutorial'

    -         copyUserStyles(sourceMap, targetMap, true, closure) +     def bttnAction   = lastNode?{ e ->

    -     } +             myP.removeAll()

    - +             def nextNodes = getNextTutNodes(lastNode)

    -     def copyUserStyles(sourceMap, targetMap, String[] lista){ +             fillContentPane(myP, nextNodes)

    -         copyUserStyles(sourceMap, targetMap, true, lista) +         }:null

    -     } +     def nextButtonPanel = ToM_ui.getNextButtonPanel(tabName, closeLabel, closeToolTip, nextLabel, nextToolTip , bttnAction)

    - +     myP.add(nextButtonPanel, ToM_ui.GBC)

    -     def copyUserStyles(sourceMap, targetMap, boolean showMessage, String[] lista){ + }

    -         def closure = {it.text in lista} +

    -         copyUserStyles(sourceMap, targetMap, showMessage, closure) + def getTutorialNode(n){

    -     } +     return n.pathToRoot.find{it.style.name == tomTutorial} +

    +

    + }

    -     def copyUserStyles(sourceMap, targetMap, String texto){ + def getTutNodes(nTutorial){

    -         copyUserStyles(sourceMap, targetMap, true, texto) +     return nTutorial.find{it.style.name?.startsWith(tomIni)?:false}

    -     } + }

    -     def copyUserStyles(sourceMap, targetMap, boolean showMessage, String texto){ + def getNextTutNodes(n){

    -         def closure = {it.text == texto} +     def tutNodes  = getTutNodes(getTutorialNode(n))

    -         copyUserStyles(sourceMap, targetMap, showMessage, closure) +     def pos = tutNodes.indexOf(n)

    -     } +     return tutNodes.drop(pos + 1)

    - + }

    - //end: +

    - + def fillContentPane(myPanel, nextTutNodes){

    - //region: copy other things from node to node +     def interruptLoop = false

    - +     // loop TutNodes

    -     def copyIcons(sourceNode, targetNode, boolean doClear = true){ +     for (tutNode in nextTutNodes){

    -         if(doClear) targetNode.icons.clear() +         switch(tutNode.style.name){

    -         targetNode.icons.addAll(sourceNode.icons.icons) +             case 'ToM_note':

    -     } +                 addNotes(myPanel, tutNode.children)

    - +                 break

    -     def copyAttributes(sourceNode, targetNode, boolean doClear = true){ +             case 'ToM_nextPage':

    -         if(doClear) targetNode.attributes.clear() +                 addNextPagePane(myPanel, tutNode)

    -         sourceNode.attributes.each{a -> +                 interruptLoop = true

    -             targetNode.attributes.add(a.key, a.value) +                 break

    -         } +             default:

    -     } +                 ui.informationMessage('node style not defined')

    - +                 break

    - //end: +         }

    - +         if(interruptLoop) break

    - //region: getting an UserStyleNode as NodeProxy from active map +     }

    - +     if(!interruptLoop) addNextPagePane(myPanel, null)

    - // public +     ToM_ui.adjustHeight(myPanel)

    -     def static getUserStyleNode( String userStyle ){ + }

    + +
    + + + + + +

    -         return getUserStyleNode( null, userStyle ) + .groovy

    -     } + discardedTask

    + +
    +
    + + + + + +

    - + import edofro.tutorialomatic.ToM_ui as tomui

    -     def static getUserStyleNode(MapProxy mapaProxy, String userStyle ){ + import edofro.tutorialomatic.ToM    as tom

    -         return getUserDefinedStylesParentNode(mapaProxy).children.find{it.text == userStyle} +

    -     } + //saca listado de tutotiales de mapa

    - + def nodosTutoriales = node.map.root.find{it.style.name == tom.styles.tutorial}

    -     def static getUserDefinedStylesParentNode(x = null){ + // se elige tutorial

    -         return getUserDefinedStylesParentNode((ScriptContext) null) +     //TODO: hacer que usuario elija tutorial a realizar

    -     } + def nTutorial = nodosTutoriales?nodosTutoriales.get(0):null

    -     def static getUserDefinedStylesParentNode(MapModel mapa){ + // listado de componentes de tutorial

    -         return getUserDefinedStylesParentNode(mapa, null) + def tutNodes = tom.getTutNodes(nTutorial)

    -     } + if(!tutNodes) return 'no tutorial components(nodes) found'

    -     def static getUserDefinedStylesParentNode(MapProxy mapaProxy){ + // ---- crear / abrir panel -----

    -         return getUserDefinedStylesParentNode(mapaProxy.delegate, null) + def myPanel = tomui.getContentPaneFromMyTab(tom.tabName, true)

    -     } +

    - + tom.fillContentPane(myPanel, tutNodes)

    + + +
    + + + + + +

    - + .groovy

    + +
    +
    + + + + + +

    -     def static getUserDefinedStylesParentNode(ScriptContext scriptContext){ + import edofro.tutorialomatic.ToM_ui as tomui

    -         MapModel mapa = Controller.getCurrentController().getMap(); + import edofro.tutorialomatic.ToM    as tom

    -         return getUserDefinedStylesParentNode(mapa, scriptContext) +

    -     } + def myPanel = tomui.getContentPaneFromMyTab(tom.tabName, false)

    -      +

    -     def static getUserDefinedStylesParentNode(MapProxy mapaProxy, ScriptContext scriptContext){ + myPanel.components.findAll{it.hasProperty('pending') && it.pending}.size()

    + +
    + + + + + +

    -         return getUserDefinedStylesParentNode(mapaProxy.delegate, scriptContext) + .groovy

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    -     } + package edofro.menuomatic

    -     def static getUserDefinedStylesParentNode(MapModel mapa, ScriptContext scriptContext){ + import org.freeplane.plugin.script.FreeplaneScriptBaseClass.ConfigProperties

    -         if(!mapa) { +

    -             return getUserDefinedStylesParentNode(scriptContext) +

    -         } + class WSE_redux{

    -         MapStyleModel styleModel = MapStyleModel.getExtension(mapa); +     static final String attributeForExtensions =  new ConfigProperties().getProperty('wikdShellExtension_attributeForExtensions','file_ext')

    -         MapModel styleMap = styleModel.getStyleMap(); +

    -         NodeModel userStyleParentNode = styleModel.getStyleNodeGroup(styleMap, MapStyleModel.STYLES_USER_DEFINED); + //region: get/set/is extension from selected node

    -         def userDefinedParentNode = new NodeProxy(userStyleParentNode, scriptContext) +

    -         return userDefinedParentNode +     def static extensionFromNode(n){ +

    +

    +         extensionFromAttribute(n)?:extensionFromDetails(n)?:extensionFromText(n)?:null

        }

    -      +

    - //end: +     def static extensionFromAttribute(n){

    - +         n[attributeForExtensions]?:null

    - } +     }

    - -
    -
    - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -

    - .groovy +     def static extensionFromDetails(n){

    - -
    - - - - - - - - - -

    - import edofro.tutorialomatic.ToM_ui as tomui +         n.details?.size()>1?n.details?[0]=='.'?n.details.drop(1).takeBefore(' ').takeBefore('\n')?:n.details.drop(1).takeBefore('\n')?:n.details.drop(1).takeBefore(' ')?:n.details.drop(1):null:null

    - import edofro.tutorialomatic.ToM    as tom +     }

    - //region: opens tutorial map +     def static extensionFromText(n){

    - +         n.text.reverse().takeBefore('.').reverse()

    -     def sep         = File.separator +     }

    -     def userDir     = c.userDirectory.path +

    -     def mapFileName = "SimpleTutorialSample.mm" +     def static extensionFromFilePath(filepath){

    -     def pathName    = userDir + sep + "doc" + sep + "Tutorial-o-Matic" + sep + mapFileName +         return filepath.reverse().split("\\.")[0].reverse().toLowerCase()

    -     def tutMap      = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto) +     }

    -     tom.showTutorials( tutMap ) +     def static setExtension(n, ext){

    - +         // If it's allready defined --> do nothing

    -     return 'tutorial started' +         if(extensionFromAttribute(n)==ext || extensionFromDetails(n)==ext) return

    - +         //I prefer it in this order:

    - //end: +             // only details

    - -
    -
    - - - - - - - - - - -

    - import edofro.tutorialomatic.ToM    as tom +             // if details are beeing Used --> attribute

    - +         if(!n.details){

    - //region: opens tutorial map +             n.details = '.' + ext

    - +         } else {

    -     def sep         = File.separator +             n[attributeForExtensions] = ext

    -     def userDir     = c.userDirectory.path +         }

    -     def mapFileName = "HowToTutorial-o-Matic.mm" +     }

    -     def pathName    = userDir + sep + "doc" + sep + "Tutorial-o-Matic" + sep + mapFileName +

    -     def tutMap      = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto) +     def static extensionFromNodeFile(n){ +

    +

    +         (n.link && n.link.uri && n.link.uri.scheme == 'file')?extensionFromFilePath(n.link.uri.path):null +

    +

    +     }

    -     tom.showTutorials( tutMap ) +     def static isExtensionNode(n, extension){ +

    +

    +         def ext = extensionFromNodeFile(n)?:extensionFromNode(n) +

    +

    +         return ext?ext==extension:false +

    +

    +     }

    @@ -10889,79 +11422,68 @@ def fillContentPane(myPanel, nextTutNodes){

    //end:

    - -
    -
    - - - - - - - - - - -

    - //opens demo map +

    - //region: defining path + //region: groovy Node

    -     def mapFile = "SimpleTutorialSample.mm" +

    -     def dir = c.userDirectory.path +     def static isGroovyNode(n){

    -     def sep = File.separator +         return (isExtensionNode(n, 'groovy') || n['script1']?true:false)

    -     def helpFile = "Tutorial-o-Matic" + sep + mapFile +     }

    -     def pathName = dir + sep + "doc" + sep + helpFile +

    - // end: +     def static scriptFromNode(n){

    - +         def input = null

    - //region: opening mindmap file +         if (isGroovyNode(n)){

    -     if(exists(pathName)){ +             if ( extensionFromNodeFile(n) == 'groovy' ) {

    -         c.mapLoader(pathName).withView().load() +                 input   = n.link.file.text

    -     } +             } else if ( n['script1']?true:false ){

    - //end: +                 input   = n['script1'].plain.toString().trim()

    - +             } else if ( n.note ){

    - +                 input   = n.note.toString()

    - //region: methods +             }

    - +         }

    -     def exists(String path){new File(path).isFile()} +         return input +

    +

    +     }

    @@ -10969,38 +11491,24 @@ def fillContentPane(myPanel, nextTutNodes){

    //end:

    - -
    -
    - - - - - - - - - - -

    - import edofro.menuomatic.MenuAction as MA +

    - + }

    - MA.menuCommandToNode(node) +

    - - - - - - + + + + + + @@ -11008,767 +11516,757 @@ def fillContentPane(myPanel, nextTutNodes){

    - def cP = new ConfigProperties() + package edofro.menuomatic

    - def sep = File.separator + import java.awt.Component

    - def path = cP.freeplaneUserDirectory + sep + 'templates,Tutorial-o-Matic,tutorial_styles_template.mm'.split(',').join(sep) + import java.awt.Point

    - + import java.awt.Window

    - def templateFile = new File(path) + import javax.swing.SwingUtilities

    - + import javax.swing.JComponent

    - def newTutorialMindMap = c.mapLoader(templateFile).unsetMapLocation().withView().getMindMap() +

    - -
    - - - - - -

    - .groovy + import org.freeplane.plugin.script.proxy.ScriptUtils

    - -
    -
    - - - - - -

    - import edofro.tutorialomatic.ToM    as tom + import org.freeplane.core.util.TextUtils  as textUtils

    - + import org.freeplane.core.util.LogUtils   as logger

    - def mapa = node.map //usar mapa activo +

    - tom.showTutorials( mapa ) + class MenuAction{

    - return 'tutorial started' +     static final int maxTextLength = {

    - -
    - - - - - -

    - .groovy +         try{

    - -
    - - - - -
    - - - - - - - -

    - import groovy.swing.SwingBuilder +             edofro.menuomatic.PackMenu.maxTextLen

    - import javax.swing.* +         }

    - // import java.util.Timer +         catch(e){

    - // import java.awt.Color +             50

    - // import java.awt.Font +         }

    - // import java.awt.Insets +     }()

    - // import javax.swing.border.EmptyBorder +

    - +     static final c = ScriptUtils.c()

    - import javax.swing.border.* +     

    - //import javax.swing.border.LineBorder; +     def static menuCommandToNode(n){

    - +         def nodo

    - //import javax.swing.border.EmptyBorder +         def action

    - +         try {

    - import java.awt.Color; +             JComponent component = (JComponent) getComponent()

    - import java.awt.* //Insets +             action = getAction(component)

    - +         } catch (e){

    - def msgHtml = 'Este es el <b> mensaje</b> Principal' +             nodo = n.createChild(e.toString())

    - def bttnText    = 'Continuar' +             nodo.note = e.printStackTrace()

    - def bttnToolTip =  'This is the button' +         }

    - def bttnAction = {e -> +         if(action){

    - //        node.createChild('resultado').note =(e.source.properties*.toString().join('\n -->   ')) +             nodo = n.createChild(getLabelText(action))

    -         def boton = e.source +             nodo.link.text = "menuitem:_${action.key}"

    -         def contenedor = boton +         } else {

    -         do { +             c.statusInfo = 'No menu or toolbar command encountered under mouse pointer'

    -             contenedor = contenedor.parent +         }    

    -         } while (contenedor.name != 'contenedor') +     }

    -         def editor = contenedor.components.find{it.name == 'mensajero'} +     

    -         def padre = contenedor.parent +     def static getLabelText(action){

    -         //node.createChild('resultado').note =(padre.properties*.toString().join('\n -->   ')) +         return getActionText(action.key,'text')?:getActionText(action.key,'tooltip')?:action.rawText?:action.key

    -         padre.removeAll() +     }

    -         padre.repaint() +

    -         padre.add(getButtonPanel('Hola','boton','ayuda',  +     def static getActionText(acc,tipo){

    -              { +       def texto = textUtils.getText("${acc}.${tipo}", null)

    -                  c.statusInfo = 'Option A chosen' +       texto = (texto && texto!='null')?textUtils.getShortText(texto, maxTextLength,'.'):null

    -                  ui.informationMessage('hola, hola!') +       return texto

    -               } +     }

    -           ) +

    -         ) +     def static getAction(component){

    -         padre.revalidate() +         if(component.properties.containsKey('action') && component.action!=null){

    -         padre.repaint() +             def accion

    -         //ui.informationMessage(padre.parent.name) +             if(component.action.properties.containsKey('originalAction')){

    -     } +                 accion = component.action.originalAction

    - +              }else{

    - +                 accion = component.action

    - +             }

    - +             return accion

    - +         }else{

    - swing = new SwingBuilder() +             return null

    - +         }

    - def miPanel = getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction) +     }

    - // ----------------------- dialogo de prueba -------------------------------------         +     def static getComponent(){

    -          +         for (Window window : Window.getWindows()) {

    -     def dialog = swing.dialog( +             Point mousePositionA = window.getMousePosition(true)

    -            title: 'Frame', +             if(!mousePositionA)continue

    -            defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, +             def compo = window.getLayeredPane()

    -            size: [400, 400], +             Point mousePosition

    -     ){ +             try {

    -     } +                 mousePosition = SwingUtilities.convertPoint(window,mousePositionA,compo)

    -      +             } catch (e){

    -     dialog.add(miPanel) +                 logger.warn('menuAction',e)

    -     dialog.show() +                 logger.warn('window:  ' + window.toString())

    -     +                 logger.warn('mousePosition:  ' + mousePositionA.toString())

    -    return 'ok'  +                 logger.warn('LayeredPane:  ' + compo.toString())

    - +                 throw e

    - // ----------------------- methods -------------------------- +             }

    - +             if (mousePosition != null) {

    - // genera panel con botón +                 Component componentUnderMouse = SwingUtilities.getDeepestComponentAt(compo, (int) mousePosition.x,

    - def getButtonPanel(html, buttonLabel, buttonToolTip, buttonAction){ +                     (int)  mousePosition.y);

    -     def panel = swing.panel( +                 return componentUnderMouse

    -         name: 'contenedor'          +             }

    -     ) { +         }

    -         borderLayout() +     }

    -         editorPane( +     

    -             name        : 'mensajero', + }

    + +
    +
    + + + + + + + + + + + +

    -             editable    : false, + package edofro.pseudofreeplaneapi

    -             contentType : "text/html", +

    -             text        : html, + //region: imports

    -             margin      : new Insets(30,10,30,10), +

    -             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste + import org.freeplane.api.MindMap                        as ApiMindMap

    -             border: new CompoundBorder(new LineBorder(Color.green, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde + //import org.freeplane.api.Node                           as ProxyNode

    -             constraints : CENTER, + //import org.freeplane.plugin.script.proxy.Proxy.Node     as ProxyNode

    -         ) + import org.freeplane.plugin.script.proxy.NodeProxy      as ProxyNode

    -         panel(         + import org.freeplane.core.ui.components.UITools as ui

    -             constraints    : SOUTH, + import org.freeplane.features.map.MapModel;

    -             // border      : new LineBorder(Color.black, 1), + import org.freeplane.features.map.NodeModel;

    -             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste + import org.freeplane.features.mode.Controller;

    -             border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde + import org.freeplane.features.styles.MapStyleModel;

    -             //insets      : new Insets(30,10,30,10), + import org.freeplane.plugin.script.ScriptContext

    -         ) { + import org.freeplane.plugin.script.proxy.ScriptUtils

    -             borderLayout() +

    -             button( +

    -                 label       : buttonLabel,  + class UserStyles {

    -                 constraints : EAST,  +

    -                 margin      : new Insets(10,15,10,15),  + //region: properties

    -                 toolTipText : buttonToolTip, +

    -                 actionPerformed : buttonAction, + //end:

    -             ) +

    -         } + //region: copyUserStyles

    -     } +

    -     return panel +     def static copyUserStyles(sourceMap, targetMap, boolean showMessage, groovy.lang.Closure closure){

    - } +         def stylesToImport = getUserDefinedStylesParentNode(sourceMap).children.findAll(closure)

    - -
    - - - - - -

    - .groovy +         def styleNamesToImport = stylesToImport*.text

    - -
    -
    - - - - - -

    - import groovy.swing.SwingBuilder +         def texto = new StringBuilder("The following styles were imported \n from map '${sourceMap.name}.mm' \n into current map '${targetMap.name}.mm':\n\n")

    - import javax.swing.* +         styleNamesToImport.each{styleName ->

    - // import java.util.Timer +             targetMap.copyStyleFrom(sourceMap, styleName)

    - // import java.awt.Color +             def sourceStyleNode = getUserStyleNode(sourceMap, styleName )

    - // import java.awt.Font +             def targetStyleNode = getUserStyleNode(targetMap, styleName )

    - // import java.awt.Insets +             copyIcons(sourceStyleNode, targetStyleNode)

    - // import javax.swing.border.EmptyBorder +             copyAttributes(sourceStyleNode, targetStyleNode)

    - +             texto << "   - $styleName\n"

    - import javax.swing.border.* +         }

    - //import javax.swing.border.LineBorder; +         texto << "\n\n"

    - +         if(showMessage) ui.informationMessage(texto.toString())

    - //import javax.swing.border.EmptyBorder +     }

    - import java.awt.Color; +     def static copyUserStyles(sourceMap, targetMap, boolean showMessage = true){

    - import java.awt.* //Insets +         copyUserStyles(sourceMap, targetMap, showMessage, {true}) +

    +

    +     }

    - import org.freeplane.core.ui.components.UITools as ui +     def static copyUserStyles(sourceMap, targetMap, groovy.lang.Closure closure){

    - +         copyUserStyles(sourceMap, targetMap, true, closure)

    - def primerNodo= node.children[0] +     }

    - def msgHtml = 'Este es el <b> mensaje</b> Principal' +     def static copyUserStyles(sourceMap, targetMap, String[] lista){

    - def bttnText    = 'Continuar' -

    -

    - def bttnToolTip =  'This is the button' +         copyUserStyles(sourceMap, targetMap, true, lista)

    - def bttnAction = {e ->    muestraNodo(e.source, primerNodo)} +     }

    - +     def static copyUserStyles(sourceMap, targetMap, boolean showMessage, String[] lista){

    - //        padre.removeAll() +         def closure = {it.text in lista}

    - //        padre.revalidate() +         copyUserStyles(sourceMap, targetMap, showMessage, closure)

    - //        padre.repaint() +     }

    - def muestraNodo(c, n){ -

    -

    -     def p = n.parent -

    -

    -     def nextNode = p.children[p.getChildPosition(n)+1] -

    -

    -     def html = n.text -

    -

    -     ui.informationMessage(html) +     def static copyUserStyles(sourceMap, targetMap, String texto){

    -     def buttonLabel = 'Next' +         copyUserStyles(sourceMap, targetMap, true, texto)

    -     def buttonToolTip = 'click to show next page' +     }

    -     def buttonAction = {e ->    muestraNodo(e.source, nextNode) } +

    -     changeButtonPanel(c, html, buttonLabel, buttonToolTip, buttonAction) +     def static copyUserStyles(sourceMap, targetMap, boolean showMessage, String texto){

    - } +         def closure = {it.text == texto}

    -      +         copyUserStyles(sourceMap, targetMap, showMessage, closure)

    - def changeButtonPanel(c, html, buttonLabel, buttonToolTip, buttonAction){ +     }

    -         def boton = c +

    -         boton.label = buttonLabel  + //end:

    -         boton.toolTipText = buttonToolTip +

    -         boton.actionPerformed = buttonAction + //region: copy other things from node to node

    -         def contenedor = c +

    -         do { +     def static copyIcons(sourceNode, targetNode, boolean doClear = true){

    -             contenedor = contenedor.parent +         if(doClear) targetNode.icons.clear()

    -         } while (contenedor.name != 'contenedor')         +         targetNode.icons.addAll(sourceNode.icons.icons)

    -         def editor = contenedor.components.find{it.name == 'mensajero'} +     }

    -         editor.text = html +

    -         contenedor.revalidate() +     def static copyAttributes(sourceNode, targetNode, boolean doClear = true){

    -         contenedor.repaint() +         if(doClear) targetNode.attributes.clear()

    - +         sourceNode.attributes.each{a ->

    - } +             targetNode.attributes.add(a.key, a.value)

    -      +         }

    - +     }

    - swing = new SwingBuilder() + //end:

    - def miPanel = getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction) + //region: getting an UserStyleNode as ProxyNode from active map

    - // ----------------------- dialogo de prueba -------------------------------------         -

    -

    -          -

    -

    -     def dialog = swing.dialog( -

    -

    -            title: 'Frame', -

    -

    -            defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, + // public

    -            size: [400, 400], +     def static getUserStyleNode( String userStyle ){

    -     ){ +         return getUserStyleNode( null, userStyle )

        }

    -      +

    -     dialog.add(miPanel) +     def static getUserStyleNode(ApiMindMap mapaProxy, String userStyle ){

    -     dialog.show() +         return getUserDefinedStylesParentNode(mapaProxy).children.find{it.text == userStyle}

    -     +     }

    -    return 'ok'  +

    - // ----------------------- methods -------------------------- +     def static getUserDefinedStylesParentNode(x = null){

    - +         return getUserDefinedStylesParentNode((ScriptContext) null)

    - // genera panel con botón +     }

    - def getButtonPanel(html, buttonLabel, buttonToolTip, buttonAction){ +

    -     def panel = swing.panel( +     def static getUserDefinedStylesParentNode(MapModel mapa){

    -         name: 'contenedor'          +         return getUserDefinedStylesParentNode(mapa, null)

    -     ) { +     }

    -         borderLayout() +

    -         editorPane( +     def static getUserDefinedStylesParentNode(ApiMindMap mapaProxy){

    -             name        : 'mensajero', +         return getUserDefinedStylesParentNode(mapaProxy.delegate, null)

    -             editable    : false, +     }

    -             contentType : "text/html", +

    -             text        : html, +

    -             margin      : new Insets(30,10,30,10), +     def static getUserDefinedStylesParentNode(ScriptContext scriptContext){

    -             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +         MapModel mapa = Controller.getCurrentController().getMap();

    -             border: new CompoundBorder(new LineBorder(Color.green, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde +         return getUserDefinedStylesParentNode(mapa, scriptContext)

    -             constraints : CENTER, +     }

    -         ) +     

    -         panel(         +     def static getUserDefinedStylesParentNode(ApiMindMap mapaProxy, ScriptContext scriptContext){

    -             constraints    : SOUTH, +         return getUserDefinedStylesParentNode(mapaProxy.delegate, scriptContext)

    -             // border      : new LineBorder(Color.black, 1), +     }

    -             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste +

    -             border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde +     def static getUserDefinedStylesParentNode(MapModel mapa, ScriptContext scriptContext){

    -             //insets      : new Insets(30,10,30,10), +         if(!mapa) {

    -         ) { +             return getUserDefinedStylesParentNode(scriptContext)

    -             borderLayout() +         }

    -             button( +         MapStyleModel styleModel = MapStyleModel.getExtension(mapa);

    -                 label       : buttonLabel,  +         MapModel styleMap = styleModel.getStyleMap();

    -                 toolTipText : buttonToolTip, +         NodeModel userStyleParentNode = styleModel.getStyleNodeGroup(styleMap, MapStyleModel.STYLES_USER_DEFINED);

    -                 actionPerformed : buttonAction, +         def userDefinedParentNode = new ProxyNode(userStyleParentNode, scriptContext)

    -                 constraints : EAST,  +         return userDefinedParentNode

    -                 margin      : new Insets(10,15,10,15),  +     }

    -             ) +     

    -         } + //end:

    -     } +

    -     return panel + }

    - } +

    - +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + @@ -11779,291 +12277,402 @@ def getButtonPanel(html, buttonLabel, buttonToolTip, buttonAction){

    - - - - - - - - - - + + + + +

    - import groovy.swing.SwingBuilder -

    -

    - import javax.swing.JFrame -

    -

    - import javax.swing.border.* + import edofro.tutorialomatic.ToM    as tom

    - import java.awt.Color; +

    - import java.awt.Insets + //region: opens tutorial map

    - +     def sep         = File.separator

    - // -------------------- main ------------------------ +     def userDir     = c.userDirectory.path

    - swing = new SwingBuilder() +     def mapFileName = "SimpleTutorialSample.mm"

    - +     def pathName    = userDir + sep + "doc" + sep + "Tutorial-o-Matic" + sep + mapFileName

    - def msgHtml = 'Este es el <b> mensaje</b> inicial' +     def tutMap      = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto)

    - def bttnText    = 'Continuar' +

    - def bttnToolTip =  'Click para continuar' +     tom.showTutorials( tutMap )

    - miPanel = getButtonPanel(msgHtml, bttnText, bttnToolTip) + //end: +

    + +
    +
    + + + + + + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom

    - miPanel.metaClass.nextNode = node.children[0]  // primer nodo es el primer hijo de nodo seleccionado. + //region: opens tutorial map

    +

    +

    +     def sep         = File.separator +

    +

    +     def userDir     = c.userDirectory.path +

    +

    +     def mapFileName = "Tutorial-o-Matic Intro.mm" +

    +

    +     def pathName    = userDir + sep + "doc" + sep + "Tutorial-o-Matic" + sep + mapFileName +

    +

    +     def tutMap      = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto)

    - // ----------------------- dialogo de prueba -------------------------------------                 +     tom.showTutorials( tutMap )

    - def dialog = swing.dialog( + //end:

    + +
    +
    + + + + + + + + + + +

    -        title: 'Frame', + //opens demo map

    -        defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE, +

    -        size: [400, 400], + //region: defining path

    -     ){}     +     def mapFile = "SimpleTutorialSample.mm"

    - dialog.add(miPanel) +     def dir = c.userDirectory.path

    - dialog.show() +     def sep = File.separator

    - +     def helpFile = "Tutorial-o-Matic" + sep + mapFile

    - return 'ok'  +     def pathName = dir + sep + "doc" + sep + helpFile

    - + // end:

    - // ----------------------- methods ------------------------------------------------------------ + //region: opening mindmap file

    - +     if(exists(pathName)){

    - // genera panel con botón +         c.mapLoader(pathName).withView().load()

    - def getButtonPanel(html, buttonLabel, buttonToolTip){ //, buttonAction){ +     }

    -     return swing.panel( + //end:

    -         name: 'contenedor'          +

    -     ) { +

    -         borderLayout() + //region: methods

    -         editorPane( +

    -             name        : 'mensajero', +     def exists(String path){new File(path).isFile()}

    -             editable    : false, +

    -             contentType : "text/html", + //end:

    + +
    +
    + + + + + + + + + + +

    -             text        : html, + import edofro.menuomatic.MenuAction as MA

    -             margin      : new Insets(30,10,30,10), +

    -             border: new CompoundBorder(new LineBorder(Color.gray, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde + MA.menuCommandToNode(node)

    + +
    + + + + + + + + + + + + + + + +

    -             constraints : CENTER, + .groovy

    + +
    + + + + + +

    -         ) + def cP = new ConfigProperties()

    -         panel(         +

    -             constraints    : SOUTH, + def sep = File.separator

    -             border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste + def path = cP.freeplaneUserDirectory + sep + 'templates,Tutorial-o-Matic,tutorial_styles_template.mm'.split(',').join(sep)

    -         ) { +

    -             borderLayout() + def templateFile = new File(path)

    -             button( +

    -                 label           : buttonLabel,  + def newTutorialMindMap = c.mapLoader(templateFile).unsetMapLocation().withView().getMindMap()

    + +
    +
    + + + + + +

    -                 toolTipText     : buttonToolTip, + .groovy

    + +
    + + + + + + + + + +

    -                 actionPerformed : {e ->   if(miPanel.nextNode){ muestraNodo(e.source, miPanel.nextNode)} else {e.source.topLevelAncestor.dispose()}}, + import edofro.tutorialomatic.ToM    as tom

    -                 constraints     : EAST,  +

    -                 margin          : new Insets(10,15,10,15),  + tom.showTutorials( node.map )

    + +
    +
    + + + + + + + + + + +

    -             ) + import edofro.tutorialomatic.ToM    as tom

    -         } + import edofro.pseudofreeplaneapi.UserStyles as us

    -     } +

    - } + //region: opens tutorial map

    -          +

    - def muestraNodo(c, n){ +     def sep         = File.separator

    -     def p        = n.parent +     def userDir     = c.userDirectory.path

    -     def nextNode = p.getChildPosition(n)<p.children.size()?p.children[p.getChildPosition(n)+1]:null  // siguiente nodo hermano de n (si es último entonces null) +     def mapFileName = "tutorial_styles_template.mm"

    -     def mhtml    = n.text +     def pathName    = userDir + sep + "templates" + sep + "Tutorial-o-Matic" + sep + mapFileName

    -     def mbuttonLabel   = nextNode?'Next':'Close' +     def sourceMap   = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto)

    -     def mbuttonToolTip = nextNode?'click to show next page':'click to close the dialog' +

    -      + // return tutMap.class

    -     changeButtonPanel(c, mhtml, mbuttonLabel, mbuttonToolTip) +     def targetMap = node.map

    -     miPanel.nextNode = nextNode +     us.copyUserStyles(sourceMap, targetMap)

    - } +

    -      + //Other use case examples on how to use edofro.pseudofreeplaneapi.UserStyles.copyUserStyles

    - def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ + /*

    -         def boton = c +     def myString = 'ToM_goto'

    -         boton.label = buttonLabel  +     def myList = 'ToM_nextPage,ToM_goto,ToM_showNode'.split(',')

    -         boton.toolTipText = buttonToolTip +     def myClosure =  {it.text.contains('u')}

    -         def contenedor = c.parent +

    -         while (contenedor.name != 'contenedor') { +

    -             contenedor = contenedor.parent +     us.copyUserStyles(sourceMap, targetMap, myString)

    -         }          +     us.copyUserStyles(sourceMap, targetMap, myList)

    -         def editor = contenedor.components.find{it.name == 'mensajero'} +     us.copyUserStyles(sourceMap, targetMap, myClosure)

    -         editor.text = html + */

    -      //   contenedor.revalidate() +

    -      //   contenedor.repaint() +

    - } +

    - +
    + @@ -12074,2933 +12683,3818 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - - - - - - - + + + + +

    - verifyInputWhenFocusTarget=true + import edofro.tutorialomatic.ToM    as tom

    - mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@13d47ecb +

    - focusTraversalPolicy=null + c.statusInfo   = tom.openTutorialPage(node)

    + +
    +
    + + + + + + + +

    - registeredKeyStrokes=[Ljavax.swing.KeyStroke;@642c4bcc + import groovy.swing.SwingBuilder

    - alignmentX=0.0 + import javax.swing.*

    - location=java.awt.Point[x=286,y=6] + // import java.util.Timer

    - rolloverSelectedIcon=null + // import java.awt.Color

    - alignmentY=0.5 + // import java.awt.Font

    - hierarchyListeners=[Ljava.awt.event.HierarchyListener;@6f6eebd5 + // import java.awt.Insets

    - managingFocus=false + // import javax.swing.border.EmptyBorder

    - rolloverIcon=null +

    - defaultButton=true + import javax.swing.border.*

    - insets=java.awt.Insets[top=12,left=17,bottom=12,right=17] + //import javax.swing.border.LineBorder;

    - baselineResizeBehavior=CENTER_OFFSET +

    - icon=null + //import javax.swing.border.EmptyBorder

    - optimizedDrawingEnabled=true +

    - action=null + import java.awt.Color;

    - minimumSize=java.awt.Dimension[width=87,height=39] + import java.awt.* //Insets

    - toolTipText=This is the button +

    - focusTraversalKeysEnabled=true + def msgHtml = 'Este es el <b> mensaje</b> Principal'

    - ignoreRepaint=false + def bttnText    = 'Continuar'

    - inheritsPopupMenu=false + def bttnToolTip =  'This is the button'

    - margin=java.awt.Insets[top=10,left=15,bottom=10,right=15] + def bttnAction = {e ->

    - parent=javax.swing.JPanel[,0,0,384x51,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.CompoundBorder@12ba5800,flags=9,maximumSize=,minimumSize=,preferredSize=] + //        node.createChild('resultado').note =(e.source.properties*.toString().join('\n -->   '))

    - rootPane=javax.swing.JRootPane[,8,31,384x361,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] +         def boton = e.source

    - displayedMnemonicIndex=-1 +         def contenedor = boton

    - width=87 +         do {

    - keyListeners=[Ljava.awt.event.KeyListener;@22285eba +             contenedor = contenedor.parent

    - toolkit=sun.awt.windows.WToolkit@46f11618 +         } while (contenedor.name != 'contenedor')

    - actionCommand=Continuar +         def editor = contenedor.components.find{it.name == 'mensajero'}

    - size=java.awt.Dimension[width=87,height=39] +         def padre = contenedor.parent

    - vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@24dc1318 +         //node.createChild('resultado').note =(padre.properties*.toString().join('\n -->   '))

    - maximumSizeSet=false +         padre.removeAll()

    - class=class javax.swing.JButton +         padre.repaint()

    - changeListeners=[Ljavax.swing.event.ChangeListener;@3c746415 +         padre.add(getButtonPanel('Hola','boton','ayuda', 

    - borderPainted=true +              {

    - maximumSize=java.awt.Dimension[width=87,height=39] +                  c.statusInfo = 'Option A chosen'

    - pressedIcon=null +                  ui.informationMessage('hola, hola!')

    - selectedObjects=null +               }

    - contentAreaFilled=true +           )

    - text=Continuar +         )

    - focusTraversable=true +         padre.revalidate()

    - componentPopupMenu=null +         padre.repaint()

    - componentListeners=[Ljava.awt.event.ComponentListener;@7cce51c3 +         //ui.informationMessage(padre.parent.name)

    - focusTraversalPolicyProvider=false +     }

    - focusListeners=[Ljava.awt.event.FocusListener;@1cf30d6e +

    - background=javax.swing.plaf.ColorUIResource[r=240,g=240,b=240] +

    - mnemonic=0 +

    - ancestorListeners=[Ljavax.swing.event.AncestorListener;@5873893b +

    - requestFocusEnabled=true +

    - backgroundSet=true + swing = new SwingBuilder()

    - actionMap=javax.swing.ActionMap@47381aec +

    - multiClickThreshhold=0 + def miPanel = getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction)

    - mouseListeners=[Ljava.awt.event.MouseListener;@49761b81 +

    - label=Continuar + // ----------------------- dialogo de prueba -------------------------------------        

    - foregroundSet=true +         

    - validateRoot=false +     def dialog = swing.dialog(

    - componentOrientation=java.awt.ComponentOrientation@59bfd7b4 +            title: 'Frame',

    - fontSet=true +            defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE,

    - locationOnScreen=java.awt.Point[x=294,y=347] +            size: [400, 400],

    - colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 +     ){

    - mousePosition=java.awt.Point[x=73,y=19] +     }

    - paintingTile=false +     

    - disabledSelectedIcon=null +     dialog.add(miPanel)

    - accessibleContext=javax.swing.JButton$AccessibleJButton@4deaf7bc +     dialog.show()

    - preferredSize=java.awt.Dimension[width=87,height=39] +    

    - inputMap=javax.swing.InputMap@914956b +    return 'ok' 

    - minimumSizeSet=false +

    - disabledIcon=null + // ----------------------- methods --------------------------

    - selected=false +

    - itemListeners=[Ljava.awt.event.ItemListener;@e7c11df + // genera panel con botón

    - focusTraversalPolicySet=false + def getButtonPanel(html, buttonLabel, buttonToolTip, buttonAction){

    - y=6 +     def panel = swing.panel(

    - x=286 +         name: 'contenedor'         

    - cursorSet=false +     ) {

    - inputMethodRequests=null +         borderLayout()

    - containerListeners=[Ljava.awt.event.ContainerListener;@772fa982 +         editorPane(

    - componentCount=0 +             name        : 'mensajero',

    - components=[Ljava.awt.Component;@5b941b09 +             editable    : false,

    - inputVerifier=null +             contentType : "text/html",

    - hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@6d62f7cc +             text        : html,

    - border=com.sun.java.swing.plaf.windows.XPStyle$XPEmptyBorder@93e2d77 +             margin      : new Insets(30,10,30,10),

    - selectedIcon=null +             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste

    - name=null +             border: new CompoundBorder(new LineBorder(Color.green, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde

    - graphics=sun.java2d.SunGraphics2D[font=java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=12],color=java.awt.SystemColor[i=9]] +             constraints : CENTER,

    - rolloverEnabled=true +         )

    - focusPainted=true +         panel(        

    - foreground=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0] +             constraints    : SOUTH,

    - horizontalTextPosition=11 +             // border      : new LineBorder(Color.black, 1),

    - hideActionText=false +             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste

    - focusable=true +             border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde

    - preferredSizeSet=false +             //insets      : new Insets(30,10,30,10),

    - defaultCapable=true +         ) {

    - visible=true +             borderLayout()

    - focusCycleRootAncestor=javax.swing.JDialog[dialog36,0,0,400x400,invalid,layout=java.awt.BorderLayout,MODELESS,title=Frame,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,384x361,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +             button(

    - model=javax.swing.DefaultButtonModel@40f098c6 +                 label       : buttonLabel, 

    - lightweight=true +                 constraints : EAST, 

    - inputContext=sun.awt.im.InputMethodContext@2eec9bee +                 margin      : new Insets(10,15,10,15), 

    - layout=null +                 toolTipText : buttonToolTip,

    - opaque=true +                 actionPerformed : buttonAction,

    - font=java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=12] +             )

    - locale=en +         }

    - cursor=java.awt.Cursor[Default Cursor] +     }

    - inputMethodListeners=[Ljava.awt.event.InputMethodListener;@24054408 +     return panel

    - iconTextGap=4 + }

    + +
    + + + + + +

    - doubleBuffered=false + .groovy

    + +
    +
    + + + + + +

    - visibleRect=java.awt.Rectangle[x=0,y=0,width=87,height=39] + import groovy.swing.SwingBuilder

    - horizontalAlignment=0 + import javax.swing.*

    - valid=true + // import java.util.Timer

    - focusCycleRoot=false + // import java.awt.Color

    - mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@5e231bd3 + // import java.awt.Font

    - verticalTextPosition=0 + // import java.awt.Insets

    - treeLock=java.awt.Component$AWTTreeLock@1a61254f + // import javax.swing.border.EmptyBorder

    - bounds=java.awt.Rectangle[x=286,y=6,width=87,height=39] +

    - propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@1a518e79 + import javax.swing.border.*

    - autoscrolls=false + //import javax.swing.border.LineBorder;

    - paintingForPrint=false +

    - showing=true -

    -

    - verticalAlignment=0 -

    -

    - actionListeners=[Ljava.awt.event.ActionListener;@50285536 + //import javax.swing.border.EmptyBorder

    - dropTarget=null +

    - nextFocusableComponent=null + import java.awt.Color;

    - height=39 + import java.awt.* //Insets

    - topLevelAncestor=javax.swing.JDialog[dialog36,0,0,400x400,invalid,layout=java.awt.BorderLayout,MODELESS,title=Frame,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,384x361,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    - displayable=true + import org.freeplane.core.ui.components.UITools as ui

    - focusOwner=true +

    - defaultLocale=en + def primerNodo= node.children[0]

    - debugGraphicsOptions=0 +

    - enabled=true + def msgHtml = 'Este es el <b> mensaje</b> Principal'

    - UI=com.sun.java.swing.plaf.windows.WindowsButtonUI@ed7adea + def bttnText    = 'Continuar'

    - UIClassID=ButtonUI + def bttnToolTip =  'This is the button'

    - -
    -
    - - -
    -
    - - - - - - -

    - def texto = new StringBuilder() + def bttnAction = {e ->    muestraNodo(e.source, primerNodo)}

    - def sep = " | " +

    -     texto + //        padre.removeAll()

    -         << '-> ' + //        padre.revalidate()

    -         << sep << 'returnType' + //        padre.repaint()

    -         << sep << 'declaringClass' +

    -         << sep << 'name' + def muestraNodo(c, n){

    -         << sep << 'parameterTypes' +     def p = n.parent

    -         << '\n' +     def nextNode = p.children[p.getChildPosition(n)+1]

    - +     def html = n.text

    - def objeto = ui.freeplaneTabbedPanel  //  <---- éste se deb cambiar para otras pruebas +     ui.informationMessage(html)

    - +     def buttonLabel = 'Next'

    - objeto.class.methods.each{ +     def buttonToolTip = 'click to show next page'

    - +     def buttonAction = {e ->    muestraNodo(e.source, nextNode) }

    - +     changeButtonPanel(c, html, buttonLabel, buttonToolTip, buttonAction)

    -     def returnType = it.returnType.name + }

    -     def declaringClass = it.declaringClass.name +     

    -     def name = it.name + def changeButtonPanel(c, html, buttonLabel, buttonToolTip, buttonAction){

    -     def parameterTypes = it.parameterTypes*.name.join(', ') +         def boton = c

    - +         boton.label = buttonLabel 

    -     texto +         boton.toolTipText = buttonToolTip

    -         << '-> ' +         boton.actionPerformed = buttonAction

    -         << sep << returnType +         def contenedor = c

    -         << sep << declaringClass +         do {

    -         << sep << name +             contenedor = contenedor.parent

    -         << sep << parameterTypes +         } while (contenedor.name != 'contenedor')        

    -         << '\n' +         def editor = contenedor.components.find{it.name == 'mensajero'}

    - } +         editor.text = html

    - +         contenedor.revalidate()

    - //texto +         contenedor.repaint()

    - def nodo = node.createChild('result') + }

    - +     

    - nodo.note = texto +

    - -
    - - - - - -

    - .groovy +

    - -
    - - - - - -

    - ->  | returnType | declaringClass | name | parameterTypes + swing = new SwingBuilder()

    - ->  | void | javax.swing.JTabbedPane | add | java.awt.Component, java.lang.Object, int +

    - ->  | void | javax.swing.JTabbedPane | add | java.awt.Component, java.lang.Object + def miPanel = getButtonPanel(msgHtml,bttnText,bttnToolTip, bttnAction)

    - ->  | java.awt.Component | javax.swing.JTabbedPane | add | java.awt.Component, int +

    - ->  | java.awt.Component | javax.swing.JTabbedPane | add | java.lang.String, java.awt.Component + // ----------------------- dialogo de prueba -------------------------------------        

    - ->  | java.awt.Component | javax.swing.JTabbedPane | add | java.awt.Component +         

    - ->  | void | javax.swing.JTabbedPane | remove | int +     def dialog = swing.dialog(

    - ->  | void | javax.swing.JTabbedPane | remove | java.awt.Component +            title: 'Frame',

    - ->  | void | javax.swing.JTabbedPane | removeAll |  +            defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE,

    - ->  | java.lang.String | javax.swing.JTabbedPane | getToolTipText | java.awt.event.MouseEvent +            size: [400, 400],

    - ->  | java.lang.String | javax.swing.JTabbedPane | getUIClassID |  +     ){

    - ->  | javax.accessibility.AccessibleContext | javax.swing.JTabbedPane | getAccessibleContext |  +     }

    - ->  | java.awt.Component | javax.swing.JTabbedPane | getComponentAt | int +     

    - ->  | void | javax.swing.JTabbedPane | removeChangeListener | javax.swing.event.ChangeListener +     dialog.add(miPanel)

    - ->  | javax.swing.plaf.TabbedPaneUI | javax.swing.JTabbedPane | getUI |  +     dialog.show()

    - ->  | void | javax.swing.JTabbedPane | addChangeListener | javax.swing.event.ChangeListener +    

    - ->  | javax.swing.SingleSelectionModel | javax.swing.JTabbedPane | getModel |  +    return 'ok' 

    - ->  | void | javax.swing.JTabbedPane | addTab | java.lang.String, java.awt.Component +

    - ->  | void | javax.swing.JTabbedPane | addTab | java.lang.String, javax.swing.Icon, java.awt.Component + // ----------------------- methods --------------------------

    - ->  | void | javax.swing.JTabbedPane | addTab | java.lang.String, javax.swing.Icon, java.awt.Component, java.lang.String +

    - ->  | java.awt.Color | javax.swing.JTabbedPane | getBackgroundAt | int + // genera panel con botón

    - ->  | java.awt.Rectangle | javax.swing.JTabbedPane | getBoundsAt | int + def getButtonPanel(html, buttonLabel, buttonToolTip, buttonAction){

    - ->  | [Ljavax.swing.event.ChangeListener; | javax.swing.JTabbedPane | getChangeListeners |  +     def panel = swing.panel(

    - ->  | javax.swing.Icon | javax.swing.JTabbedPane | getDisabledIconAt | int +         name: 'contenedor'         

    - ->  | int | javax.swing.JTabbedPane | getDisplayedMnemonicIndexAt | int +     ) {

    - ->  | java.awt.Color | javax.swing.JTabbedPane | getForegroundAt | int +         borderLayout()

    - ->  | javax.swing.Icon | javax.swing.JTabbedPane | getIconAt | int +         editorPane(

    - ->  | int | javax.swing.JTabbedPane | getMnemonicAt | int +             name        : 'mensajero',

    - ->  | int | javax.swing.JTabbedPane | getSelectedIndex |  +             editable    : false,

    - ->  | java.awt.Component | javax.swing.JTabbedPane | getTabComponentAt | int +             contentType : "text/html",

    - ->  | int | javax.swing.JTabbedPane | getTabCount |  +             text        : html,

    - ->  | int | javax.swing.JTabbedPane | getTabLayoutPolicy |  +             margin      : new Insets(30,10,30,10),

    - ->  | int | javax.swing.JTabbedPane | getTabPlacement |  +             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste

    - ->  | int | javax.swing.JTabbedPane | getTabRunCount |  +             border: new CompoundBorder(new LineBorder(Color.green, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde

    - ->  | java.lang.String | javax.swing.JTabbedPane | getTitleAt | int +             constraints : CENTER,

    - ->  | java.lang.String | javax.swing.JTabbedPane | getToolTipTextAt | int +         )

    - ->  | int | javax.swing.JTabbedPane | indexAtLocation | int, int +         panel(        

    - ->  | int | javax.swing.JTabbedPane | indexOfComponent | java.awt.Component +             constraints    : SOUTH,

    - ->  | int | javax.swing.JTabbedPane | indexOfTab | javax.swing.Icon +             // border      : new LineBorder(Color.black, 1),

    - ->  | int | javax.swing.JTabbedPane | indexOfTab | java.lang.String +             // border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste

    - ->  | int | javax.swing.JTabbedPane | indexOfTabComponent | java.awt.Component +             border: new CompoundBorder(new LineBorder(Color.red, 1),new EmptyBorder(5, 10, 5, 10))  // éste es de prueba poder ver el borde

    - ->  | void | javax.swing.JTabbedPane | insertTab | java.lang.String, javax.swing.Icon, java.awt.Component, java.lang.String, int +             //insets      : new Insets(30,10,30,10),

    - ->  | boolean | javax.swing.JTabbedPane | isEnabledAt | int +         ) {

    - ->  | void | javax.swing.JTabbedPane | removeTabAt | int +             borderLayout()

    - ->  | void | javax.swing.JTabbedPane | setBackgroundAt | int, java.awt.Color +             button(

    - ->  | void | javax.swing.JTabbedPane | setComponentAt | int, java.awt.Component +                 label       : buttonLabel, 

    - ->  | void | javax.swing.JTabbedPane | setDisabledIconAt | int, javax.swing.Icon +                 toolTipText : buttonToolTip,

    - ->  | void | javax.swing.JTabbedPane | setDisplayedMnemonicIndexAt | int, int +                 actionPerformed : buttonAction,

    - ->  | void | javax.swing.JTabbedPane | setEnabledAt | int, boolean +                 constraints : EAST, 

    - ->  | void | javax.swing.JTabbedPane | setForegroundAt | int, java.awt.Color +                 margin      : new Insets(10,15,10,15), 

    - ->  | void | javax.swing.JTabbedPane | setIconAt | int, javax.swing.Icon +             )

    - ->  | void | javax.swing.JTabbedPane | setMnemonicAt | int, int +         }

    - ->  | void | javax.swing.JTabbedPane | setModel | javax.swing.SingleSelectionModel +     }

    - ->  | void | javax.swing.JTabbedPane | setSelectedComponent | java.awt.Component +     return panel

    - ->  | void | javax.swing.JTabbedPane | setSelectedIndex | int + }

    + +
    + + + + + +

    - ->  | void | javax.swing.JTabbedPane | setTabComponentAt | int, java.awt.Component + .groovy

    + +
    + + + + + + + +

    - ->  | void | javax.swing.JTabbedPane | setTabLayoutPolicy | int + completedTask

    -

    - ->  | void | javax.swing.JTabbedPane | setTabPlacement | int + + + + + + + + + + + + + + + +

    + import groovy.swing.SwingBuilder

    - ->  | void | javax.swing.JTabbedPane | setTitleAt | int, java.lang.String + import javax.swing.JFrame

    - ->  | void | javax.swing.JTabbedPane | setToolTipTextAt | int, java.lang.String + import javax.swing.border.*

    - ->  | void | javax.swing.JTabbedPane | setUI | javax.swing.plaf.TabbedPaneUI + import java.awt.Color;

    - ->  | void | javax.swing.JTabbedPane | updateUI |  + import java.awt.Insets

    - ->  | java.awt.Component | javax.swing.JTabbedPane | getSelectedComponent |  +

    - ->  | void | javax.swing.JComponent | update | java.awt.Graphics +

    - ->  | boolean | javax.swing.JComponent | contains | int, int + // -------------------- main ------------------------

    - ->  | java.awt.Point | javax.swing.JComponent | getLocation | java.awt.Point + swing = new SwingBuilder()

    - ->  | void | javax.swing.JComponent | print | java.awt.Graphics +

    - ->  | java.awt.Dimension | javax.swing.JComponent | getSize | java.awt.Dimension + def msgHtml = 'Este es el <b> mensaje</b> inicial'

    - ->  | boolean | javax.swing.JComponent | isOpaque |  + def bttnText    = 'Continuar'

    - ->  | void | javax.swing.JComponent | disable |  + def bttnToolTip =  'Click para continuar'

    - ->  | void | javax.swing.JComponent | enable |  +

    - ->  | void | javax.swing.JComponent | setVisible | boolean + miPanel = getButtonPanel(msgHtml, bttnText, bttnToolTip)

    - ->  | int | javax.swing.JComponent | getHeight |  +

    - ->  | int | javax.swing.JComponent | getWidth |  + miPanel.metaClass.nextNode = node.children[0]  // primer nodo es el primer hijo de nodo seleccionado.

    - ->  | java.awt.Rectangle | javax.swing.JComponent | getBounds | java.awt.Rectangle +

    - ->  | void | javax.swing.JComponent | paint | java.awt.Graphics +

    - ->  | java.awt.FontMetrics | javax.swing.JComponent | getFontMetrics | java.awt.Font + // ----------------------- dialogo de prueba -------------------------------------                

    - ->  | [Ljava.util.EventListener; | javax.swing.JComponent | getListeners | java.lang.Class +

    - ->  | int | javax.swing.JComponent | getX |  + def dialog = swing.dialog(

    - ->  | int | javax.swing.JComponent | getY |  +        title: 'Frame',

    - ->  | void | javax.swing.JComponent | addAncestorListener | javax.swing.event.AncestorListener +        defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE,

    - ->  | void | javax.swing.JComponent | addVetoableChangeListener | java.beans.VetoableChangeListener +        size: [400, 400],

    - ->  | void | javax.swing.JComponent | computeVisibleRect | java.awt.Rectangle +     ){}    

    - ->  | javax.swing.JToolTip | javax.swing.JComponent | createToolTip |  + dialog.add(miPanel)

    - ->  | java.awt.event.ActionListener | javax.swing.JComponent | getActionForKeyStroke | javax.swing.KeyStroke + dialog.show()

    - ->  | javax.swing.ActionMap | javax.swing.JComponent | getActionMap |  +

    - ->  | [Ljavax.swing.event.AncestorListener; | javax.swing.JComponent | getAncestorListeners |  + return 'ok' 

    - ->  | boolean | javax.swing.JComponent | getAutoscrolls |  +

    - ->  | javax.swing.border.Border | javax.swing.JComponent | getBorder |  +

    - ->  | java.lang.Object | javax.swing.JComponent | getClientProperty | java.lang.Object + // ----------------------- methods ------------------------------------------------------------

    - ->  | javax.swing.JPopupMenu | javax.swing.JComponent | getComponentPopupMenu |  +

    - ->  | int | javax.swing.JComponent | getConditionForKeyStroke | javax.swing.KeyStroke + // genera panel con botón

    - ->  | int | javax.swing.JComponent | getDebugGraphicsOptions |  + def getButtonPanel(html, buttonLabel, buttonToolTip){ //, buttonAction){

    - ->  | java.util.Locale | javax.swing.JComponent | getDefaultLocale |  +     return swing.panel(

    - ->  | boolean | javax.swing.JComponent | getInheritsPopupMenu |  +         name: 'contenedor'         

    - ->  | javax.swing.InputMap | javax.swing.JComponent | getInputMap | int +     ) {

    - ->  | javax.swing.InputMap | javax.swing.JComponent | getInputMap |  +         borderLayout()

    - ->  | javax.swing.InputVerifier | javax.swing.JComponent | getInputVerifier |  +         editorPane(

    - ->  | java.awt.Component | javax.swing.JComponent | getNextFocusableComponent |  +             name        : 'mensajero',

    - ->  | java.awt.Point | javax.swing.JComponent | getPopupLocation | java.awt.event.MouseEvent +             editable    : false,

    - ->  | [Ljavax.swing.KeyStroke; | javax.swing.JComponent | getRegisteredKeyStrokes |  +             contentType : "text/html",

    - ->  | java.awt.Point | javax.swing.JComponent | getToolTipLocation | java.awt.event.MouseEvent +             text        : html,

    - ->  | java.lang.String | javax.swing.JComponent | getToolTipText |  +             margin      : new Insets(30,10,30,10),

    - ->  | java.awt.Container | javax.swing.JComponent | getTopLevelAncestor |  +             border: new CompoundBorder(new LineBorder(Color.gray, 1),new EmptyBorder(5, 10, 5, 10)),  // éste es de prueba poder ver el borde

    - ->  | javax.swing.TransferHandler | javax.swing.JComponent | getTransferHandler |  +             constraints : CENTER,

    - ->  | boolean | javax.swing.JComponent | getVerifyInputWhenFocusTarget |  +         )

    - ->  | [Ljava.beans.VetoableChangeListener; | javax.swing.JComponent | getVetoableChangeListeners |  +         panel(        

    - ->  | java.awt.Rectangle | javax.swing.JComponent | getVisibleRect |  +             constraints    : SOUTH,

    - ->  | void | javax.swing.JComponent | grabFocus |  +             border      : new EmptyBorder(5, 10, 5, 10),  // <------- éste

    - ->  | boolean | javax.swing.JComponent | isLightweightComponent | java.awt.Component +         ) {

    - ->  | boolean | javax.swing.JComponent | isManagingFocus |  +             borderLayout()

    - ->  | boolean | javax.swing.JComponent | isOptimizedDrawingEnabled |  +             button(

    - ->  | boolean | javax.swing.JComponent | isPaintingForPrint |  +                 label           : buttonLabel, 

    - ->  | boolean | javax.swing.JComponent | isPaintingTile |  +                 toolTipText     : buttonToolTip,

    - ->  | boolean | javax.swing.JComponent | isRequestFocusEnabled |  +                 actionPerformed : {e ->   if(miPanel.nextNode){ muestraNodo(e.source, miPanel.nextNode)} else {e.source.topLevelAncestor.dispose()}},

    - ->  | void | javax.swing.JComponent | setToolTipText | java.lang.String +                 constraints     : EAST, 

    - ->  | java.awt.Graphics | javax.swing.JComponent | getGraphics |  +                 margin          : new Insets(10,15,10,15), 

    - ->  | void | javax.swing.JComponent | addNotify |  +             )

    - ->  | float | javax.swing.JComponent | getAlignmentX |  +         }

    - ->  | float | javax.swing.JComponent | getAlignmentY |  +     }

    - ->  | int | javax.swing.JComponent | getBaseline | int, int + }

    - ->  | java.awt.Component$BaselineResizeBehavior | javax.swing.JComponent | getBaselineResizeBehavior |  +         

    - ->  | java.awt.Insets | javax.swing.JComponent | getInsets | java.awt.Insets + def muestraNodo(c, n){

    - ->  | java.awt.Insets | javax.swing.JComponent | getInsets |  +     def p        = n.parent

    - ->  | java.awt.Dimension | javax.swing.JComponent | getMaximumSize |  +     def nextNode = p.getChildPosition(n)<p.children.size()?p.children[p.getChildPosition(n)+1]:null  // siguiente nodo hermano de n (si es último entonces null)

    - ->  | java.awt.Dimension | javax.swing.JComponent | getMinimumSize |  +     def mhtml    = n.text

    - ->  | java.awt.Dimension | javax.swing.JComponent | getPreferredSize |  +     def mbuttonLabel   = nextNode?'Next':'Close'

    - ->  | void | javax.swing.JComponent | hide |  +     def mbuttonToolTip = nextNode?'click to show next page':'click to close the dialog'

    - ->  | boolean | javax.swing.JComponent | isDoubleBuffered |  +     

    - ->  | boolean | javax.swing.JComponent | isValidateRoot |  +     changeButtonPanel(c, mhtml, mbuttonLabel, mbuttonToolTip)

    - ->  | void | javax.swing.JComponent | printAll | java.awt.Graphics +     miPanel.nextNode = nextNode

    - ->  | void | javax.swing.JComponent | removeNotify |  + }

    - ->  | void | javax.swing.JComponent | repaint | java.awt.Rectangle +     

    - ->  | void | javax.swing.JComponent | repaint | long, int, int, int, int + def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - ->  | boolean | javax.swing.JComponent | requestFocusInWindow |  +         def boton = c

    - ->  | void | javax.swing.JComponent | reshape | int, int, int, int +         boton.label = buttonLabel 

    - ->  | void | javax.swing.JComponent | setBackground | java.awt.Color +         boton.toolTipText = buttonToolTip

    - ->  | void | javax.swing.JComponent | setFocusTraversalKeys | int, java.util.Set +         def contenedor = c.parent

    - ->  | void | javax.swing.JComponent | setFont | java.awt.Font +         while (contenedor.name != 'contenedor') {

    - ->  | void | javax.swing.JComponent | setForeground | java.awt.Color +             contenedor = contenedor.parent

    - ->  | void | javax.swing.JComponent | setMaximumSize | java.awt.Dimension +         }         

    - ->  | void | javax.swing.JComponent | setMinimumSize | java.awt.Dimension +         def editor = contenedor.components.find{it.name == 'mensajero'}

    - ->  | void | javax.swing.JComponent | setPreferredSize | java.awt.Dimension +         editor.text = html

    - ->  | void | javax.swing.JComponent | setDefaultLocale | java.util.Locale +      //   contenedor.revalidate()

    - ->  | void | javax.swing.JComponent | firePropertyChange | java.lang.String, boolean, boolean +      //   contenedor.repaint()

    - ->  | void | javax.swing.JComponent | firePropertyChange | java.lang.String, char, char + }

    + +
    + + + + + +

    - ->  | void | javax.swing.JComponent | firePropertyChange | java.lang.String, int, int + .groovy

    + +
    + + + + + + + + + + + +

    - ->  | void | javax.swing.JComponent | setEnabled | boolean + verifyInputWhenFocusTarget=true

    - ->  | void | javax.swing.JComponent | requestFocus |  + mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@13d47ecb

    - ->  | boolean | javax.swing.JComponent | requestFocus | boolean + focusTraversalPolicy=null

    - ->  | void | javax.swing.JComponent | revalidate |  + registeredKeyStrokes=[Ljavax.swing.KeyStroke;@642c4bcc

    - ->  | void | javax.swing.JComponent | paintImmediately | int, int, int, int + alignmentX=0.0

    - ->  | void | javax.swing.JComponent | paintImmediately | java.awt.Rectangle + location=java.awt.Point[x=286,y=6]

    - ->  | void | javax.swing.JComponent | putClientProperty | java.lang.Object, java.lang.Object + rolloverSelectedIcon=null

    - ->  | void | javax.swing.JComponent | registerKeyboardAction | java.awt.event.ActionListener, java.lang.String, javax.swing.KeyStroke, int + alignmentY=0.5

    - ->  | void | javax.swing.JComponent | registerKeyboardAction | java.awt.event.ActionListener, javax.swing.KeyStroke, int + hierarchyListeners=[Ljava.awt.event.HierarchyListener;@6f6eebd5

    - ->  | void | javax.swing.JComponent | removeAncestorListener | javax.swing.event.AncestorListener + managingFocus=false

    - ->  | void | javax.swing.JComponent | removeVetoableChangeListener | java.beans.VetoableChangeListener + rolloverIcon=null

    - ->  | boolean | javax.swing.JComponent | requestDefaultFocus |  + defaultButton=true

    - ->  | void | javax.swing.JComponent | resetKeyboardActions |  + insets=java.awt.Insets[top=12,left=17,bottom=12,right=17]

    - ->  | void | javax.swing.JComponent | scrollRectToVisible | java.awt.Rectangle + baselineResizeBehavior=CENTER_OFFSET

    - ->  | void | javax.swing.JComponent | setActionMap | javax.swing.ActionMap + icon=null

    - ->  | void | javax.swing.JComponent | setAlignmentX | float + optimizedDrawingEnabled=true

    - ->  | void | javax.swing.JComponent | setAlignmentY | float + action=null

    - ->  | void | javax.swing.JComponent | setAutoscrolls | boolean + minimumSize=java.awt.Dimension[width=87,height=39]

    - ->  | void | javax.swing.JComponent | setBorder | javax.swing.border.Border + toolTipText=This is the button

    - ->  | void | javax.swing.JComponent | setComponentPopupMenu | javax.swing.JPopupMenu + focusTraversalKeysEnabled=true

    - ->  | void | javax.swing.JComponent | setDebugGraphicsOptions | int + ignoreRepaint=false

    - ->  | void | javax.swing.JComponent | setDoubleBuffered | boolean + inheritsPopupMenu=false

    - ->  | void | javax.swing.JComponent | setInheritsPopupMenu | boolean + margin=java.awt.Insets[top=10,left=15,bottom=10,right=15]

    - ->  | void | javax.swing.JComponent | setInputMap | int, javax.swing.InputMap + parent=javax.swing.JPanel[,0,0,384x51,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.CompoundBorder@12ba5800,flags=9,maximumSize=,minimumSize=,preferredSize=]

    - ->  | void | javax.swing.JComponent | setInputVerifier | javax.swing.InputVerifier + rootPane=javax.swing.JRootPane[,8,31,384x361,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=]

    - ->  | void | javax.swing.JComponent | setNextFocusableComponent | java.awt.Component + displayedMnemonicIndex=-1

    - ->  | void | javax.swing.JComponent | setOpaque | boolean + width=87

    - ->  | void | javax.swing.JComponent | setRequestFocusEnabled | boolean + keyListeners=[Ljava.awt.event.KeyListener;@22285eba

    - ->  | void | javax.swing.JComponent | setTransferHandler | javax.swing.TransferHandler + toolkit=sun.awt.windows.WToolkit@46f11618

    - ->  | void | javax.swing.JComponent | setVerifyInputWhenFocusTarget | boolean + actionCommand=Continuar

    - ->  | void | javax.swing.JComponent | unregisterKeyboardAction | javax.swing.KeyStroke + size=java.awt.Dimension[width=87,height=39]

    - ->  | javax.swing.JRootPane | javax.swing.JComponent | getRootPane |  + vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@24dc1318

    - ->  | void | java.awt.Container | list | java.io.PrintWriter, int + maximumSizeSet=false

    - ->  | void | java.awt.Container | list | java.io.PrintStream, int + class=class javax.swing.JButton

    - ->  | void | java.awt.Container | setFocusTraversalPolicy | java.awt.FocusTraversalPolicy + changeListeners=[Ljavax.swing.event.ChangeListener;@3c746415

    - ->  | java.awt.Component | java.awt.Container | locate | int, int + borderPainted=true

    - ->  | [Ljava.awt.Component; | java.awt.Container | getComponents |  + maximumSize=java.awt.Dimension[width=87,height=39]

    - ->  | void | java.awt.Container | applyComponentOrientation | java.awt.ComponentOrientation + pressedIcon=null

    - ->  | boolean | java.awt.Container | areFocusTraversalKeysSet | int + selectedObjects=null

    - ->  | int | java.awt.Container | countComponents |  + contentAreaFilled=true

    - ->  | void | java.awt.Container | deliverEvent | java.awt.Event + text=Continuar

    - ->  | void | java.awt.Container | doLayout |  + focusTraversable=true

    - ->  | java.awt.Component | java.awt.Container | findComponentAt | int, int + componentPopupMenu=null

    - ->  | java.awt.Component | java.awt.Container | findComponentAt | java.awt.Point + componentListeners=[Ljava.awt.event.ComponentListener;@7cce51c3

    - ->  | java.awt.Component | java.awt.Container | getComponentAt | java.awt.Point + focusTraversalPolicyProvider=false

    - ->  | java.awt.Component | java.awt.Container | getComponentAt | int, int + focusListeners=[Ljava.awt.event.FocusListener;@1cf30d6e

    - ->  | int | java.awt.Container | getComponentZOrder | java.awt.Component + background=javax.swing.plaf.ColorUIResource[r=240,g=240,b=240]

    - ->  | java.util.Set | java.awt.Container | getFocusTraversalKeys | int + mnemonic=0

    - ->  | java.awt.FocusTraversalPolicy | java.awt.Container | getFocusTraversalPolicy |  + ancestorListeners=[Ljavax.swing.event.AncestorListener;@5873893b

    - ->  | java.awt.LayoutManager | java.awt.Container | getLayout |  + requestFocusEnabled=true

    - ->  | java.awt.Point | java.awt.Container | getMousePosition | boolean + backgroundSet=true

    - ->  | boolean | java.awt.Container | isFocusCycleRoot |  + actionMap=javax.swing.ActionMap@47381aec

    - ->  | boolean | java.awt.Container | isFocusCycleRoot | java.awt.Container + multiClickThreshhold=0

    - ->  | void | java.awt.Container | layout |  + mouseListeners=[Ljava.awt.event.MouseListener;@49761b81

    - ->  | java.awt.Dimension | java.awt.Container | minimumSize |  + label=Continuar

    - ->  | java.awt.Dimension | java.awt.Container | preferredSize |  + foregroundSet=true

    - ->  | void | java.awt.Container | invalidate |  + validateRoot=false

    - ->  | void | java.awt.Container | validate |  + componentOrientation=java.awt.ComponentOrientation@59bfd7b4

    - ->  | void | java.awt.Container | addPropertyChangeListener | java.beans.PropertyChangeListener + fontSet=true

    - ->  | void | java.awt.Container | addPropertyChangeListener | java.lang.String, java.beans.PropertyChangeListener + locationOnScreen=java.awt.Point[x=294,y=347]

    - ->  | int | java.awt.Container | getComponentCount |  + colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0

    - ->  | java.awt.Component | java.awt.Container | getComponent | int + mousePosition=java.awt.Point[x=73,y=19]

    - ->  | void | java.awt.Container | addContainerListener | java.awt.event.ContainerListener + paintingTile=false

    - ->  | [Ljava.awt.event.ContainerListener; | java.awt.Container | getContainerListeners |  + disabledSelectedIcon=null

    - ->  | java.awt.Insets | java.awt.Container | insets |  + accessibleContext=javax.swing.JButton$AccessibleJButton@4deaf7bc

    - ->  | boolean | java.awt.Container | isAncestorOf | java.awt.Component + preferredSize=java.awt.Dimension[width=87,height=39]

    - ->  | boolean | java.awt.Container | isFocusTraversalPolicyProvider |  + inputMap=javax.swing.InputMap@914956b

    - ->  | boolean | java.awt.Container | isFocusTraversalPolicySet |  + minimumSizeSet=false

    - ->  | void | java.awt.Container | paintComponents | java.awt.Graphics + disabledIcon=null

    - ->  | void | java.awt.Container | printComponents | java.awt.Graphics + selected=false

    - ->  | void | java.awt.Container | removeContainerListener | java.awt.event.ContainerListener + itemListeners=[Ljava.awt.event.ItemListener;@e7c11df

    - ->  | void | java.awt.Container | setComponentZOrder | java.awt.Component, int + focusTraversalPolicySet=false

    - ->  | void | java.awt.Container | setFocusCycleRoot | boolean + y=6

    - ->  | void | java.awt.Container | setFocusTraversalPolicyProvider | boolean + x=286

    - ->  | void | java.awt.Container | setLayout | java.awt.LayoutManager + cursorSet=false

    - ->  | void | java.awt.Container | transferFocusDownCycle |  + inputMethodRequests=null

    - ->  | void | java.awt.Component | add | java.awt.PopupMenu + containerListeners=[Ljava.awt.event.ContainerListener;@772fa982

    - ->  | void | java.awt.Component | remove | java.awt.MenuComponent + componentCount=0

    - ->  | java.lang.String | java.awt.Component | toString |  + components=[Ljava.awt.Component;@5b941b09

    - ->  | java.lang.String | java.awt.Component | getName |  + inputVerifier=null

    - ->  | boolean | java.awt.Component | contains | java.awt.Point + hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@6d62f7cc

    - ->  | java.awt.Dimension | java.awt.Component | size |  + border=com.sun.java.swing.plaf.windows.XPStyle$XPEmptyBorder@93e2d77

    - ->  | java.awt.Point | java.awt.Component | getLocation |  + selectedIcon=null

    - ->  | java.awt.Container | java.awt.Component | getParent |  + name=null

    - ->  | void | java.awt.Component | setName | java.lang.String + graphics=sun.java2d.SunGraphics2D[font=java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=12],color=java.awt.SystemColor[i=9]]

    - ->  | void | java.awt.Component | list | java.io.PrintWriter + rolloverEnabled=true

    - ->  | void | java.awt.Component | list |  + focusPainted=true

    - ->  | void | java.awt.Component | list | java.io.PrintStream + foreground=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0]

    - ->  | java.awt.Dimension | java.awt.Component | getSize |  + horizontalTextPosition=11

    - ->  | java.awt.Point | java.awt.Component | location |  + hideActionText=false

    - ->  | void | java.awt.Component | setSize | java.awt.Dimension + focusable=true

    - ->  | void | java.awt.Component | setSize | int, int + preferredSizeSet=false

    - ->  | void | java.awt.Component | resize | java.awt.Dimension + defaultCapable=true

    - ->  | void | java.awt.Component | resize | int, int + visible=true

    - ->  | void | java.awt.Component | enable | boolean + focusCycleRootAncestor=javax.swing.JDialog[dialog36,0,0,400x400,invalid,layout=java.awt.BorderLayout,MODELESS,title=Frame,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,384x361,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]

    - ->  | boolean | java.awt.Component | isValid |  + model=javax.swing.DefaultButtonModel@40f098c6

    - ->  | boolean | java.awt.Component | imageUpdate | java.awt.Image, int, int, int, int, int + lightweight=true

    - ->  | boolean | java.awt.Component | isLightweight |  + inputContext=sun.awt.im.InputMethodContext@2eec9bee

    - ->  | boolean | java.awt.Component | postEvent | java.awt.Event + layout=null

    - ->  | java.awt.Rectangle | java.awt.Component | getBounds |  + opaque=true

    - ->  | int | java.awt.Component | checkImage | java.awt.Image, java.awt.image.ImageObserver + font=java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=12]

    - ->  | int | java.awt.Component | checkImage | java.awt.Image, int, int, java.awt.image.ImageObserver + locale=en

    - ->  | java.awt.Image | java.awt.Component | createImage | java.awt.image.ImageProducer + cursor=java.awt.Cursor[Default Cursor]

    - ->  | java.awt.Image | java.awt.Component | createImage | int, int + inputMethodListeners=[Ljava.awt.event.InputMethodListener;@24054408

    - ->  | java.awt.image.ColorModel | java.awt.Component | getColorModel |  + iconTextGap=4

    - ->  | boolean | java.awt.Component | prepareImage | java.awt.Image, int, int, java.awt.image.ImageObserver + doubleBuffered=false

    - ->  | boolean | java.awt.Component | prepareImage | java.awt.Image, java.awt.image.ImageObserver + visibleRect=java.awt.Rectangle[x=0,y=0,width=87,height=39]

    - ->  | java.awt.peer.ComponentPeer | java.awt.Component | getPeer |  + horizontalAlignment=0

    - ->  | boolean | java.awt.Component | isFocusable |  + valid=true

    - ->  | java.awt.Font | java.awt.Component | getFont |  + focusCycleRoot=false

    - ->  | java.util.Locale | java.awt.Component | getLocale |  + mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@5e231bd3

    - ->  | void | java.awt.Component | setLocale | java.util.Locale + verticalTextPosition=0

    - ->  | java.awt.Color | java.awt.Component | getBackground |  + treeLock=java.awt.Component$AWTTreeLock@1a61254f

    - ->  | java.awt.Color | java.awt.Component | getForeground |  + bounds=java.awt.Rectangle[x=286,y=6,width=87,height=39]

    - ->  | java.awt.GraphicsConfiguration | java.awt.Component | getGraphicsConfiguration |  + propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@1a518e79

    - ->  | void | java.awt.Component | addComponentListener | java.awt.event.ComponentListener + autoscrolls=false

    - ->  | void | java.awt.Component | addFocusListener | java.awt.event.FocusListener + paintingForPrint=false

    - ->  | void | java.awt.Component | addHierarchyBoundsListener | java.awt.event.HierarchyBoundsListener + showing=true

    - ->  | void | java.awt.Component | addHierarchyListener | java.awt.event.HierarchyListener + verticalAlignment=0

    - ->  | void | java.awt.Component | addInputMethodListener | java.awt.event.InputMethodListener + actionListeners=[Ljava.awt.event.ActionListener;@50285536

    - ->  | void | java.awt.Component | addKeyListener | java.awt.event.KeyListener + dropTarget=null

    - ->  | void | java.awt.Component | addMouseListener | java.awt.event.MouseListener + nextFocusableComponent=null

    - ->  | void | java.awt.Component | addMouseMotionListener | java.awt.event.MouseMotionListener + height=39

    - ->  | void | java.awt.Component | addMouseWheelListener | java.awt.event.MouseWheelListener + topLevelAncestor=javax.swing.JDialog[dialog36,0,0,400x400,invalid,layout=java.awt.BorderLayout,MODELESS,title=Frame,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,384x361,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]

    - ->  | java.awt.Rectangle | java.awt.Component | bounds |  + displayable=true

    - ->  | java.awt.image.VolatileImage | java.awt.Component | createVolatileImage | int, int + focusOwner=true

    - ->  | java.awt.image.VolatileImage | java.awt.Component | createVolatileImage | int, int, java.awt.ImageCapabilities + defaultLocale=en

    - ->  | void | java.awt.Component | dispatchEvent | java.awt.AWTEvent + debugGraphicsOptions=0

    - ->  | void | java.awt.Component | enableInputMethods | boolean + enabled=true

    - ->  | [Ljava.awt.event.ComponentListener; | java.awt.Component | getComponentListeners |  + UI=com.sun.java.swing.plaf.windows.WindowsButtonUI@ed7adea

    - ->  | java.awt.ComponentOrientation | java.awt.Component | getComponentOrientation |  + UIClassID=ButtonUI

    + +
    +
    + + + + + +

    - ->  | java.awt.Cursor | java.awt.Component | getCursor |  + completedTask

    + +
    +
    +
    +
    +
    + + + + + + +

    - ->  | java.awt.dnd.DropTarget | java.awt.Component | getDropTarget |  + def texto = new StringBuilder()

    - ->  | java.awt.Container | java.awt.Component | getFocusCycleRootAncestor |  + def sep = " | "

    - ->  | [Ljava.awt.event.FocusListener; | java.awt.Component | getFocusListeners |  +

    - ->  | boolean | java.awt.Component | getFocusTraversalKeysEnabled |  +     texto

    - ->  | [Ljava.awt.event.HierarchyBoundsListener; | java.awt.Component | getHierarchyBoundsListeners |  +         << '-> '

    - ->  | [Ljava.awt.event.HierarchyListener; | java.awt.Component | getHierarchyListeners |  +         << sep << 'returnType'

    - ->  | boolean | java.awt.Component | getIgnoreRepaint |  +         << sep << 'declaringClass'

    - ->  | java.awt.im.InputContext | java.awt.Component | getInputContext |  +         << sep << 'name'

    - ->  | [Ljava.awt.event.InputMethodListener; | java.awt.Component | getInputMethodListeners |  +         << sep << 'parameterTypes'

    - ->  | java.awt.im.InputMethodRequests | java.awt.Component | getInputMethodRequests |  +         << '\n'

    - ->  | [Ljava.awt.event.KeyListener; | java.awt.Component | getKeyListeners |  +

    - ->  | java.awt.Point | java.awt.Component | getLocationOnScreen |  + def objeto = ui.freeplaneTabbedPanel  //  <---- éste se deb cambiar para otras pruebas

    - ->  | [Ljava.awt.event.MouseListener; | java.awt.Component | getMouseListeners |  +

    - ->  | [Ljava.awt.event.MouseMotionListener; | java.awt.Component | getMouseMotionListeners |  + objeto.class.methods.each{

    - ->  | java.awt.Point | java.awt.Component | getMousePosition |  +

    - ->  | [Ljava.awt.event.MouseWheelListener; | java.awt.Component | getMouseWheelListeners |  +

    - ->  | java.awt.Toolkit | java.awt.Component | getToolkit |  +     def returnType = it.returnType.name

    - ->  | java.lang.Object | java.awt.Component | getTreeLock |  +     def declaringClass = it.declaringClass.name

    - ->  | boolean | java.awt.Component | gotFocus | java.awt.Event, java.lang.Object +     def name = it.name

    - ->  | boolean | java.awt.Component | handleEvent | java.awt.Event +     def parameterTypes = it.parameterTypes*.name.join(', ')

    - ->  | boolean | java.awt.Component | hasFocus |  +

    - ->  | boolean | java.awt.Component | isBackgroundSet |  +     texto

    - ->  | boolean | java.awt.Component | isCursorSet |  +         << '-> '

    - ->  | boolean | java.awt.Component | isDisplayable |  +         << sep << returnType

    - ->  | boolean | java.awt.Component | isFocusOwner |  +         << sep << declaringClass

    - ->  | boolean | java.awt.Component | isFocusTraversable |  +         << sep << name

    - ->  | boolean | java.awt.Component | isFontSet |  +         << sep << parameterTypes

    - ->  | boolean | java.awt.Component | isForegroundSet |  +         << '\n'

    - ->  | boolean | java.awt.Component | isMaximumSizeSet |  + }

    - ->  | boolean | java.awt.Component | isMinimumSizeSet |  +

    - ->  | boolean | java.awt.Component | isPreferredSizeSet |  + //texto

    - ->  | boolean | java.awt.Component | isShowing |  +

    - ->  | boolean | java.awt.Component | keyDown | java.awt.Event, int + def nodo = node.createChild('result')

    - ->  | boolean | java.awt.Component | keyUp | java.awt.Event, int +

    - ->  | boolean | java.awt.Component | lostFocus | java.awt.Event, java.lang.Object + nodo.note = texto

    + +
    + + + + + +

    - ->  | boolean | java.awt.Component | mouseDown | java.awt.Event, int, int + .groovy

    + +
    + + + + + +

    - ->  | boolean | java.awt.Component | mouseDrag | java.awt.Event, int, int + ->  | returnType | declaringClass | name | parameterTypes

    - ->  | boolean | java.awt.Component | mouseEnter | java.awt.Event, int, int + ->  | void | javax.swing.JTabbedPane | add | java.awt.Component, java.lang.Object, int

    - ->  | boolean | java.awt.Component | mouseExit | java.awt.Event, int, int + ->  | void | javax.swing.JTabbedPane | add | java.awt.Component, java.lang.Object

    - ->  | boolean | java.awt.Component | mouseMove | java.awt.Event, int, int + ->  | java.awt.Component | javax.swing.JTabbedPane | add | java.awt.Component, int

    - ->  | boolean | java.awt.Component | mouseUp | java.awt.Event, int, int + ->  | java.awt.Component | javax.swing.JTabbedPane | add | java.lang.String, java.awt.Component

    - ->  | void | java.awt.Component | move | int, int + ->  | java.awt.Component | javax.swing.JTabbedPane | add | java.awt.Component

    - ->  | void | java.awt.Component | nextFocus |  + ->  | void | javax.swing.JTabbedPane | remove | int

    - ->  | void | java.awt.Component | paintAll | java.awt.Graphics + ->  | void | javax.swing.JTabbedPane | remove | java.awt.Component

    - ->  | void | java.awt.Component | removeComponentListener | java.awt.event.ComponentListener + ->  | void | javax.swing.JTabbedPane | removeAll | 

    - ->  | void | java.awt.Component | removeFocusListener | java.awt.event.FocusListener + ->  | java.lang.String | javax.swing.JTabbedPane | getToolTipText | java.awt.event.MouseEvent

    - ->  | void | java.awt.Component | removeHierarchyBoundsListener | java.awt.event.HierarchyBoundsListener + ->  | java.lang.String | javax.swing.JTabbedPane | getUIClassID | 

    - ->  | void | java.awt.Component | removeHierarchyListener | java.awt.event.HierarchyListener + ->  | javax.accessibility.AccessibleContext | javax.swing.JTabbedPane | getAccessibleContext | 

    - ->  | void | java.awt.Component | removeInputMethodListener | java.awt.event.InputMethodListener + ->  | java.awt.Component | javax.swing.JTabbedPane | getComponentAt | int

    - ->  | void | java.awt.Component | removeKeyListener | java.awt.event.KeyListener + ->  | void | javax.swing.JTabbedPane | removeChangeListener | javax.swing.event.ChangeListener

    - ->  | void | java.awt.Component | removeMouseListener | java.awt.event.MouseListener + ->  | javax.swing.plaf.TabbedPaneUI | javax.swing.JTabbedPane | getUI | 

    - ->  | void | java.awt.Component | removeMouseMotionListener | java.awt.event.MouseMotionListener + ->  | void | javax.swing.JTabbedPane | addChangeListener | javax.swing.event.ChangeListener

    - ->  | void | java.awt.Component | removeMouseWheelListener | java.awt.event.MouseWheelListener + ->  | javax.swing.SingleSelectionModel | javax.swing.JTabbedPane | getModel | 

    - ->  | void | java.awt.Component | repaint |  + ->  | void | javax.swing.JTabbedPane | addTab | java.lang.String, java.awt.Component

    - ->  | void | java.awt.Component | repaint | long + ->  | void | javax.swing.JTabbedPane | addTab | java.lang.String, javax.swing.Icon, java.awt.Component

    - ->  | void | java.awt.Component | repaint | int, int, int, int + ->  | void | javax.swing.JTabbedPane | addTab | java.lang.String, javax.swing.Icon, java.awt.Component, java.lang.String

    - ->  | void | java.awt.Component | setBounds | java.awt.Rectangle + ->  | java.awt.Color | javax.swing.JTabbedPane | getBackgroundAt | int

    - ->  | void | java.awt.Component | setBounds | int, int, int, int + ->  | java.awt.Rectangle | javax.swing.JTabbedPane | getBoundsAt | int

    - ->  | void | java.awt.Component | setComponentOrientation | java.awt.ComponentOrientation + ->  | [Ljavax.swing.event.ChangeListener; | javax.swing.JTabbedPane | getChangeListeners | 

    - ->  | void | java.awt.Component | setCursor | java.awt.Cursor + ->  | javax.swing.Icon | javax.swing.JTabbedPane | getDisabledIconAt | int

    - ->  | void | java.awt.Component | setDropTarget | java.awt.dnd.DropTarget + ->  | int | javax.swing.JTabbedPane | getDisplayedMnemonicIndexAt | int

    - ->  | void | java.awt.Component | setFocusTraversalKeysEnabled | boolean + ->  | java.awt.Color | javax.swing.JTabbedPane | getForegroundAt | int

    - ->  | void | java.awt.Component | setFocusable | boolean + ->  | javax.swing.Icon | javax.swing.JTabbedPane | getIconAt | int

    - ->  | void | java.awt.Component | setIgnoreRepaint | boolean + ->  | int | javax.swing.JTabbedPane | getMnemonicAt | int

    - ->  | void | java.awt.Component | setLocation | int, int + ->  | int | javax.swing.JTabbedPane | getSelectedIndex | 

    - ->  | void | java.awt.Component | setLocation | java.awt.Point + ->  | java.awt.Component | javax.swing.JTabbedPane | getTabComponentAt | int

    - ->  | void | java.awt.Component | show | boolean + ->  | int | javax.swing.JTabbedPane | getTabCount | 

    - ->  | void | java.awt.Component | show |  + ->  | int | javax.swing.JTabbedPane | getTabLayoutPolicy | 

    - ->  | void | java.awt.Component | transferFocus |  + ->  | int | javax.swing.JTabbedPane | getTabPlacement | 

    - ->  | void | java.awt.Component | transferFocusBackward |  + ->  | int | javax.swing.JTabbedPane | getTabRunCount | 

    - ->  | void | java.awt.Component | transferFocusUpCycle |  + ->  | java.lang.String | javax.swing.JTabbedPane | getTitleAt | int

    - ->  | boolean | java.awt.Component | action | java.awt.Event, java.lang.Object + ->  | java.lang.String | javax.swing.JTabbedPane | getToolTipTextAt | int

    - ->  | boolean | java.awt.Component | inside | int, int + ->  | int | javax.swing.JTabbedPane | indexAtLocation | int, int

    - ->  | void | java.awt.Component | removePropertyChangeListener | java.beans.PropertyChangeListener + ->  | int | javax.swing.JTabbedPane | indexOfComponent | java.awt.Component

    - ->  | void | java.awt.Component | removePropertyChangeListener | java.lang.String, java.beans.PropertyChangeListener + ->  | int | javax.swing.JTabbedPane | indexOfTab | javax.swing.Icon

    - ->  | [Ljava.beans.PropertyChangeListener; | java.awt.Component | getPropertyChangeListeners | java.lang.String + ->  | int | javax.swing.JTabbedPane | indexOfTab | java.lang.String

    - ->  | [Ljava.beans.PropertyChangeListener; | java.awt.Component | getPropertyChangeListeners |  + ->  | int | javax.swing.JTabbedPane | indexOfTabComponent | java.awt.Component

    - ->  | void | java.awt.Component | firePropertyChange | java.lang.String, short, short + ->  | void | javax.swing.JTabbedPane | insertTab | java.lang.String, javax.swing.Icon, java.awt.Component, java.lang.String, int

    - ->  | void | java.awt.Component | firePropertyChange | java.lang.String, byte, byte + ->  | boolean | javax.swing.JTabbedPane | isEnabledAt | int

    - ->  | void | java.awt.Component | firePropertyChange | java.lang.String, long, long + ->  | void | javax.swing.JTabbedPane | removeTabAt | int

    - ->  | void | java.awt.Component | firePropertyChange | java.lang.String, float, float + ->  | void | javax.swing.JTabbedPane | setBackgroundAt | int, java.awt.Color

    - ->  | void | java.awt.Component | firePropertyChange | java.lang.String, double, double + ->  | void | javax.swing.JTabbedPane | setComponentAt | int, java.awt.Component

    - ->  | boolean | java.awt.Component | isEnabled |  + ->  | void | javax.swing.JTabbedPane | setDisabledIconAt | int, javax.swing.Icon

    - ->  | boolean | java.awt.Component | isVisible |  + ->  | void | javax.swing.JTabbedPane | setDisplayedMnemonicIndexAt | int, int

    - ->  | void | java.lang.Object | wait |  + ->  | void | javax.swing.JTabbedPane | setEnabledAt | int, boolean

    - ->  | void | java.lang.Object | wait | long, int + ->  | void | javax.swing.JTabbedPane | setForegroundAt | int, java.awt.Color

    - ->  | void | java.lang.Object | wait | long + ->  | void | javax.swing.JTabbedPane | setIconAt | int, javax.swing.Icon

    - ->  | boolean | java.lang.Object | equals | java.lang.Object + ->  | void | javax.swing.JTabbedPane | setMnemonicAt | int, int

    - ->  | int | java.lang.Object | hashCode |  + ->  | void | javax.swing.JTabbedPane | setModel | javax.swing.SingleSelectionModel

    - ->  | java.lang.Class | java.lang.Object | getClass |  + ->  | void | javax.swing.JTabbedPane | setSelectedComponent | java.awt.Component

    - ->  | void | java.lang.Object | notify |  + ->  | void | javax.swing.JTabbedPane | setSelectedIndex | int

    - ->  | void | java.lang.Object | notifyAll |  + ->  | void | javax.swing.JTabbedPane | setTabComponentAt | int, java.awt.Component

    - -
    -
    -
    - - - - - -

    - def tabPane = ui.freeplaneTabbedPanel + ->  | void | javax.swing.JTabbedPane | setTabLayoutPolicy | int

    - def texto = new StringBuilder() + ->  | void | javax.swing.JTabbedPane | setTabPlacement | int

    - + ->  | void | javax.swing.JTabbedPane | setTitleAt | int, java.lang.String

    - texto << tabPane.properties*.toString().join('\n') + ->  | void | javax.swing.JTabbedPane | setToolTipTextAt | int, java.lang.String

    - + ->  | void | javax.swing.JTabbedPane | setUI | javax.swing.plaf.TabbedPaneUI

    - node.createChild('properties of Tabbed panel').note = texto + ->  | void | javax.swing.JTabbedPane | updateUI | 

    - -
    - - - - - -

    - .groovy + ->  | java.awt.Component | javax.swing.JTabbedPane | getSelectedComponent | 

    - -
    - - - - - -

    - verifyInputWhenFocusTarget=true + ->  | void | javax.swing.JComponent | update | java.awt.Graphics

    - mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@1ca46b6 + ->  | boolean | javax.swing.JComponent | contains | int, int

    - focusTraversalPolicy=null + ->  | java.awt.Point | javax.swing.JComponent | getLocation | java.awt.Point

    - registeredKeyStrokes=[Ljavax.swing.KeyStroke;@1ff9cb8 + ->  | void | javax.swing.JComponent | print | java.awt.Graphics

    - alignmentX=0.5 + ->  | java.awt.Dimension | javax.swing.JComponent | getSize | java.awt.Dimension

    - location=java.awt.Point[x=7,y=0] + ->  | boolean | javax.swing.JComponent | isOpaque | 

    - alignmentY=0.5 + ->  | void | javax.swing.JComponent | disable | 

    - hierarchyListeners=[Ljava.awt.event.HierarchyListener;@c2572 + ->  | void | javax.swing.JComponent | enable | 

    - managingFocus=false + ->  | void | javax.swing.JComponent | setVisible | boolean

    - painting=false + ->  | int | javax.swing.JComponent | getHeight | 

    - insets=java.awt.Insets[top=0,left=0,bottom=0,right=0] + ->  | int | javax.swing.JComponent | getWidth | 

    - baselineResizeBehavior=CONSTANT_ASCENT + ->  | java.awt.Rectangle | javax.swing.JComponent | getBounds | java.awt.Rectangle

    - optimizedDrawingEnabled=true + ->  | void | javax.swing.JComponent | paint | java.awt.Graphics

    - minimumSize=java.awt.Dimension[width=231,height=134] + ->  | java.awt.FontMetrics | javax.swing.JComponent | getFontMetrics | java.awt.Font

    - toolTipText=null + ->  | [Ljava.util.EventListener; | javax.swing.JComponent | getListeners | java.lang.Class

    - focusTraversalKeysEnabled=true + ->  | int | javax.swing.JComponent | getX | 

    - ignoreRepaint=false + ->  | int | javax.swing.JComponent | getY | 

    - inheritsPopupMenu=false + ->  | void | javax.swing.JComponent | addAncestorListener | javax.swing.event.AncestorListener

    - tabPlacement=1 + ->  | void | javax.swing.JComponent | addVetoableChangeListener | java.beans.VetoableChangeListener

    - rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] + ->  | void | javax.swing.JComponent | computeVisibleRect | java.awt.Rectangle

    - parent=javax.swing.Box[,0,0,468x918,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] + ->  | javax.swing.JToolTip | javax.swing.JComponent | createToolTip | 

    - width=461 + ->  | java.awt.event.ActionListener | javax.swing.JComponent | getActionForKeyStroke | javax.swing.KeyStroke

    - toolkit=sun.awt.windows.WToolkit@12eb0c5 + ->  | javax.swing.ActionMap | javax.swing.JComponent | getActionMap | 

    - keyListeners=[Ljava.awt.event.KeyListener;@3d86ba + ->  | [Ljavax.swing.event.AncestorListener; | javax.swing.JComponent | getAncestorListeners | 

    - transferHandler=null + ->  | boolean | javax.swing.JComponent | getAutoscrolls | 

    - size=java.awt.Dimension[width=461,height=918] + ->  | javax.swing.border.Border | javax.swing.JComponent | getBorder | 

    - vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@18f91fd + ->  | java.lang.Object | javax.swing.JComponent | getClientProperty | java.lang.Object

    - maximumSizeSet=false + ->  | javax.swing.JPopupMenu | javax.swing.JComponent | getComponentPopupMenu | 

    - class=class javax.swing.JTabbedPane + ->  | int | javax.swing.JComponent | getConditionForKeyStroke | javax.swing.KeyStroke

    - changeListeners=[Ljavax.swing.event.ChangeListener;@16c0a8 + ->  | int | javax.swing.JComponent | getDebugGraphicsOptions | 

    - maximumSize=java.awt.Dimension[width=32767,height=32767] + ->  | java.util.Locale | javax.swing.JComponent | getDefaultLocale | 

    - focusTraversable=true + ->  | boolean | javax.swing.JComponent | getInheritsPopupMenu | 

    - componentPopupMenu=null + ->  | javax.swing.InputMap | javax.swing.JComponent | getInputMap | int

    - componentListeners=[Ljava.awt.event.ComponentListener;@11e55ad + ->  | javax.swing.InputMap | javax.swing.JComponent | getInputMap | 

    - focusTraversalPolicyProvider=false + ->  | javax.swing.InputVerifier | javax.swing.JComponent | getInputVerifier | 

    - focusListeners=[Ljava.awt.event.FocusListener;@10a0962 + ->  | java.awt.Component | javax.swing.JComponent | getNextFocusableComponent | 

    - background=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229] + ->  | java.awt.Point | javax.swing.JComponent | getPopupLocation | java.awt.event.MouseEvent

    - graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0] + ->  | [Ljavax.swing.KeyStroke; | javax.swing.JComponent | getRegisteredKeyStrokes | 

    - ancestorListeners=[Ljavax.swing.event.AncestorListener;@cb7147 + ->  | java.awt.Point | javax.swing.JComponent | getToolTipLocation | java.awt.event.MouseEvent

    - requestFocusEnabled=true + ->  | java.lang.String | javax.swing.JComponent | getToolTipText | 

    - actionMap=javax.swing.ActionMap@e97e2e + ->  | java.awt.Container | javax.swing.JComponent | getTopLevelAncestor | 

    - backgroundSet=true + ->  | javax.swing.TransferHandler | javax.swing.JComponent | getTransferHandler | 

    - mouseListeners=[Ljava.awt.event.MouseListener;@50fbf6 + ->  | boolean | javax.swing.JComponent | getVerifyInputWhenFocusTarget | 

    - foregroundSet=true + ->  | [Ljava.beans.VetoableChangeListener; | javax.swing.JComponent | getVetoableChangeListeners | 

    - validateRoot=false + ->  | java.awt.Rectangle | javax.swing.JComponent | getVisibleRect | 

    - componentOrientation=java.awt.ComponentOrientation@9cc218 + ->  | void | javax.swing.JComponent | grabFocus | 

    - fontSet=true + ->  | boolean | javax.swing.JComponent | isLightweightComponent | java.awt.Component

    - createdDoubleBuffer=false + ->  | boolean | javax.swing.JComponent | isManagingFocus | 

    - locationOnScreen=java.awt.Point[x=2825,y=-220] + ->  | boolean | javax.swing.JComponent | isOptimizedDrawingEnabled | 

    - selectedComponent=javax.swing.JPanel[,2,25,456x890,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=297,maximumSize=,minimumSize=,preferredSize=] + ->  | boolean | javax.swing.JComponent | isPaintingForPrint | 

    - colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 + ->  | boolean | javax.swing.JComponent | isPaintingTile | 

    - mousePosition=null + ->  | boolean | javax.swing.JComponent | isRequestFocusEnabled | 

    - tabRunCount=1 + ->  | void | javax.swing.JComponent | setToolTipText | java.lang.String

    - paintingTile=false + ->  | java.awt.Graphics | javax.swing.JComponent | getGraphics | 

    - accessibleContext=javax.swing.JTabbedPane$AccessibleJTabbedPane@100181d + ->  | void | javax.swing.JComponent | addNotify | 

    - managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB] + ->  | float | javax.swing.JComponent | getAlignmentX | 

    - preferredSize=java.awt.Dimension[width=461,height=1] + ->  | float | javax.swing.JComponent | getAlignmentY | 

    - inputMap=javax.swing.InputMap@7793a4 + ->  | int | javax.swing.JComponent | getBaseline | int, int

    - minimumSizeSet=false + ->  | java.awt.Component$BaselineResizeBehavior | javax.swing.JComponent | getBaselineResizeBehavior | 

    - focusTraversalPolicySet=false + ->  | java.awt.Insets | javax.swing.JComponent | getInsets | java.awt.Insets

    - y=0 + ->  | java.awt.Insets | javax.swing.JComponent | getInsets | 

    - x=7 + ->  | java.awt.Dimension | javax.swing.JComponent | getMaximumSize | 

    - cursorSet=false + ->  | java.awt.Dimension | javax.swing.JComponent | getMinimumSize | 

    - inputMethodRequests=null + ->  | java.awt.Dimension | javax.swing.JComponent | getPreferredSize | 

    - containerListeners=[Ljava.awt.event.ContainerListener;@1007dec + ->  | void | javax.swing.JComponent | hide | 

    - componentCount=5 + ->  | boolean | javax.swing.JComponent | isDoubleBuffered | 

    - components=[Ljava.awt.Component;@1c3177 + ->  | boolean | javax.swing.JComponent | isValidateRoot | 

    - inputVerifier=null + ->  | void | javax.swing.JComponent | printAll | java.awt.Graphics

    - tabCount=5 + ->  | void | javax.swing.JComponent | removeNotify | 

    - border=null + ->  | void | javax.swing.JComponent | repaint | java.awt.Rectangle

    - hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@1ca263a + ->  | void | javax.swing.JComponent | repaint | long, int, int, int, int

    - name=null + ->  | boolean | javax.swing.JComponent | requestFocusInWindow | 

    - paintingOrigin=false + ->  | void | javax.swing.JComponent | reshape | int, int, int, int

    - graphics=sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12],color=java.awt.Color[r=0,g=0,b=0]] + ->  | void | javax.swing.JComponent | setBackground | java.awt.Color

    - tabLayoutPolicy=0 + ->  | void | javax.swing.JComponent | setFocusTraversalKeys | int, java.util.Set

    - managingFocusForwardTraversalKeys=[ctrl pressed TAB] + ->  | void | javax.swing.JComponent | setFont | java.awt.Font

    - foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51] + ->  | void | javax.swing.JComponent | setForeground | java.awt.Color

    - focusable=true + ->  | void | javax.swing.JComponent | setMaximumSize | java.awt.Dimension

    - preferredSizeSet=true + ->  | void | javax.swing.JComponent | setMinimumSize | java.awt.Dimension

    - visible=true + ->  | void | javax.swing.JComponent | setPreferredSize | java.awt.Dimension

    - model=javax.swing.DefaultSingleSelectionModel@12cc957 + ->  | void | javax.swing.JComponent | setDefaultLocale | java.util.Locale

    - focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] + ->  | void | javax.swing.JComponent | firePropertyChange | java.lang.String, boolean, boolean

    - lightweight=true + ->  | void | javax.swing.JComponent | firePropertyChange | java.lang.String, char, char

    - layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout@67cf92 + ->  | void | javax.swing.JComponent | firePropertyChange | java.lang.String, int, int

    - inputContext=sun.awt.im.InputMethodContext@138a03 + ->  | void | javax.swing.JComponent | setEnabled | boolean

    - opaque=false + ->  | void | javax.swing.JComponent | requestFocus | 

    - font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12] + ->  | boolean | javax.swing.JComponent | requestFocus | boolean

    - locale=en + ->  | void | javax.swing.JComponent | revalidate | 

    - cursor=java.awt.Cursor[Default Cursor] + ->  | void | javax.swing.JComponent | paintImmediately | int, int, int, int

    - inputMethodListeners=[Ljava.awt.event.InputMethodListener;@86ef3e + ->  | void | javax.swing.JComponent | paintImmediately | java.awt.Rectangle

    - doubleBuffered=false + ->  | void | javax.swing.JComponent | putClientProperty | java.lang.Object, java.lang.Object

    - visibleRect=java.awt.Rectangle[x=0,y=0,width=461,height=918] + ->  | void | javax.swing.JComponent | registerKeyboardAction | java.awt.event.ActionListener, java.lang.String, javax.swing.KeyStroke, int

    - valid=true + ->  | void | javax.swing.JComponent | registerKeyboardAction | java.awt.event.ActionListener, javax.swing.KeyStroke, int

    - focusCycleRoot=false + ->  | void | javax.swing.JComponent | removeAncestorListener | javax.swing.event.AncestorListener

    - mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@cd081f + ->  | void | javax.swing.JComponent | removeVetoableChangeListener | java.beans.VetoableChangeListener

    - bounds=java.awt.Rectangle[x=7,y=0,width=461,height=918] + ->  | boolean | javax.swing.JComponent | requestDefaultFocus | 

    - treeLock=java.awt.Component$AWTTreeLock@1875b2 + ->  | void | javax.swing.JComponent | resetKeyboardActions | 

    - propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@14117b8 + ->  | void | javax.swing.JComponent | scrollRectToVisible | java.awt.Rectangle

    - paintingForPrint=false + ->  | void | javax.swing.JComponent | setActionMap | javax.swing.ActionMap

    - autoscrolls=false + ->  | void | javax.swing.JComponent | setAlignmentX | float

    - showing=true + ->  | void | javax.swing.JComponent | setAlignmentY | float

    - selectedIndex=4 + ->  | void | javax.swing.JComponent | setAutoscrolls | boolean

    - dropTarget=null + ->  | void | javax.swing.JComponent | setBorder | javax.swing.border.Border

    - paintingChild=null + ->  | void | javax.swing.JComponent | setComponentPopupMenu | javax.swing.JPopupMenu

    - nextFocusableComponent=null + ->  | void | javax.swing.JComponent | setDebugGraphicsOptions | int

    - height=918 + ->  | void | javax.swing.JComponent | setDoubleBuffered | boolean

    - peer=sun.awt.NullComponentPeer@123725b + ->  | void | javax.swing.JComponent | setInheritsPopupMenu | boolean

    - topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] + ->  | void | javax.swing.JComponent | setInputMap | int, javax.swing.InputMap

    - displayable=true + ->  | void | javax.swing.JComponent | setInputVerifier | javax.swing.InputVerifier

    - defaultLocale=en + ->  | void | javax.swing.JComponent | setNextFocusableComponent | java.awt.Component

    - focusOwner=false + ->  | void | javax.swing.JComponent | setOpaque | boolean

    - debugGraphicsOptions=0 + ->  | void | javax.swing.JComponent | setRequestFocusEnabled | boolean

    - enabled=true + ->  | void | javax.swing.JComponent | setTransferHandler | javax.swing.TransferHandler

    - UI=javax.swing.plaf.metal.MetalTabbedPaneUI@140e5f3 + ->  | void | javax.swing.JComponent | setVerifyInputWhenFocusTarget | boolean

    - UIClassID=TabbedPaneUI + ->  | void | javax.swing.JComponent | unregisterKeyboardAction | javax.swing.KeyStroke

    - -
    -
    - - - - - -

    - verifyInputWhenFocusTarget=true + ->  | javax.swing.JRootPane | javax.swing.JComponent | getRootPane | 

    - mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@1ad35df + ->  | void | java.awt.Container | list | java.io.PrintWriter, int

    - focusTraversalPolicy=null + ->  | void | java.awt.Container | list | java.io.PrintStream, int

    - registeredKeyStrokes=[Ljavax.swing.KeyStroke;@69a3b5 + ->  | void | java.awt.Container | setFocusTraversalPolicy | java.awt.FocusTraversalPolicy

    - alignmentX=0.5 + ->  | java.awt.Component | java.awt.Container | locate | int, int

    - location=java.awt.Point[x=7,y=0] + ->  | [Ljava.awt.Component; | java.awt.Container | getComponents | 

    - alignmentY=0.5 + ->  | void | java.awt.Container | applyComponentOrientation | java.awt.ComponentOrientation

    - hierarchyListeners=[Ljava.awt.event.HierarchyListener;@fd9129 + ->  | boolean | java.awt.Container | areFocusTraversalKeysSet | int

    - managingFocus=false + ->  | int | java.awt.Container | countComponents | 

    - painting=false + ->  | void | java.awt.Container | deliverEvent | java.awt.Event

    - insets=java.awt.Insets[top=0,left=0,bottom=0,right=0] + ->  | void | java.awt.Container | doLayout | 

    - baselineResizeBehavior=CONSTANT_ASCENT + ->  | java.awt.Component | java.awt.Container | findComponentAt | int, int

    - optimizedDrawingEnabled=true + ->  | java.awt.Component | java.awt.Container | findComponentAt | java.awt.Point

    - minimumSize=java.awt.Dimension[width=231,height=134] + ->  | java.awt.Component | java.awt.Container | getComponentAt | java.awt.Point

    - toolTipText=null + ->  | java.awt.Component | java.awt.Container | getComponentAt | int, int

    - focusTraversalKeysEnabled=true + ->  | int | java.awt.Container | getComponentZOrder | java.awt.Component

    - ignoreRepaint=false + ->  | java.util.Set | java.awt.Container | getFocusTraversalKeys | int

    - inheritsPopupMenu=false + ->  | java.awt.FocusTraversalPolicy | java.awt.Container | getFocusTraversalPolicy | 

    - tabPlacement=1 + ->  | java.awt.LayoutManager | java.awt.Container | getLayout | 

    - rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] + ->  | java.awt.Point | java.awt.Container | getMousePosition | boolean

    - parent=javax.swing.Box[,0,0,391x918,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] + ->  | boolean | java.awt.Container | isFocusCycleRoot | 

    - width=384 + ->  | boolean | java.awt.Container | isFocusCycleRoot | java.awt.Container

    - toolkit=sun.awt.windows.WToolkit@12eb0c5 + ->  | void | java.awt.Container | layout | 

    - keyListeners=[Ljava.awt.event.KeyListener;@61210a + ->  | java.awt.Dimension | java.awt.Container | minimumSize | 

    - transferHandler=null + ->  | java.awt.Dimension | java.awt.Container | preferredSize | 

    - size=java.awt.Dimension[width=384,height=918] + ->  | void | java.awt.Container | invalidate | 

    - vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@5ceb54 + ->  | void | java.awt.Container | validate | 

    - maximumSizeSet=false + ->  | void | java.awt.Container | addPropertyChangeListener | java.beans.PropertyChangeListener

    - class=class javax.swing.JTabbedPane + ->  | void | java.awt.Container | addPropertyChangeListener | java.lang.String, java.beans.PropertyChangeListener

    - changeListeners=[Ljavax.swing.event.ChangeListener;@1d99761 + ->  | int | java.awt.Container | getComponentCount | 

    - maximumSize=java.awt.Dimension[width=32767,height=32767] + ->  | java.awt.Component | java.awt.Container | getComponent | int

    - focusTraversable=true + ->  | void | java.awt.Container | addContainerListener | java.awt.event.ContainerListener

    - componentPopupMenu=null + ->  | [Ljava.awt.event.ContainerListener; | java.awt.Container | getContainerListeners | 

    - componentListeners=[Ljava.awt.event.ComponentListener;@18d272a + ->  | java.awt.Insets | java.awt.Container | insets | 

    - focusTraversalPolicyProvider=false + ->  | boolean | java.awt.Container | isAncestorOf | java.awt.Component

    - focusListeners=[Ljava.awt.event.FocusListener;@cf26e0 + ->  | boolean | java.awt.Container | isFocusTraversalPolicyProvider | 

    - background=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229] + ->  | boolean | java.awt.Container | isFocusTraversalPolicySet | 

    - graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0] + ->  | void | java.awt.Container | paintComponents | java.awt.Graphics

    - ancestorListeners=[Ljavax.swing.event.AncestorListener;@1327726 + ->  | void | java.awt.Container | printComponents | java.awt.Graphics

    - requestFocusEnabled=true + ->  | void | java.awt.Container | removeContainerListener | java.awt.event.ContainerListener

    - actionMap=javax.swing.ActionMap@e97e2e + ->  | void | java.awt.Container | setComponentZOrder | java.awt.Component, int

    - backgroundSet=true + ->  | void | java.awt.Container | setFocusCycleRoot | boolean

    - mouseListeners=[Ljava.awt.event.MouseListener;@71897e + ->  | void | java.awt.Container | setFocusTraversalPolicyProvider | boolean

    - foregroundSet=true + ->  | void | java.awt.Container | setLayout | java.awt.LayoutManager

    - validateRoot=false + ->  | void | java.awt.Container | transferFocusDownCycle | 

    - componentOrientation=java.awt.ComponentOrientation@9cc218 + ->  | void | java.awt.Component | add | java.awt.PopupMenu

    - fontSet=true + ->  | void | java.awt.Component | remove | java.awt.MenuComponent

    - createdDoubleBuffer=false + ->  | java.lang.String | java.awt.Component | toString | 

    - locationOnScreen=java.awt.Point[x=2902,y=-220] + ->  | java.lang.String | java.awt.Component | getName | 

    - selectedComponent=javax.swing.JScrollPane[,2,25,379x890,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=com.sun.java.swing.plaf.windows.XPStyle$XPFillBorder@b9e7d6,flags=328,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,1,872,360x17,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=20],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,361,1,17x871,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=20],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_ALWAYS,viewport=javax.swing.JViewport[,1,1,360x871,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=java.awt.Point[x=0,y=0],scrollUnderway=false],viewportBorder=] + ->  | boolean | java.awt.Component | contains | java.awt.Point

    - colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 + ->  | java.awt.Dimension | java.awt.Component | size | 

    - mousePosition=null + ->  | java.awt.Point | java.awt.Component | getLocation | 

    - tabRunCount=1 + ->  | java.awt.Container | java.awt.Component | getParent | 

    - paintingTile=false + ->  | void | java.awt.Component | setName | java.lang.String

    - accessibleContext=javax.swing.JTabbedPane$AccessibleJTabbedPane@100181d + ->  | void | java.awt.Component | list | java.io.PrintWriter

    - managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB] + ->  | void | java.awt.Component | list | 

    - preferredSize=java.awt.Dimension[width=384,height=1] + ->  | void | java.awt.Component | list | java.io.PrintStream

    - inputMap=javax.swing.InputMap@7793a4 + ->  | java.awt.Dimension | java.awt.Component | getSize | 

    - minimumSizeSet=false + ->  | java.awt.Point | java.awt.Component | location | 

    - focusTraversalPolicySet=false + ->  | void | java.awt.Component | setSize | java.awt.Dimension

    - y=0 + ->  | void | java.awt.Component | setSize | int, int

    - x=7 + ->  | void | java.awt.Component | resize | java.awt.Dimension

    - cursorSet=false + ->  | void | java.awt.Component | resize | int, int

    - inputMethodRequests=null + ->  | void | java.awt.Component | enable | boolean

    - containerListeners=[Ljava.awt.event.ContainerListener;@614dad + ->  | boolean | java.awt.Component | isValid | 

    - componentCount=5 + ->  | boolean | java.awt.Component | imageUpdate | java.awt.Image, int, int, int, int, int

    - components=[Ljava.awt.Component;@1068067 + ->  | boolean | java.awt.Component | isLightweight | 

    - inputVerifier=null + ->  | boolean | java.awt.Component | postEvent | java.awt.Event

    - tabCount=5 + ->  | java.awt.Rectangle | java.awt.Component | getBounds | 

    - border=null + ->  | int | java.awt.Component | checkImage | java.awt.Image, java.awt.image.ImageObserver

    - hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@1034ce6 + ->  | int | java.awt.Component | checkImage | java.awt.Image, int, int, java.awt.image.ImageObserver

    - name=null + ->  | java.awt.Image | java.awt.Component | createImage | java.awt.image.ImageProducer

    - paintingOrigin=false + ->  | java.awt.Image | java.awt.Component | createImage | int, int

    - graphics=sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12],color=java.awt.Color[r=0,g=0,b=0]] + ->  | java.awt.image.ColorModel | java.awt.Component | getColorModel | 

    - tabLayoutPolicy=0 + ->  | boolean | java.awt.Component | prepareImage | java.awt.Image, int, int, java.awt.image.ImageObserver

    - managingFocusForwardTraversalKeys=[ctrl pressed TAB] + ->  | boolean | java.awt.Component | prepareImage | java.awt.Image, java.awt.image.ImageObserver

    - foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51] + ->  | java.awt.peer.ComponentPeer | java.awt.Component | getPeer | 

    - focusable=true + ->  | boolean | java.awt.Component | isFocusable | 

    - preferredSizeSet=true + ->  | java.awt.Font | java.awt.Component | getFont | 

    - visible=true + ->  | java.util.Locale | java.awt.Component | getLocale | 

    - model=javax.swing.DefaultSingleSelectionModel@12cc957 + ->  | void | java.awt.Component | setLocale | java.util.Locale

    - focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] + ->  | java.awt.Color | java.awt.Component | getBackground | 

    - lightweight=true + ->  | java.awt.Color | java.awt.Component | getForeground | 

    - layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout@67cf92 + ->  | java.awt.GraphicsConfiguration | java.awt.Component | getGraphicsConfiguration | 

    - inputContext=sun.awt.im.InputMethodContext@138a03 + ->  | void | java.awt.Component | addComponentListener | java.awt.event.ComponentListener

    - opaque=false + ->  | void | java.awt.Component | addFocusListener | java.awt.event.FocusListener

    - font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12] + ->  | void | java.awt.Component | addHierarchyBoundsListener | java.awt.event.HierarchyBoundsListener

    - locale=en + ->  | void | java.awt.Component | addHierarchyListener | java.awt.event.HierarchyListener

    - cursor=java.awt.Cursor[Default Cursor] + ->  | void | java.awt.Component | addInputMethodListener | java.awt.event.InputMethodListener

    - inputMethodListeners=[Ljava.awt.event.InputMethodListener;@1891ec1 + ->  | void | java.awt.Component | addKeyListener | java.awt.event.KeyListener

    - doubleBuffered=false + ->  | void | java.awt.Component | addMouseListener | java.awt.event.MouseListener

    - visibleRect=java.awt.Rectangle[x=0,y=0,width=384,height=918] + ->  | void | java.awt.Component | addMouseMotionListener | java.awt.event.MouseMotionListener

    - valid=true + ->  | void | java.awt.Component | addMouseWheelListener | java.awt.event.MouseWheelListener

    - focusCycleRoot=false + ->  | java.awt.Rectangle | java.awt.Component | bounds | 

    - mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@1173078 + ->  | java.awt.image.VolatileImage | java.awt.Component | createVolatileImage | int, int

    - bounds=java.awt.Rectangle[x=7,y=0,width=384,height=918] + ->  | java.awt.image.VolatileImage | java.awt.Component | createVolatileImage | int, int, java.awt.ImageCapabilities

    - treeLock=java.awt.Component$AWTTreeLock@1875b2 + ->  | void | java.awt.Component | dispatchEvent | java.awt.AWTEvent

    - propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@2198c5 + ->  | void | java.awt.Component | enableInputMethods | boolean

    - paintingForPrint=false + ->  | [Ljava.awt.event.ComponentListener; | java.awt.Component | getComponentListeners | 

    - autoscrolls=false + ->  | java.awt.ComponentOrientation | java.awt.Component | getComponentOrientation | 

    - showing=true + ->  | java.awt.Cursor | java.awt.Component | getCursor | 

    - selectedIndex=0 + ->  | java.awt.dnd.DropTarget | java.awt.Component | getDropTarget | 

    - dropTarget=null + ->  | java.awt.Container | java.awt.Component | getFocusCycleRootAncestor | 

    - paintingChild=null + ->  | [Ljava.awt.event.FocusListener; | java.awt.Component | getFocusListeners | 

    - nextFocusableComponent=null + ->  | boolean | java.awt.Component | getFocusTraversalKeysEnabled | 

    - height=918 + ->  | [Ljava.awt.event.HierarchyBoundsListener; | java.awt.Component | getHierarchyBoundsListeners | 

    - peer=sun.awt.NullComponentPeer@123725b + ->  | [Ljava.awt.event.HierarchyListener; | java.awt.Component | getHierarchyListeners | 

    - topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] + ->  | boolean | java.awt.Component | getIgnoreRepaint | 

    - displayable=true + ->  | java.awt.im.InputContext | java.awt.Component | getInputContext | 

    - defaultLocale=en + ->  | [Ljava.awt.event.InputMethodListener; | java.awt.Component | getInputMethodListeners | 

    - focusOwner=false + ->  | java.awt.im.InputMethodRequests | java.awt.Component | getInputMethodRequests | 

    - debugGraphicsOptions=0 + ->  | [Ljava.awt.event.KeyListener; | java.awt.Component | getKeyListeners | 

    - enabled=true + ->  | java.awt.Point | java.awt.Component | getLocationOnScreen | 

    - UI=javax.swing.plaf.metal.MetalTabbedPaneUI@140e5f3 + ->  | [Ljava.awt.event.MouseListener; | java.awt.Component | getMouseListeners | 

    - UIClassID=TabbedPaneUI + ->  | [Ljava.awt.event.MouseMotionListener; | java.awt.Component | getMouseMotionListeners | 

    - -
    -
    - - - - - -

    - verifyInputWhenFocusTarget=true + ->  | java.awt.Point | java.awt.Component | getMousePosition | 

    - mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@196141d + ->  | [Ljava.awt.event.MouseWheelListener; | java.awt.Component | getMouseWheelListeners | 

    - focusTraversalPolicy=null + ->  | java.awt.Toolkit | java.awt.Component | getToolkit | 

    - registeredKeyStrokes=[Ljavax.swing.KeyStroke;@1c3129c + ->  | java.lang.Object | java.awt.Component | getTreeLock | 

    - alignmentX=0.5 + ->  | boolean | java.awt.Component | gotFocus | java.awt.Event, java.lang.Object

    - location=java.awt.Point[x=7,y=0] + ->  | boolean | java.awt.Component | handleEvent | java.awt.Event

    - alignmentY=0.5 + ->  | boolean | java.awt.Component | hasFocus | 

    - hierarchyListeners=[Ljava.awt.event.HierarchyListener;@102950b + ->  | boolean | java.awt.Component | isBackgroundSet | 

    - managingFocus=false + ->  | boolean | java.awt.Component | isCursorSet | 

    - painting=false + ->  | boolean | java.awt.Component | isDisplayable | 

    - insets=java.awt.Insets[top=0,left=0,bottom=0,right=0] + ->  | boolean | java.awt.Component | isFocusOwner | 

    - baselineResizeBehavior=CONSTANT_ASCENT + ->  | boolean | java.awt.Component | isFocusTraversable | 

    - optimizedDrawingEnabled=true + ->  | boolean | java.awt.Component | isFontSet | 

    - minimumSize=java.awt.Dimension[width=231,height=134] + ->  | boolean | java.awt.Component | isForegroundSet | 

    - toolTipText=null + ->  | boolean | java.awt.Component | isMaximumSizeSet | 

    - focusTraversalKeysEnabled=true + ->  | boolean | java.awt.Component | isMinimumSizeSet | 

    - ignoreRepaint=false + ->  | boolean | java.awt.Component | isPreferredSizeSet | 

    - inheritsPopupMenu=false + ->  | boolean | java.awt.Component | isShowing | 

    - tabPlacement=1 + ->  | boolean | java.awt.Component | keyDown | java.awt.Event, int

    - rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] + ->  | boolean | java.awt.Component | keyUp | java.awt.Event, int

    - parent=javax.swing.Box[,0,0,7x918,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] + ->  | boolean | java.awt.Component | lostFocus | java.awt.Event, java.lang.Object

    - width=0 + ->  | boolean | java.awt.Component | mouseDown | java.awt.Event, int, int

    - toolkit=sun.awt.windows.WToolkit@12eb0c5 + ->  | boolean | java.awt.Component | mouseDrag | java.awt.Event, int, int

    - keyListeners=[Ljava.awt.event.KeyListener;@1440a6b + ->  | boolean | java.awt.Component | mouseEnter | java.awt.Event, int, int

    - transferHandler=null + ->  | boolean | java.awt.Component | mouseExit | java.awt.Event, int, int

    - size=java.awt.Dimension[width=0,height=0] + ->  | boolean | java.awt.Component | mouseMove | java.awt.Event, int, int

    - vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@6fc562 + ->  | boolean | java.awt.Component | mouseUp | java.awt.Event, int, int

    - maximumSizeSet=false + ->  | void | java.awt.Component | move | int, int

    - class=class javax.swing.JTabbedPane + ->  | void | java.awt.Component | nextFocus | 

    - changeListeners=[Ljavax.swing.event.ChangeListener;@1d96641 + ->  | void | java.awt.Component | paintAll | java.awt.Graphics

    - maximumSize=java.awt.Dimension[width=32767,height=32767] + ->  | void | java.awt.Component | removeComponentListener | java.awt.event.ComponentListener

    - focusTraversable=true + ->  | void | java.awt.Component | removeFocusListener | java.awt.event.FocusListener

    - componentPopupMenu=null + ->  | void | java.awt.Component | removeHierarchyBoundsListener | java.awt.event.HierarchyBoundsListener

    - componentListeners=[Ljava.awt.event.ComponentListener;@541bfc + ->  | void | java.awt.Component | removeHierarchyListener | java.awt.event.HierarchyListener

    - focusTraversalPolicyProvider=false + ->  | void | java.awt.Component | removeInputMethodListener | java.awt.event.InputMethodListener

    - focusListeners=[Ljava.awt.event.FocusListener;@14c404f + ->  | void | java.awt.Component | removeKeyListener | java.awt.event.KeyListener

    - background=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229] + ->  | void | java.awt.Component | removeMouseListener | java.awt.event.MouseListener

    - graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0] + ->  | void | java.awt.Component | removeMouseMotionListener | java.awt.event.MouseMotionListener

    - ancestorListeners=[Ljavax.swing.event.AncestorListener;@144ce91 + ->  | void | java.awt.Component | removeMouseWheelListener | java.awt.event.MouseWheelListener

    - requestFocusEnabled=true + ->  | void | java.awt.Component | repaint | 

    - actionMap=javax.swing.ActionMap@e97e2e + ->  | void | java.awt.Component | repaint | long

    - backgroundSet=true + ->  | void | java.awt.Component | repaint | int, int, int, int

    - mouseListeners=[Ljava.awt.event.MouseListener;@1b75d56 + ->  | void | java.awt.Component | setBounds | java.awt.Rectangle

    - foregroundSet=true + ->  | void | java.awt.Component | setBounds | int, int, int, int

    - validateRoot=false + ->  | void | java.awt.Component | setComponentOrientation | java.awt.ComponentOrientation

    - componentOrientation=java.awt.ComponentOrientation@9cc218 + ->  | void | java.awt.Component | setCursor | java.awt.Cursor

    - fontSet=true + ->  | void | java.awt.Component | setDropTarget | java.awt.dnd.DropTarget

    - createdDoubleBuffer=false + ->  | void | java.awt.Component | setFocusTraversalKeysEnabled | boolean

    - selectedComponent=javax.swing.JScrollPane[,2,101,-5x-104,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=com.sun.java.swing.plaf.windows.XPStyle$XPFillBorder@b9e7d6,flags=328,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,1,872,360x17,hidden,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=20],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,361,1,17x871,hidden,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=20],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_ALWAYS,viewport=javax.swing.JViewport[,1,1,-7x-106,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=java.awt.Point[x=0,y=0],scrollUnderway=false],viewportBorder=] + ->  | void | java.awt.Component | setFocusable | boolean

    - colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 + ->  | void | java.awt.Component | setIgnoreRepaint | boolean

    - mousePosition=null + ->  | void | java.awt.Component | setLocation | int, int

    - tabRunCount=5 + ->  | void | java.awt.Component | setLocation | java.awt.Point

    - paintingTile=false + ->  | void | java.awt.Component | show | boolean

    - accessibleContext=javax.swing.JTabbedPane$AccessibleJTabbedPane@100181d + ->  | void | java.awt.Component | show | 

    - managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB] + ->  | void | java.awt.Component | transferFocus | 

    - preferredSize=java.awt.Dimension[width=0,height=0] + ->  | void | java.awt.Component | transferFocusBackward | 

    - inputMap=javax.swing.InputMap@7793a4 + ->  | void | java.awt.Component | transferFocusUpCycle | 

    - minimumSizeSet=false + ->  | boolean | java.awt.Component | action | java.awt.Event, java.lang.Object

    - focusTraversalPolicySet=false + ->  | boolean | java.awt.Component | inside | int, int

    - y=0 + ->  | void | java.awt.Component | removePropertyChangeListener | java.beans.PropertyChangeListener

    - x=7 + ->  | void | java.awt.Component | removePropertyChangeListener | java.lang.String, java.beans.PropertyChangeListener

    - cursorSet=false + ->  | [Ljava.beans.PropertyChangeListener; | java.awt.Component | getPropertyChangeListeners | java.lang.String

    - inputMethodRequests=null + ->  | [Ljava.beans.PropertyChangeListener; | java.awt.Component | getPropertyChangeListeners | 

    - containerListeners=[Ljava.awt.event.ContainerListener;@16838a7 + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, short, short

    - componentCount=5 + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, byte, byte

    - components=[Ljava.awt.Component;@bf51bd + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, long, long

    - inputVerifier=null + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, float, float

    - tabCount=5 + ->  | void | java.awt.Component | firePropertyChange | java.lang.String, double, double

    - border=null + ->  | boolean | java.awt.Component | isEnabled | 

    - hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@11e2b3d + ->  | boolean | java.awt.Component | isVisible | 

    - name=null + ->  | void | java.lang.Object | wait | 

    - paintingOrigin=false + ->  | void | java.lang.Object | wait | long, int

    - graphics=sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12],color=java.awt.Color[r=0,g=0,b=0]] + ->  | void | java.lang.Object | wait | long

    - tabLayoutPolicy=0 + ->  | boolean | java.lang.Object | equals | java.lang.Object

    - managingFocusForwardTraversalKeys=[ctrl pressed TAB] + ->  | int | java.lang.Object | hashCode | 

    - foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51] + ->  | java.lang.Class | java.lang.Object | getClass | 

    - focusable=true + ->  | void | java.lang.Object | notify | 

    - preferredSizeSet=true + ->  | void | java.lang.Object | notifyAll | 

    + +
    +
    +
    + + + + + +

    - visible=false + def tabPane = ui.freeplaneTabbedPanel

    - model=javax.swing.DefaultSingleSelectionModel@12cc957 + def texto = new StringBuilder()

    - focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    - lightweight=true + texto << tabPane.properties*.toString().join('\n')

    - layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout@67cf92 +

    - inputContext=sun.awt.im.InputMethodContext@138a03 + node.createChild('properties of Tabbed panel').note = texto

    + +
    + + + + + +

    - opaque=false + .groovy

    + +
    + + + + + +

    - font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12] + verifyInputWhenFocusTarget=true

    - locale=en + mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@1ca46b6

    - cursor=java.awt.Cursor[Default Cursor] + focusTraversalPolicy=null

    - inputMethodListeners=[Ljava.awt.event.InputMethodListener;@5685e5 + registeredKeyStrokes=[Ljavax.swing.KeyStroke;@1ff9cb8

    - doubleBuffered=false + alignmentX=0.5

    - visibleRect=java.awt.Rectangle[x=0,y=0,width=0,height=0] + location=java.awt.Point[x=7,y=0]

    - valid=true + alignmentY=0.5

    - focusCycleRoot=false + hierarchyListeners=[Ljava.awt.event.HierarchyListener;@c2572

    - mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@413488 + managingFocus=false

    - bounds=java.awt.Rectangle[x=7,y=0,width=0,height=0] + painting=false

    - treeLock=java.awt.Component$AWTTreeLock@1875b2 + insets=java.awt.Insets[top=0,left=0,bottom=0,right=0]

    - propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@ebb404 + baselineResizeBehavior=CONSTANT_ASCENT

    - paintingForPrint=false + optimizedDrawingEnabled=true

    - autoscrolls=false + minimumSize=java.awt.Dimension[width=231,height=134]

    - showing=false + toolTipText=null

    - selectedIndex=0 + focusTraversalKeysEnabled=true

    - dropTarget=null + ignoreRepaint=false

    - paintingChild=null + inheritsPopupMenu=false

    - nextFocusableComponent=null + tabPlacement=1

    - height=0 + rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=]

    - peer=sun.awt.NullComponentPeer@123725b + parent=javax.swing.Box[,0,0,468x918,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=]

    - topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] + width=461

    - displayable=true + toolkit=sun.awt.windows.WToolkit@12eb0c5

    - defaultLocale=en + keyListeners=[Ljava.awt.event.KeyListener;@3d86ba

    - focusOwner=false + transferHandler=null

    - debugGraphicsOptions=0 + size=java.awt.Dimension[width=461,height=918]

    - enabled=true + vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@18f91fd

    - UI=javax.swing.plaf.metal.MetalTabbedPaneUI@140e5f3 + maximumSizeSet=false

    - UIClassID=TabbedPaneUI + class=class javax.swing.JTabbedPane

    - -
    -
    -
    -
    - - - - - - - - - - -

    - import edofro.tutorialomatic.ToM    as tom + changeListeners=[Ljavax.swing.event.ChangeListener;@16c0a8

    - import edofro.pseudofreeplaneapi.UserStyles as us + maximumSize=java.awt.Dimension[width=32767,height=32767]

    - + focusTraversable=true

    - //region: opens tutorial map + componentPopupMenu=null

    - + componentListeners=[Ljava.awt.event.ComponentListener;@11e55ad

    -     def sep         = File.separator + focusTraversalPolicyProvider=false

    -     def userDir     = c.userDirectory.path + focusListeners=[Ljava.awt.event.FocusListener;@10a0962

    -     def mapFileName = "tutorial_styles_template.mm" + background=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229]

    -     def pathName    = userDir + sep + "templates" + sep + "Tutorial-o-Matic" + sep + mapFileName + graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0]

    -     def sourceMap   = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto) + ancestorListeners=[Ljavax.swing.event.AncestorListener;@cb7147

    - + requestFocusEnabled=true

    - // return tutMap.class + actionMap=javax.swing.ActionMap@e97e2e

    -     def targetMap = node.map + backgroundSet=true

    -     us.copyUserStyles(sourceMap, targetMap) + mouseListeners=[Ljava.awt.event.MouseListener;@50fbf6

    - + foregroundSet=true

    - //Other use case examples on how to use UserStyles.copyUserStyles + validateRoot=false

    - /* + componentOrientation=java.awt.ComponentOrientation@9cc218

    -     def myString = 'ToM_goto' + fontSet=true

    -     def myList = 'ToM_nextPage,ToM_goto,ToM_showNode'.split(',') + createdDoubleBuffer=false

    -     def myClosure =  {it.text.contains('u')} + locationOnScreen=java.awt.Point[x=2825,y=-220]

    - + selectedComponent=javax.swing.JPanel[,2,25,456x890,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=297,maximumSize=,minimumSize=,preferredSize=]

    - + colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0

    -     us.copyUserStyles(sourceMap, targetMap, myString) + mousePosition=null

    -     us.copyUserStyles(sourceMap, targetMap, myList) + tabRunCount=1

    -     us.copyUserStyles(sourceMap, targetMap, myClosure) + paintingTile=false

    - */ + accessibleContext=javax.swing.JTabbedPane$AccessibleJTabbedPane@100181d

    - + managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB]

    - + preferredSize=java.awt.Dimension[width=461,height=1]

    - + inputMap=javax.swing.InputMap@7793a4

    - -
    -
    - - - - - -

    - import edofro.tutorialomatic.ToM    as tom + minimumSizeSet=false

    - + focusTraversalPolicySet=false +

    +

    + y=0 +

    +

    + x=7 +

    +

    + cursorSet=false +

    +

    + inputMethodRequests=null +

    +

    + containerListeners=[Ljava.awt.event.ContainerListener;@1007dec +

    +

    + componentCount=5 +

    +

    + components=[Ljava.awt.Component;@1c3177 +

    +

    + inputVerifier=null +

    +

    + tabCount=5 +

    +

    + border=null +

    +

    + hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@1ca263a +

    +

    + name=null +

    +

    + paintingOrigin=false +

    +

    + graphics=sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12],color=java.awt.Color[r=0,g=0,b=0]] +

    +

    + tabLayoutPolicy=0 +

    +

    + managingFocusForwardTraversalKeys=[ctrl pressed TAB] +

    +

    + foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51] +

    +

    + focusable=true +

    +

    + preferredSizeSet=true +

    +

    + visible=true +

    +

    + model=javax.swing.DefaultSingleSelectionModel@12cc957 +

    +

    + focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + lightweight=true +

    +

    + layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout@67cf92 +

    +

    + inputContext=sun.awt.im.InputMethodContext@138a03 +

    +

    + opaque=false +

    +

    + font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12] +

    +

    + locale=en +

    +

    + cursor=java.awt.Cursor[Default Cursor] +

    +

    + inputMethodListeners=[Ljava.awt.event.InputMethodListener;@86ef3e +

    +

    + doubleBuffered=false +

    +

    + visibleRect=java.awt.Rectangle[x=0,y=0,width=461,height=918] +

    +

    + valid=true +

    +

    + focusCycleRoot=false +

    +

    + mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@cd081f +

    +

    + bounds=java.awt.Rectangle[x=7,y=0,width=461,height=918] +

    +

    + treeLock=java.awt.Component$AWTTreeLock@1875b2 +

    +

    + propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@14117b8 +

    +

    + paintingForPrint=false +

    +

    + autoscrolls=false +

    +

    + showing=true +

    +

    + selectedIndex=4 +

    +

    + dropTarget=null +

    +

    + paintingChild=null +

    +

    + nextFocusableComponent=null +

    +

    + height=918 +

    +

    + peer=sun.awt.NullComponentPeer@123725b +

    +

    + topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + displayable=true +

    +

    + defaultLocale=en +

    +

    + focusOwner=false +

    +

    + debugGraphicsOptions=0 +

    +

    + enabled=true +

    +

    + UI=javax.swing.plaf.metal.MetalTabbedPaneUI@140e5f3 +

    +

    + UIClassID=TabbedPaneUI +

    + +
    +
    + + + + + + +

    + verifyInputWhenFocusTarget=true +

    +

    + mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@1ad35df +

    +

    + focusTraversalPolicy=null +

    +

    + registeredKeyStrokes=[Ljavax.swing.KeyStroke;@69a3b5 +

    +

    + alignmentX=0.5 +

    +

    + location=java.awt.Point[x=7,y=0] +

    +

    + alignmentY=0.5 +

    +

    + hierarchyListeners=[Ljava.awt.event.HierarchyListener;@fd9129 +

    +

    + managingFocus=false +

    +

    + painting=false +

    +

    + insets=java.awt.Insets[top=0,left=0,bottom=0,right=0] +

    +

    + baselineResizeBehavior=CONSTANT_ASCENT +

    +

    + optimizedDrawingEnabled=true +

    +

    + minimumSize=java.awt.Dimension[width=231,height=134] +

    +

    + toolTipText=null +

    +

    + focusTraversalKeysEnabled=true +

    +

    + ignoreRepaint=false +

    +

    + inheritsPopupMenu=false +

    +

    + tabPlacement=1 +

    +

    + rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] +

    +

    + parent=javax.swing.Box[,0,0,391x918,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] +

    +

    + width=384 +

    +

    + toolkit=sun.awt.windows.WToolkit@12eb0c5 +

    +

    + keyListeners=[Ljava.awt.event.KeyListener;@61210a +

    +

    + transferHandler=null +

    +

    + size=java.awt.Dimension[width=384,height=918] +

    +

    + vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@5ceb54 +

    +

    + maximumSizeSet=false +

    +

    + class=class javax.swing.JTabbedPane +

    +

    + changeListeners=[Ljavax.swing.event.ChangeListener;@1d99761 +

    +

    + maximumSize=java.awt.Dimension[width=32767,height=32767] +

    +

    + focusTraversable=true +

    +

    + componentPopupMenu=null +

    +

    + componentListeners=[Ljava.awt.event.ComponentListener;@18d272a +

    +

    + focusTraversalPolicyProvider=false +

    +

    + focusListeners=[Ljava.awt.event.FocusListener;@cf26e0 +

    +

    + background=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229] +

    +

    + graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0] +

    +

    + ancestorListeners=[Ljavax.swing.event.AncestorListener;@1327726 +

    +

    + requestFocusEnabled=true +

    +

    + actionMap=javax.swing.ActionMap@e97e2e +

    +

    + backgroundSet=true +

    +

    + mouseListeners=[Ljava.awt.event.MouseListener;@71897e +

    +

    + foregroundSet=true +

    +

    + validateRoot=false +

    +

    + componentOrientation=java.awt.ComponentOrientation@9cc218 +

    +

    + fontSet=true +

    +

    + createdDoubleBuffer=false +

    +

    + locationOnScreen=java.awt.Point[x=2902,y=-220] +

    +

    + selectedComponent=javax.swing.JScrollPane[,2,25,379x890,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=com.sun.java.swing.plaf.windows.XPStyle$XPFillBorder@b9e7d6,flags=328,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,1,872,360x17,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=20],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,361,1,17x871,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=20],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_ALWAYS,viewport=javax.swing.JViewport[,1,1,360x871,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=java.awt.Point[x=0,y=0],scrollUnderway=false],viewportBorder=] +

    +

    + colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 +

    +

    + mousePosition=null +

    +

    + tabRunCount=1 +

    +

    + paintingTile=false +

    +

    + accessibleContext=javax.swing.JTabbedPane$AccessibleJTabbedPane@100181d +

    +

    + managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB] +

    +

    + preferredSize=java.awt.Dimension[width=384,height=1] +

    +

    + inputMap=javax.swing.InputMap@7793a4 +

    +

    + minimumSizeSet=false +

    +

    + focusTraversalPolicySet=false +

    +

    + y=0 +

    +

    + x=7 +

    +

    + cursorSet=false +

    +

    + inputMethodRequests=null +

    +

    + containerListeners=[Ljava.awt.event.ContainerListener;@614dad +

    +

    + componentCount=5 +

    +

    + components=[Ljava.awt.Component;@1068067 +

    +

    + inputVerifier=null +

    +

    + tabCount=5 +

    +

    + border=null +

    +

    + hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@1034ce6 +

    +

    + name=null +

    +

    + paintingOrigin=false +

    +

    + graphics=sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12],color=java.awt.Color[r=0,g=0,b=0]] +

    +

    + tabLayoutPolicy=0 +

    +

    + managingFocusForwardTraversalKeys=[ctrl pressed TAB] +

    +

    + foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51] +

    +

    + focusable=true +

    +

    + preferredSizeSet=true +

    +

    + visible=true +

    +

    + model=javax.swing.DefaultSingleSelectionModel@12cc957 +

    +

    + focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + lightweight=true +

    +

    + layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout@67cf92 +

    +

    + inputContext=sun.awt.im.InputMethodContext@138a03 +

    +

    + opaque=false +

    +

    + font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12] +

    +

    + locale=en +

    +

    + cursor=java.awt.Cursor[Default Cursor] +

    +

    + inputMethodListeners=[Ljava.awt.event.InputMethodListener;@1891ec1 +

    +

    + doubleBuffered=false +

    +

    + visibleRect=java.awt.Rectangle[x=0,y=0,width=384,height=918] +

    +

    + valid=true +

    +

    + focusCycleRoot=false +

    +

    + mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@1173078 +

    +

    + bounds=java.awt.Rectangle[x=7,y=0,width=384,height=918] +

    +

    + treeLock=java.awt.Component$AWTTreeLock@1875b2 +

    +

    + propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@2198c5 +

    +

    + paintingForPrint=false +

    +

    + autoscrolls=false +

    +

    + showing=true +

    +

    + selectedIndex=0 +

    +

    + dropTarget=null +

    +

    + paintingChild=null +

    +

    + nextFocusableComponent=null +

    +

    + height=918 +

    +

    + peer=sun.awt.NullComponentPeer@123725b +

    +

    + topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + displayable=true +

    +

    + defaultLocale=en +

    +

    + focusOwner=false +

    +

    + debugGraphicsOptions=0 +

    +

    + enabled=true +

    +

    + UI=javax.swing.plaf.metal.MetalTabbedPaneUI@140e5f3 +

    +

    + UIClassID=TabbedPaneUI +

    + +
    +
    + + + + + + +

    + verifyInputWhenFocusTarget=true +

    +

    + mouseWheelListeners=[Ljava.awt.event.MouseWheelListener;@196141d +

    +

    + focusTraversalPolicy=null +

    +

    + registeredKeyStrokes=[Ljavax.swing.KeyStroke;@1c3129c +

    +

    + alignmentX=0.5 +

    +

    + location=java.awt.Point[x=7,y=0] +

    +

    + alignmentY=0.5 +

    +

    + hierarchyListeners=[Ljava.awt.event.HierarchyListener;@102950b +

    +

    + managingFocus=false +

    +

    + painting=false +

    +

    + insets=java.awt.Insets[top=0,left=0,bottom=0,right=0] +

    +

    + baselineResizeBehavior=CONSTANT_ASCENT +

    +

    + optimizedDrawingEnabled=true +

    +

    + minimumSize=java.awt.Dimension[width=231,height=134] +

    +

    + toolTipText=null +

    +

    + focusTraversalKeysEnabled=true +

    +

    + ignoreRepaint=false +

    +

    + inheritsPopupMenu=false +

    +

    + tabPlacement=1 +

    +

    + rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] +

    +

    + parent=javax.swing.Box[,0,0,7x918,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] +

    +

    + width=0 +

    +

    + toolkit=sun.awt.windows.WToolkit@12eb0c5 +

    +

    + keyListeners=[Ljava.awt.event.KeyListener;@1440a6b +

    +

    + transferHandler=null +

    +

    + size=java.awt.Dimension[width=0,height=0] +

    +

    + vetoableChangeListeners=[Ljava.beans.VetoableChangeListener;@6fc562 +

    +

    + maximumSizeSet=false +

    +

    + class=class javax.swing.JTabbedPane +

    +

    + changeListeners=[Ljavax.swing.event.ChangeListener;@1d96641 +

    +

    + maximumSize=java.awt.Dimension[width=32767,height=32767] +

    +

    + focusTraversable=true +

    +

    + componentPopupMenu=null +

    +

    + componentListeners=[Ljava.awt.event.ComponentListener;@541bfc +

    +

    + focusTraversalPolicyProvider=false +

    +

    + focusListeners=[Ljava.awt.event.FocusListener;@14c404f +

    +

    + background=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229] +

    +

    + graphicsConfiguration=sun.awt.Win32GraphicsConfig@1e4252b[dev=Win32GraphicsDevice[screen=1],pixfmt=0] +

    +

    + ancestorListeners=[Ljavax.swing.event.AncestorListener;@144ce91 +

    +

    + requestFocusEnabled=true +

    +

    + actionMap=javax.swing.ActionMap@e97e2e +

    +

    + backgroundSet=true +

    +

    + mouseListeners=[Ljava.awt.event.MouseListener;@1b75d56 +

    +

    + foregroundSet=true +

    +

    + validateRoot=false +

    +

    + componentOrientation=java.awt.ComponentOrientation@9cc218 +

    +

    + fontSet=true +

    +

    + createdDoubleBuffer=false +

    +

    + selectedComponent=javax.swing.JScrollPane[,2,101,-5x-104,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=com.sun.java.swing.plaf.windows.XPStyle$XPFillBorder@b9e7d6,flags=328,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,1,872,360x17,hidden,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=20],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_AS_NEEDED,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,361,1,17x871,hidden,layout=com.sun.java.swing.plaf.windows.WindowsScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=20],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_ALWAYS,viewport=javax.swing.JViewport[,1,1,-7x-106,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=java.awt.Point[x=0,y=0],scrollUnderway=false],viewportBorder=] +

    +

    + colorModel=DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 +

    +

    + mousePosition=null +

    +

    + tabRunCount=5 +

    +

    + paintingTile=false +

    +

    + accessibleContext=javax.swing.JTabbedPane$AccessibleJTabbedPane@100181d +

    +

    + managingFocusBackwardTraversalKeys=[shift ctrl pressed TAB] +

    +

    + preferredSize=java.awt.Dimension[width=0,height=0] +

    +

    + inputMap=javax.swing.InputMap@7793a4 +

    +

    + minimumSizeSet=false +

    +

    + focusTraversalPolicySet=false +

    +

    + y=0 +

    +

    + x=7 +

    +

    + cursorSet=false +

    +

    + inputMethodRequests=null +

    +

    + containerListeners=[Ljava.awt.event.ContainerListener;@16838a7 +

    +

    + componentCount=5 +

    +

    + components=[Ljava.awt.Component;@bf51bd +

    +

    + inputVerifier=null +

    +

    + tabCount=5 +

    +

    + border=null +

    +

    + hierarchyBoundsListeners=[Ljava.awt.event.HierarchyBoundsListener;@11e2b3d +

    +

    + name=null +

    +

    + paintingOrigin=false +

    +

    + graphics=sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12],color=java.awt.Color[r=0,g=0,b=0]] +

    +

    + tabLayoutPolicy=0 +

    +

    + managingFocusForwardTraversalKeys=[ctrl pressed TAB] +

    +

    + foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51] +

    +

    + focusable=true +

    +

    + preferredSizeSet=true +

    +

    + visible=false +

    +

    + model=javax.swing.DefaultSingleSelectionModel@12cc957 +

    +

    + focusCycleRootAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + lightweight=true +

    +

    + layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout@67cf92 +

    +

    + inputContext=sun.awt.im.InputMethodContext@138a03

    - + opaque=false

    - def newPageUri = node.link?.uri + font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12]

    - def mapa       = node.map + locale=en

    - + cursor=java.awt.Cursor[Default Cursor]

    - c.statusInfo   = tom.openTutorialPage(newPageUri, mapa) + inputMethodListeners=[Ljava.awt.event.InputMethodListener;@5685e5

    - -
    - - - - - -

    - .groovy + doubleBuffered=false +

    +

    + visibleRect=java.awt.Rectangle[x=0,y=0,width=0,height=0] +

    +

    + valid=true +

    +

    + focusCycleRoot=false +

    +

    + mouseMotionListeners=[Ljava.awt.event.MouseMotionListener;@413488 +

    +

    + bounds=java.awt.Rectangle[x=7,y=0,width=0,height=0] +

    +

    + treeLock=java.awt.Component$AWTTreeLock@1875b2 +

    +

    + propertyChangeListeners=[Ljava.beans.PropertyChangeListener;@ebb404 +

    +

    + paintingForPrint=false +

    +

    + autoscrolls=false +

    +

    + showing=false +

    +

    + selectedIndex=0 +

    +

    + dropTarget=null +

    +

    + paintingChild=null +

    +

    + nextFocusableComponent=null +

    +

    + height=0 +

    +

    + peer=sun.awt.NullComponentPeer@123725b +

    +

    + topLevelAncestor=javax.swing.JFrame[mainFreeplaneFrame,1358,-326,1936x1066,invalid,layout=java.awt.BorderLayout,title=ScriptsEnComputadorYDesarrollosEdo v1.9* - Freeplane - Mind map mode C:\Respaldo EF\ef\Documentos con macros\08 Freemind Groovy\scripts\ScriptsEnComputadorYDesarrollosEdo v1.9.mm,resizable,maximized,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,8,31,1920x1027,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] +

    +

    + displayable=true +

    +

    + defaultLocale=en +

    +

    + focusOwner=false +

    +

    + debugGraphicsOptions=0 +

    +

    + enabled=true +

    +

    + UI=javax.swing.plaf.metal.MetalTabbedPaneUI@140e5f3 +

    +

    + UIClassID=TabbedPaneUI

    - - - -
    - + + + + + + - + - + - - + + - + @@ -15016,60 +16510,65 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - + - + - - + + + + + - + + + - + - + - + - + - + - + @@ -15085,12 +16584,12 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - + @@ -15099,38 +16598,38 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - + - + - + - + - + @@ -15165,7 +16664,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -15182,22 +16681,14 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - - - - - - - - - + @@ -15211,64 +16702,64 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - - + + - + - + - + - + - + - + - + - + - + - + @@ -15513,10 +17004,11 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - - + + + - + @@ -15527,18 +17019,18 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - - + + - - - - - + + + + + - + @@ -15633,16 +17125,47 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - - - - - + + + + + + + + + +

    + Ya existe. Es parte de MDH +

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + @@ -15654,9 +17177,9 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - + + + You can make that **ToM** shows **where in the menu** the user can find a specific command. @@ -15664,25 +17187,25 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - + + + You can add to your tutorial buttons that **apply menu actions**. - - - + + + You can add buttons to **jump to other tutorial pages** in the same mindmap (and jump back). - - + + You can add buttons to **open other tutorials** or **tutorial's pages** from the same or another mindmap. @@ -15690,9 +17213,9 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - + + + You can add a button to **show nodes** in the same or in another MindMap. It may be any node. It doesn't need to be in a tutorial. @@ -15702,24 +17225,24 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - + + + You can add a button to **open other mindmaps** needed for the tutorial. - - + + You can add actions to **insert example nodes** or specific node structures **to the user's mindmap**. - - + + After inserting an example branch, you can have a **button that selects the nodes** that you want so the user can easily go further with the tutorial. @@ -15727,9 +17250,9 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - + + + You can add to your tutorial panels that show blocks of **groovy code ** and / or **buttons** that apply those **groovy scripts** to the selected nodes. @@ -15737,9 +17260,9 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - + + + You can add an "_**inspect**_" button to the tutorial that directly goes to the map that contains the current tutorial information and selects the node where the current page starts. @@ -15748,210 +17271,401 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + - + + + - + + + + + + +

    + discardedTask +

    + +
    +
    +
    - + + + - - + + - - - - - - - - - - - - - - - - - + + + - - - - - - - + + + + + + + + + + + - - - - - - - - + + - - - - - + + - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + //había algunos con minúsculas entremedio que hacían que no funcionara +

    +

    + +

    +

    + //def nodo=node +

    +

    + def nodos=c.selecteds +

    +

    + +

    +

    + nodos.each{nodo -> +

    +

    +     def t = nodo.text +

    +

    +     def newT = "emoji-${t.takeAfter('-').takeBefore('.').toUpperCase()}.svg" +

    +

    +     nodo.text = newT +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + +

    + =node.icons.icons +

    + +
    + + =node.icons.icons + +
    + + + + + + + + + + + + + +

    + ="![](${node.link.uri})" +

    + + +
    + + + + + + +

    + ="![](${node.link.uri})" +

    + + +
    - - - - - - - +

    - //había algunos con minúsculas entremedio que hacían que no funcionara + ="![](${node.link.uri})"

    + + +
    +
    + + + + + +

    - + ="![](${node.link.uri})"

    + + +
    +
    + + + + + +

    - //def nodo=node + ="![](${node.link.uri})"

    + + +
    +
    + + + + + +

    - def nodos=c.selecteds + ="![](${node.link.uri})"

    + + +
    +
    + + + + + +

    - + ="![](${node.link.uri})"

    + + +
    +
    + + + + + +

    - nodos.each{nodo -> + ="![](${node.link.uri})"

    + + +
    +
    + + + + + +

    -     def t = nodo.text + ="![](${node.link.uri})"

    + + +
    +
    + + + + + +

    -     def newT = "emoji-${t.takeAfter('-').takeBefore('.').toUpperCase()}.svg" + ="![](${node.link.uri})"

    + + +
    +
    + + + + + +

    -     nodo.text = newT + ="![](${node.link.uri})"

    + + +
    +
    + + + + + +

    - } + ="![](${node.link.uri})"

    -
    - + + +
    +

    - .groovy + ="![](${node.link.uri})"

    -
    + +
    - - - +

    - =node.icons.icons + ="![](${node.link.uri})"

    -
    - - =node.icons.icons +
    - - - - -
    - + - + - + - + - + @@ -16031,20 +17745,22 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){
    - + - + - + + + @@ -16061,8 +17777,8 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ = edofro.MarkDownHelper.MDH.document(node) - - + + @@ -16073,7 +17789,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - + @@ -16099,7 +17815,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - + @@ -16110,9 +17826,9 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - + - + @@ -16123,9 +17839,9 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - + - + @@ -16136,62 +17852,90 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - +
    - - + + - - - - - - -

    - = edofro.MarkDownHelper.MDH.list(node) -

    - -
    - - - + + = edofro.MarkDownHelper.MDH.list(node) +// xx + + + + + + + + - - - + + + - + + - - - - - - - - - + + + + + + + + + - - + + + = edofro.MarkDownHelper.MDH.list(node) +//xx + + + +

    - = edofro.MarkDownHelper.MDH.list(node) + = +

    +

    + (node['tasksStyles']?:'pendingTask,nextTask').split(',').collect{st -> "${node.find{it.style.name == st}.size()}  ${st}(s)"}.join('\n')

    - +
    + + + + + + + + + + + + + + + +
    +
    + + + = edofro.MarkDownHelper.MDH.list(node) +//xx - + @@ -16207,116 +17951,135 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - + - - - - - - + + + + + + + + +

    + and make it easy understandable +

    + +
    + + + + - - + + + - - - - + + + + + + + + - + + - - - - + + + - - - - - - - - - - - - + + + - + + + + + + - - - - - - + + - - - - + + + + - - - - - - - + + + + + + + - - + + - - + + + + + + - - + + - - + + - - - - - - - - + + - - - - - + + + + - - + + - - + + + + + + - - - + + + + + + + + + + + + + @@ -16329,92 +18092,46 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - + + - - - - + + + + - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - feedback Quickfold -

    - -
    + + + + + + - - - - - - + + + + + @@ -16423,13 +18140,13 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - + @@ -16538,26 +18255,201 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){
    - + + + + + + +

    + this very file +

    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + tutorial Home +

    + +
    +
    + + + + + + + + + +

    + tutorial paso a paso +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - -

    - and make it easy understandable -

    - - -
    - - + + + + @@ -16566,7 +18458,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - Inated:   2022-07-24  20:22:59 + Inated:   2022-08-07  19:45:21

    @@ -16584,7 +18476,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){  0 new file(s) imported as node(s) 

    -  0 node(s) moved/renamed in drive +  14 node(s) moved/renamed in drive

    @@ -16593,7 +18485,10 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ------- Folders: -------- 

    - 20 folders didn't need to be moved  + 22 folders didn't need to be moved  +

    +

    + 1 folders were created in new position and deleted in old one 

    1 folders were not found  @@ -16605,7 +18500,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - 2.7 seconds + 7.3 seconds

    @@ -16619,8 +18514,11 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ + + + - + @@ -16632,10 +18530,10 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - - + + + + @@ -16688,7 +18586,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -16729,7 +18627,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -16768,9 +18666,9 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - + @@ -16817,7 +18715,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -16918,7 +18816,7 @@ def addListenerPane(myP){ - + @@ -17151,7 +19049,7 @@ def activateListener(comp){ - + @@ -17389,7 +19287,7 @@ def activateListener(comp){

    - + @@ -17557,7 +19455,7 @@ def activateListener(comp){ - + @@ -17813,39 +19711,39 @@ def activateListener(comp, nodo){

    - - - - - + + + + + - - + + - - - + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - + - + @@ -18199,7 +20097,7 @@ def activateListener(comp, nodo){ - + @@ -18210,7 +20108,7 @@ def activateListener(comp, nodo){

    - + @@ -18221,7 +20119,7 @@ def activateListener(comp, nodo){

    - + @@ -18346,7 +20244,7 @@ def getToolbar(toolbarName) { - + @@ -18444,9 +20342,9 @@ def getToolbar(toolbarName) { - + - + @@ -18483,7 +20381,7 @@ def getToolbar(toolbarName) { - + @@ -18648,10 +20546,10 @@ def getToolbar(toolbarName) {

    - - + + - + @@ -18728,11 +20626,11 @@ def textoLabel(acc) { - + - + @@ -19175,35 +21073,35 @@ def textoLabel(acc) { - - - - - + + + + + - - - + + + - - - - - - - - - - + + + + + + + + + + - - - + + + @@ -19214,15 +21112,15 @@ def textoLabel(acc) {

    - + - + - - + + - + @@ -19234,7 +21132,7 @@ def textoLabel(acc) { - + @@ -19247,11 +21145,11 @@ def textoLabel(acc) { - - - - - + + + + + @@ -19262,21 +21160,21 @@ def textoLabel(acc) {

    - + - - + + - - - - - + + + + + - - + + @@ -19287,7 +21185,7 @@ def textoLabel(acc) {

    - + @@ -19300,8 +21198,8 @@ def textoLabel(acc) { - - + + @@ -19312,14 +21210,14 @@ def textoLabel(acc) {

    - - - + + + - - - + + + @@ -19332,7 +21230,7 @@ def textoLabel(acc) { - + @@ -19345,11 +21243,11 @@ def textoLabel(acc) { - - - - - + + + + + @@ -19384,7 +21282,7 @@ def textoLabel(acc) { - + @@ -19395,8 +21293,8 @@ def textoLabel(acc) {

    - - + + @@ -19470,16 +21368,16 @@ def textoLabel(acc) { - - - + + + - - - + + + - - + + @@ -19574,8 +21472,8 @@ def textoLabel(acc) { - - + + @@ -19615,7 +21513,7 @@ def textoLabel(acc) { - + @@ -19635,7 +21533,7 @@ def textoLabel(acc) { - + ## a codeBlock example Code: **'pasar texto a nota e indicar formato Markdown'** @@ -19660,7 +21558,7 @@ def textoLabel(acc) { - + @@ -19676,8 +21574,8 @@ def textoLabel(acc) { - - + + @@ -19717,7 +21615,7 @@ def textoLabel(acc) { - + @@ -19737,7 +21635,7 @@ def textoLabel(acc) { - + ## a codeBlock example Code: **'pasar texto a nota e indicar formato Markdown'** @@ -19762,7 +21660,7 @@ def textoLabel(acc) { - + @@ -19780,7 +21678,7 @@ def textoLabel(acc) { - + @@ -19791,39 +21689,39 @@ def textoLabel(acc) {

    - - - - - - - + + + + + + + - - + + - + - - + + - - - + + + - - - - - + + + + + - - - + + + @@ -19834,13 +21732,13 @@ def textoLabel(acc) {

    - + - + @@ -19849,11 +21747,11 @@ def textoLabel(acc) { - - - - - + + + + + @@ -19996,7 +21894,7 @@ def msg(t){ - + @@ -20085,7 +21983,7 @@ def msg(t){ - + @@ -20135,7 +22033,7 @@ def msg(t){ - + @@ -20236,82 +22134,82 @@ def msg(t){ - - - - - - + + + + + + - - - - + + + + - - - + + + - - - - - + + + + + - + - - - - - + + + + + - + - - + + - - - - - - - - + + + + + + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - - - + + + + + - + - - - - - + + + + + @@ -20392,109 +22290,961 @@ def openTutorialPage(nodeDirection , mapa = null){     return 'No tutorial node found'

    - } + } +

    +

    + +

    +

    + +

    +

    + def openTutorialPageUri(URI uri, mapa){ +

    +

    + //    if(!uri) return null +

    +

    +     def isMindmap =  uri.scheme == 'file' && uri.path.endsWith('.mm') +

    +

    +     def nodeId = (!uri.scheme || isMindmap) && uri.fragment?.startsWith('ID_')? +

    +

    +                     uri.fragment +

    +

    +                     :null +

    +

    +     if (!nodeId) return 'No node ID defined in URI' +

    +

    +     def tutMapPath = nodeId && isMindmap? +

    +

    +                         uri.path.drop(1) +

    +

    +                         :null +

    +

    +     def tutMap = tutMapPath? +

    +

    +                     tom.getMapFromPath(tutMapPath, false)    //open mind map not visible +

    +

    +                     :mapa +

    +

    +     openTutorialPageString(nodeId, tutMap) +

    +

    + } +

    +

    + +

    +

    + +

    +

    + def openTutorialPageString(String nodeId, tutMap){ +

    +

    +     def attributeTabLabel = tom.attributeTabLabel +

    +

    +     def defaultMapTutorialsTabLabel = tom.defaultMapTutorialsTabLabel +

    +

    + +

    +

    +     if(!tutMap) return 'No tutorial mindmap defined' +

    +

    +     def targetNode = tutMap.node(nodeId) +

    +

    +     //return targetNode +

    +

    +     //return tom.isTutNode(targetNode) +

    +

    +     if(!tom.isTutNode(targetNode)) return 'Indicated node is not part of a tutorial' +

    +

    +     def tutorialTabName = targetNode[attributeTabLabel] ?: tutMap.root[attributeTabLabel] ?: defaultMapTutorialsTabLabel +

    +

    +     def myP = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true) +

    +

    +     tom.fillPage(myP, targetNode, true, true) +

    +

    +     return 'tutorial displayed' +

    +

    + } +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + + + +

    + import edofro.tutorialomatic.ToM    as tom +

    +

    + +

    +

    + +

    +

    + def nodo = node +

    +

    + def myUri = nodo.link?.uri +

    +

    + +

    +

    + //return 'hola'.class +

    +

    + +

    +

    + c.statusInfo = tom.openTutorialPage(myUri, nodo.map) +

    +

    + //c.statusInfo = tom.openTutorialPage(myUri) +

    +

    + //c.statusInfo = tom.openTutorialPage(nodo.text, nodo.map) +

    +

    + //c.statusInfo = tom.openTutorialPage(nodo.text) //must fail +

    + +
    + + + + + + +

    + .groovy +

    + +
    + + + +
    +
    + + + + + + + + + + + +

    + def newPageNode = node +

    +

    + def selectedNode = c.selected +

    +

    + +

    +

    + +

    +

    + def linkNode = selectedNode.createChild(newPageNode.text) +

    +

    + linkNode['ToM_LinkToPage'] = getUriFromNode(newPageNode) +

    +

    + linkNode.link.uri = new URI('menuitem:_addons.tutorialOMatic.openTutorialPageFromLink_on_single_node')  +

    +

    + +

    +

    + //getUriFromNode(node) +

    +

    + +

    +

    + def getUriFromNode(nodo, String sch = 'tutorial'){ +

    +

    +     def ssp = nodo.map.file.toURI().schemeSpecificPart +

    +

    +     def frg = nodo.id +

    +

    +     return new URI(sch, ssp, frg) +

    +

    + } +

    + +
    + + + + + + +

    + .groovy

    + +
    + + + + + + +
    + + + + + + + +

    - + def D = [:]

    - def openTutorialPageUri(URI uri, mapa){ + D.a =45

    - //    if(!uri) return null +

    -     def isMindmap =  uri.scheme == 'file' && uri.path.endsWith('.mm') + D.a / 9

    -     def nodeId = (!uri.scheme || isMindmap) && uri.fragment?.startsWith('ID_')? + D.b = 'ghg'

    -                     uri.fragment + D.c = {it.texr }

    -                     :null +

    -     if (!nodeId) return 'No node ID defined in URI' + def L =[]

    -     def tutMapPath = nodeId && isMindmap? + L << D << D

    -                         uri.path.drop(1) +

    -                         :null + L

    + +
    + + + + + +

    -     def tutMap = tutMapPath? + .groovy

    + +
    +
    + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    -                     tom.getMapFromPath(tutMapPath, false)    //open mind map not visible + y no aplica

    + +
    + + + + + +

    -                     :mapa + feedback Quickfold

    + +
    + + + + + + + +

    -     openTutorialPageString(nodeId, tutMap) + feedback Quickfold

    + +
    + + + + + + + +

    - } + feedback Quickfold

    + +
    + + + + + + + +

    - + feedback Quickfold

    + +
    + + + + + + + +

    - + feedback Quickfold

    + +
    + + + + + + + +

    - def openTutorialPageString(String nodeId, tutMap){ + feedback Quickfold

    + +
    + + +
    + + + + + +

    -     def attributeTabLabel = tom.attributeTabLabel + Esto es sólo una prueba

    -     def defaultMapTutorialsTabLabel = tom.defaultMapTutorialsTabLabel +

    -     if(!tutMap) return 'No tutorial mindmap defined' + Chito!!!

    -     def targetNode = tutMap.node(nodeId) +

    -     //return targetNode + ahora cambió

    + +
    + + + + + +

    -     //return tom.isTutNode(targetNode) + .txt

    + +
    +
    +
    + + + + + + +

    -     if(!tom.isTutNode(targetNode)) return 'Indicated node is not part of a tutorial' + feedback Quickfold

    + +
    + + +
    + + + + + + + = (node['tasksStyles']?:'pendingTask,nextTask').split(',').collect{st -> "${node.find{n-> st in n.style.allActiveStyles}.size()} ${st}(s)"}.join('\n') + + + + + +
    + + + + + +

    -     def tutorialTabName = targetNode[attributeTabLabel] ?: tutMap.root[attributeTabLabel] ?: defaultMapTutorialsTabLabel + =

    -     def myP = tomui.getContentPaneFromMyTab(tutorialTabName.toString(), true) + (node['tasksStyles']?:'pendingTask,nextTask').split(',').collect{st -> "${node.find{it.style.name == st}.size()}  ${st}(s)"}.join('\n')

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    -     tom.fillPage(myP, targetNode, true, true) + customMenu  

    -     return 'tutorial displayed' +   - icons only

    - } +   - return to mindmap

    +
    + + + + + + + + + + @@ -20502,57 +23252,79 @@ def openTutorialPageString(String nodeId, tutMap){

    - .groovy + customMenu   +

    +

    +   - icons only +

    +

    +   - return to mindmap

    - - - + + + + + + + + + + + + + + + + + + + + + + +

    - import edofro.tutorialomatic.ToM    as tom -

    -

    - -

    -

    - -

    -

    - def nodo = node -

    -

    - def myUri = nodo.link?.uri -

    -

    - -

    -

    - //return 'hola'.class -

    -

    - -

    -

    - c.statusInfo = tom.openTutorialPage(myUri, nodo.map) -

    -

    - //c.statusInfo = tom.openTutorialPage(myUri) + customMenu  

    - //c.statusInfo = tom.openTutorialPage(nodo.text, nodo.map) +   - icons only

    - //c.statusInfo = tom.openTutorialPage(nodo.text) //must fail +   - return to mindmap

    -
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + @@ -20560,67 +23332,62 @@ def openTutorialPageString(String nodeId, tutMap){

    - .groovy + customMenu   +

    +

    +   - icons only +

    +

    +   - return to mindmap

    -
    - - + +
    - - - - - +

    - def newPageNode = node -

    -

    - def selectedNode = c.selected -

    -

    - -

    -

    - -

    -

    - def linkNode = selectedNode.createChild(newPageNode.text) -

    -

    - linkNode['ToM_LinkToPage'] = getUriFromNode(newPageNode) + customMenu 

    - linkNode.link.uri = new URI('menuitem:_addons.tutorialOMatic.openTutorialPageFromLink_on_single_node')  +   - icons only

    - +   - return to mindmap

    + + +
    +
    + + + + + + + +

    - //getUriFromNode(node) + def nodos = root.find{it.style.name=='milestone' && !it.text.matches(/\*\*.*\*\*/)}

    - def getUriFromNode(nodo, String sch = 'tutorial'){ -

    -

    -     def ssp = nodo.map.file.toURI().schemeSpecificPart + nodos.each{n ->

    -     def frg = nodo.id +     def texto = n.text

    -     return new URI(sch, ssp, frg) +     n.text = '**' + texto + '**'

    } @@ -20638,56 +23405,42 @@ def getUriFromNode(nodo, String sch = 'tutorial'){

    - - - - - -
    - - - - - - - - -

    - def D = [:] -

    -

    - -

    + + + + + +

    - D.a =45 + def estilos = 'discardedTask,completedTask'.split(',')

    - D.a / 9 + estilos.each{estilo ->

    - D.b = 'ghg' +     def nodos = node.find{ it.style.name == estilo }

    - D.c = {it.texr } +     nodos.each{n ->

    - +         def texto = n.details?.text

    - def L =[] +         n.details =  ((texto?texto + '\n':'') + estilo)

    - L << D << D +         n.style.name = null

    - +     }

    - L + }

    @@ -20703,352 +23456,157 @@ def getUriFromNode(nodo, String sch = 'tutorial'){
    - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - + +

    - y no aplica + def nodos = c.selecteds +

    +

    + +

    +

    + nodos.each{n -> +

    +

    +     n.text = 'image Origami Bookmarks' +

    +

    +     n.link.text = n.link.text.takeBefore('?') + '?auto=webp&frame=1&width=500&height=500&fit=bounds' +

    +

    + }

    - +

    - feedback Quickfold + .groovy

    - - +

    - feedback Quickfold + def nodos = node.find{n -> n.style.name && n.style.name == 'MarkdownHelperNode' && n.text == 'Markdown document.md'} +

    +

    + +

    +

    + //def n = node +

    +

    + nodos.each{ n -> +

    +

    +    def newText = n.children.first().text.split(' ').take(5).join(' ') + ' ...' +

    +

    +    n.text = newText +

    +

    + }

    - - - +

    - feedback Quickfold + .groovy

    - - +

    - feedback Quickfold + def nodos = [] + c.selecteds +

    +

    + +

    +

    + nodos.each{ +

    +

    +     //it.children*.delete() +

    +

    +     //it.text = it.text.takeBefore('.') +

    +

    +     //it['menuLocation'] += '/Demos' +

    +

    +     def texto = it.text +

    +

    +     it.note = texto +

    +

    +     it.text = texto.split(' ').take(5).join(' ') + '...' +

    +

    + }

    - - - +

    - feedback Quickfold + .groovy

    - - +

    - feedback Quickfold + def nodos= [] + c.selecteds +

    +

    + nodos.each{n -> +

    +

    +     n.text = "**${n.text}**".toString() +

    +

    + }

    - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -21056,67 +23614,49 @@ def getUriFromNode(nodo, String sch = 'tutorial'){

    - customMenu   -

    -

    -   - icons only -

    -

    -   - return to mindmap + .groovy

    - - - - - - - - - - - + + +

    - customMenu   + def L1 ="aa,bb,cc,dd,ee".split(',') as ArrayList

    -   - icons only + def L2 ="hh,ii,jj".split(',') as ArrayList

    -   - return to mindmap + def L3 ="hh,ii,jj,cc".split(',') as ArrayList +

    +

    + +

    +

    + //def L11 =(ArrayList) L1 +

    +

    + +

    +

    + println L1.disjoint(L2) +

    +

    + println L1.disjoint(L3) +

    +

    + println L2.disjoint(L3)

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - + +
    @@ -21124,17 +23664,11 @@ def getUriFromNode(nodo, String sch = 'tutorial'){

    - customMenu   -

    -

    -   - icons only -

    -

    -   - return to mindmap + .groovy

    -
    -
    + +
    diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 4528c45..8de8e60 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -1,8 +1,12 @@ + + + + - + @@ -84,9 +88,8 @@ - -
    - +
    + @@ -94,7 +97,7 @@ - + @@ -187,8 +190,7 @@ To translate the description you have to define a translation for the key 'addons.${name}.description'.

    - -
    +
    @@ -201,8 +203,7 @@ Change log of this add-on: append one node for each noteworthy version and put the details for each version into a child node.

    - -
    +
    @@ -281,8 +282,7 @@ The License text has to be entered as a child of the 'license' node, either as plain text or as HTML.

    - -
    +
    @@ -391,8 +391,7 @@ - - +
    @@ -412,10 +411,9 @@ For each menu item with an icon add an attribute with the icon key (use develope - - +
    - + @@ -445,10 +443,9 @@ For each menu item with an icon add an attribute with the icon key (use develope - - + - + @@ -457,7 +454,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -484,7 +481,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -499,8 +496,7 @@ For each menu item with an icon add an attribute with the icon key (use develope List of files and/or directories to remove on uninstall

    - -
    +
    @@ -528,7 +524,7 @@ For each menu item with an icon add an attribute with the icon key (use develope
    - + @@ -643,24 +639,23 @@ For each menu item with an icon add an attribute with the icon key (use develope   - In any case set execute_scripts_without_asking to true unless you want to annoy users.

    - -
    - - - - +
    + + + + - + - + - - - - + + + + @@ -669,69 +664,69 @@ For each menu item with an icon add an attribute with the icon key (use develope - - - - + + + + - + - - - - + + + + - + - - - - + + + + - + - - - - + + + + - + - - - - + + + + - + - - - + + + @@ -739,7 +734,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -776,8 +771,7 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    - -
    +
    @@ -816,8 +810,7 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    - -
    +
    @@ -852,8 +845,7 @@ For each menu item with an icon add an attribute with the icon key (use develope Images can be added automatically by releaseAddOn.groovy or must be uploaded into the map via the script Tools->Scripts->Insert Binary since they have to be (base64) encoded as simple strings.

    - -
    +
    @@ -866,8 +858,7 @@ For each menu item with an icon add an attribute with the icon key (use develope Direct links to menu commands - -
    +
    diff --git a/Tutorial-o-Matic/build.gradle b/Tutorial-o-Matic/build.gradle index c31e16f..f139525 100644 --- a/Tutorial-o-Matic/build.gradle +++ b/Tutorial-o-Matic/build.gradle @@ -1,18 +1,17 @@ //Tutorial-o-Matic - - apply plugin: 'groovy' targetCompatibility='1.8' // 1. I have to define which freeplane version is going to be used to look at the libreries (freeplane and groovy) -def FPversion = 'v10_1' +def FPversion = 'v10_x' def freeplaneDirs = [ instaled : "C:/Program Files/Freeplane", protableApps : "C:/PortableApps/FreeplanePortable/App/Freeplane", v9_15 : "C:/Freeplane/freeplane-1.9.15-pre01", - v10_1 : "C:/Freeplane/freeplane-1.10.2" + v10_1 : "C:/Freeplane/freeplane-1.10.2", + v10_x : "C:/Freeplane/freeplane-1.10.x" ] def freeplaneDir = freeplaneDirs[FPversion] diff --git a/Tutorial-o-Matic/scripts/ToMTutorial.groovy b/Tutorial-o-Matic/scripts/ToMTutorial.groovy index 3bc9d51..86bc74f 100644 --- a/Tutorial-o-Matic/scripts/ToMTutorial.groovy +++ b/Tutorial-o-Matic/scripts/ToMTutorial.groovy @@ -4,7 +4,7 @@ import edofro.tutorialomatic.ToM as tom def sep = File.separator def userDir = c.userDirectory.path - def mapFileName = "HowToTutorial-o-Matic.mm" + def mapFileName = "Tutorial-o-Matic Intro.mm" def pathName = userDir + sep + "doc" + sep + "Tutorial-o-Matic" + sep + mapFileName def tutMap = tom.getMapFromPath(pathName, false) //usar mapa indicado (pero oculto) diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm index c4ee8f3..6dcc23d 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm @@ -150,10 +150,8 @@ - - - - + + @@ -166,12 +164,9 @@

    - -
    +
    - - - + @@ -181,12 +176,9 @@ ![image Origami Bookmarks](https://content.instructables.com/ORIG/FEG/OIPK/L06PT77G/FEGOIPKL06PT77G.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds)

    - -
    +
    - - - + @@ -199,12 +191,9 @@

    - -
    +
    - - - + @@ -217,12 +206,9 @@

    - -
    +
    - - - + @@ -235,15 +221,12 @@

    - -
    +
    - - - + @@ -256,12 +239,9 @@

    - -
    +
    - - - + @@ -271,12 +251,9 @@ ![image Origami Bookmarks](https://content.instructables.com/ORIG/FDD/YAIK/L06PT6OG/FDDYAIKL06PT6OG.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds)

    - -
    +
    - - - + @@ -313,12 +290,9 @@

    - -
    +
    - - - + @@ -343,15 +317,12 @@

    - -
    +
    - - - + @@ -364,12 +335,9 @@

    - -
    +
    - - - + @@ -382,12 +350,9 @@

    - -
    +
    - - - + @@ -400,16 +365,13 @@

    - -
    +
    - - - + @@ -422,12 +384,9 @@

    - -
    +
    - - - + @@ -440,12 +399,9 @@

    - -
    +
    - - - + @@ -458,12 +414,9 @@

    - -
    +
    - - - + @@ -482,12 +435,9 @@

    - -
    +
    - - - + @@ -506,12 +456,9 @@

    - -
    +
    - - - + @@ -530,12 +477,9 @@

    - -
    +
    - - - + @@ -548,16 +492,13 @@

    - -
    +
    - - - + @@ -570,12 +511,9 @@

    - -
    +
    - - - + @@ -588,12 +526,9 @@

    - -
    +
    - - - + @@ -612,14 +547,11 @@ Fold the square into quarters (fold once horizontally and once vertically.)

    - -
    +
    - - - + @@ -638,14 +570,11 @@ Fold the square into quarters (fold once horizontally and once vertically.)

    - -
    +
    - - - + @@ -664,14 +593,11 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -690,14 +616,11 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -716,12 +639,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -734,16 +654,13 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -756,12 +673,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -771,12 +685,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- ![image Origami Bookmarks](https://content.instructables.com/ORIG/FMV/XRZC/L06PT9QS/FMVXRZCL06PT9QS.jpg?auto=webp&frame=1&fit=bounds&md=d0b67e4507fddf246d311ff018cd22a8)

    - -
    +
    - - - + @@ -789,12 +700,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -807,12 +715,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -840,12 +745,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -858,16 +760,13 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -880,12 +779,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -895,12 +791,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTG/QP3N/L06PT76P/FTGQP3NL06PT76P.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=c7ed44f4d0772f0e72a8e37abc3e6924)

    - -
    +
    - - - + @@ -913,12 +806,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -931,12 +821,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -949,12 +836,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -967,8 +851,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm index f72c689..af6bce9 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm @@ -1,6 +1,28 @@ - + + + + + + + + + + + + + + + + + + + + + + + @@ -134,6 +156,21 @@ + + + + + + + + + + + + + + +
    @@ -1894,7 +1931,7 @@ candle indicates that executes only one time (then button gets disabled)
    - + @@ -2160,11 +2197,17 @@ This example shows some actions applied without showing any message (muted): - - + + + + + + + + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm index 7edba91..2a7b900 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm @@ -14,7 +14,7 @@ - + @@ -461,19 +461,19 @@

    - * Assigning ToM Styles + - Assigning ToM Styles

    - * Tutorial's creation commands + - Tutorial's creation commands

    - * Adding action's commands + - Adding action's commands

    - * Adding action nodes with default text' commands + - Adding action nodes with default text' commands

    - * Modifiers (icons) + - Modifiers (icons)

    @@ -485,40 +485,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 8ab596d0b8d5ed68cd380a4cb2eef7baa750c4d1 Mon Sep 17 00:00:00 2001 From: EdoFro <35700575+EdoFro@users.noreply.github.com> Date: Mon, 8 Aug 2022 21:24:18 -0400 Subject: [PATCH 42/42] v0.0.7 --- .../HowToTutorial-o-Matic.mm | 1035 +++++---- .../Tutorial-o-Matic Intro.mm | 142 +- .../Tutorial-o-MaticStepByStep.mm | 1175 +++++----- EditingTutorialsWithMDH/myExistingMindMap.mm | 35 +- README.MD | 25 +- Tutorial-o-Matic project.mm | 1265 +++++++---- Tutorial-o-Matic/Tutorial-o-Matic.mm | 124 +- Tutorial-o-Matic/history.md | 3 +- Tutorial-o-Matic/translations/en.properties | 7 +- Tutorial-o-Matic/translations/es.properties | 16 +- .../Tutorial-o-Matic/HowToTutorial-o-Matic.mm | 194 +- .../Tutorial-o-Matic/LongTutorialExample.mm | 860 ------- .../Tutorial-o-Matic/SimpleTutorialSample.mm | 1461 ++++-------- .../Tutorial-o-Matic Intro.mm | 139 +- .../Tutorial-o-MaticCommands.mm | 4 +- .../Tutorial-o-MaticStepByStep.mm | 2021 +++++++++++------ .../doc/Tutorial-o-Matic/myExistingMindMap.mm | 892 ++++---- 17 files changed, 4580 insertions(+), 4818 deletions(-) delete mode 100644 Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm diff --git a/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm b/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm index 4a4beb9..2dc35f8 100644 --- a/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm +++ b/EditingTutorialsWithMDH/HowToTutorial-o-Matic.mm @@ -3,8 +3,8 @@ - - + + @@ -195,14 +195,14 @@ - + - - - - + + + + @@ -225,7 +225,7 @@

    - + ## Hi!! This guide contains brief **explanations of all commands and building blocks** you can use to build a Tutorial. @@ -233,7 +233,7 @@ I recommend you to do the **"Step by Step" tutorials first** and use this document as a guide afterwards. - + @@ -245,7 +245,7 @@ - + I hope you enjoy this! @@ -256,9 +256,9 @@ - - - + + + @@ -272,22 +272,22 @@ - + In this section you can see the commands used to add new **actions** to your tutorials. - + - - - - + + + + @@ -302,8 +302,8 @@ =edofro.MarkDownHelper.MDH.document(node) - - + + **Tutorial-o-Matic** use mindmaps to store the tutorial's information. To understand how to display a tutorial and its structure **Tutorial-o-Matic** needs that the map has some _special user styles_. @@ -313,13 +313,13 @@ - + The best way to learn how to use this add-on is to make the **'Step by step' tutorial** by yourself. - + @@ -334,8 +334,8 @@ =edofro.MarkDownHelper.MDH.document(node) - - + + This is not a real tutorial, it's more like a guide. For example, for each "building block", there is a brief an explanation and **multiple buttons** with different actions. @@ -345,7 +345,7 @@ For example, there are buttons to: - + @@ -356,15 +356,15 @@

    - - - - + + + + - + - + In the following pages you can see a brief explanation about how to create a tutorial with **Tutorial-o-Matic**. @@ -373,12 +373,12 @@ - + - - - - + + + + @@ -397,10 +397,10 @@ - - + + - + = "${node?.children[0]?.text} directly".toString() @@ -417,13 +417,13 @@

    - +
    - - - + + + @@ -442,10 +442,10 @@ - - + + - + = "${node?.children[0]?.text} directly".toString() @@ -461,12 +461,12 @@

    - + - - - + + + @@ -483,20 +483,17 @@ Its text will be used as the title of the new tutorial
  • - Assign the style "ToM-Tutorial" to that node + Assign the style "ToM-Tutorial" to that node
  • -

    - -

    - - + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -512,9 +509,9 @@

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -530,14 +527,14 @@

    - - - - + + + + - - - + + + @@ -549,17 +546,17 @@ - + To see a tutorial in "***Editing Mode***" you need to add a "**crayon**" icon to the **Tutorial base node**. - - + + - + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() @@ -575,12 +572,12 @@

    - + - - - + + + @@ -592,7 +589,7 @@ - + @@ -617,10 +614,10 @@ - - + + - + = "${node?.children[0]?.text} directly".toString() @@ -636,13 +633,13 @@

    - +
    - - - + + + @@ -656,21 +653,21 @@ Select a node (its text doesn't affect the tutorial)
  • - Assign the style "ToM_note" to that node + Assign the style "ToM_note" to that node
  • Add one or more child nodes to that node
  • - The notes of that child nodes will be used as the text to be shown in the tutorial + The notes of that child nodes will be used as the text to be shown in the tutorial
  • - - + + @@ -686,10 +683,10 @@ Select a node (its text doesn't affect the tutorial) - - + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -705,9 +702,9 @@ Select a node (its text doesn't affect the tutorial)

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -723,20 +720,20 @@ Select a node (its text doesn't affect the tutorial)

    - - - + + + - + - + - - - + + + @@ -759,7 +756,7 @@ Select a node (its text doesn't affect the tutorial) - + @@ -777,7 +774,7 @@ Select a node (its text doesn't affect the tutorial) - + @@ -789,7 +786,7 @@ Select a node (its text doesn't affect the tutorial) - + @@ -801,25 +798,22 @@ Select a node (its text doesn't affect the tutorial) - +

    - These nodes can be set between the other nodes or as parents of them. They just have to be "before" the others ("in breadth-first order") -

    -

    - + These nodes can be set between the other nodes or as parents  of them. They just have to be "before" the others ("in breadth-first order")

    - - - + + + @@ -831,7 +825,7 @@ Select a node (its text doesn't affect the tutorial) - + @@ -845,17 +839,17 @@ Select a node (its text doesn't affect the tutorial) Select the desired node (its text will be used as title for that page)
  • - Assign the style "ToM_newPage" to that node + Assign the style "ToM_newPage" to that node
  • - - + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -871,9 +865,9 @@ Select the desired node (its text will be used as title for that page)

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -889,14 +883,14 @@ Select the desired node (its text will be used as title for that page)

    - - - + + + - - - + + + @@ -907,7 +901,7 @@ Select the desired node (its text will be used as title for that page)

    - + @@ -920,7 +914,7 @@ Select the desired node (its text will be used as title for that page) - + @@ -934,17 +928,17 @@ Select the desired node (its text will be used as title for that page) Select the desired node (its text doesn't affect the tutorial)
  • - Assign the style "ToM_nextPage" to that node + Assign the style "ToM_nextPage" to that node
  • - - + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -960,9 +954,9 @@ Select the desired node (its text doesn't affect the tutorial)

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -978,21 +972,33 @@ Select the desired node (its text doesn't affect the tutorial)

    - - - + + + - + - + + + + + + + +

    + Insert new 'next page' node directly +

    + + +
    - - - + + + @@ -1013,10 +1019,10 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -1032,9 +1038,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -1050,25 +1056,37 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + + + + + + + +

    + Insert new 'TOC' node directly +

    + + +
    - + - + @@ -1087,8 +1105,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: }

    - -
    +
    @@ -1101,9 +1118,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:
    - - - + + + @@ -1119,14 +1136,14 @@ To add a Table of Content (TOC) to your tutorial, you just have to: = edofro.MarkDownHelper.MDH.document(node)
    - - + + You can add multiple **actions** to your tutorial by using the following **special styles**: - + @@ -1137,82 +1154,82 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - - - + + + You can make that **ToM** shows **where in the menu** the user can find a specific command. - - - + + + You can add to your tutorial buttons that **apply menu actions**. - - - + + + You can add to your tutorial panels that show blocks of **groovy code ** and / or **buttons** that apply those **groovy scripts** to the selected nodes. - - - + + + You can add buttons to **jump to other tutorial pages** in the same mindmap (and jump back). - - - + + + You can add actions to **insert example nodes** or specific node structures **to the user's mindmap**. - - - + + + After inserting an example branch, you can have a **button that selects the nodes** that you want so the user can easily go further with the tutorial. - - - + + + You can add a button to **open other mindmaps** needed for the tutorial. - - - + + + You can add an "_**inspect**_" button to the tutorial that directly goes to the map that contains the current tutorial information and selects the node where the current page starts. - - - + + + You can add a button to **show nodes** in the same or in another MindMap. It may be any node. It doesn't need to be in a tutorial. @@ -1221,9 +1238,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - + + + You can add buttons to **open other tutorials** or **tutorial's pages** from the same or another mindmap. @@ -1233,7 +1250,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + @@ -1248,8 +1265,8 @@ To add a Table of Content (TOC) to your tutorial, you just have to: =edofro.MarkDownHelper.MDH.document(node) - - + + This is not a real tutorial, it's more like a guide. For each "action", there is a brief an explanation and **multiple buttons** with different actions. @@ -1259,7 +1276,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: For example, there are buttons to: - + @@ -1270,15 +1287,15 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - - + + + + - + - + @@ -1293,8 +1310,8 @@ To add a Table of Content (TOC) to your tutorial, you just have to: =edofro.MarkDownHelper.MDH.document(node) - - + + In the following pages, you can see a brief explanation about all the **building components** used to **add actions** to your tutorials with **Tutorial-o-Matic**. @@ -1307,11 +1324,11 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + - - - + + + @@ -1324,7 +1341,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps * Add a node with style "**ToM_showMenu**" @@ -1336,10 +1353,10 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -1355,9 +1372,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -1373,19 +1390,43 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + - - - + + + ## Modifiers + +You can use icons as modifiers when using the **ToM_showMenu** node. + +* Icons in nodes with links to menu commands: + * **fire:** <br> +when present it shows a **second button** +with a **rocket** image. <br> +This button shows the menu +AND **executes the command**. + +The following "**showMenu**" panels serve as example. The second has an additional + "Fire" icon in the node in the map, that's why it has the two buttons. + + + + + + + + + + + + @@ -1403,7 +1444,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + To add a node that has a link to a command Manual: @@ -1415,10 +1456,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + + - + = "${node?.children[0]?.text} directly".toString() @@ -1435,9 +1478,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -1453,14 +1496,14 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - - - + + + @@ -1478,7 +1521,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + Another way to get a node with a link to a menu command is using the ToM command "Get menu command" @@ -1497,14 +1540,14 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + - - - + + + @@ -1517,7 +1560,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps The steps are very similar to the "showMenu" case: @@ -1534,10 +1577,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + - + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -1553,9 +1598,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -1571,19 +1616,19 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + - - - + + + ## Modifiers The **ToM_menuAction** node accept some icons as @@ -1604,13 +1649,21 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - - - + + + + + + + + + + + + + - + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() @@ -1626,9 +1679,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() @@ -1644,9 +1697,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() @@ -1662,9 +1715,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() @@ -1680,13 +1733,13 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - +
    - - - + + + @@ -1699,7 +1752,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + By using icons as modifiers you can get panels that: * show the code but don't have a button @@ -1712,7 +1765,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps The steps are very similar to the "menuAction" case: @@ -1730,10 +1783,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + - + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -1749,9 +1804,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -1767,19 +1822,19 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + - - - + + + ## Modifiers The **ToM_groovy** node accept some icons as @@ -1797,12 +1852,18 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - - + + + + + + + + + + - + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() @@ -1818,9 +1879,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() @@ -1836,9 +1897,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() @@ -1854,13 +1915,13 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - +
    - - - + + + @@ -1873,7 +1934,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps The steps are very similar to the "menuAction" case: @@ -1892,7 +1953,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + By using icons as modifiers you can add a "**Return back**" button @@ -1900,10 +1961,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -1919,9 +1982,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -1937,19 +2000,19 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + - - - + + + ## Modifiers The **ToM_goto** node accept some icons as @@ -1964,10 +2027,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + - + + = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() @@ -1983,13 +2048,13 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - +
    - - - + + + @@ -2001,7 +2066,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + @@ -2024,7 +2089,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + When building a tutorial you can add **predefined nodes or branches of nodes** that the user can **insert in his/her own map**. @@ -2037,7 +2102,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps @@ -2052,10 +2117,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -2071,9 +2138,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -2089,20 +2156,20 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + - - - + + + @@ -2115,7 +2182,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + To indicate **which** are the nodes you want **to select**, just paste **clones of them** as child nodes of the **ToM_select node**. @@ -2123,7 +2190,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps @@ -2139,9 +2206,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - + + + @@ -2154,10 +2221,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -2173,9 +2242,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -2191,20 +2260,20 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + - - - + + + @@ -2217,10 +2286,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + + - + = "${node?.children[0]?.text} directly".toString() @@ -2237,12 +2308,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - - - + + + @@ -2255,10 +2326,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + + - + = "${node?.children[0]?.text} directly".toString() @@ -2275,13 +2348,13 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - +
    - - - + + + @@ -2294,7 +2367,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + Currently that map must be in the same directory as the tutorial map @@ -2302,7 +2375,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps @@ -2317,9 +2390,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - + + + @@ -2332,10 +2405,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + - + + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -2351,9 +2426,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -2369,21 +2444,21 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + - - - + + + @@ -2396,7 +2471,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps @@ -2410,9 +2485,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - + + + @@ -2425,10 +2500,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -2444,9 +2521,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -2462,21 +2539,21 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + - - - + + + @@ -2489,7 +2566,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps The steps are very similar to the "goto" case: @@ -2508,9 +2585,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - + + + @@ -2523,10 +2600,12 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - + + + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -2542,9 +2621,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -2560,21 +2639,21 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + - - - + + + @@ -2587,7 +2666,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + ## Steps The steps are very similar to the "goto" case: @@ -2606,7 +2685,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + @@ -2621,9 +2700,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: =edofro.MarkDownHelper.MDH.document(node) - - - + + + @@ -2634,63 +2713,65 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - + + + + + - + = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() @@ -2706,9 +2787,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - + - + = "Insert new **${node?.children[1]?.text}** node directly".toString() @@ -2724,13 +2805,13 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - - - + + + - + - + diff --git a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm index fc52c7d..d304810 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-Matic Intro.mm @@ -7,14 +7,14 @@ - + - + @@ -208,8 +208,7 @@ - - + @@ -259,6 +258,25 @@ + + + + + + + + + + + + + + =edofro.MarkDownHelper.MDH.document(node) + + + + + @@ -278,11 +296,18 @@ - + + + + + + + + + - @@ -332,11 +357,27 @@ - + - + + + + + + + +

    + 'How to ToM' +

    +

    + guide +

    + + + +
    @@ -348,20 +389,24 @@ - - - - - - -

    - = edofro.MarkDownHelper.MDH.document(node) -

    - -
    - + + =edofro.MarkDownHelper.MDH.document(node) + + + + + + This document contains **two guides** about the **building components** used to build tutorials with **Tutorial-o-Matic**: + + 1. commands used to **create new tutorials** + 2. **actions** you can add to the tutorials + + + - + + + @@ -384,24 +429,20 @@

    - + - - - - - - - -

    - 'How to ToM' -

    -

    - panel -

    - - -
    +
    +
    + + + + + + + + + + @@ -414,22 +455,23 @@ - =edofro.MarkDownHelper.MDH.document(node) - - - - - - This document contains **two guides** about the **building components** used to build tutorials with **Tutorial-o-Matic**: - - 1. commands used to **create new tutorials** - 2. **actions** you can add to the tutorials - - + = edofro.MarkDownHelper.MDH.document(node) + + + + + + + + + + + + diff --git a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm index 81d464d..5e5f8d3 100644 --- a/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm +++ b/EditingTutorialsWithMDH/Tutorial-o-MaticStepByStep.mm @@ -3,7 +3,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -235,15 +235,15 @@ - + - + - - - + + + @@ -258,9 +258,9 @@ =edofro.MarkDownHelper.MDH.document(node) - - - + + + @@ -273,49 +273,49 @@

    - - - - + + + + - - - + + + ## 1. Create a basic tutorial in a new mindmap -In this tutorial you will learn how to create a new map containing a one page tutorial. +In this tutorial you will learn how to create a +new map containing a one page tutorial. - - ## 2. xx + + ## 2. Adding a basic tutorial to an existing mindmap -xx - +In this tutorial you will learn how to set +an existing mindmap to contain a one page tutorial. - - - ## 3. xx + + ## 3. Organizing a tutorial in multiple pages -xx +In this tutorial you will learn how +to divide a long tutorial into pages. - - + - - - - + + + + @@ -330,11 +330,11 @@ = edofro.MarkDownHelper.MDH.document(node) - - + + - + @@ -349,8 +349,8 @@ =edofro.MarkDownHelper.MDH.document(node) - - + + **Tutorial-o-Matic** use mindmaps to store the tutorial's information. To understand how to display a tutorial and its structure **Tutorial-o-Matic** needs that the map has some _special user styles_. @@ -364,9 +364,9 @@ - - - + + + @@ -381,8 +381,8 @@ =edofro.MarkDownHelper.MDH.document(node) - - + + To create a new mindmap that has the styles needed to build a tutorial using **Tutorial-o-Matic** , you can use the command "**Create new tutorial mind map**". @@ -393,8 +393,8 @@ - - + + ## Step 1: create a new tutorial able mind map @@ -406,8 +406,8 @@ - - + + @@ -422,7 +422,7 @@ = edofro.MarkDownHelper.MDH.document(node) - + After creating the new map, click the "**Next page**" button to continue with the tutorial. @@ -430,9 +430,9 @@ - - - + + + As said before this new map has some _special styles_. @@ -444,10 +444,10 @@ - - - - + + + + @@ -462,7 +462,7 @@ = edofro.MarkDownHelper.MDH.document(node) - + Ok, now is time to create the tutorial. We first need a title for our tutorial. @@ -472,7 +472,7 @@ - + @@ -487,8 +487,8 @@ = edofro.MarkDownHelper.MDH.document(node) - - + + Ok. just insert a new node and write "my first tutorial" as its text. (If you want to skip this step, just click 'insert nodes') @@ -497,11 +497,11 @@ - - + + - - + + ### Ok. Now let's test it! @@ -512,9 +512,9 @@ - - - + + + @@ -529,14 +529,14 @@ = edofro.MarkDownHelper.MDH.document(node) - - + + Ok. that was kind of frustrating, but as said before, nodes need special styles to be recognized as part of the tutorial. - + @@ -563,7 +563,7 @@ - + @@ -578,19 +578,19 @@ = edofro.MarkDownHelper.MDH.document(node) - - + + Select the node you want to be your tutorial's title and apply the **ToM-Tutorial** style to it. - + - - + + @@ -604,7 +604,7 @@ - + ### Ok. Now let's test it! @@ -615,9 +615,9 @@ - - - + + + @@ -632,8 +632,8 @@ = edofro.MarkDownHelper.MDH.document(node) - - + + Ok. that was kind of frustrating again. Let's put some information in the tutorial now!! @@ -645,9 +645,9 @@ - - - + + + @@ -662,8 +662,8 @@ = edofro.MarkDownHelper.MDH.document(node) - - + + To know what information from the map should be used as text in the information panels of the tutorial, **Tutorial-o Matic** looks for nodes with the **ToM_note** style and it uses the notes form their childnodes as information. @@ -671,7 +671,7 @@ - + @@ -703,7 +703,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -716,18 +716,18 @@ Write some text to its note (this is the information that will be shown) - - + + - - + + - + - - + + @@ -742,14 +742,14 @@ Write some text to its note (this is the information that will be shown) - - + + - + - - + + @@ -769,7 +769,7 @@ Write some text to its note (this is the information that will be shown) - + ### Ok. Now let's test it! @@ -781,9 +781,9 @@ Write some text to its note (this is the information that will be shown) - - - + + + @@ -798,14 +798,14 @@ Write some text to its note (this is the information that will be shown) = edofro.MarkDownHelper.MDH.document(node) - + Now we will copy to the tutorial some other 'ToM_note' nodes as examples so you can see other use cases - + @@ -819,14 +819,14 @@ Write some text to its note (this is the information that will be shown) - + - + - - - + + + @@ -843,10 +843,10 @@ Write some text to its note (this is the information that will be shown) - - - - + + + + ## List examples ### Simple list @@ -874,7 +874,7 @@ Write some text to its note (this is the information that will be shown) - + ## Table example |Name|this is the Age column|Badge| @@ -884,7 +884,7 @@ Write some text to its note (this is the information that will be shown) |Alex|45|![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png)| - + @@ -900,7 +900,7 @@ Write some text to its note (this is the information that will be shown) - + ## Code block Code: **'example code'** @@ -921,8 +921,8 @@ Write some text to its note (this is the information that will be shown) - - + + ### Ok. Now let's test it! @@ -933,9 +933,9 @@ Write some text to its note (this is the information that will be shown) - - - + + + @@ -950,8 +950,8 @@ Write some text to its note (this is the information that will be shown) = edofro.MarkDownHelper.MDH.document(node) - - + + Now you can play with your map and see how the tutorial changes! For example: @@ -969,9 +969,26 @@ Write some text to its note (this is the information that will be shown) + + + + + + + + + + + + + + = edofro.MarkDownHelper.MDH.document(node) + + + - - + + ### Ok. Now let's test it! @@ -981,7 +998,7 @@ Write some text to its note (this is the information that will be shown) - + = "${node?.children[0]?.text}".toString() @@ -997,7 +1014,7 @@ Write some text to its note (this is the information that will be shown)

    - + ### Ok. Now let's test it! @@ -1007,8 +1024,8 @@ Write some text to its note (this is the information that will be shown) - - + + @@ -1023,7 +1040,7 @@ Write some text to its note (this is the information that will be shown) = edofro.MarkDownHelper.MDH.document(node) - + # Congratulations!! ## You have completed this tutorial!! @@ -1037,14 +1054,14 @@ Write some text to its note (this is the information that will be shown) - + - - - - - + + + + + @@ -1059,8 +1076,8 @@ Write some text to its note (this is the information that will be shown) = edofro.MarkDownHelper.MDH.document(node) - - + + You can add a tutorial to any of your existing map. You can do it, for example, @@ -1081,12 +1098,12 @@ Write some text to its note (this is the information that will be shown) - - - + + + - - + + As said in previous tutorial, the map needs some _special styles_. @@ -1098,9 +1115,9 @@ Write some text to its note (this is the information that will be shown) - - - + + + @@ -1115,8 +1132,8 @@ Write some text to its note (this is the information that will be shown) - - + + Let's take a look at the **styles manager** again now. @@ -1128,8 +1145,8 @@ Write some text to its note (this is the information that will be shown) - - + + @@ -1144,8 +1161,8 @@ Write some text to its note (this is the information that will be shown) = edofro.MarkDownHelper.MDH.document(node) - - + + I recommend you to complete the first tutorial if you haven't. In the following page we will add a sample tutorial, so we can see that it works in an existing map too. @@ -1156,9 +1173,9 @@ Write some text to its note (this is the information that will be shown) - - - + + + @@ -1173,8 +1190,8 @@ Write some text to its note (this is the information that will be shown) = edofro.MarkDownHelper.MDH.document(node) - - + + Select any node in any branch and continue with the next steps. @@ -1183,11 +1200,11 @@ Write some text to its note (this is the information that will be shown) - + - - - + + + @@ -1220,7 +1237,7 @@ Write some text to its note (this is the information that will be shown) - + ## Table example |Name|this is the Age column|Badge| @@ -1230,7 +1247,7 @@ Write some text to its note (this is the information that will be shown) |Alex|45|![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png)| - + @@ -1246,7 +1263,7 @@ Write some text to its note (this is the information that will be shown) - + ## Code block Code: **'example code'** @@ -1265,12 +1282,12 @@ Write some text to its note (this is the information that will be shown) - + - - + + ### Ok. Now let's test it! @@ -1280,8 +1297,8 @@ Write some text to its note (this is the information that will be shown) - - + + @@ -1296,7 +1313,7 @@ Write some text to its note (this is the information that will be shown) = edofro.MarkDownHelper.MDH.document(node) - + # Congratulations!! ## You have completed this tutorial!! @@ -1310,22 +1327,22 @@ Write some text to its note (this is the information that will be shown) - + - - + + - + - - - - + + + + @@ -1340,11 +1357,11 @@ Write some text to its note (this is the information that will be shown) = edofro.MarkDownHelper.MDH.document(node) - - + + - - + + @@ -1355,7 +1372,7 @@ Write some text to its note (this is the information that will be shown)

    - + @@ -1366,7 +1383,7 @@ Write some text to its note (this is the information that will be shown)

    - + @@ -1377,9 +1394,9 @@ Write some text to its note (this is the information that will be shown)

    - + - + @@ -1390,12 +1407,12 @@ Write some text to its note (this is the information that will be shown)

    - +
    - + @@ -1419,13 +1436,13 @@ Write some text to its note (this is the information that will be shown)
    - +
    - - - + + + @@ -1440,8 +1457,8 @@ Write some text to its note (this is the information that will be shown) =edofro.MarkDownHelper.MDH.document(node) - - + + To create a new mindmap that has the styles needed to build a tutorial using **Tutorial-o-Matic** , you can use the command "**Create new tutorial mind map**". @@ -1452,8 +1469,8 @@ Write some text to its note (this is the information that will be shown) - - + + ## Step 1: create a new tutorial able mind map @@ -1465,9 +1482,9 @@ Write some text to its note (this is the information that will be shown) - - - + + + @@ -1491,16 +1508,16 @@ Write some text to its note (this is the information that will be shown) - + - + - + - - - + + + @@ -1515,12 +1532,12 @@ Write some text to its note (this is the information that will be shown) - + The original creator of this tutorial is [lalabananas](https://www.instructables.com/member/lalabananas/) and it was published as [Cute-Origami-Bookmarks in Instructables](https://www.instructables.com/Cute-Origami-Bookmarks/). - + @@ -1532,7 +1549,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1547,7 +1564,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1562,7 +1579,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1578,10 +1595,10 @@ Write some text to its note (this is the information that will be shown) - - - - + + + + @@ -1596,7 +1613,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1608,7 +1625,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1647,7 +1664,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1675,9 +1692,9 @@ Write some text to its note (this is the information that will be shown) - - - + + + @@ -1692,7 +1709,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1707,7 +1724,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1724,9 +1741,9 @@ Write some text to its note (this is the information that will be shown) - - - + + + @@ -1741,7 +1758,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1756,7 +1773,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1771,7 +1788,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1792,7 +1809,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1813,7 +1830,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1834,7 +1851,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1851,10 +1868,10 @@ Write some text to its note (this is the information that will be shown) - - - - + + + + @@ -1869,7 +1886,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1884,7 +1901,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1907,9 +1924,9 @@ Fold the square into quarters (fold once horizontally and once vertically.) - - - + + + @@ -1932,9 +1949,9 @@ Fold the square into quarters (fold once horizontally and once vertically.) - - - + + + @@ -1957,9 +1974,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - + + + @@ -1982,9 +1999,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - + + + @@ -2005,7 +2022,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2023,9 +2040,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - + + + @@ -2040,7 +2057,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2052,7 +2069,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2067,7 +2084,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2082,7 +2099,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2112,7 +2129,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2129,9 +2146,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - + + + @@ -2146,7 +2163,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2158,7 +2175,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2173,7 +2190,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2188,7 +2205,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2203,7 +2220,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -2222,8 +2239,8 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - + + @@ -2238,15 +2255,15 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - - - - + + + + + + - + @@ -2261,21 +2278,21 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - + + + - - + + - - - + + + @@ -2300,15 +2317,15 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - - + + + + - - + + @@ -2323,21 +2340,21 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - + + + - - - - - - + + + + + + - - + + @@ -2352,8 +2369,8 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - + + If you want to **divide** your tutorial **in multiple pages** you have two different options: @@ -2364,24 +2381,24 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- to indicate where the next page starts. - + "**New page**" nodes are used to indicate where a **new page starts** AND the **title** of this new page. This title gets shown at the **top of the page** - - + + "**Next page**" nodes only indicates where a **new page** starts but **doesn't insert** a new **title** to the tutorial - + With the same logic, when showing the **Table of Content** only **"New page" titles** are listed there. - + These nodes can be set **between** the other nodes **or as parents** of them. They just have to be "**before**" the others ("in **breadth-first order**") @@ -2390,8 +2407,8 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - + + @@ -2406,12 +2423,12 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - + + + - + @@ -2426,8 +2443,8 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - + + @@ -2439,11 +2456,11 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - + + - + @@ -2458,22 +2475,22 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - + - + - - + + - - - + + + @@ -2497,15 +2514,15 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - - - - + + + + - - + + @@ -2520,8 +2537,8 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - + + @@ -2533,15 +2550,15 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - + + - - - + + + @@ -2556,10 +2573,10 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - + + - + @@ -2574,29 +2591,29 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - - + + + + - + - + - - + + --- ## Table of contents: --- - + - - + + @@ -2611,28 +2628,28 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - + - + - - + + - + ### Let's look at the changes. Click at the button to show how the page looks now: - + - - + + @@ -2647,14 +2664,14 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - + + - - - + + + @@ -2669,9 +2686,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - + + + @@ -2685,18 +2702,18 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + - - - - - + + + + + - + - + @@ -2711,34 +2728,34 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - + - + - - + + - + ### Let's look at the changes. Click at the button to show how the page looks now: - + - - - + + + @@ -2753,10 +2770,10 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - - + + + + @@ -2770,25 +2787,25 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + - + - + - + - + - + - + - + - + @@ -2803,10 +2820,10 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - + - + @@ -2814,25 +2831,25 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - + + - + ### Let's look at the changes. Click at the button to show how the page looks now: - + - - - + + + @@ -2847,13 +2864,13 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - - - + + + + + - + @@ -2864,7 +2881,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - + @@ -2878,11 +2895,11 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --
    - - + + - + @@ -2897,14 +2914,14 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - - + + + + - + @@ -2919,9 +2936,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - + + + @@ -2935,9 +2952,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - + + + @@ -2951,14 +2968,14 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - + + + - + @@ -2973,30 +2990,31 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - + - + + - - + + - + ### Let's look at the changes. Click at the button to show how the page looks now: - + - - - + + + @@ -3011,11 +3029,11 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - - - + + + + + @@ -3027,14 +3045,14 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - + + + - - + + - + @@ -3046,7 +3064,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -3060,12 +3078,12 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + - - + + - + @@ -3077,7 +3095,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -3091,12 +3109,12 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + - - + + - + @@ -3108,7 +3126,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -3122,7 +3140,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -3130,9 +3148,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - + + + @@ -3147,8 +3165,8 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - + + @@ -3162,12 +3180,12 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - + + - + - + @@ -3182,11 +3200,11 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - - + + + - + @@ -3197,7 +3215,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - + @@ -3211,7 +3229,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --
    - + @@ -3225,17 +3243,17 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - + + - + - - + + - + - + @@ -3246,7 +3264,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - + @@ -3261,7 +3279,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --
    - + @@ -3276,13 +3294,13 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - + - - - + + + @@ -3297,10 +3315,10 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - + + - + @@ -3315,8 +3333,8 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - + + @@ -3330,17 +3348,17 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + - - - - + + + + - + - + @@ -3355,31 +3373,31 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - + - + - - + + - + ### Let's look at the changes. Click at the button to show how the page looks now: - + - - + + @@ -3394,12 +3412,12 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - - + + - - + + @@ -3414,7 +3432,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- = edofro.MarkDownHelper.MDH.document(node) - + # Congratulations!! ## You have completed this tutorial!! @@ -3428,105 +3446,23 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - - - - - - - - -

    - actions -

    - -
    - - -
    - - - - - - - - - - - -

    - Editing mode -

    - -
    -
    - - To see a tutorial in "***Editing Mode***" -you need to add a "**crayon**" icon to the **Tutorial base node**. - - - -
    - - - - - - - = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() - - - - - - - -

    - "Add a '$0' icon to the selected node(s) directly" -

    - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - + + - - + + @@ -3538,7 +3474,7 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - + @@ -3563,10 +3499,10 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- - - + + - + = "${node?.children[0]?.text} directly".toString() @@ -3582,7 +3518,8 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - + +
    diff --git a/EditingTutorialsWithMDH/myExistingMindMap.mm b/EditingTutorialsWithMDH/myExistingMindMap.mm index 483a5df..48921ed 100644 --- a/EditingTutorialsWithMDH/myExistingMindMap.mm +++ b/EditingTutorialsWithMDH/myExistingMindMap.mm @@ -4,7 +4,7 @@ - + @@ -40,34 +40,7 @@ - - - - - - - - - -pre { - background-color: #e5e7ff; - border-left: 5px solid #ccc; - display: block; - padding: 8px; - margin: 5px; -} -code { - font-family: Consolas,"courier new"; - font-size: 11px; - color: #999; -} - -blockquote { - border-left: 5px solid #cccccc; - background-color: #eeeeee; - padding: 8px; -} - + @@ -203,12 +176,12 @@
    - + - + diff --git a/README.MD b/README.MD index 6afd75b..16877bc 100644 --- a/README.MD +++ b/README.MD @@ -10,7 +10,7 @@ Look under [Releases](https://github.com/EdoFro/Freeplane_Tutorial_AddOn/release 1. Download the addon.mm file, open it in Freeplane and install it. 1. Relaunch Freeplane -1. go to menu Edo Tools/Tutorial-o-Matic and click on 'Tutorial-o-Matic Demo' +1. Go to menu **Edo Tools/Tutorial-o-Matic** and click on **'Tutorial-o-Matic Intro'** enjoy the demo! @@ -22,10 +22,6 @@ edo - **No milestone** - [ ] **Redefine Add-on menu and Add-on tutorials links for better user experience (working on it: ~75%)** -- **ToM v0.0.7** - - Add-on tutorials (w/MDH) - - StepByStep Tutorial - - [ ] **Update "Introduction" tutorial in StepByStep map (working on it: ~0%)** # Tasks @@ -45,16 +41,11 @@ edo - [x] Tutorial 2: one page tutorial in an existing mindmap - [x] Tutorial 3: "Organizing a tutorial in multiple pages" - [x] Add "Crayon" functionality to add-on's tutorial - - [ ] **Update "Introduction" tutorial in StepByStep map (working on it: ~0%)** - - [ ] Add links to StepbyStepActions tutorial (to WIP repository for this stage) - - StepByStepActions Tutorial - - [ ] Create basic version of "Tutorial-o-MaticStepByStepActions.mm" mindmap where ToM actions styles will be explained - - practice.maps - - [ ] Delete MDH Styles from "myExistingMindMap.mm" map - - [ ] Delete MDH Styles from "LongTutorialExample_MDH.mm" map + - [x] Update "Introduction" tutorial in StepByStep map + - [x] Delete Crayon from al add-on tutorial map - README.MD - - [ ] Redefine instructions - - [ ] Improve ReadMe.MD + - [x] Redefine instructions + - [x] Improve ReadMe.MD - **ToM v0.0.8** - lib - ToM_actions.grvy @@ -67,6 +58,8 @@ edo - [ ] Help script that calls "Save as MDH clean mindmap" (MDH add-on) to automatize updating process - StepByStepActions Tutorial - [ ] Create "Tutorial-o-MaticStepByStepActions.mm" mindmap where all ToM actions styles are explained + - StepByStep Tutorial + - [ ] Add links to StepbyStepActions tutorial (to WIP repository for this stage) - **ToM xFuture A** - lib - ToM_actions.grvy @@ -102,14 +95,14 @@ edo - [ ] nodo con link a file .md
    -->
    lo despliega en panel de editor - ToM_ui.grvy - [ ] Improve buttonPanel layout to make it more compact + - scripts + - [ ] init Script that reacts to the opening of mindmaps that have tutorials and automatically shows the Tutorials dialog - Add-on tutorials (w/MDH) - Commands - [ ] add buttonBoards to map - Apuntes - [ ] practice maps: Should the user be able to save changes or should the user have to use "save as" option? - [ ] new MDH feature:
    Command to 'update' the note of a node that has a link to a MDH node and it copy/pastes its contain (from another map)
    desde otro mapa - - scripts - - [ ] init Script that reacts to the opening of mindmaps that have tutorials and automatically shows the Tutorials dialog - **ToM xFuture C** - lib - ToM_actions.grvy diff --git a/Tutorial-o-Matic project.mm b/Tutorial-o-Matic project.mm index d8294d5..46cdf47 100644 --- a/Tutorial-o-Matic project.mm +++ b/Tutorial-o-Matic project.mm @@ -106,7 +106,7 @@ - + @@ -1129,7 +1129,7 @@ - + @@ -8200,7 +8200,7 @@ def setPanelEnabled(panel, Boolean isEnabled) {
    - + @@ -11178,8 +11178,7 @@ def fillContentPane(myPanel, nextTutNodes){ tom.fillContentPane(myPanel, tutNodes)

    - -
    +
    @@ -12260,7 +12259,7 @@ def fillContentPane(myPanel, nextTutNodes){
    - + @@ -16511,21 +16510,50 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + @@ -16535,37 +16563,13 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - - - - + - - - - - - - - - - - - - - - - - - - @@ -16598,7 +16602,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -17132,7 +17136,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -17158,11 +17162,8 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - - - @@ -17289,6 +17290,38 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -17322,38 +17355,6 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -17361,18 +17362,12 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - - - - @@ -17381,8 +17376,167 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ + + + + + + + + + +

    + import edofro.pseudofreeplaneapi.UserStyles as us +

    +

    + +

    +

    + //usar después de ejecutar "save as MDH clean mindmap" +

    +

    + +

    +

    + // delete other edofro styles +

    +

    +     def userStylesToDelete = [ +

    +

    +             'baseFolder', 'newFolderImport', 'freshNew', 'movedRenamed', 'file', 'file_folder', +

    +

    +             'missing', 'modifiedFile', 'locked', 'file_folder_with_icon', 'GroovyNode', 'Warning', +

    +

    +             'hasGroovyNode', 'Topic', 'Subtopic', 'Subsubtopic', 'Siguiente tarea', 'nextTask', +

    +

    +             'Tarea pendiente', 'pendingTask', 'Tarea finalizada', 'completedTask', 'Tarea Descartada', +

    +

    +             'discardedTask', 'Proyecto', 'Grupito', 'Iniciativa', 'Organizador', 'Minuta', 'Acuerdo', +

    +

    +             'numerado', 'con duda', 'BotonMenu', 'menuButton', 'project', 'MarkdownHelperNode', +

    +

    +             'customMenuPackage', 'tasksBucket', 'maybeTask', 'milestone', 'contieneSigTareas', +

    +

    +             'containsNextTasks', 'contieneTareaPend', 'containsPendingTasks' +

    +

    +         ] +

    +

    +     def targetMap = node.mindMap +

    +

    + +

    +

    +     // 7. get "to delete style nodes" from map +

    +

    +     def toDeleteStyleNodesInMap  = us.getUserDefinedStylesParentNode(targetMap).children.findAll{it.text in userStylesToDelete } +

    +

    +     println toDeleteStyleNodesInMap +

    +

    + +

    +

    +     def stylesToProcess  = toDeleteStyleNodesInMap.collect{it.text} +

    +

    +     println stylesToProcess +

    +

    + +

    +

    +     def nodosWithUnwantedStyles         = targetMap.root.find{ it.style.name in stylesToProcess} +

    +

    +     println nodosWithUnwantedStyles.size() +

    +

    + +

    +

    +     nodosWithUnwantedStyles.each{n -> +

    +

    +         n.style.name = null +

    +

    +     } +

    +

    + +

    +

    +     toDeleteStyleNodesInMap.each{n -> +

    +

    +         n.delete() +

    +

    +     } +

    +

    + +

    +

    + // delete crayons +

    +

    +     def tom_Tutorial = 'ToM-Tutorial' +

    +

    +     def crayonIcon = 'emoji-1F58D' +

    +

    + +

    +

    +     def tutorialNodes = root.find{n -> n.style.name == tom_Tutorial} +

    +

    +     println tutorialNodes*.text +

    +

    +     tutorialNodes.each{n -> +

    +

    +         while (n.icons.remove(crayonIcon)){ +

    +

    +         } +

    +

    +     } +

    + + +
    + + + + + + +

    + .groovy +

    + +
    +
    - + @@ -17472,8 +17626,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17485,8 +17638,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17498,8 +17650,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17511,8 +17662,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17524,8 +17674,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17537,8 +17686,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17550,8 +17698,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17563,8 +17710,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17576,8 +17722,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17589,8 +17734,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17602,8 +17746,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17615,8 +17758,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17628,8 +17770,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17641,8 +17782,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ ="![](${node.link.uri})"

    - -
    +
    @@ -17865,10 +18005,10 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){
    - + - + @@ -17879,7 +18019,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -17897,7 +18037,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ = edofro.MarkDownHelper.MDH.list(node) //xx
    - + @@ -17915,18 +18055,11 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - + + - - - - - - - @@ -17935,7 +18068,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ = edofro.MarkDownHelper.MDH.list(node) //xx
    - + @@ -17953,9 +18086,9 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - + + + @@ -17967,119 +18100,118 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - - - + + + - - - + + + - - - - - - - - + + + + + + + - - + - - - + + + - - - + + + + + + - - - - - - + + - - + + + + + + - - - - + + + + + - - - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + - - - - - - + + - - + + - - - + + + - - - + + + @@ -18092,46 +18224,43 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - - - - - - - - + + + + + + + - - + + - - - - + + + + - - + + - - - - - + + + + + - + - - - - - + + + + + @@ -18270,7 +18399,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -18298,20 +18427,20 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - + - - - + + + - + @@ -18343,15 +18472,15 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + - - + + @@ -18370,9 +18499,9 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - - + + + @@ -18387,7 +18516,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - + @@ -18446,8 +18575,8 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){ - - + + @@ -18512,8 +18641,7 @@ def changeButtonPanel(c, html, buttonLabel, buttonToolTip){

    - -
    +
    @@ -21075,7 +21203,7 @@ def textoLabel(acc) { - + @@ -21146,7 +21274,7 @@ def textoLabel(acc) { - + @@ -21748,7 +21876,7 @@ def textoLabel(acc) { - + @@ -22170,8 +22298,8 @@ def msg(t){ - - + + @@ -22208,7 +22336,7 @@ def msg(t){ - + @@ -22784,7 +22912,7 @@ def getUriFromNode(nodo, String sch = 'tutorial'){ - + @@ -22813,9 +22941,9 @@ def getUriFromNode(nodo, String sch = 'tutorial'){ - - - + + + @@ -22826,21 +22954,18 @@ def getUriFromNode(nodo, String sch = 'tutorial'){ - - - - - - + + + @@ -22873,6 +22998,9 @@ def getUriFromNode(nodo, String sch = 'tutorial'){ + + + @@ -22946,8 +23074,8 @@ def getUriFromNode(nodo, String sch = 'tutorial'){ - - + + @@ -23031,175 +23159,164 @@ def getUriFromNode(nodo, String sch = 'tutorial'){ - - - - - - - - - + + - - - - - - - - + + + + - - - + + + - - - - - - - - + + + - - + + + + + + + - - - + + + + - - - + + + + + + - - - - - - + + - - + + + + - - - - + + - - - - - + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - + + + + + + - - + + - - - + + + + + - - - - - + + + - - - - - - - + + + + + + + - - + + - - - - + + + + - - + + - - - - - + + + + + - + - - - - - + + + + + @@ -23264,27 +23381,29 @@ def getUriFromNode(nodo, String sch = 'tutorial'){ - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -23301,30 +23420,19 @@ def getUriFromNode(nodo, String sch = 'tutorial'){   - return to mindmap

    - -
    +
    +
    - - - - + + + + + - - - - - - - - - - - - - + @@ -23341,8 +23449,7 @@ def getUriFromNode(nodo, String sch = 'tutorial'){   - return to mindmap

    - -
    +
    @@ -23363,8 +23470,7 @@ def getUriFromNode(nodo, String sch = 'tutorial'){   - return to mindmap

    - -
    +
    @@ -23619,6 +23725,7 @@ def getUriFromNode(nodo, String sch = 'tutorial'){
    + @@ -23655,6 +23762,316 @@ def getUriFromNode(nodo, String sch = 'tutorial'){ println L2.disjoint(L3)

    +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + def nTask = node +

    +

    + +

    +

    + def allClones = ([] + nTask.getNodesSharingContent() + nTask.getNodesSharingContentAndSubtree() + nTask).unique().sort{it.id} +

    +

    + println allClones*.id +

    +

    + +

    +

    + +

    +

    + def bucketStyle = 'tasksBucket' +

    +

    + +

    +

    + allClones.each{n-> +

    +

    +     println n.id + '   ' + n.pathToRoot*.folded[0 .. -2] + '   ' + foldDistance(n)   + '   ' + n.visible  + '   ' + isInsideFolded(n) +

    +

    + } +

    +

    + +

    +

    + println allClones.sort{n -> foldDistance(n)}*.id +

    +

    + +

    +

    + +

    +

    + def foldDistance(n){ +

    +

    +     if(n.isRoot()) return 0 +

    +

    +     def lista = n.pathToRoot*.folded[0 .. -2] +

    +

    +     def largo = lista.size() +

    +

    +     def firstFold = lista.indexOf(true) +

    +

    +     firstFold = firstFold >= 0 ? firstFold : largo +

    +

    +     return largo-firstFold +

    +

    + } +

    +

    + +

    +

    + def isInsideFolded(n){ +

    +

    +     if(n.isRoot()) return false +

    +

    +     def lista = n.pathToRoot*.folded[0 .. -2] +

    +

    +     return  lista.any{it == true}  +

    +

    + } +

    +

    + +

    +

    + // +

    + +
    + + + + + + +

    + .groovy +

    + +
    +
    + + + + + + +

    + tests = [ +

    +

    +     {a,b -> a.text == b.text} +

    +

    + //    ,{a,b -> a.id == b.id} +

    +

    +     ,{a,b -> a.details?.htmlText == b.details?.htmlText} +

    +

    +     ,{a,b -> a.note?.html == b.note?.html} +

    +

    +     ,{a,b -> a.children.size() == b.children.size()} +

    +

    +     ,{a,b -> a.children*.text == b.children*.text} +

    +

    +     ,{a,b -> a.attributes == a.attributes} +

    +

    +     ,{a,b -> a.style.name == a.style.name} +

    +

    +     ,{a,b -> a.icons.icons == a.icons.icons} +

    +

    + ] +

    +

    + +

    +

    + def (a,b) = c.selecteds +

    +

    + +

    +

    + println a.text +

    +

    + println b.text +

    +

    + +

    +

    + println equals(a,b) +

    +

    + +

    +

    + comparar(a,b) +

    +

    + +

    +

    + def comparar(x,y){ +

    +

    +     println x.text +

    +

    +     if(equals(x,y)){ +

    +

    +         def xChilds = x.children +

    +

    +         def yChilds = y.children +

    +

    +         for(def i=0 ; i< xChilds.size(); i++){ +

    +

    +             def resp = comparar(xChilds[i],yChilds[i]) +

    +

    +             if(!resp){ +

    +

    +                 return false +

    +

    +             } +

    +

    +         } +

    +

    +         return true +

    +

    +     }else{ +

    +

    +         equals(x,y, true) +

    +

    +         x.pathToRoot.dropRight(1).reverse()*.folded = false +

    +

    +         y.pathToRoot.dropRight(1).reverse()*.folded = false +

    +

    +         c.select([x,y]) +

    +

    +         return false +

    +

    +     } +

    +

    + } +

    +

    + +

    +

    + +

    +

    + +

    +

    + +

    +

    + def equals(x,y,z = false){ +

    +

    +     def test = true +

    +

    +     def i = 0 +

    +

    +     def iMax = tests.size() +

    +

    +     while(test && i<iMax){ +

    +

    +         test = tests[i](x,y) +

    +

    +         if(z){ +

    +

    +             println i + '   ' + tests[i].toString() + '   ' + test +

    +

    +         } +

    +

    +         i++ +

    +

    +     } +

    +

    +     println i +

    +

    +     return test +

    +

    + } +

    +
    diff --git a/Tutorial-o-Matic/Tutorial-o-Matic.mm b/Tutorial-o-Matic/Tutorial-o-Matic.mm index 8de8e60..4157e82 100644 --- a/Tutorial-o-Matic/Tutorial-o-Matic.mm +++ b/Tutorial-o-Matic/Tutorial-o-Matic.mm @@ -1,6 +1,6 @@ - + @@ -88,7 +88,8 @@ - + +
    @@ -174,7 +175,7 @@
    - + @@ -190,10 +191,11 @@ To translate the description you have to define a translation for the key 'addons.${name}.description'.

    -
    + +
    - + @@ -203,7 +205,8 @@ Change log of this add-on: append one node for each noteworthy version and put the details for each version into a child node.

    -
    + +
    @@ -261,9 +264,10 @@ - + - + + @@ -282,7 +286,8 @@ The License text has to be entered as a child of the 'license' node, either as plain text or as HTML.

    -
    + +
    @@ -391,7 +396,8 @@ - + +
    @@ -411,7 +417,8 @@ For each menu item with an icon add an attribute with the icon key (use develope - + +
    @@ -443,47 +450,37 @@ For each menu item with an icon add an attribute with the icon key (use develope - - + +
    + - - - - - + + - - - - - - -

    - Instructions: -

    - In submenu {0}
    click on {1} - -
    + + +
    - - + + - - - - - + + + + + + @@ -496,7 +493,8 @@ For each menu item with an icon add an attribute with the icon key (use develope List of files and/or directories to remove on uninstall

    -
    + +
    @@ -639,9 +637,10 @@ For each menu item with an icon add an attribute with the icon key (use develope   - In any case set execute_scripts_without_asking to true unless you want to annoy users.

    -
    + +
    - + @@ -653,7 +652,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -665,7 +664,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -677,7 +676,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -689,7 +688,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -701,7 +700,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -713,7 +712,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -725,7 +724,7 @@ For each menu item with an icon add an attribute with the icon key (use develope - + @@ -771,7 +770,8 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    -
    + +
    @@ -810,7 +810,8 @@ For each menu item with an icon add an attribute with the icon key (use develope  - The files will be processed in the sequence as seen in the map.

    -
    + +
    @@ -845,7 +846,8 @@ For each menu item with an icon add an attribute with the icon key (use develope Images can be added automatically by releaseAddOn.groovy or must be uploaded into the map via the script Tools->Scripts->Insert Binary since they have to be (base64) encoded as simple strings.

    -
    + +
    @@ -858,30 +860,12 @@ For each menu item with an icon add an attribute with the icon key (use develope Direct links to menu commands -
    + +
    - - - - - - -

    - .groovy -

    -

    - opens tutorial defined in first child node -

    - -
    - - - - -
    diff --git a/Tutorial-o-Matic/history.md b/Tutorial-o-Matic/history.md index f2631a3..f4aa78a 100644 --- a/Tutorial-o-Matic/history.md +++ b/Tutorial-o-Matic/history.md @@ -3,7 +3,8 @@ ## v0.0.7 * getMenuCommand renamed to getMenuCommandToM.groovy -* bugs fix +* bugs fixes +* Improved Step by Step Tutorials ## v0.0.6 diff --git a/Tutorial-o-Matic/translations/en.properties b/Tutorial-o-Matic/translations/en.properties index 47e0f0e..5cccff7 100644 --- a/Tutorial-o-Matic/translations/en.properties +++ b/Tutorial-o-Matic/translations/en.properties @@ -1,13 +1,14 @@ -#Tue Apr 12 16:11:29 CLT 2022 +#Mon Aug 08 18:13:04 CLT 2022 + addons.${name}.createNewTutorialMindMap=Create new tutorial mind map addons.${name}=Tutorial-o-Matic addons.${name}.ToMDemo=Tutorial-o-Matic Demo -addons.${name}.ToMTutorial=Tutorial-o-Matic How to +addons.${name}.ToMTutorial=Tutorial-o-Matic Intro addons.${name}.importToMStyles=Import Tutorial-o-Matic Styles +addons.${name}.getMenuCommandToM=Get menu command addons.${name}.executeTutorial=execute Demo tutorial addons.${name}.ActionInstruction1=

    Instructions\:

    In submenu {0}
    click on {1} addons.${name}.openTutorialPageFromLink=Open tutorial page from link addons.${name}.ActionInstruction2=You can also use de keyboard shortcut {0} for this command addons.${name}.openDemoMap=open Demo map -addons.${name}.getMenuCommand=Get menu command addons.${name}.showTutorialsFromActiveMap=Show tutorials from active map diff --git a/Tutorial-o-Matic/translations/es.properties b/Tutorial-o-Matic/translations/es.properties index f7303f0..8abec76 100644 --- a/Tutorial-o-Matic/translations/es.properties +++ b/Tutorial-o-Matic/translations/es.properties @@ -1,12 +1,14 @@ -#Tue Apr 12 16:11:29 CLT 2022 +#Mon Aug 08 18:13:04 CLT 2022 + addons.${name}.createNewTutorialMindMap=Crear nuevo mapa para tutoriales -addons.${name}.ActionInstruction1=

    Instrucciones\:

    En submenu {0}
    has click en {1} addons.${name}=Tutorial-o-Matic -addons.${name}.ActionInstruction2=Puedes usar también el atajo {0} para este comando -addons.${name}.openDemoMap=abrir mapa demo -addons.${name}.getMenuCommand=Obtener comando desde el menú -addons.${name}.showTutorialsFromActiveMap=Mostrar tutoriales de mapa activo addons.${name}.ToMDemo=Tutorial-o-Matic Demo -addons.${name}.ToMTutorial=Como usar Tutorial-o-Matic +addons.${name}.ToMTutorial=Intro Tutorial-o-Matic addons.${name}.importToMStyles=Importar estilos Tutorial-o-Matic +addons.${name}.getMenuCommandToM=Obtener comando desde el menú addons.${name}.executeTutorial=ejecutar Demo tutorial +addons.${name}.ActionInstruction1=

    Instrucciones\:

    En submenu {0}
    has click en {1} +addons.${name}.openTutorialPageFromLink=Abrir página de tutorial desde enlace +addons.${name}.ActionInstruction2=Puedes usar también el atajo {0} para este comando +addons.${name}.openDemoMap=abrir mapa demo +addons.${name}.showTutorialsFromActiveMap=Mostrar tutoriales de mapa activo diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm index 3e0ab51..7f8bce4 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/HowToTutorial-o-Matic.mm @@ -116,27 +116,6 @@
    - - - - - - - - - - - - - - - - - - - - -
    @@ -168,7 +147,6 @@ - @@ -251,12 +229,11 @@ - - + @@ -342,16 +319,16 @@

    - * see where in Freeplane's menu you can find the command to apply that style + - see where in Freeplane's menu you can find the command to apply that style

    - * apply the style directly to the currently selected node + - apply the style directly to the currently selected node

    - * insert a new node with that style as a child of the currently selected node.<br>The node has no text and it's ready to type in it. + - insert a new node with that style as a child of the currently selected node.<br>The node has no text and it's ready to type in it.

    - * insert a new node with a predefined style and text as a child of the currently selected node + - insert a new node with a predefined style and text as a child of the currently selected node

    @@ -485,12 +462,9 @@ Its text will be used as the title of the new tutorial

  • - Assign the style "ToM-Tutorial" to that node + Assign the style "ToM-Tutorial" to that node
  • -

    - -

    @@ -658,13 +632,13 @@ Select a node (its text doesn't affect the tutorial)
  • - Assign the style "ToM_note" to that node + Assign the style "ToM_note" to that node
  • Add one or more child nodes to that node
  • - The notes of that child nodes will be used as the text to be shown in the tutorial + The notes of that child nodes will be used as the text to be shown in the tutorial
  • @@ -810,10 +784,7 @@ Select a node (its text doesn't affect the tutorial)

    - These nodes can be set between the other nodes or as parents of them. They just have to be "before" the others ("in breadth-first order") -

    -

    - + These nodes can be set between the other nodes or as parents  of them. They just have to be "before" the others ("in breadth-first order")

    @@ -847,7 +818,7 @@ Select a node (its text doesn't affect the tutorial) Select the desired node (its text will be used as title for that page)
  • - Assign the style "ToM_newPage" to that node + Assign the style "ToM_newPage" to that node
  • @@ -936,7 +907,7 @@ Select the desired node (its text will be used as title for that page) Select the desired node (its text doesn't affect the tutorial)
  • - Assign the style "ToM_nextPage" to that node + Assign the style "ToM_nextPage" to that node
  • @@ -986,7 +957,19 @@ Select the desired node (its text doesn't affect the tutorial)
    - + + + + + + + +

    + Insert new 'next page' node directly +

    + + +
    @@ -1058,7 +1041,19 @@ To add a Table of Content (TOC) to your tutorial, you just have to:
    - + + + + + + + +

    + Insert new 'TOC' node directly +

    + + +
    @@ -1066,7 +1061,6 @@ To add a Table of Content (TOC) to your tutorial, you just have to:
    - @@ -1212,16 +1206,16 @@ To add a Table of Content (TOC) to your tutorial, you just have to:

    - * see where in Freeplane's menu you can find the command to apply that style + - see where in Freeplane's menu you can find the command to apply that style

    - * apply the style directly to the currently selected node + - apply the style directly to the currently selected node

    - * insert a new node with that style as a child of the currently selected node.<br>The node has no text and it's ready to type in it. + - insert a new node with that style as a child of the currently selected node.<br>The node has no text and it's ready to type in it.

    - * insert a new node with a predefined style and text as a child of the currently selected node + - insert a new node with a predefined style and text as a child of the currently selected node

    @@ -1351,6 +1345,30 @@ To add a Table of Content (TOC) to your tutorial, you just have to: + + + ## Modifiers + +You can use icons as modifiers when using the **ToM_showMenu** node. + +* Icons in nodes with links to menu commands: + * **fire:** <br> +when present it shows a **second button** +with a **rocket** image. <br> +This button shows the menu +AND **executes the command**. + +The following "**showMenu**" panels serve as example. The second has an additional + "Fire" icon in the node in the map, that's why it has the two buttons. + + + + + + + + + @@ -1384,7 +1402,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -1466,7 +1486,7 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + @@ -1506,7 +1526,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -1576,10 +1598,18 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - - + + + + + + + + + + + + @@ -1707,7 +1737,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -1774,9 +1806,15 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - - - + + + + + + + + + @@ -1882,7 +1920,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -1946,7 +1986,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -2043,7 +2085,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -2150,7 +2194,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -2213,7 +2259,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -2251,7 +2299,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -2332,7 +2382,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -2430,7 +2482,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -2535,7 +2589,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + @@ -2679,7 +2735,9 @@ To add a Table of Content (TOC) to your tutorial, you just have to: - + + + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm deleted file mode 100644 index 6dcc23d..0000000 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/LongTutorialExample.mm +++ /dev/null @@ -1,860 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - # Cute Origami Bookmarks -

    -

    - -

    - - -
    - - - - - - -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FEG/OIPK/L06PT77G/FEGOIPKL06PT77G.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds) -

    - -
    -
    - - - - - - -

    - Hello internet people, today I will show you how to create corner bookmarks out of coloured paper. They always turn out really cute and they're perfect for giving as gifts :) -

    -

    - -

    - -
    -
    - - - - - - -

    - Although these are very easy and simple crafts, it can be hard to get some creative inspiration to figure out how you want to design them. I will also give some tips that I think will be helpful. -

    -

    - -

    - -
    -
    - - - - - - -

    - I made the bookmarks shown above earlier, but for this instructable I am going to make some new and fresh ones. -

    -

    - -

    - -
    -
    -
    - - - - - - - - -

    - # Supplies -

    -

    - -

    - -
    -
    - - - - - - -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FDD/YAIK/L06PT6OG/FDDYAIKL06PT6OG.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds) -

    - -
    -
    - - - - - - -

    - To make these bookmarks you will need: -

    -

    - -

    -

    - - A ruler (at least 10cm or 4in) -

    -

    - - A pencil -

    -

    - - Scissors -

    -

    - - Paper or card (a few different colours) -

    -

    - - Glue stick or squeezy glue -

    -

    - - Some inspiration for bookmark designs -

    -

    - - A will to cut and stick paper -

    -

    - -

    - -
    -
    - - - - - - -

    - Optional: -

    -

    - -

    -

    - - Black pen -

    -

    - - Coloured pencils/markers -

    -

    - - Paper knife/cutter (for scoring card) -

    -

    - -

    - -
    -
    -
    - - - - - - - - -

    - # Step 1: Decide Your Design -

    -

    - -

    - -
    -
    - - - - - - -

    - First, decide what design you would like to make: I mainly make different types of animals, but you could also make humans or your favourite (book) characters. However, if you are feeling spontaneous, it is perfectly fine to not plan any design at all! -

    -

    - -

    - -
    -
    - - - - - - -

    - Make sure that you have paper in the necessary colours and sizes to make your design, or you might become very disappointed when you realise you are missing something :/ -

    -

    - -

    - -
    -
    -
    -
    - - - - - - - - -

    - # Step 2: Measure and Cut Paper -

    -

    - -

    - -
    -
    - - - - - - -

    - We are now going to make the base of the bookmark. -

    -

    - -

    - -
    -
    - - - - - - -

    - To do this, you need to measure out a square piece of paper that is (at least) 10cm each side -- a bookmark smaller than this will probably be difficult to fold and decorate. 10cm is roughly 4 inches. -

    -

    - -

    - -
    -
    - - - - - - -

    - Use your ruler to measure out 10cm from each side, then mark it with a pencil. -

    -

    - -

    -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FE7/N8W6/L06PT6OX/FE7N8W6L06PT6OX.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=aaaf0b8a070a15f59177952615be4a7c) -

    -

    - -

    - -
    -
    - - - - - - -

    - Draw two faint lines connecting the marks you made. -

    -

    - -

    -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FOK/9C7Z/L06PT6OY/FOK9C7ZL06PT6OY.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=fd3e2ca353277244ec55143f1950ddd5) -

    -

    - -

    - -
    -
    - - - - - - -

    - Cut through the lines as accurately as you can. -

    -

    - -

    -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/F0D/OFSO/L06PT6OZ/F0DOFSOL06PT6OZ.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=04c3a616a3d7923f2a961440522628ca) -

    -

    - -

    - -
    -
    - - - - - - -

    - Realise that the end size of the bookmark will be a quarter of the square's area... this can help you decide how big to cut your square. Also, if you already have a square piece of paper that is a suitable size for you, you can skip this step. -

    -

    - -

    - -
    -
    -
    -
    - - - - - - - - -

    - # Step 3: Fold Paper -

    -

    - -

    - -
    -
    - - - - - - -

    - We now have to fold the paper to make it into a corner bookmark. It might be easier to take a look at the pictures above rather than trying to interpret the instructions. -

    -

    - -

    - -
    -
    - - - - - - -

    - Fold the square into quarters (fold once horizontally and once vertically.) -

    -

    - -

    -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FL6/YUHP/L06PT6P9/FL6YUHPL06PT6P9.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=34132bf0e55a204f144a7a8a6acf9251) -

    -

    - -

    - -
    -
    -
    - - - - - - - -

    - Fold your paper diagonally once to make a triangle. Rotate it so the base is facing upwards. -

    -

    - -

    -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FAJ/5KUG/L06PT6PA/FAJ5KUGL06PT6PA.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=add530039e1b153ced492c86c31636fc) -

    -

    - -

    - -
    -
    -
    - - - - - - - -

    - Fold the bottom corner upwards to make a little pocket (there are two layers -- only fold the top one.) -

    -

    - -

    -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FHC/EW5L/L06PT6PB/FHCEW5LL06PT6PB.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=1f84256ea9c64323167933d3de92ec51) -

    -

    - -

    - -
    -
    -
    - - - - - - - -

    - Fold the left and right corners downwards, to make a smaller square. -

    -

    - -

    -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTE/UEWE/L06PT6PC/FTEUEWEL06PT6PC.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=93246151a1a78bbc87006e2506bcbe2e) -

    -

    - -

    - -
    -
    -
    - - - - - - - -

    - Tuck the left and right corners underneath the little pocket you made, and then fold them. You now have the base of your bookmark! -

    -

    - -

    -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FE9/RLNT/L06PT6PD/FE9RLNTL06PT6PD.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=a88fad583bde511ee08844eb2e9f1676) -

    -

    - -

    - -
    -
    - - - - - - -

    - If you are using card, you probably need to score the card first in order to fold it neatly. Use a ruler and a paper knife or cutter to do this. Make sure you do it safely! -

    -

    - -

    - -
    -
    -
    -
    - - - - - - - - -

    - # Step 4: Decorate Bookmark -

    -

    - -

    - -
    -
    - - - - - - -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FMV/XRZC/L06PT9QS/FMVXRZCL06PT9QS.jpg?auto=webp&frame=1&fit=bounds&md=d0b67e4507fddf246d311ff018cd22a8) -

    - -
    -
    - - - - - - -

    - We have now reached the very fun part, which is decorating your bookmark. If you are a minimalist and/or very lazy, this step may not be necessary and your bookmark is now finished! :) -

    -

    - -

    - -
    -
    - - - - - - -

    - As you can see, I turned the pink bookmark into a slightly creepy axolotl, by sticking some gills to the back and making blue eyes. -

    -

    - -

    - -
    -
    - - - - - - -

    - Tips for decorating your bookmarks: -

    -

    - -

    -

    - - Cut out small details (eyes, noses, ears, hair, etc.) out of pieces of scrap paper and stick them on. -

    -

    - - Use a black pen/fineliner to make some details. It might also be easier to draw eyes with a pen than sticking paper. -

    -

    - - You could use coloured pencils/markers to draw on some designs (but this will only work if you draw on light-coloured paper.) -

    -

    - - Maybe add texture to spice it up a bit -- feathers and stickers and shiny stuff! -

    -

    - -

    - -
    -
    - - - - - - -

    - If you are adding extra parts to your bookmark, keep in mind that some may stick out of the book a bit and maybe get damaged (like the gills on my axolotl.) -

    -

    - -

    - -
    -
    -
    -
    - - - - - - - - -

    - # Step 5: Voilà! -

    -

    - -

    - -
    -
    - - - - - - -

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTG/QP3N/L06PT76P/FTGQP3NL06PT76P.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=c7ed44f4d0772f0e72a8e37abc3e6924) -

    - -
    -
    - - - - - - -

    - Congratulations! You have created a child! -

    -

    - -

    - -
    -
    - - - - - - -

    - I also made a fox and whale along with my axolotl :) -

    -

    - -

    - -
    -
    - - - - - - -

    - Now you could gift your creation to anyone who likes to read books. It's also a good idea to make these for kids as they can encourage them to read more. Of course, there is also the option of keeping it for yourself :D -

    -

    - -

    - -
    -
    - - - - - - -

    - Thanks for reading my instructable -- it is my first one and it has been very fun to make. I hope it was entertaining and somewhat helpful! And also please share some pictures of your children below! -

    -

    - -

    - -
    -
    -
    -
    -
    -
    - diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm index af6bce9..9504e3a 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/SimpleTutorialSample.mm @@ -1,6 +1,6 @@ - + @@ -210,7 +210,7 @@

    - + @@ -821,859 +821,13 @@
    - - - - + + + + + - - - In the following pages you can see the different content that the **Tutorial-o-Matic(ToM)** AddOn can show. - -New features may be added in the future. - - - - - - - - - # Calvin and Hobbes - ------ - -## 1. Preface - ------ - -I made this markdown document and its source mindmap as an example to show how the **Markdown Helper AddOn** works and to show some of its features. - -This document isn't an official source of information about the **Calvin and Hobbes** comic strip. I made this document about it because I like **Mr. Watterson** work very much and I think that any extra showroom for it is well deserved. - -All information in this document comes from the ['Calvin and Hobbes' wiki page available in FANDOM.com](https://calvinandhobbes.fandom.com/wiki/Main_Page) - -Please look in there if you want to know more about **Calvin and Hobbes**. - -## 2. Content - ------ - -[Calvin and Hobbes](#Calvin-and-Hobbes) - -[1. Preface](#1-Preface) - -[2. Content](#2-Content) - -[3. Story Arcs](#3-Story-Arcs) - -[4. Characters](#4-Characters) - -[5. Watterson](#5-Watterson) - -[6. Books](#6-Books) - -## 3. Story Arcs - ------ - -In [Calvin and Hobbes](https://calvinandhobbes.fandom.com/wiki/Calvin_and_Hobbes), story arcs are a theme or plotline that lasts longer than a day. They can range from a few days to a month, such as the arc with [Calvin](https://calvinandhobbes.fandom.com/wiki/Calvin) accidentally pushing [his parents' car](https://calvinandhobbes.fandom.com/wiki/Car) into a ditch. - -Generally, the strip had week-long story arcs for the first couple of years and had its longest arcs in the middle of the its life. Later on, the arcs became fewer and farther between as [Bill Watterson](https://calvinandhobbes.fandom.com/wiki/Bill_Watterson) focused more on [Sunday strips](https://calvinandhobbes.fandom.com/wiki/Sunday_comics). - -Story arcs are used mainly to develop characters, introduce new devices, or investigate new artistic directions. - -## 4. Characters - ------ - -The principal characters of this strip are the followings: - -|Name|Image|Link|Description| -|----|:----:|:----:|----| -|Calvin|![https://static.wikia.nocookie.net/candh/images/7/78/Image.jpg/revision/latest/scale-to-width-down/139?cb=20130902154949](https://static.wikia.nocookie.net/candh/images/7/78/Image.jpg/revision/latest/scale-to-width-down/139?cb=20130902154949)|[Calvin](https://calvinandhobbes.fandom.com/wiki/Calvin)| -|Hobbes|![https://static.wikia.nocookie.net/candh/images/3/36/61D_hobbes.jpg/revision/latest/scale-to-width-down/133?cb=20121112232636](https://static.wikia.nocookie.net/candh/images/3/36/61D_hobbes.jpg/revision/latest/scale-to-width-down/133?cb=20121112232636)|[Hobbes](https://calvinandhobbes.fandom.com/wiki/Hobbes)| -|Susie Derkins|![https://static.wikia.nocookie.net/candh/images/a/a4/Susie_lalal.jpg/revision/latest/scale-to-width-down/140?cb=20130902161428](https://static.wikia.nocookie.net/candh/images/a/a4/Susie_lalal.jpg/revision/latest/scale-to-width-down/140?cb=20130902161428)|[Susie Derkins](https://calvinandhobbes.fandom.com/wiki/Susie_Derkins)| -|Calvin's mother|![https://static.wikia.nocookie.net/candh/images/3/32/Cmom_mainpage.jpeg/revision/latest/scale-to-width-down/150?cb=20170703031759](https://static.wikia.nocookie.net/candh/images/3/32/Cmom_mainpage.jpeg/revision/latest/scale-to-width-down/150?cb=20170703031759)|[Calvin's mother](https://calvinandhobbes.fandom.com/wiki/Calvin%27s_mother)| -|Calvin's father|![https://static.wikia.nocookie.net/candh/images/c/ca/Dad.jpg/revision/latest/scale-to-width-down/150?cb=20200108212915](https://static.wikia.nocookie.net/candh/images/c/ca/Dad.jpg/revision/latest/scale-to-width-down/150?cb=20200108212915)|[Calvin's father](https://calvinandhobbes.fandom.com/wiki/Calvin%27s_father)| -|Rosalyn|![https://static.wikia.nocookie.net/candh/images/2/20/Rosalyn.png/revision/latest/scale-to-width-down/49?cb=20200108212824](https://static.wikia.nocookie.net/candh/images/2/20/Rosalyn.png/revision/latest/scale-to-width-down/49?cb=20200108212824)|[Rosalyn](https://calvinandhobbes.fandom.com/wiki/Rosalyn)| -|Moe|![https://static.wikia.nocookie.net/candh/images/8/81/Moe.jpg/revision/latest/scale-to-width-down/150?cb=20090401050911](https://static.wikia.nocookie.net/candh/images/8/81/Moe.jpg/revision/latest/scale-to-width-down/150?cb=20090401050911)|[Moe](https://calvinandhobbes.fandom.com/wiki/Moe)| -|Miss Wormwood|![https://static.wikia.nocookie.net/candh/images/7/79/Wormwoodmainpagepic.png/revision/latest/scale-to-width-down/121?cb=20170713194559](https://static.wikia.nocookie.net/candh/images/7/79/Wormwoodmainpagepic.png/revision/latest/scale-to-width-down/121?cb=20170713194559)|[Miss Wormwood](https://calvinandhobbes.fandom.com/wiki/Miss_Wormwood)| -|Alter Egos|![https://static.wikia.nocookie.net/candh/images/e/e7/Unknown-5.jpeg/revision/latest/scale-to-width-down/111?cb=20110320025133](https://static.wikia.nocookie.net/candh/images/e/e7/Unknown-5.jpeg/revision/latest/scale-to-width-down/111?cb=20110320025133)|[Alter Egos](https://calvinandhobbes.fandom.com/wiki/Category:Alter_egos)| - -## 5. Watterson - ------ - -William Boyd "Bill" Watterson II (born July 5, 1958) is the author of [Calvin and Hobbes](https://calvinandhobbes.fandom.com/wiki/Calvin_and_Hobbes). He was author and artist during the strip's decade-long run. Calvin and Hobbes abruptly ceased publication in 1995, when Watterson decided to retire. He is now removed completely from the public eye, and is reluctant to take interviews, preferring to let his work speak for itself. He drew Calvin's father to look exactly like himself, for symbolism. Bill is currently 62 years old. - -## 6. Books - ------ - -Despite [ Bill Watterson](https://calvinandhobbes.fandom.com/wiki/Bill_Watterson)'s reluctance to sell [merchandise](https://calvinandhobbes.fandom.com/wiki/Licensing) based on [merchandise](https://calvinandhobbes.fandom.com/wiki/Licensing) or its characters, he still allowed some merchandise to reach the public, one of the few was books. There have so far been eighteen books (including one three-volume set) published in the United States. - -The books, referred to as "Collections", form a complete archive of the newspaper strips, except for a [single daily strip](https://calvinandhobbes.fandom.com/wiki/Alternate_strip) from November 28, 1985 (The collections do contain a strip for this date, but it is not the same strip that appeared in some newspapers). "Treasuries" combine the two preceding collections with bonus material and include color reprints of Sunday comics, and irregular printed collections reprint already published comics with a particular intent, such as providing original sketches or commentary. - -A complete collection of Calvin and Hobbes strips, in three hardcover volumes, with a total 1440 pages, was released on October 4, 2005, by [Andrews & McMeel](https://calvinandhobbes.fandom.com/wiki/Andrews_%26_McMeel) Publishing. It also includes color prints of the art used on paperback covers, the Treasuries' extra illustrated stories and poems, and an original 14-page introduction by Bill Watterson. Unfortunately, the alternate 1985 strip is still omitted, and two other strips (January 7, 1987, and November 25, 1988) have altered dialogue. - -To celebrate the release, Calvin and Hobbes reruns were made available to newspapers from Sunday, September 4, 2005, through Saturday, December 31, 2005, and Bill Watterson answered a select dozen questions submitted by readers. ([[1]](http://www.amuniversal.com/ups/features/thereturn/) [[2]](http://www.andrewsmcmeel.com/calvinandhobbes/returning.html)) Like current contemporary strips, weekday Calvin and Hobbes strips now appear in color print when available, instead of black and white as in their first run. - -|Title|Cover|Date|ISBN|Notes| -|----|----|:----:|----|----| -|[Calvin and Hobbes](https://calvinandhobbes.fandom.com/wiki/Calvin_and_Hobbes_(book))|![https://static.wikia.nocookie.net/candh/images/b/b2/Calvin_and_Hobbes_Original.png/revision/latest/scale-to-width-down/100?cb=20060314024407](https://static.wikia.nocookie.net/candh/images/b/b2/Calvin_and_Hobbes_Original.png/revision/latest/scale-to-width-down/100?cb=20060314024407)|April 1987|ISBN 0836220889|Collection covering strips from first strip on Nov 18, 1985 to Aug 17, 1986. Original content: Foreword by [Garry Trudeau](http://en.wikipedia.org/wiki/Garry_Trudeau).| -|[Something Under the Bed Is Drooling](https://calvinandhobbes.fandom.com/wiki/Something_Under_the_Bed_Is_Drooling)|![https://static.wikia.nocookie.net/candh/images/2/24/Something_Under_the_Bed_Is_Drooling.jpg/revision/latest/scale-to-width-down/100?cb=20060316165419](https://static.wikia.nocookie.net/candh/images/2/24/Something_Under_the_Bed_Is_Drooling.jpg/revision/latest/scale-to-width-down/100?cb=20060316165419)|April 1988|ISBN 0836218256|Collection covering strips from Aug 18, 1986 to May 22, 1987. Original content: Foreword by [Pat Oliphant](http://en.wikipedia.org/wiki/Pat_Oliphant).| -|[The Essential Calvin and Hobbes: A Calvin and Hobbes Treasury](https://calvinandhobbes.fandom.com/wiki/The_Essential_Calvin_and_Hobbes)|![https://static.wikia.nocookie.net/candh/images/d/dd/The_Essential_Calvin_and_Hobbes.png/revision/latest/scale-to-width-down/100?cb=20060316165656](https://static.wikia.nocookie.net/candh/images/d/dd/The_Essential_Calvin_and_Hobbes.png/revision/latest/scale-to-width-down/100?cb=20060316165656)|September 1988|ISBN 0836218051|Treasury including cartoons from Calvin and Hobbes, Something Under the Bed is Drooling, & a strip from May 23, 1987 not published in Drooling. Original content: Foreword by [Charles M. Schulz](http://en.wikipedia.org/wiki/Charles_M._Schulz), original illustrated poem "[A Nauseous Nocturne](https://calvinandhobbes.fandom.com/wiki/A_Nauseous_Nocturne)" and artwork on back cover of a giant rampaging Calvin.| -|....|....|....|....|....| -|....|....|....| - -Early books were printed in a smaller format, and the Sunday strips appeared in black and white. They were then reprinted, in color for the Sundays, in the three "Treasuries" (Essential, Authoritative, and Indispensable). The contents of Attack of the Deranged Mutant Killer Monster Snow Goons were not reprinted, and its Sunday comics were in black and white. As a result, those Sunday strips were never reprinted in color until the Complete collection was published in 2005. Every book since Snow Goons had been printed in a larger format with Sundays in color and weekday and Saturday strips larger than they appeared in most newspapers. - -Remaining books do contain some additional content; for instance, The Calvin and Hobbes Lazy Sunday Book contains a long watercolor Spaceman Spiff epic not seen elsewhere until Complete, and The Calvin and Hobbes Tenth Anniversary Book contains much original commentary from Watterson. Calvin and Hobbes: Sunday Pages 1985-1995 contains 36 Sunday strips in color alongside Watterson's original sketches, prepared for an exhibition at The Ohio State University Cartoon Research Library. - -An officially licensed children's textbook entitled [Teaching with Calvin and Hobbes](https://calvinandhobbes.fandom.com/wiki/Teaching_with_Calvin_and_Hobbes) ([ISBN 1878849158](https://calvinandhobbes.fandom.com/wiki/ISBN_1878849158?action=edit&redlink=1)) was published in 1993. It reprints 57 comic strips comprising 5 [story arcs](https://calvinandhobbes.fandom.com/wiki/Story_arcs). - - - - - - - - ## How to xxxx - -Sopose this is an introductio paragraph that explains a problem and next it comes an explanation of the possible solution: - -In the following animation you can see how this can be done: - -### my animated webimage - -*(I just took any image. I think for this kind of tutorials you should include smaller ones (not so wide)) * - -![https://github.com/EdoFro/hello-world/raw/master/testFormulaNodeChange.gif](https://github.com/EdoFro/hello-world/raw/master/testFormulaNodeChange.gif) - - - - - # My Document - -## Introduction - -This is just a test - -I don`t have much more to say - -## List examples - -### Simple list - -1. apples -1. bananas -1. oranges -1. lettuce -1. cucumber -1. tomatos -1. carrots - -1. apples -1. bananas -1. oranges -1. lettuce -1. cucumber -1. tomatos -1. carrots - -### Structured list - -1. fruits - 1. apples - 1. bananas - 1. oranges - 1. tomatoes -1. salats - * lettuce - * cucumber - * tomatoes - * carrots - -### List with links - -* links - * [Freeplane Homepage](https://www.freeplane.org/wiki/index.php/Home) - * [MarkdownHelper-icon.svg](file:/C:/Users/Edo/Documents/GitHub/Freeplane_MarkdownHelper/MarkdownHelper/images/MarkdownHelper-icon.svg) -* images - * ![What is Mindmapping (thumb)](https://www.freeplane.org/wiki/images/thumb/7/7b/WhatIsMindMapping.jpg/300px-WhatIsMindMapping.jpg) - * ![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png) - -## My plain task list - -- [x] walk the dog -- [x] do the dishes -- [ ] cancer cure -- [ ] laundry - -## Structured tasks lists - -They work the same as plain tasks lists, but they can see subtasks inside of tasks. - -- [ ] task 1 -- [ ] task 2 - - [x] task 2.1 - - [ ] task 2.2 -- [x] task 3 - - [x] subtask 3.1 - -## Table example - -|Name|this is the Age column|Badge| -|----|:----:|----| -|Piotr|25|![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png)| -|Maria|33|![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png)| -|Alex|45|![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png)| - -## Code block - -Code: **'example code'** - -```groovy -// example code -// the node's details must start with a dot and then the language of the code - -def text = node.text - -def msg = "the text of the selected node is ${text}" - -ui.informationMessage(msg.toString()) -``` - -## Text block - -The ![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png), the ![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png) and the ![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png) are from **[Graphic Burger](https://graphicburger.com/)** and can be found [here](https://graphicburger.com/71-free-animal-icons/). - -## Comment - -> Anything inside this node gets commented -> -> The ![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png), the ![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png) and the ![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png) are from **[Graphic Burger](https://graphicburger.com/)** and can be found [here](https://graphicburger.com/71-free-animal-icons/). -> -> -> -> |Name|this is the Age column|Badge| -> |----|:----:|----| -> |Piotr|25|![Corgi.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Corgi.png)| -> |Maria|33|![Deer.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Deer.png)| -> |Alex|45|![Bear.png](https://github.com/EdoFro/hello-world/raw/master/resources/Animals%20Icons%20Set/Animals_png_small/mammals/Bear.png)| -> -> - -## Conclusions - -Blah **blablablah** blablah. Blablablah blah **blablablah** blablablah, Blablah blah, Blah blah blablah blablablah blablah. Blablah blablah blablablah blah blablah blablablah blablablah blablablah. - - - - - - - - - - - - - -

    - Welcome to the Tutorial-o-Matic demo!! -

    -

    - This is a demo version of an addon that can be used to build tutorials in Freeplane. -

    - -
    -
    -
    -
    - - - - - You can make that **ToM** shows where in the menu the user can find a specific command. - - -Here are some examples: - - - - - - - - - - - - - - - - - -

    - Here are some example on how you can apply some menu actions on the selected nodes: -

    - -
    -
    -
    - - - - - - - - - -

    - This example shows some menu actions applied using the menus: -

    -

    - -

    -

    - it creates a new child node and it adds an icon to it -

    - -
    - - - - - - -

    - added icons: -

    -

    - candle: indicates it executes only one time and get disabled -

    -

    - mouse: should show the menu location -

    - -
    - - - - - - - - - - - - -

    - This example shows some actions applied using Hotkeys (or the menus commands): -

    -

    - -

    -
      -
    1. - applies BOLD to selected node -
    2. -
    3. - shows(or hides) the Filter Toolbar -
    4. -
    - -
    - - - - - - -

    - keyboard icon (or no icon) indicates it should show the Hotkeys (if it hasn't a defined hotkey, then it shows the menu position) -

    - -
    - - - - - - - - - - - -

    - This example shows some actions applied without showing any message (muted): -

    -

    - -

    -
      -
    • - shows/hides the "map overview" window -
    • -
    - -
    - - - - - - -

    - muted icon indicates it should execute the command without showing menus or hotkeys -

    - -
    - - -
    - - - - - **ToM** builds automatically the tutorial's table of content using the titles of each new page - - -Here is the current tutorial's TOC: - - - - - - - - - - You can add buttons to jump to other tutorial pages - - -Here is an example: - - - - - - - - - - -

    - To jump to the **'HTML example'** page click on the button bellow: -

    - -
    -
    - - You can also jump to another tutorial's page. - - -To jump to the **'SimpleDemo's TOC page'** page click on the button bellow: - - -
    -
    - - - - - You can add buttons to jump to other nodes (in this or other mindmap) - - -Here is an example: - - - - - - - - - - - - - - - - - - - -

    - Here are some examples of **groovy scripts** as part of the tutorial -

    - -
    -
    - - The first example shows two times the same groovy script. - - -This script will reverse the text of the selected node. - - -The difference between both scripts is that after clicking the button, the first one will disable itself (one time execution) and the second button will stay enabled (for multiple time uses) - - -Select a node with a text and try them. - - - -
    - - - - - - - - - -

    - candle indicates that executes only one time (then button gets disabled) -

    - -
    - - - - - - - - -

    - .groovy -

    -

    - magnifier icon indicates that the script code must be shown in the tutorial -

    - -
    - -
    -
    - - - - - - - - - - -

    - .groovy -

    - -
    - -
    -
    -
    - - - - - - - - This example shows also two times the same groovy script. - - -This script will show a dialog and ask the user to pick an option and show it. That's all. - - -The difference between both panels is that one shows the groovy script and the other doesn't. - - -Try them. - - - - - - - - - - - - - - -

    - .groovy -

    -

    - magnifier icon indicates that the script code must be shown in the tutorial -

    - -
    - -
    - - - - - - -

    - .groovy -

    - -
    - -
    -
    -
    -
    - - - - - When building a tutorial you can add nodes that the user can insert in his/her own map. - - -Select a node in your map and click the button to insert a branch containing the "Madagascar characters". - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - After inserting an example branch, you can have a button that selects the nodes that you want so the user can easily go further with the tutorial. - - -In this example I added a button that selects the nodes "Alex", "Kowalski" and "Julien". - -Click the button to see how the selection changes: - - - - - - - - - - -

    - to indicate which are the nodes you want to select just paste clones of them here as childs -

    - -
    - - - - - - - - - - - - -

    - Now we can apply them some command, like -

    -
      -
    • - "Blinking node" + "Bold" -
    • -
    -

    - click again to turn it on/off -

    - -
    - - - - - - - - - You can add a button to open other maps needed for the tutorial. - -Currently that map must be in the same directory as the tutorial map - - -**Open the ExercisingMap.mm** by clicking the following button - - - - - - - - - - - - - I added a button to directly go to the map that contains the tutorial information and select the node that defines the current page. - -Click the following button to go to the node that has this page information: - - - - - - - - - - - - - - - - - -

    - Ok. that was the features demo. -

    -

    - I hope you enjoyed it. bye! -

    -

    - -

    -

    - edo -

    - -
    -
    -
    -
    -
    - - - - - - - - -

    - the "crayon" icon indicates that this tutorial is beeing edited. -

    -

    - Buttons "inspect" and "reload" appear on page's top. -

    -

    - -

    -

    - the attribute "ToM_TabLabel" indicates which Tab should the tutorial be shown in. -

    -

    - If not present -> default is "Tutorial" -

    - -
    - - - - - - - - - This tutorial is the same as the previous "Current features", - but as you can see, there are two new buttons left from the title of the page: - -- **inspect**: - - it shows you the map that is beeing used as source information for this tutorial - - and it selects the node that defines the title of the current tutorial page - -- **reload**: - - it reloads the information from the mindmap and builds this page again - -This way you can go to the map by clicking **inspect**, -make some changes and then **reload** the page to look how the changes work. - - - - Any tutorial can be seen in this "***Editing Mode***". - -You just need to add a "**crayon**" icon to the **Tutorial base node**. - -Click **inspect** to look into the mind map and see the icon in the Tutorial node (the one in *salmon-pink* color). - - - - Do the following steps to test these features: - -- Click **inspect** -- Select the yellow node next to the currently selected node -- Change the text in its note -- Change the order of the nodes inside the "Text" node -- Click **reload** - - - - Now you can click "**Next page**" and look how the different Tutorial pages -and their features have been configured in the MindMap. - -There are also comments in the map that explain some of the configuration options. - - - - - - - - - + @@ -1683,8 +837,9 @@ candle indicates that executes only one time (then button gets disabled) nodes with style ToM_Note look at the notes of their children to build text panes

    -
    - + + + In the following pages you can see the different content that the **Tutorial-o-Matic(ToM)** AddOn can show. New features may be added in the future. @@ -1692,11 +847,11 @@ candle indicates that executes only one time (then button gets disabled)
    - - - - - + + + + + # Calvin and Hobbes ----- @@ -1794,9 +949,9 @@ candle indicates that executes only one time (then button gets disabled) - - - + + + ## How to xxxx Sopose this is an introductio paragraph that explains a problem and next it comes an explanation of the possible solution: @@ -1811,7 +966,7 @@ candle indicates that executes only one time (then button gets disabled) - + # My Document ## Introduction @@ -1930,12 +1085,12 @@ candle indicates that executes only one time (then button gets disabled) - - + + - - - + + + @@ -1952,10 +1107,10 @@ candle indicates that executes only one time (then button gets disabled) - - - - + + + + **ToM** builds automatically the tutorial's table of content using the titles of each new page @@ -1963,14 +1118,14 @@ candle indicates that executes only one time (then button gets disabled) - + - - - - - + + + + + You can make that **ToM** shows where in the menu the user can find a specific command. @@ -1978,15 +1133,15 @@ candle indicates that executes only one time (then button gets disabled) - - - + + + - - - - + + + + @@ -1999,7 +1154,7 @@ candle indicates that executes only one time (then button gets disabled) - + @@ -2036,10 +1191,10 @@ candle indicates that executes only one time (then button gets disabled)

    - - + + - + @@ -2075,10 +1230,10 @@ keyboard icon (or no icon) indicates it should show the Hotkeys (if it hasn't a

    - - + + - + @@ -2110,13 +1265,13 @@ This example shows some actions applied without showing any message (muted):

    - + - - - - + + + + You can add buttons to jump to other tutorial pages @@ -2125,9 +1280,9 @@ This example shows some actions applied without showing any message (muted): - + - + @@ -2139,28 +1294,28 @@ This example shows some actions applied without showing any message (muted): - + You can also jump to another tutorial's page. To jump to the **'SimpleDemo's TOC page'** page click on the button bellow: - - - - + + + + - - + + Here is the same first example without option "goBack" selected: - - + + @@ -2174,10 +1329,10 @@ This example shows some actions applied without showing any message (muted): - - - - + + + + @@ -2189,34 +1344,34 @@ This example shows some actions applied without showing any message (muted): - + You can also jump to another tutorial's page. To jump to the **'SimpleDemo's TOC page'** page click on the button bellow: - - - + + + - - + + - - + + - + - + - - - - + + + + @@ -2228,15 +1383,15 @@ This example shows some actions applied without showing any message (muted): - + The first example shows two times the following groovy script: - + - + @@ -2250,11 +1405,11 @@ This example shows some actions applied without showing any message (muted): - + - - + + This script will reverse the text of the selected node. @@ -2266,7 +1421,7 @@ This example shows some actions applied without showing any message (muted): - + @@ -2280,7 +1435,7 @@ candle indicates that executes only one time (then button gets disabled)

    - + @@ -2299,9 +1454,9 @@ candle indicates that executes only one time (then button gets disabled) - + - + @@ -2318,13 +1473,13 @@ candle indicates that executes only one time (then button gets disabled) - + - - + + - - + + This example shows also two times the same groovy script. @@ -2339,9 +1494,9 @@ candle indicates that executes only one time (then button gets disabled) - + - + @@ -2359,7 +1514,7 @@ candle indicates that executes only one time (then button gets disabled) - + @@ -2375,10 +1530,10 @@ candle indicates that executes only one time (then button gets disabled) - - - - + + + + When building a tutorial you can add nodes that the user can insert in his/her own map. @@ -2386,39 +1541,39 @@ candle indicates that executes only one time (then button gets disabled) - - - - - - - + + + + + + + - - - - - + + + + + - - - - - + + + + + - - + + - - + + - - - - + + + + After inserting an example branch, you can have a button that selects the nodes that you want so the user can easily go further with the tutorial. @@ -2429,7 +1584,7 @@ candle indicates that executes only one time (then button gets disabled) - + @@ -2440,11 +1595,11 @@ candle indicates that executes only one time (then button gets disabled)

    - - - + + + - + @@ -2465,14 +1620,14 @@ candle indicates that executes only one time (then button gets disabled)

    - - + + - - - - + + + + You can add a button to open other maps needed for the tutorial. Currently that map must be in the same directory as the tutorial map @@ -2483,14 +1638,14 @@ candle indicates that executes only one time (then button gets disabled) - - + + - - - - + + + + You can add a button to show nodes in the same or in another MindMaps. It may be any node. It doesn't need to be in a tutorial. @@ -2499,15 +1654,17 @@ candle indicates that executes only one time (then button gets disabled) - - + + + - - - - + + + + + I added a button to directly go to the map that contains the tutorial information and select the node that defines the current page. Click the following button to go to the node that has this page information: @@ -2515,12 +1672,12 @@ candle indicates that executes only one time (then button gets disabled) - + - - - - + + + + @@ -2544,9 +1701,305 @@ candle indicates that executes only one time (then button gets disabled) + + + + + + + + + +

    + the "crayon" icon indicates that this tutorial is beeing edited. +

    +

    + Buttons "inspect" and "reload" appear on page's top. +

    +

    + +

    +

    + the attribute "ToM_TabLabel" indicates which Tab should the tutorial be shown in. +

    +

    + If not present -> default is "Tutorial" +

    + +
    + + + + + + + + + This tutorial is the same as the previous "Current features", + but as you can see, there are two new buttons left from the title of the page: + +- **inspect**: + - it shows you the map that is beeing used as source information for this tutorial + - and it selects the node that defines the title of the current tutorial page + +- **reload**: + - it reloads the information from the mindmap and builds this page again + +This way you can go to the map by clicking **inspect**, +make some changes and then **reload** the page to look how the changes work. + + + + Any tutorial can be seen in this "***Editing Mode***". + +You just need to add a "**crayon**" icon to the **Tutorial base node**. + +Click **inspect** to look into the mind map and see the icon in the Tutorial node (the one in *salmon-pink* color). + + + + Do the following steps to test these features: + +- Click **inspect** +- Select the yellow node next to the currently selected node +- Change the text in its note +- Change the order of the nodes inside the "Text" node +- Click **reload** + + + + Now you can click "**Next page**" and look how the different Tutorial pages +and their features have been configured in the MindMap. + +There are also comments in the map that explain some of the configuration options. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm index 2a7b900..959c8f8 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-Matic Intro.mm @@ -14,7 +14,7 @@ - + @@ -114,27 +114,6 @@ - - - - - - - - - - - - - - - - - - - - - @@ -178,10 +157,8 @@ - - - + @@ -232,7 +209,10 @@
    - + + + + @@ -241,25 +221,40 @@

    - ---- + # Attention:

    - # Content + ## I highly recommend to start with the "**Step by Step**" tutorials +

    + + +
    +
    + + + + + + + + +

    + ----

    - + # Content

    - ---- +

    @@ -269,8 +264,12 @@ + + + + + - @@ -318,7 +317,7 @@ 1. a tutorial with multiple pages

    - 1. adding acctions + 1. adding acctions (pending)

    @@ -327,26 +326,24 @@ - + - + + -

    - Tutorial 2 +

    + 'How to ToM'

    -

    - +

    + guide

    -
    - - @@ -354,7 +351,22 @@

    - Tutorial 3 + # How to Tutorial-o-Matic +

    +

    + +

    +

    + This document contains **two guides** about the **building components** used to build tutorials with **Tutorial-o-Matic**: +

    +

    + +

    +

    +  1. commands used to **create new tutorials** +

    +

    +  2. **actions** you can add to the tutorials

    @@ -363,24 +375,33 @@ - + - - + -

    - 'How to ToM' +

    + Tutorial 2

    -

    - panel +

    +

    +
    +
    +
    + + + + + + + @@ -388,22 +409,13 @@

    - # How to Tutorial-o-Matic + # Tutorial demos

    - This document contains **two guides** about the **building components** used to build tutorials with **Tutorial-o-Matic**: -

    -

    - -

    -

    -  1. commands used to **create new tutorials** -

    -

    -  2. **actions** you can add to the tutorials + This file showcases the features of Tutorial-o-Matic

    @@ -412,6 +424,13 @@ + + + + + + + diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm index a77650f..59c8a86 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticCommands.mm @@ -153,7 +153,6 @@ - @@ -179,8 +178,7 @@

    - -
    +
    diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm index 838f91c..095627b 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/Tutorial-o-MaticStepByStep.mm @@ -3,8 +3,29 @@ - - + + + + + + + + + + + + + + + + + + + + + @@ -115,27 +136,6 @@ - - - - - - - - - - - - - - - - - - - - -
    @@ -179,8 +179,7 @@ - - + @@ -217,7 +216,7 @@ 1. a tutorial with multiple pages

    - 1. adding actions + 1. adding actions (pending)

    @@ -233,33 +232,32 @@ ## 1. Create a basic tutorial in a new mindmap -In this tutorial you will learn how to create a new map containing a one page tutorial. +In this tutorial you will learn how to create a +new map containing a one page tutorial. - - ## 2. xx + + ## 2. Adding a basic tutorial to an existing mindmap -xx - +In this tutorial you will learn how to set +an existing mindmap to contain a one page tutorial. - - - ## 3. xx + + ## 3. Organizing a tutorial in multiple pages -xx +In this tutorial you will learn how +to divide a long tutorial into pages. - - - + @@ -398,7 +396,7 @@ - + @@ -412,7 +410,7 @@ - + @@ -763,7 +761,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -774,7 +772,13 @@ Write some text to its note (this is the information that will be shown)

    - Now we will copy to the tutorial some othr 'ToM_note' nodes as examples so you can see other use cases + Now we will copy to the tutorial some other  +

    +

    + 'ToM_note' nodes as examples so you can  +

    +

    + see other use cases

    @@ -904,7 +908,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -963,6 +967,24 @@ Write some text to its note (this is the information that will be shown) + + + + + + + + +

    + ## Tip: You can use the "Execute" button to see the changes faster +

    +

    + +

    + + + +
    @@ -1036,13 +1058,12 @@ Write some text to its note (this is the information that will be shown)
    - - + - + - + @@ -1109,7 +1130,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1123,7 +1144,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1139,7 +1160,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1152,7 +1173,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1185,8 +1206,8 @@ Write some text to its note (this is the information that will be shown) - - + + @@ -1347,15 +1368,21 @@ Write some text to its note (this is the information that will be shown) - - - + + - - - - - + + + + + + + + + + + + @@ -1364,7 +1391,25 @@ Write some text to its note (this is the information that will be shown)

    - # Cute Origami Bookmarks + # Introduction +

    +

    + +

    +

    + In this tutorial, we are going to take a long one-page tutorial and divide it in multiple pages for better navigation and usability. +

    +

    + +

    +

    + The example tutorial, we are going to use for this exercise, is an origami tutorial. +

    +

    + +

    +

    + The creator is [lalabananas](https://www.instructables.com/member/lalabananas/) and it was published as [Cute-Origami-Bookmarks in Instructables](https://www.instructables.com/Cute-Origami-Bookmarks/).

    @@ -1373,7 +1418,7 @@ Write some text to its note (this is the information that will be shown) - + @@ -1382,13 +1427,26 @@ Write some text to its note (this is the information that will be shown)

    - ![image Origami Bookmarks](https://content.instructables.com/ORIG/FEG/OIPK/L06PT77G/FEGOIPKL06PT77G.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds) + For this, we are going to create a new mindmap and insert the example tutorial to it. +

    +

    + +

    +

    + **Let's start!!** +

    +

    +

    - + +
    + + + @@ -1397,7 +1455,25 @@ Write some text to its note (this is the information that will be shown)

    - Hello internet people, today I will show you how to create corner bookmarks out of coloured paper. They always turn out really cute and they're perfect for giving as gifts :) + # Creating a new mind map +

    +

    + +

    +

    + To create a new mindmap that has the styles +

    +

    + needed to build a tutorial using **Tutorial-o-Matic** , you can use  +

    +

    + the command "**Create new tutorial mind map**".   +

    +

    + +

    +

    + You can get the same result by creating a new map using the "tutorial_styles_template"  as template map.

    @@ -1406,7 +1482,23 @@ Write some text to its note (this is the information that will be shown) - + + + + + + ## Step 1: create a new tutorial able mind map + +You can do it yourself by clicking the menu command, +or click the 'Execute' button to let ToM do it for you. + + + + + + + + @@ -1415,7 +1507,7 @@ Write some text to its note (this is the information that will be shown)

    - Although these are very easy and simple crafts, it can be hard to get some creative inspiration to figure out how you want to design them. I will also give some tips that I think will be helpful. + Now we are ready to insert the **Origami tutorial** in our new map

    @@ -1424,30 +1516,95 @@ Write some text to its note (this is the information that will be shown) - - - + + + + + + + +

    - I made the bookmarks shown above earlier, but for this instructable I am going to make some new and fresh ones. + # Cute Origami Bookmarks

    - +
    +
    + + The original creator of this tutorial is [lalabananas](https://www.instructables.com/member/lalabananas/) +and it was published as [Cute-Origami-Bookmarks in Instructables](https://www.instructables.com/Cute-Origami-Bookmarks/). + + + + + + +

    + ![image Origami Bookmarks](https://content.instructables.com/ORIG/FEG/OIPK/L06PT77G/FEGOIPKL06PT77G.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds) +

    + +
    +
    + + + + + + +

    + Hello internet people, today I will show you how to create corner bookmarks out of coloured paper. They always turn out really cute and they're perfect for giving as gifts :) +

    +

    + +

    + +
    +
    + + + + + + +

    + Although these are very easy and simple crafts, it can be hard to get some creative inspiration to figure out how you want to design them. I will also give some tips that I think will be helpful. +

    +

    + +

    + +
    +
    + + + + + + +

    + I made the bookmarks shown above earlier, but for this instructable I am going to make some new and fresh ones. +

    +

    + +

    + +
    +
    + - - - - + + @@ -1460,12 +1617,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1475,12 +1629,9 @@ Write some text to its note (this is the information that will be shown) ![image Origami Bookmarks](https://content.instructables.com/ORIG/FDD/YAIK/L06PT6OG/FDDYAIKL06PT6OG.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds)

    - -
    +
    - - - + @@ -1517,12 +1668,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1547,15 +1695,12 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - + - - - + @@ -1568,12 +1713,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1586,12 +1728,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1604,16 +1743,13 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - + - - - + @@ -1626,12 +1762,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1644,12 +1777,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1662,12 +1792,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1686,12 +1813,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1710,12 +1834,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1734,12 +1855,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1752,16 +1870,14 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - + + - - - + @@ -1774,12 +1890,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1792,12 +1905,9 @@ Write some text to its note (this is the information that will be shown)

    - -
    +
    - - - + @@ -1816,12 +1926,13 @@ Fold the square into quarters (fold once horizontally and once vertically.)

    - -
    +
    - - - + +
    + + + @@ -1840,12 +1951,13 @@ Fold the square into quarters (fold once horizontally and once vertically.)

    - -
    +
    - - - + +
    + + + @@ -1864,13 +1976,14 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - - + +
    + + + + @@ -1888,12 +2001,13 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + +
    + + + @@ -1912,12 +2026,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -1930,16 +2041,14 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - + + - - - + @@ -1952,12 +2061,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -1967,12 +2073,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- ![image Origami Bookmarks](https://content.instructables.com/ORIG/FMV/XRZC/L06PT9QS/FMVXRZCL06PT9QS.jpg?auto=webp&frame=1&fit=bounds&md=d0b67e4507fddf246d311ff018cd22a8)

    - -
    +
    - - - + @@ -1985,12 +2088,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -2003,12 +2103,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -2036,12 +2133,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -2054,16 +2148,13 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - + - - - + @@ -2076,12 +2167,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -2091,12 +2179,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers -- ![image Origami Bookmarks](https://content.instructables.com/ORIG/FTG/QP3N/L06PT76P/FTGQP3NL06PT76P.jpg?auto=webp&frame=1&width=500&height=500&fit=bounds&md=c7ed44f4d0772f0e72a8e37abc3e6924)

    - -
    +
    - - - + @@ -2109,12 +2194,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -2127,12 +2209,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -2145,12 +2224,9 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    - - - + @@ -2163,702 +2239,1289 @@ Fold the bottom corner upwards to make a little pocket (there are two layers --

    - -
    +
    +
    - - + + + +

    - def nodos = c.selecteds + # The tutorial branch

    - nodos.each{n -> -

    -

    -     n.text = 'image Origami Bookmarks' + As you can see, a new branch of nodes was copied into the map.

    -     n.link.text = n.link.text.takeBefore('?') + '?auto=webp&frame=1&width=500&height=500&fit=bounds' +

    - } + This branch has the whole information to display an **Origami** tutorial in Freeplane.

    - -
    - - - - - -

    - .groovy +

    - -
    -
    - - - - - -

    - def nodos = node.find{n -> n.style.name && n.style.name == 'MarkdownHelperNode' && n.text == 'Markdown document.md'} + It has multiple nodes that contains the different parts of the tutorial

    - //def n = node -

    -

    - nodos.each{ n -> + If you want you can **navigate the map** to have a first impression on how it's build.

    -    def newText = n.children.first().text.split(' ').take(5).join(' ') + ' ...' + But **please, don't modify it yet**.

    -    n.text = newText +

    - } + When ready, go to the **next page**

    - -
    - - - - - -

    - .groovy +

    -
    -
    -
    + +
    - + + +

    - information + # Save the mindmap

    - multiple pages +

    - -
    - - - - - - - - - - - - - - - - - - - - - - -

    - To prepare any existing mindmap to contain a tutorial, you have to add the special Tutorial-o-Matic styles to it. + Save the mindmap in your drive now.

    - You get that by using the command "Import Tutorial-o-Matic Styles" + This is useful for the editing options that are shown later. +

    +

    +

    -
    + +
    - - + + + - - - - = "${node?.children[0]?.text} directly".toString() - - - - - - - -

    - "$0 directly" -

    - -
    -
    - - - + + + + + +

    - If you want to divide your tutorial in multiple pages  you have two different options: + # Opening the tutorial +

    +

    +

    -
      -
    • - inserting "New page" nodes -
    • -
    • - inserting "Next page" nodes -
    • -

    - You have to insert these nodes to indicate where the next page starts. + Follow the instructions to take a **look at the origami tutorial**

    - -
    -
    - - - - - -

    - "New page" nodes are used to indicate where a new page starts AND the title of this new page. +

    - This title gets shown at the top of the page + After that, please **return here** to continue the tutorial.

    - -
    -
    - - - - - -

    - "Next page" nodes only indicates where a new page starts but doesn't insert a new title to the tutorial + You can come back by:

    - -
    -
    - - - - - -

    - With the same logic, when showing the Table of Content only "New page" titles are listed there. + - clicking the "**Stop Tutorial**" at the bottom of the origami tutorial

    - -
    -
    - - - - - -

    - These nodes can be set between the other nodes or as parents of them. They just have to be "before" the others ("in breadth-first order") + - or by selecting this Tab again ("**ToM tut 3**")

    -
    + +
    - - - + + + +

    - New Pages nodes + As you can see **The Origami Tutorial** has **many steps** and it's pretty **long**.

    - -
    -
    - - - - - -

    - To insert "New page" nodes, you have to + +

    +

    + Maybe it's **better to divide it** in multiple pages. +

    +

    + +

    +

    + ## Let's do it!! +

    +

    +

    -
      -
    • - Select the desired node (its text will be used as title for that page) -
    • -
    • - Assign the style "ToM_newPage" to that node -
    • -
    -
    + +
    - - - - - - = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() - - + + + + + + + + + + +

    - "Assign $0 style to selected node(s) directly" + # Introduction

    - -
    - - - - - - = "Insert new **${node?.children[1]?.text}** node directly".toString() - - - - - - -

    - "Insert new $1 node directly" +

    - -
    - - - - - - - - - - - - -

    - Next Pages nodes + If you want to **divide** your tutorial **in multiple pages**

    - -
    - +

    +  you have two different options: +

    +

    + +

    +

    +    *  "**New page**" nodes +

    +

    +    *  "**Next page**" nodes +

    +

    + +

    +

    + You have to **insert** these nodes **between the others** +

    +

    +  to indicate where the next page starts. +

    +

    + +

    +

    + "**New page**" nodes are used to indicate  +

    +

    + where a **new page starts** AND the **title** of this new page. +

    +

    + This title gets shown at the **top of the page** +

    +

    + +

    +

    + > for example, "**Creating the first pages**" in this very page +

    +

    + +

    +

    + "**Next page**" nodes only indicates where a **new page** starts  +

    +

    + but **doesn't insert** a new **title** to the tutorial +

    +

    + +

    +

    + With the same logic, when showing the  +

    +

    + **Table of Content** only **"New page" titles** are listed there. +

    +

    + +

    +

    + These nodes can be set **between** the other nodes  +

    +

    + **or as parents** of them. They just have to be  +

    +

    + "**before**" the others ("in **breadth-first order**") +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + +

    + # Let's create our first pages +

    +

    + +

    +

    + As a first step, we are going to define the first page of the tutorial. +

    +

    + +

    +

    + For this, we are going to define the title to the first page and for the second one. This way Tutorial-o-Matic will understand where the first page starts and ends. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + For this you have to apply the "**Tom_newPage**" style to the following nodes: +

    +

    + +

    +

    + - Cute Origami Bookmarks +

    +

    + - Supplies +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + You can also click on the following buttons to make ToM do it for you +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +

    + # Opening the tutorial (again) +

    +

    + +

    +

    + Follow the instructions to take a **look at the origami tutorial** +

    +

    + +

    +

    + After that, please **return here** to continue the tutorial. +

    +

    + +

    +

    + You can come back by: +

    +

    + - clicking the "**Stop Tutorial**" at the bottom of the origami tutorial +

    +

    + - or by selecting this Tab again ("**ToM tut 3**") +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + +

    + Now you can see that it has two pages: +

    +

    + +

    +

    + - A first one with an origami image and some welcome words +

    +

    + - And a second long one with all the steps +

    +

    + +

    + + +
    +
    +
    +
    + + + + + + + + + + +

    + We can add a **Table of contents** to any page in our tutorial. +

    +

    + +

    +

    + To do so we have to just insert a node that has the "**ToM_TOC**" style. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + We will add one in the Origami tutorial in its first page. +

    +

    + +

    +

    + If you look at its map there is node with the text "toc". +

    +

    + +

    +

    + We will insert there a ToM_note that shows a "Table of contents" title +

    +

    + +

    +

    + And a node that we can use to create the TOC +

    +

    + +

    + + +
    +
    +
    + + + + + + + + --- +## Table of contents: +--- + + + + + + + + + + + + + + +

    + Let's select now the new "TOC" node adn apply it the "**ToM_TOC**" style +

    +

    + +

    + + +
    +
    +
    + + + + + + + + + + + + ### Let's look at the changes. + +Click at the button to show how the page looks now: + + + + + + +

    - Edo + As you can see, now the first page has a "Table of contents" in it. +

    +

    + +

    +

    + Currently it shows only **two** titles, but this will change soon. +

    +

    +

    -
    + +
    - + + + + + +

    - To insert "Next page" nodes, you have to + Now we can create new pages for every step. +

    +

    + +

    +

    + For doing this, you have to: +

    +

    + +

    +

    + 1. select the folowing nodes +

    +

    +    - Step 1: Decide Your Design +

    +

    +    - Step 2: Measure and Cut Paper +

    +

    +    - Step 3: Fold Paper +

    +

    +    - Step 4: Decorate Bookmark +

    +

    +    - Step 5: Voilà! +

    +

    + 1. apply them the **ToM_newPage** style +

    +

    +

    -
      -
    • - Select the desired node (its text doesn't affect the tutorial) -
    • -
    • - Assign the style "ToM_nextPage" to that node -
    • -
    -
    + +
    +
    + + + + + + + + +

    + As usual, you can use the following buttons to let ToM do it for you: +

    +

    + +

    + + +
    +
    + + + + + + + + + + - - - + - = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() + ### Let's look at the changes. + +Click at the button to show how the page looks now: - + + + + + + + +

    - "Assign $0 style to selected node(s) directly" + Now the tutorial has multiple pages, but each of them has its title repited. +

    +

    + +

    +

    + This is because we added the newPages titles, but they were also as part of the text of the tutorial. +

    +

    + +

    +

    + Just follow these steps to get rid of the repeated titles: +

    +

    + +

    +

    + 1. select these nodes that are inside the ToM_note nodes: +

    +

    +    - \# Cute Origami Bookmarks ... +

    +

    +    - \# Supplies ... +

    +

    +    - \# Step 2: Measure and ... +

    +

    +    - \# Fold Paper ... +

    +

    +    - \# Step 4: Decorate Bookmark ... +

    +

    +    - \# Step 5: Voilà! ... +

    +

    + 1. delete them +

    +

    +

    -
    - + +
    +
    + + + + + + + + +

    + ## Tip: This time, I think, it will be useful to use the next button to get that nodes selected. jmho. +

    +

    + +

    + + +
    +
    - + + + + + + + + + + + + + + + - = "Insert new **${node?.children[1]?.text}** node directly".toString() + ### Let's look at the changes. + +Click at the button to show how the page looks now: + + + + + + + + + + + + + + +

    + While editing a tutorial, it is very common that you want to see how the changes, that you have done in the tutorial's map, look in the tutorial pane itself. +

    +

    + +

    +

    + Other times, while looking at the tutorial in the pane, you see something you want to change. +

    +

    + For this you have to go to the nodes where the current page was defined. +

    +

    + +

    +

    + All this can be a little tricky, but .. There is another solution: +

    +

    + +

    +

    + # the crayon modifier +

    +

    + +

    +

    + ![ToM Modifiers 010.png](https://raw.githubusercontent.com/EdoFro/Freeplane_Tutorial_AddOn/wip/resources/Tutorial-o-Matic/ToM%20Modifiers%20010.png) +

    +

    + +

    +

    + You can use the "editing" mode when reviewing and/or editing a tutorial. +

    +

    + This way you can have access to some extra buttons. +

    +

    + +

    +

    + To indicate that a tutorial is in "editing mode" you have to add a crayon icon to its "tutorial node" (the base node with "ToM-Tutorial" style) and launch the tutorial. +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + --- +

    +

    + +

    +

    + # Atention +

    +

    + +

    +

    + ## The " editing" mode works only if the mindmap containing the tutorial has been saved. +

    +

    + +

    +

    + --- +

    +

    + +

    + + +
    +
    + + + + + + + + +

    + # Let's set our "Origami" tutorial in "editing" mode +

    +

    + +

    +

    + All we have to do is: +

    +

    + +

    +

    + 1. select its base tutorial node. +

    +

    + 1. add the "crayon" icon to it +

    +

    + 1. refresh the tutorial's pane  <br> (you can do any of these:) +

    +

    +    - relaunch the tutorial +

    +

    +    - go to the next page +

    +

    +    - go to the Table of Contents +

    +

    + +

    + +
    - +
    + + +

    - "Insert new $1 node directly" + You can also click the following buttons to look how it works: +

    +

    +

    -
    - - - + +
    +
    +
    + + + - - - - + + + + + + + ### Let's look at the changes. + +Click at the button to show how the page looks now: + + - - - + + + + +

    - To add a Table of Content (TOC) to your tutorial, you just have to: + # The "extra" buttons +

    +

    + +

    +

    + After refreshing the tutorial you can note that there are three buttons on the left from the page's title. +

    +

    + +

    +

    + They are very useful when editing a tutorial. +

    +

    + +

    +

    + ## Description: +

    +

    + +

    +

    + |Button|Functionality| +

    +

    + |----|----| +

    +

    + |![ToM Modifiers 002.png](https://raw.githubusercontent.com/EdoFro/Freeplane_Tutorial_AddOn/wip/resources/Tutorial-o-Matic/ToM%20Modifiers%20002.png)|This button takes you to the nodes in the tutorial mindmap that defines the current page.<br>(the "source nodes")| +

    +

    + |![ToM Modifiers 003.png](https://raw.githubusercontent.com/EdoFro/Freeplane_Tutorial_AddOn/wip/resources/Tutorial-o-Matic/ToM%20Modifiers%20003.png)|this button updates the current page and shows all changes made to the "source nodes".<br>This is very handy to easily preview all modifications.| +

    +

    + |![ToM Modifiers 001.png](https://raw.githubusercontent.com/EdoFro/Freeplane_Tutorial_AddOn/wip/resources/Tutorial-o-Matic/ToM%20Modifiers%20001.png)|This button creates a link to the current tutorial page in your map.<br>This can be very handy to come back to a tutorialpage you found interesting from one of your own maps.| +

    +

    +

    -
      -
    • - Add a node -
    • -
    • - Assign the style "ToM-TOC" to that node -
    • -
    -
    + +
    - - - - - - = "Assign **${node?.children[0]?.text}** style to selected node(s) directly".toString() - - + + + + +

    - "Assign $0 style to selected node(s) directly" + Let's do a little exercise. +

    +

    + +

    +

    + 1. In the Origami tutorial panel click on the "**Table of Contents**" button<br>(At the very bottom) +

    +

    + 1. Click on the "**Step 1: Decide Your Design**" button +

    +

    + +

    +

    + As you can see, here the title appears two times. +

    +

    +

    -
    - - - - - - = "Insert new **${node?.children[1]?.text}** node directly".toString() + - + + + +

    - "Insert new $1 node directly" + Let's correct this: +

    +

    + +

    +

    + 1. Click on the microscope button +

    +

    + +

    +

    +   - ![ToM Modifiers 002.png](https://raw.githubusercontent.com/EdoFro/Freeplane_Tutorial_AddOn/wip/resources/Tutorial-o-Matic/ToM%20Modifiers%20002.png) +

    +

    + +

    +

    + 1. It selected the page's node +

    +

    + 1. select its descendant node +

    +

    +    - \# Step 1: Decide Your ... +

    +

    + 1. delete it +

    +

    + 1. click on the arrows button to update the page +

    +

    + +

    +

    +   - ![ToM Modifiers 003.png](https://raw.githubusercontent.com/EdoFro/Freeplane_Tutorial_AddOn/wip/resources/Tutorial-o-Matic/ToM%20Modifiers%20003.png) +

    +

    +

    -
    - - - - - - - - - - - - - - - - - - - - + +
    - - - - + + +

    - bla bla bla + As easy as that!! +

    +

    +

    -
    -
    + +
    - - - - - - + + + + +

    - bla bla bla + We will use some nextPages nodes now to split one of the steps into multiple pages. +

    +

    + +

    +

    + As said before, nextPages are very similar to newPages, but they don't insert a title in the page. +

    +

    +

    -
    -
    -
    - - - - -
    -
    -
    + +
    - - - - + + +

    - actions + Exercise: Let's split Step 3 +

    +

    + +

    +

    + 1. select nodes +

    +

    +    - 3.2. +

    +

    +    - 3.3. +

    +

    +    - 3.4. +

    +

    +    - 3.5. +

    +

    + 1. apply them the **ToM_nextPage** style +

    +

    +

    -
    - - + +
    - - - - - - + + +

    - Editing mode + As usual, you can use the following buttons to let ToM do it for you: +

    +

    +

    -
    -
    - - To see a tutorial in "***Editing Mode***" -you need to add a "**crayon**" icon to the **Tutorial base node**. - +
    - - + + + + + + + + + + - + - = "Add a '**${node?.children[0]?.text}**' icon to the selected node(s) directly".toString() + ### Let's look at the changes. + +Click at the button to show how the page looks now: - + + + + + +

    - "Add a '$0' icon to the selected node(s) directly" + Go to the "Step 3" page and now you can see it's divided into shorter pages that have no extra title +

    +

    + +

    +

    + Look at the "Table of Contens". It has no new titles in there. +

    +

    +

    -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
    - - + + + +

    - Tab Title + # Congratulations!!

    - -
    -
    - - - - - -

    - You can assign the title of the tab where your tutorial will be shown. +

    - To do this you have to add an attribute named "ToM_TabLabel" to your ToM-Tutorial node. + ## You have completed this tutorial!!

    - The value of that attribute will be shown as the tutorial's tab title. +

    - You can add that attribute by yourself or copy it from the ToM-Tutorial style. + (you can save your test map if you want, but you don't need to)

    -
    -
    -
    - - - - - - - = "${node?.children[0]?.text} directly".toString() + - - - - - - -

    - "$0 directly" -

    - -
    - +
    diff --git a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm index dffcacc..765aa32 100644 --- a/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm +++ b/Tutorial-o-Matic/zips/doc/Tutorial-o-Matic/myExistingMindMap.mm @@ -1,10 +1,10 @@ - + - + @@ -93,306 +93,306 @@

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + - - - - + + + + - - - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - - - - + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + - - + + + + + - - - - - - - - + + + + - - - - - + + + - - - - - + + - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + + + + + + - - + + + - - - - - - - - - - + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - - + + - - - - - + + + + + + + + + + - - - - + + + + + + - - - + + + + + + - - - - - + + - - + + + - - + + + + + - - - - - - - + + + + - - + + + - - - - - - - - - - + + + + + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -410,199 +410,199 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +