From 40c365af93e0bac4441fee2cd0d0a7e90022dd5a Mon Sep 17 00:00:00 2001 From: Joel Moniz Date: Sat, 16 Aug 2014 17:33:30 +0530 Subject: [PATCH] Added Tools, Libs reference menus to Help Including support for core tools & libs if reqd later --- app/src/processing/app/Editor.java | 15 ++ app/src/processing/app/Library.java | 10 ++ app/src/processing/mode/java/JavaEditor.java | 147 +++++++++++++++++++ build/shared/lib/languages/PDE.properties | 3 + 4 files changed, 175 insertions(+) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 83ee34b03..76fa82d22 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -286,6 +286,11 @@ public abstract class Editor extends JFrame implements RunnerListener { } + protected ArrayList getCoreTools() { + return coreTools; + } + + /** * Broken out to get modes working for GSOC, but this needs a longer-term * solution where the listeners are handled properly. @@ -1258,6 +1263,16 @@ public abstract class Editor extends JFrame implements RunnerListener { public void showReference(String filename) { File file = new File(mode.getReferenceFolder(), filename); + showReferenceFile(file); + } + + + /** + * Given the .html file, displays it in the default browser. + * + * @param file + */ + public void showReferenceFile(File file) { try { file = file.getCanonicalFile(); } catch (IOException e) { diff --git a/app/src/processing/app/Library.java b/app/src/processing/app/Library.java index 0ec49106d..8b468ec4a 100644 --- a/app/src/processing/app/Library.java +++ b/app/src/processing/app/Library.java @@ -284,6 +284,16 @@ public class Library extends LocalContribution { } + public boolean hasReference() { + return referenceFile.exists(); + } + + + public File getReferenceIndexFile() { + return referenceFile; + } + + public String getGroup() { return group; } diff --git a/app/src/processing/mode/java/JavaEditor.java b/app/src/processing/mode/java/JavaEditor.java index 9b3c71edf..d26e2ee13 100644 --- a/app/src/processing/mode/java/JavaEditor.java +++ b/app/src/processing/mode/java/JavaEditor.java @@ -4,12 +4,17 @@ import java.awt.*; import java.awt.event.*; import java.beans.*; import java.io.*; +import java.util.ArrayList; +import java.util.Iterator; import javax.swing.*; import javax.swing.border.*; +import javax.swing.event.MenuEvent; +import javax.swing.event.MenuListener; import processing.app.*; import processing.app.Toolkit; +import processing.app.contrib.ToolContribution; import processing.mode.java.runner.Runner; @@ -134,6 +139,100 @@ public class JavaEditor extends Editor { } }); menu.add(item); + + menu.addSeparator(); + + final JMenu libRefSubmenu = new JMenu(Language.text("menu.help.libraries_reference")); + // Populate only when sub-menu is opened, to avoid having spurious menu + // options if a library is deleted, or a missing menu option if a library is added + libRefSubmenu.addMenuListener(new MenuListener() { + + @Override + public void menuSelected(MenuEvent e) { + boolean isCoreLibMenuItemAdded = false; + boolean isContribLibMenuItemAdded = false; + + // Adding this in case references are included in a core library, + // or other core libraries are incuded in future + isCoreLibMenuItemAdded = addLibReferencesToSubMenu(mode.coreLibraries, libRefSubmenu); + + if (isCoreLibMenuItemAdded && !mode.contribLibraries.isEmpty()) + libRefSubmenu.addSeparator(); + + isContribLibMenuItemAdded = addLibReferencesToSubMenu(mode.contribLibraries, libRefSubmenu); + + if (!isContribLibMenuItemAdded && !isCoreLibMenuItemAdded) { + JMenuItem emptyMenuItem = new JMenuItem(Language.text("menu.help.empty")); + emptyMenuItem.setEnabled(false); + emptyMenuItem.setFocusable(false); + emptyMenuItem.setFocusPainted(false); + libRefSubmenu.add(emptyMenuItem); + } + else if (!isContribLibMenuItemAdded && !mode.coreLibraries.isEmpty()) { + //re-populate the menu to get rid of terminal separator + libRefSubmenu.removeAll(); + addLibReferencesToSubMenu(mode.coreLibraries, libRefSubmenu); + } + } + + @Override + public void menuDeselected(MenuEvent e) { + libRefSubmenu.removeAll(); + } + + @Override + public void menuCanceled(MenuEvent e) { + menuDeselected(e); + } + }); + menu.add(libRefSubmenu); + + final JMenu toolRefSubmenu = new JMenu(Language.text("menu.help.tools_reference")); + // Populate only when sub-menu is opened, to avoid having spurious menu + // options if a tool is deleted, or a missing menu option if a library is added + toolRefSubmenu.addMenuListener(new MenuListener() { + + @Override + public void menuSelected(MenuEvent e) { + boolean isCoreToolMenuItemAdded = false; + boolean isContribToolMenuItemAdded = false; + + // Adding this in in case a reference folder is added for MovieMaker, or in case + // other core tools are introduced later + isCoreToolMenuItemAdded = addToolReferencesToSubMenu(getCoreTools(), toolRefSubmenu); + + if (isCoreToolMenuItemAdded && !contribTools.isEmpty()) + toolRefSubmenu.addSeparator(); + + isContribToolMenuItemAdded = addToolReferencesToSubMenu(contribTools, toolRefSubmenu); + + if (!isContribToolMenuItemAdded && !isCoreToolMenuItemAdded) { + toolRefSubmenu.removeAll(); // in case a separator was added + final JMenuItem emptyMenuItem = new JMenuItem(Language.text("menu.help.empty")); + emptyMenuItem.setEnabled(false); + emptyMenuItem.setBorderPainted(false); + emptyMenuItem.setFocusable(false); + emptyMenuItem.setFocusPainted(false); + toolRefSubmenu.add(emptyMenuItem); + } + else if (!isContribToolMenuItemAdded && !contribTools.isEmpty()) { + // re-populate the menu to get rid of terminal separator + toolRefSubmenu.removeAll(); + addToolReferencesToSubMenu(getCoreTools(), toolRefSubmenu); + } + } + + @Override + public void menuDeselected(MenuEvent e) { + toolRefSubmenu.removeAll(); + } + + @Override + public void menuCanceled(MenuEvent e) { + menuDeselected(e); + } + }); + menu.add(toolRefSubmenu); menu.addSeparator(); item = new JMenuItem(Language.text("menu.help.online")); @@ -184,6 +283,54 @@ public class JavaEditor extends Editor { } + //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + private boolean addLibReferencesToSubMenu(ArrayList libsList, JMenu subMenu) { + boolean isItemAdded = false; + Iterator iter = libsList.iterator(); + while (iter.hasNext()) { + final Library libContrib = iter.next(); + if (libContrib.hasReference()) { + JMenuItem libRefItem = new JMenuItem(libContrib.getName()); + libRefItem.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + showReferenceFile(libContrib.getReferenceIndexFile()); + } + }); + subMenu.add(libRefItem); + isItemAdded = true; + } + } + return isItemAdded; + } + + + private boolean addToolReferencesToSubMenu(ArrayList toolsList, JMenu subMenu) { + boolean isItemAdded = false; + Iterator iter = toolsList.iterator(); + while (iter.hasNext()) { + final ToolContribution toolContrib = iter.next(); + final File toolRef = new File(toolContrib.getFolder(), "reference/index.html"); + if (toolRef.exists()) { + JMenuItem libRefItem = new JMenuItem(toolContrib.getName()); + libRefItem.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + showReferenceFile(toolRef); + } + }); + subMenu.add(libRefItem); + isItemAdded = true; + } + } + return isItemAdded; + } + + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index 961212cc4..f256dcec6 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -105,6 +105,9 @@ menu.help.about = About Processing menu.help.environment = Environment menu.help.reference = Reference menu.help.find_in_reference = Find in Reference +menu.help.libraries_reference = Libraries Reference +menu.help.tools_reference = Tools Reference +menu.help.empty = (empty) menu.help.online = Online menu.help.getting_started = Getting Started menu.help.getting_started.url = http://processing.org/learning/gettingstarted/