From 66ce5e43f7ba6f1e68b5f91396a5727c6900991f Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sun, 27 Jul 2014 00:11:40 +0400 Subject: [PATCH 01/11] Added new 'example' type in ContributionType.java's enum --- app/src/processing/app/Base.java | 17 +++++++++++++++++ .../app/contrib/ContributionManagerDialog.java | 1 + .../app/contrib/ContributionType.java | 17 ++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index ff6ac2621..a28db5f36 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -98,6 +98,7 @@ public class Base { ContributionManagerDialog libraryManagerFrame; ContributionManagerDialog toolManagerFrame; ContributionManagerDialog modeManagerFrame; + ContributionManagerDialog exampleManagerFrame; ContributionManagerDialog updateManagerFrame; // set to true after the first time the menu is built. @@ -385,6 +386,8 @@ public class Base { new ContributionManagerDialog(ContributionType.TOOL); modeManagerFrame = new ContributionManagerDialog(ContributionType.MODE); + exampleManagerFrame = + new ContributionManagerDialog(ContributionType.EXAMPLE); updateManagerFrame = new ContributionManagerDialog(null); @@ -1651,6 +1654,14 @@ public class Base { } + /** + * Show the examples installer window. + */ + public void handleOpenExampleManager() { + exampleManagerFrame.showFrame(activeEditor); + } + + public void handleShowUpdates() { updateManagerFrame.showFrame(activeEditor); } @@ -1923,6 +1934,7 @@ public class Base { getSketchbookLibrariesFolder().mkdir(); getSketchbookToolsFolder().mkdir(); getSketchbookModesFolder().mkdir(); + getSketchbookExamplesFolder().mkdir(); // System.err.println("sketchbook: " + sketchbookFolder); } @@ -1954,6 +1966,11 @@ public class Base { } + static public File getSketchbookExamplesFolder() { + return new File(sketchbookFolder, "examples"); + } + + static protected File getDefaultSketchbookFolder() { File sketchbookFolder = null; try { diff --git a/app/src/processing/app/contrib/ContributionManagerDialog.java b/app/src/processing/app/contrib/ContributionManagerDialog.java index 82d4d79ad..7bcace976 100644 --- a/app/src/processing/app/contrib/ContributionManagerDialog.java +++ b/app/src/processing/app/contrib/ContributionManagerDialog.java @@ -62,6 +62,7 @@ public class ContributionManagerDialog { if (type == null) { filter = ContributionType.createUpdateFilter(); } else { + filter = type.createFilter(); } contribListing = ContributionListing.getInstance(); diff --git a/app/src/processing/app/contrib/ContributionType.java b/app/src/processing/app/contrib/ContributionType.java index 8b882ee59..fca4f4dfb 100644 --- a/app/src/processing/app/contrib/ContributionType.java +++ b/app/src/processing/app/contrib/ContributionType.java @@ -31,7 +31,7 @@ import processing.app.Editor; import processing.app.Library; public enum ContributionType { - LIBRARY, TOOL, MODE; + LIBRARY, TOOL, MODE, EXAMPLE; public String toString() { @@ -42,6 +42,8 @@ public enum ContributionType { return "tool"; case MODE: return "mode"; + case EXAMPLE: + return "example"; } return null; // should be unreachable }; @@ -65,6 +67,8 @@ public enum ContributionType { return "tools"; case MODE: return "modes"; + case EXAMPLE: + return "examples"; } return null; // should be unreachable } @@ -106,6 +110,9 @@ public enum ContributionType { if ("mode".equalsIgnoreCase(s)) { return MODE; } + if ("example".equalsIgnoreCase(s)) { + return EXAMPLE; + } } return null; } @@ -119,6 +126,8 @@ public enum ContributionType { return Base.getSketchbookToolsFolder(); case MODE: return Base.getSketchbookModesFolder(); + case EXAMPLE: + return Base.getSketchbookExamplesFolder(); } return null; } @@ -181,6 +190,9 @@ public enum ContributionType { return ToolContribution.load(folder); case MODE: return ModeContribution.load(base, folder); + case EXAMPLE: + //TODO: Fill this in if reqd + return null; } return null; } @@ -198,6 +210,9 @@ public enum ContributionType { case MODE: contribs.addAll(editor.getBase().getModeContribs()); break; + case EXAMPLE: + //TODO: Fill this in if reqd + break; } return contribs; } From fbcf60e2ad059778dad1e0db7b6f4977e6c0f063 Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Wed, 30 Jul 2014 12:29:45 +0400 Subject: [PATCH 02/11] UI of 'Add Examples...' done --- app/src/processing/app/Mode.java | 40 +++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 3f669f643..61335d319 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -692,7 +692,40 @@ public abstract class Mode { } }); + JPanel examplesPanel = new JPanel(); + examplesPanel.setLayout(new BoxLayout(examplesPanel, BoxLayout.PAGE_AXIS)); + examplesPanel.setBackground(Color.WHITE); + + final JLabel openExamplesManagerLabel = new JLabel("Add Example..."); + openExamplesManagerLabel.setOpaque(false); + openExamplesManagerLabel.setBorder(new EmptyBorder(10, 6, 1, 5)); + openExamplesManagerLabel.setAlignmentX(Component.LEFT_ALIGNMENT); + openExamplesManagerLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); + openExamplesManagerLabel.setForeground(new Color(0, 0, 238)); + openExamplesManagerLabel.addMouseListener(new MouseListener() { + + @Override + public void mouseReleased(MouseEvent e) {} + + @Override + public void mousePressed(MouseEvent e) {} + + @Override + public void mouseExited(MouseEvent e) {} + + @Override + public void mouseEntered(MouseEvent e) {} + + @Override + public void mouseClicked(MouseEvent e) { + base.handleOpenExampleManager(); + openExamplesManagerLabel.setForeground(new Color(85, 26, 139)); + } + }); + final JTree tree = buildExamplesTree(); + tree.setOpaque(true); + tree.setAlignmentX(Component.LEFT_ALIGNMENT); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); tree.setShowsRootHandles(true); @@ -763,7 +796,12 @@ public abstract class Mode { JScrollPane treePane = new JScrollPane(tree); treePane.setPreferredSize(new Dimension(250, 450)); treePane.setBorder(new EmptyBorder(0, 0, 0, 0)); - examplesFrame.getContentPane().add(treePane); + treePane.setOpaque(true); + treePane.setAlignmentX(Component.LEFT_ALIGNMENT); + + examplesPanel.add(openExamplesManagerLabel); + examplesPanel.add(treePane); + examplesFrame.getContentPane().add(examplesPanel); examplesFrame.pack(); restoreExpanded(tree); From 31a85c7c8ffe7f403f74ef66ad5b7e5f23c8085b Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Wed, 30 Jul 2014 19:39:49 +0400 Subject: [PATCH 03/11] Contributed Examples tree displays in Examples window Also, example folder does not show as node in JTree --- app/src/processing/app/Mode.java | 213 ++++++++++++++++++++----------- 1 file changed, 142 insertions(+), 71 deletions(-) diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 61335d319..7b1a889ed 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -69,6 +69,8 @@ public abstract class Mode { protected File examplesFolder; protected File librariesFolder; protected File referenceFolder; + + protected File examplesContribFolder; public ArrayList coreLibraries; public ArrayList contribLibraries; @@ -100,6 +102,9 @@ public abstract class Mode { examplesFolder = new File(folder, "examples"); librariesFolder = new File(folder, "libraries"); referenceFolder = new File(folder, "reference"); + + // Get path to the contributed examples compatible with this mode + examplesContribFolder = Base.getSketchbookExamplesFolder(); // rebuildToolbarMenu(); rebuildLibraryList(); @@ -588,6 +593,15 @@ public abstract class Mode { } + public File[] getContributedExampleCategoryFolders() { + return examplesContribFolder.listFiles(new FilenameFilter() { + public boolean accept(File dir, String name) { + return dir.isDirectory() && name.charAt(0) != '.'; + } + }); + } + + public JTree buildExamplesTree() { DefaultMutableTreeNode node = new DefaultMutableTreeNode("Examples"); @@ -665,6 +679,40 @@ public abstract class Mode { } + public JTree buildContributedExamplesTrees() { + DefaultMutableTreeNode node = new DefaultMutableTreeNode("Contributed Examples"); + + JTree examplesTree = new JTree(node); + + try { + // break down the examples folder for examples + File[] subfolders = getContributedExampleCategoryFolders(); + + for (File sub : subfolders) { + DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(sub.getName()); + if (base.addSketches(subNode, sub)) { + node.add(subNode); + int exampleNodeNumber = -1; + for (int y = 0; y < subNode.getChildCount(); y++) + if (subNode.getChildAt(y).toString().equals("example")) + exampleNodeNumber = y; + if (exampleNodeNumber == -1) + continue; + TreeNode exampleNode = subNode.getChildAt(exampleNodeNumber); + subNode.remove(exampleNodeNumber); + int count = exampleNode.getChildCount(); + for (int x = 0; x < count; x++) { + subNode.add((DefaultMutableTreeNode) exampleNode.getChildAt(0)); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return examplesTree; + } + + public void resetExamples() { if (examplesFrame != null) { boolean visible = examplesFrame.isVisible(); @@ -724,83 +772,34 @@ public abstract class Mode { }); final JTree tree = buildExamplesTree(); - tree.setOpaque(true); - tree.setAlignmentX(Component.LEFT_ALIGNMENT); - - tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - tree.setShowsRootHandles(true); -// tree.setToggleClickCount(2); - // expand the root - tree.expandRow(0); - // now hide the root - tree.setRootVisible(false); - - // After 2.0a7, no longer expanding each of the categories at Casey's - // request. He felt that the window was too complicated too quickly. -// for (int row = tree.getRowCount()-1; row >= 0; --row) { -// tree.expandRow(row); -// } - - tree.addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - DefaultMutableTreeNode node = - (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); - - int selRow = tree.getRowForLocation(e.getX(), e.getY()); - //TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); - //if (node != null && node.isLeaf() && node.getPath().equals(selPath)) { - if (node != null && node.isLeaf() && selRow != -1) { - SketchReference sketch = (SketchReference) node.getUserObject(); - base.handleOpen(sketch.getPath()); - } - } - } - }); - tree.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { // doesn't fire keyTyped() - examplesFrame.setVisible(false); - } - } - public void keyTyped(KeyEvent e) { - if (e.getKeyChar() == KeyEvent.VK_ENTER) { - DefaultMutableTreeNode node = - (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); - if (node != null && node.isLeaf()) { - SketchReference sketch = (SketchReference) node.getUserObject(); - base.handleOpen(sketch.getPath()); - } - } - } - }); - - tree.addTreeExpansionListener(new TreeExpansionListener() { - @Override - public void treeExpanded(TreeExpansionEvent event) { - updateExpanded(tree); - } - - @Override - public void treeCollapsed(TreeExpansionEvent event) { - updateExpanded(tree); - } - }); - - tree.setBorder(new EmptyBorder(5, 5, 5, 5)); - if (Base.isMacOS()) { - tree.setToggleClickCount(2); - } else { - tree.setToggleClickCount(1); - } + setupExamplesTree(tree); + JScrollPane treePane = new JScrollPane(tree); - treePane.setPreferredSize(new Dimension(250, 450)); - treePane.setBorder(new EmptyBorder(0, 0, 0, 0)); + treePane.setPreferredSize(new Dimension(250, 300)); + treePane.setBorder(new EmptyBorder(5, 0, 0, 0)); treePane.setOpaque(true); + treePane.setBackground(Color.WHITE); treePane.setAlignmentX(Component.LEFT_ALIGNMENT); + JLabel contribExLabel = new JLabel("Contributed Examples"); + contribExLabel.setOpaque(false); + contribExLabel.setBorder(new EmptyBorder(10, 6, 1, 5)); + contribExLabel.setAlignmentX(Component.LEFT_ALIGNMENT); + + final JTree tree2 = buildContributedExamplesTrees(); + setupExamplesTree(tree2); + + JScrollPane treePane2 = new JScrollPane(tree2); + treePane2.setPreferredSize(new Dimension(250, 300)); + treePane2.setBorder(new EmptyBorder(0, 0, 10, 0)); + treePane2.setOpaque(true); + treePane2.setBackground(Color.WHITE); + treePane2.setAlignmentX(Component.LEFT_ALIGNMENT); + examplesPanel.add(openExamplesManagerLabel); examplesPanel.add(treePane); + examplesPanel.add(contribExLabel); + examplesPanel.add(treePane2); examplesFrame.getContentPane().add(examplesPanel); examplesFrame.pack(); @@ -823,6 +822,78 @@ public abstract class Mode { } + private void setupExamplesTree(final JTree tree) { + tree.setOpaque(true); + tree.setAlignmentX(Component.LEFT_ALIGNMENT); + + tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + tree.setShowsRootHandles(true); +// tree.setToggleClickCount(2); + // expand the root + tree.expandRow(0); + // now hide the root + tree.setRootVisible(false); + + // After 2.0a7, no longer expanding each of the categories at Casey's + // request. He felt that the window was too complicated too quickly. +// for (int row = tree.getRowCount()-1; row >= 0; --row) { +// tree.expandRow(row); +// } + + tree.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + DefaultMutableTreeNode node = + (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); + + int selRow = tree.getRowForLocation(e.getX(), e.getY()); + //TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); + //if (node != null && node.isLeaf() && node.getPath().equals(selPath)) { + if (node != null && node.isLeaf() && selRow != -1) { + SketchReference sketch = (SketchReference) node.getUserObject(); + base.handleOpen(sketch.getPath()); + } + } + } + }); + tree.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { // doesn't fire keyTyped() + examplesFrame.setVisible(false); + } + } + public void keyTyped(KeyEvent e) { + if (e.getKeyChar() == KeyEvent.VK_ENTER) { + DefaultMutableTreeNode node = + (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); + if (node != null && node.isLeaf()) { + SketchReference sketch = (SketchReference) node.getUserObject(); + base.handleOpen(sketch.getPath()); + } + } + } + }); + + tree.addTreeExpansionListener(new TreeExpansionListener() { + @Override + public void treeExpanded(TreeExpansionEvent event) { + updateExpanded(tree); + } + + @Override + public void treeCollapsed(TreeExpansionEvent event) { + updateExpanded(tree); + } + }); + + tree.setBorder(new EmptyBorder(5, 5, 5, 5)); + if (Base.isMacOS()) { + tree.setToggleClickCount(2); + } else { + tree.setToggleClickCount(1); + } + } + protected void updateExpanded(JTree tree) { Enumeration en = tree.getExpandedDescendants(new TreePath(tree.getModel().getRoot())); //en.nextElement(); // skip the root "Examples" node From 31aa89f35cf74889774af425b3602971bab60af9 Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sat, 2 Aug 2014 15:51:31 +0530 Subject: [PATCH 04/11] Contribs now show in Example Manager --- app/src/processing/app/Base.java | 22 +++++++++ app/src/processing/app/Mode.java | 17 ++----- .../contrib/ContributionManagerDialog.java | 5 +- .../app/contrib/ContributionType.java | 7 ++- .../app/contrib/ExampleContribution.java | 46 +++++++++++++++++++ 5 files changed, 80 insertions(+), 17 deletions(-) create mode 100644 app/src/processing/app/contrib/ExampleContribution.java diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index a28db5f36..e1df82070 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -124,6 +124,8 @@ public class Base { private Mode[] coreModes; //public List contribModes; protected ArrayList modeContribs; + + protected ArrayList exampleContribs; private JMenu sketchbookMenu; @@ -340,6 +342,19 @@ public class Base { } + /** + * Instantiates and adds new contributed modes to the contribModes list. + * Checks for duplicates so the same mode isn't instantiates twice. Does not + * remove modes because modes can't be removed once they are instantiated. + */ + void rebuildContribExamples() { + if (exampleContribs == null) { + exampleContribs = new ArrayList(); + } + ExampleContribution.loadMissing(this); + } + + public Base(String[] args) throws Exception { // // Get the sketchbook path, and make sure it's set properly // determineSketchbookFolder(); @@ -357,6 +372,8 @@ public class Base { ContributionManager.cleanup(this); buildCoreModes(); rebuildContribModes(); + + rebuildContribExamples(); // Needs to happen after the sketchbook folder has been located. // Also relies on the modes to be loaded so it knows what can be @@ -661,6 +678,11 @@ public class Base { } + public ArrayList getExampleContribs() { + return exampleContribs; + } + + // Because of variations in native windowing systems, no guarantees about // changes to the focused and active Windows can be made. Developers must // never assume that this Window is the focused or active Window until this diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 7b1a889ed..511c45bae 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -34,6 +34,7 @@ import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.tree.*; +import processing.app.contrib.ContributionType; import processing.app.syntax.*; import processing.core.PApplet; @@ -593,15 +594,6 @@ public abstract class Mode { } - public File[] getContributedExampleCategoryFolders() { - return examplesContribFolder.listFiles(new FilenameFilter() { - public boolean accept(File dir, String name) { - return dir.isDirectory() && name.charAt(0) != '.'; - } - }); - } - - public JTree buildExamplesTree() { DefaultMutableTreeNode node = new DefaultMutableTreeNode("Examples"); @@ -685,9 +677,10 @@ public abstract class Mode { JTree examplesTree = new JTree(node); try { - // break down the examples folder for examples - File[] subfolders = getContributedExampleCategoryFolders(); - + File[] subfolders = ContributionType.EXAMPLE.listCandidates(examplesContribFolder); + if (subfolders == null) { + subfolders = new File[0]; //empty array + } for (File sub : subfolders) { DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(sub.getName()); if (base.addSketches(subNode, sub)) { diff --git a/app/src/processing/app/contrib/ContributionManagerDialog.java b/app/src/processing/app/contrib/ContributionManagerDialog.java index 7bcace976..64cb5da93 100644 --- a/app/src/processing/app/contrib/ContributionManagerDialog.java +++ b/app/src/processing/app/contrib/ContributionManagerDialog.java @@ -394,7 +394,10 @@ public class ContributionManagerDialog { ArrayList modes = editor.getBase().getModeContribs(); contributions.addAll(modes); - + + ArrayList examples = editor.getBase().getExampleContribs(); + contributions.addAll(examples); + // ArrayList compilations = LibraryCompilation.list(libraries); // // // Remove libraries from the list that are part of a compilations diff --git a/app/src/processing/app/contrib/ContributionType.java b/app/src/processing/app/contrib/ContributionType.java index fca4f4dfb..5e34b9d88 100644 --- a/app/src/processing/app/contrib/ContributionType.java +++ b/app/src/processing/app/contrib/ContributionType.java @@ -145,7 +145,7 @@ public enum ContributionType { * contribution type. For instance, a list of folders that have a 'mode' * subfolder if this is a ModeContribution. */ - File[] listCandidates(File folder) { + public File[] listCandidates(File folder) { return folder.listFiles(new FileFilter() { public boolean accept(File potential) { return isCandidate(potential); @@ -191,8 +191,7 @@ public enum ContributionType { case MODE: return ModeContribution.load(base, folder); case EXAMPLE: - //TODO: Fill this in if reqd - return null; + return ExampleContribution.load(folder); } return null; } @@ -211,7 +210,7 @@ public enum ContributionType { contribs.addAll(editor.getBase().getModeContribs()); break; case EXAMPLE: - //TODO: Fill this in if reqd + contribs.addAll(editor.getBase().getExampleContribs()); break; } return contribs; diff --git a/app/src/processing/app/contrib/ExampleContribution.java b/app/src/processing/app/contrib/ExampleContribution.java new file mode 100644 index 000000000..9025022db --- /dev/null +++ b/app/src/processing/app/contrib/ExampleContribution.java @@ -0,0 +1,46 @@ +package processing.app.contrib; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + +import processing.app.Base; + +public class ExampleContribution extends LocalContribution { + + static public ExampleContribution load(File folder) { + return new ExampleContribution(folder); + } + + private ExampleContribution(File folder) { + super(folder); + } + + + static public void loadMissing(Base base) { + File examplesFolder = Base.getSketchbookExamplesFolder(); + ArrayList contribExamples = base.getExampleContribs(); + + HashMap existing = new HashMap(); + for (ExampleContribution contrib : contribExamples) { + existing.put(contrib.getFolder(), contrib); + } + File[] potential = ContributionType.EXAMPLE.listCandidates(examplesFolder); + // If modesFolder does not exist or is inaccessible (folks might like to + // mess with folders then report it as a bug) 'potential' will be null. + if (potential != null) { + for (File folder : potential) { + if (!existing.containsKey(folder)) { + contribExamples.add(new ExampleContribution(folder)); + } + } + } + } + + + @Override + public ContributionType getType() { + return ContributionType.EXAMPLE; + } + +} From 2d8098758f824ee9f07ee7f32d7310a83a084b68 Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sun, 3 Aug 2014 17:42:01 +0530 Subject: [PATCH 05/11] Modes now taken into account when deciding whether to show examples --- app/src/processing/app/Mode.java | 3 ++ .../app/contrib/AvailableContribution.java | 11 ++++- .../app/contrib/ExampleContribution.java | 44 ++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 511c45bae..c6bf0a505 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -35,6 +35,7 @@ import javax.swing.event.TreeExpansionListener; import javax.swing.tree.*; import processing.app.contrib.ContributionType; +import processing.app.contrib.ExampleContribution; import processing.app.syntax.*; import processing.core.PApplet; @@ -682,6 +683,8 @@ public abstract class Mode { subfolders = new File[0]; //empty array } for (File sub : subfolders) { + if (!ExampleContribution.isExampleCompatible(base, sub)) + continue; DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(sub.getName()); if (base.addSketches(subNode, sub)) { node.add(subNode); diff --git a/app/src/processing/app/contrib/AvailableContribution.java b/app/src/processing/app/contrib/AvailableContribution.java index 1023f2a83..e97643334 100644 --- a/app/src/processing/app/contrib/AvailableContribution.java +++ b/app/src/processing/app/contrib/AvailableContribution.java @@ -1,4 +1,4 @@ -/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* Part of the Processing project - http://processing.org @@ -268,6 +268,12 @@ class AvailableContribution extends Contribution { String prettyVersion = properties.get("prettyVersion"); if (prettyVersion == null || prettyVersion.isEmpty()) prettyVersion = getPrettyVersion(); + + String compatibleContribsList = null; + + if (getType() == ContributionType.EXAMPLE) { + compatibleContribsList = properties.get("compatibleModesList"); + } long lastUpdated; try { @@ -294,6 +300,9 @@ class AvailableContribution extends Contribution { writer.println("version=" + version); writer.println("prettyVersion=" + prettyVersion); writer.println("lastUpdated=" + lastUpdated); + if (getType() == ContributionType.EXAMPLE) { + writer.println("compatibleModesList=" + compatibleContribsList); + } writer.flush(); writer.close(); diff --git a/app/src/processing/app/contrib/ExampleContribution.java b/app/src/processing/app/contrib/ExampleContribution.java index 9025022db..e9843c15d 100644 --- a/app/src/processing/app/contrib/ExampleContribution.java +++ b/app/src/processing/app/contrib/ExampleContribution.java @@ -8,14 +8,53 @@ import processing.app.Base; public class ExampleContribution extends LocalContribution { + private ArrayList compatibleModesList; + static public ExampleContribution load(File folder) { return new ExampleContribution(folder); } private ExampleContribution(File folder) { super(folder); + compatibleModesList = parseCompatibleModesList(properties + .get("compatibleModesList")); } + private static ArrayList parseCompatibleModesList(String unparsedModes) { + ArrayList modesList = new ArrayList(); + if (unparsedModes == null || unparsedModes.isEmpty()) + return modesList; + String[] splitStr = unparsedModes.split(","); + for (String mode : splitStr) + modesList.add(mode.trim()); + return modesList; + } + + /** + * Function to determine whether or not the example present in the + * exampleLocation directory is compatible with the present mode. + * + * @param base + * @param exampleLocationFolder + * @return true if the example is compatible with the mode of the currently + * active editor + */ + public static boolean isExampleCompatible(Base base, + File exampleLocationFolder) { + File propertiesFile = new File(exampleLocationFolder, + ContributionType.EXAMPLE.toString() + + ".properties"); + if (propertiesFile.exists()) { + ArrayList compModesList = parseCompatibleModesList(Base + .readSettings(propertiesFile).get("compatibleModesList")); + for (String c : compModesList) { + if (c.equalsIgnoreCase(base.getActiveEditor().getMode().getIdentifier())) { + return true; + } + } + } + return false; + } static public void loadMissing(Base base) { File examplesFolder = Base.getSketchbookExamplesFolder(); @@ -37,10 +76,13 @@ public class ExampleContribution extends LocalContribution { } } - @Override public ContributionType getType() { return ContributionType.EXAMPLE; } + public ArrayList getCompatibleModesList() { + return compatibleModesList; + } + } From 8b913f0e635aeefdd4275f9c96ed8f48a3fe167d Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Tue, 5 Aug 2014 15:34:24 +0530 Subject: [PATCH 06/11] Updating display style of Examples Tree --- app/src/processing/app/Mode.java | 203 ++++++++---------- .../app/contrib/ExampleContribution.java | 3 +- 2 files changed, 95 insertions(+), 111 deletions(-) diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index c6bf0a505..426835ba5 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -595,10 +595,10 @@ public abstract class Mode { } - public JTree buildExamplesTree() { + public DefaultMutableTreeNode buildExamplesTree() { DefaultMutableTreeNode node = new DefaultMutableTreeNode("Examples"); - JTree examplesTree = new JTree(node); +// JTree examplesTree = new JTree(node); // rebuildExamplesTree(node); // } @@ -617,30 +617,28 @@ public abstract class Mode { // }); File[] subfolders = getExampleCategoryFolders(); -// DefaultMutableTreeNode examplesParent = new DefaultMutableTreeNode("Examples"); + DefaultMutableTreeNode modeExParent = new DefaultMutableTreeNode("Mode Examples"); + for (File sub : subfolders) { DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(sub.getName()); if (base.addSketches(subNode, sub)) { // examplesParent.add(subNode); - node.add(subNode); + modeExParent.add(subNode); } } -// node.add(examplesParent); -// examplesTree.expandPath(new TreePath(examplesParent)); - + // get library examples boolean any = false; - DefaultMutableTreeNode libParent = new DefaultMutableTreeNode("Libraries"); for (Library lib : coreLibraries) { if (lib.hasExamples()) { DefaultMutableTreeNode libNode = new DefaultMutableTreeNode(lib.getName()); - any |= base.addSketches(libNode, lib.getExamplesFolder()); - libParent.add(libNode); + if (base.addSketches(libNode, lib.getExamplesFolder())) + modeExParent.add(libNode); } } - if (any) { - node.add(libParent); - } + + if (modeExParent.getChildCount() > 0) + node.add(modeExParent); // get contrib library examples any = false; @@ -651,7 +649,7 @@ public abstract class Mode { } if (any) { // menu.addSeparator(); - DefaultMutableTreeNode contribParent = new DefaultMutableTreeNode("Contributed Libraries"); + DefaultMutableTreeNode contribParent = new DefaultMutableTreeNode("Library Examples"); // Base.addDisabledItem(menu, "Contributed"); for (Library lib : contribLibraries) { if (lib.hasExamples()) { @@ -668,15 +666,17 @@ public abstract class Mode { } catch (IOException e) { e.printStackTrace(); } - return examplesTree; + + DefaultMutableTreeNode contribExampleNode = buildContributedExamplesTrees(); + if (contribExampleNode.getChildCount() > 0) + node.add(contribExampleNode); + return node; } - public JTree buildContributedExamplesTrees() { + public DefaultMutableTreeNode buildContributedExamplesTrees() { DefaultMutableTreeNode node = new DefaultMutableTreeNode("Contributed Examples"); - JTree examplesTree = new JTree(node); - try { File[] subfolders = ContributionType.EXAMPLE.listCandidates(examplesContribFolder); if (subfolders == null) { @@ -688,6 +688,7 @@ public abstract class Mode { DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(sub.getName()); if (base.addSketches(subNode, sub)) { node.add(subNode); + System.out.println(subNode); int exampleNodeNumber = -1; for (int y = 0; y < subNode.getChildCount(); y++) if (subNode.getChildAt(y).toString().equals("example")) @@ -699,13 +700,14 @@ public abstract class Mode { int count = exampleNode.getChildCount(); for (int x = 0; x < count; x++) { subNode.add((DefaultMutableTreeNode) exampleNode.getChildAt(0)); + System.out.println(subNode); } } } } catch (IOException e) { e.printStackTrace(); } - return examplesTree; + return node;//examplesTree; } @@ -767,8 +769,78 @@ public abstract class Mode { } }); - final JTree tree = buildExamplesTree(); - setupExamplesTree(tree); + final JTree tree = new JTree(buildExamplesTree()); + + + tree.setOpaque(true); + tree.setAlignmentX(Component.LEFT_ALIGNMENT); + + tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + tree.setShowsRootHandles(true); +// tree.setToggleClickCount(2); + // expand the root + tree.expandRow(0); + // now hide the root + tree.setRootVisible(false); + + // After 2.0a7, no longer expanding each of the categories at Casey's + // request. He felt that the window was too complicated too quickly. +// for (int row = tree.getRowCount()-1; row >= 0; --row) { +// tree.expandRow(row); +// } + + tree.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + DefaultMutableTreeNode node = + (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); + + int selRow = tree.getRowForLocation(e.getX(), e.getY()); + //TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); + //if (node != null && node.isLeaf() && node.getPath().equals(selPath)) { + if (node != null && node.isLeaf() && selRow != -1) { + SketchReference sketch = (SketchReference) node.getUserObject(); + base.handleOpen(sketch.getPath()); + } + } + } + }); + tree.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { // doesn't fire keyTyped() + examplesFrame.setVisible(false); + } + } + public void keyTyped(KeyEvent e) { + if (e.getKeyChar() == KeyEvent.VK_ENTER) { + DefaultMutableTreeNode node = + (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); + if (node != null && node.isLeaf()) { + SketchReference sketch = (SketchReference) node.getUserObject(); + base.handleOpen(sketch.getPath()); + } + } + } + }); + + tree.addTreeExpansionListener(new TreeExpansionListener() { + @Override + public void treeExpanded(TreeExpansionEvent event) { + updateExpanded(tree); + } + + @Override + public void treeCollapsed(TreeExpansionEvent event) { + updateExpanded(tree); + } + }); + + tree.setBorder(new EmptyBorder(5, 5, 5, 5)); + if (Base.isMacOS()) { + tree.setToggleClickCount(2); + } else { + tree.setToggleClickCount(1); + } JScrollPane treePane = new JScrollPane(tree); treePane.setPreferredSize(new Dimension(250, 300)); @@ -777,25 +849,8 @@ public abstract class Mode { treePane.setBackground(Color.WHITE); treePane.setAlignmentX(Component.LEFT_ALIGNMENT); - JLabel contribExLabel = new JLabel("Contributed Examples"); - contribExLabel.setOpaque(false); - contribExLabel.setBorder(new EmptyBorder(10, 6, 1, 5)); - contribExLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - - final JTree tree2 = buildContributedExamplesTrees(); - setupExamplesTree(tree2); - - JScrollPane treePane2 = new JScrollPane(tree2); - treePane2.setPreferredSize(new Dimension(250, 300)); - treePane2.setBorder(new EmptyBorder(0, 0, 10, 0)); - treePane2.setOpaque(true); - treePane2.setBackground(Color.WHITE); - treePane2.setAlignmentX(Component.LEFT_ALIGNMENT); - examplesPanel.add(openExamplesManagerLabel); examplesPanel.add(treePane); - examplesPanel.add(contribExLabel); - examplesPanel.add(treePane2); examplesFrame.getContentPane().add(examplesPanel); examplesFrame.pack(); @@ -818,78 +873,6 @@ public abstract class Mode { } - private void setupExamplesTree(final JTree tree) { - tree.setOpaque(true); - tree.setAlignmentX(Component.LEFT_ALIGNMENT); - - tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - tree.setShowsRootHandles(true); -// tree.setToggleClickCount(2); - // expand the root - tree.expandRow(0); - // now hide the root - tree.setRootVisible(false); - - // After 2.0a7, no longer expanding each of the categories at Casey's - // request. He felt that the window was too complicated too quickly. -// for (int row = tree.getRowCount()-1; row >= 0; --row) { -// tree.expandRow(row); -// } - - tree.addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - DefaultMutableTreeNode node = - (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); - - int selRow = tree.getRowForLocation(e.getX(), e.getY()); - //TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); - //if (node != null && node.isLeaf() && node.getPath().equals(selPath)) { - if (node != null && node.isLeaf() && selRow != -1) { - SketchReference sketch = (SketchReference) node.getUserObject(); - base.handleOpen(sketch.getPath()); - } - } - } - }); - tree.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { // doesn't fire keyTyped() - examplesFrame.setVisible(false); - } - } - public void keyTyped(KeyEvent e) { - if (e.getKeyChar() == KeyEvent.VK_ENTER) { - DefaultMutableTreeNode node = - (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); - if (node != null && node.isLeaf()) { - SketchReference sketch = (SketchReference) node.getUserObject(); - base.handleOpen(sketch.getPath()); - } - } - } - }); - - tree.addTreeExpansionListener(new TreeExpansionListener() { - @Override - public void treeExpanded(TreeExpansionEvent event) { - updateExpanded(tree); - } - - @Override - public void treeCollapsed(TreeExpansionEvent event) { - updateExpanded(tree); - } - }); - - tree.setBorder(new EmptyBorder(5, 5, 5, 5)); - if (Base.isMacOS()) { - tree.setToggleClickCount(2); - } else { - tree.setToggleClickCount(1); - } - } - protected void updateExpanded(JTree tree) { Enumeration en = tree.getExpandedDescendants(new TreePath(tree.getModel().getRoot())); //en.nextElement(); // skip the root "Examples" node diff --git a/app/src/processing/app/contrib/ExampleContribution.java b/app/src/processing/app/contrib/ExampleContribution.java index e9843c15d..e7d7575c4 100644 --- a/app/src/processing/app/contrib/ExampleContribution.java +++ b/app/src/processing/app/contrib/ExampleContribution.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.HashMap; import processing.app.Base; +import processing.core.PApplet; public class ExampleContribution extends LocalContribution { @@ -24,7 +25,7 @@ public class ExampleContribution extends LocalContribution { ArrayList modesList = new ArrayList(); if (unparsedModes == null || unparsedModes.isEmpty()) return modesList; - String[] splitStr = unparsedModes.split(","); + String[] splitStr = PApplet.trim(PApplet.split(unparsedModes, ','));//unparsedModes.split(","); for (String mode : splitStr) modesList.add(mode.trim()); return modesList; From 13889f84837bc96f2af25ec7070db328166c0607 Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Thu, 7 Aug 2014 23:49:18 +0530 Subject: [PATCH 07/11] Rename to Examples-Package --- app/src/processing/app/Base.java | 16 +++++----- app/src/processing/app/Mode.java | 12 +++---- .../app/contrib/AvailableContribution.java | 4 +-- .../contrib/ContributionManagerDialog.java | 3 +- .../app/contrib/ContributionType.java | 32 +++++++++++-------- ....java => ExamplesPackageContribution.java} | 26 +++++++-------- 6 files changed, 49 insertions(+), 44 deletions(-) rename app/src/processing/app/contrib/{ExampleContribution.java => ExamplesPackageContribution.java} (70%) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index e1df82070..986b7467c 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -125,7 +125,7 @@ public class Base { //public List contribModes; protected ArrayList modeContribs; - protected ArrayList exampleContribs; + protected ArrayList exampleContribs; private JMenu sketchbookMenu; @@ -349,9 +349,9 @@ public class Base { */ void rebuildContribExamples() { if (exampleContribs == null) { - exampleContribs = new ArrayList(); + exampleContribs = new ArrayList(); } - ExampleContribution.loadMissing(this); + ExamplesPackageContribution.loadMissing(this); } @@ -404,7 +404,7 @@ public class Base { modeManagerFrame = new ContributionManagerDialog(ContributionType.MODE); exampleManagerFrame = - new ContributionManagerDialog(ContributionType.EXAMPLE); + new ContributionManagerDialog(ContributionType.EXAMPLES_PACKAGE); updateManagerFrame = new ContributionManagerDialog(null); @@ -678,7 +678,7 @@ public class Base { } - public ArrayList getExampleContribs() { + public ArrayList getExampleContribs() { return exampleContribs; } @@ -1956,7 +1956,7 @@ public class Base { getSketchbookLibrariesFolder().mkdir(); getSketchbookToolsFolder().mkdir(); getSketchbookModesFolder().mkdir(); - getSketchbookExamplesFolder().mkdir(); + getSketchbookExamplesPackagesFolder().mkdir(); // System.err.println("sketchbook: " + sketchbookFolder); } @@ -1988,8 +1988,8 @@ public class Base { } - static public File getSketchbookExamplesFolder() { - return new File(sketchbookFolder, "examples"); + static public File getSketchbookExamplesPackagesFolder() { + return new File(sketchbookFolder, "examples-packages"); } diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 426835ba5..8e27e17aa 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -35,7 +35,7 @@ import javax.swing.event.TreeExpansionListener; import javax.swing.tree.*; import processing.app.contrib.ContributionType; -import processing.app.contrib.ExampleContribution; +import processing.app.contrib.ExamplesPackageContribution; import processing.app.syntax.*; import processing.core.PApplet; @@ -106,7 +106,7 @@ public abstract class Mode { referenceFolder = new File(folder, "reference"); // Get path to the contributed examples compatible with this mode - examplesContribFolder = Base.getSketchbookExamplesFolder(); + examplesContribFolder = Base.getSketchbookExamplesPackagesFolder(); // rebuildToolbarMenu(); rebuildLibraryList(); @@ -675,15 +675,15 @@ public abstract class Mode { public DefaultMutableTreeNode buildContributedExamplesTrees() { - DefaultMutableTreeNode node = new DefaultMutableTreeNode("Contributed Examples"); + DefaultMutableTreeNode node = new DefaultMutableTreeNode("Contributed Examples-Packages"); try { - File[] subfolders = ContributionType.EXAMPLE.listCandidates(examplesContribFolder); + File[] subfolders = ContributionType.EXAMPLES_PACKAGE.listCandidates(examplesContribFolder); if (subfolders == null) { subfolders = new File[0]; //empty array } for (File sub : subfolders) { - if (!ExampleContribution.isExampleCompatible(base, sub)) + if (!ExamplesPackageContribution.isExamplesPackageCompatible(base, sub)) continue; DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(sub.getName()); if (base.addSketches(subNode, sub)) { @@ -691,7 +691,7 @@ public abstract class Mode { System.out.println(subNode); int exampleNodeNumber = -1; for (int y = 0; y < subNode.getChildCount(); y++) - if (subNode.getChildAt(y).toString().equals("example")) + if (subNode.getChildAt(y).toString().equals("examples-package")) exampleNodeNumber = y; if (exampleNodeNumber == -1) continue; diff --git a/app/src/processing/app/contrib/AvailableContribution.java b/app/src/processing/app/contrib/AvailableContribution.java index e97643334..39b1cb1b0 100644 --- a/app/src/processing/app/contrib/AvailableContribution.java +++ b/app/src/processing/app/contrib/AvailableContribution.java @@ -271,7 +271,7 @@ class AvailableContribution extends Contribution { String compatibleContribsList = null; - if (getType() == ContributionType.EXAMPLE) { + if (getType() == ContributionType.EXAMPLES_PACKAGE) { compatibleContribsList = properties.get("compatibleModesList"); } @@ -300,7 +300,7 @@ class AvailableContribution extends Contribution { writer.println("version=" + version); writer.println("prettyVersion=" + prettyVersion); writer.println("lastUpdated=" + lastUpdated); - if (getType() == ContributionType.EXAMPLE) { + if (getType() == ContributionType.EXAMPLES_PACKAGE) { writer.println("compatibleModesList=" + compatibleContribsList); } diff --git a/app/src/processing/app/contrib/ContributionManagerDialog.java b/app/src/processing/app/contrib/ContributionManagerDialog.java index 64cb5da93..641378b69 100644 --- a/app/src/processing/app/contrib/ContributionManagerDialog.java +++ b/app/src/processing/app/contrib/ContributionManagerDialog.java @@ -62,7 +62,6 @@ public class ContributionManagerDialog { if (type == null) { filter = ContributionType.createUpdateFilter(); } else { - filter = type.createFilter(); } contribListing = ContributionListing.getInstance(); @@ -395,7 +394,7 @@ public class ContributionManagerDialog { ArrayList modes = editor.getBase().getModeContribs(); contributions.addAll(modes); - ArrayList examples = editor.getBase().getExampleContribs(); + ArrayList examples = editor.getBase().getExampleContribs(); contributions.addAll(examples); // ArrayList compilations = LibraryCompilation.list(libraries); diff --git a/app/src/processing/app/contrib/ContributionType.java b/app/src/processing/app/contrib/ContributionType.java index 5e34b9d88..a2e661d98 100644 --- a/app/src/processing/app/contrib/ContributionType.java +++ b/app/src/processing/app/contrib/ContributionType.java @@ -31,7 +31,7 @@ import processing.app.Editor; import processing.app.Library; public enum ContributionType { - LIBRARY, TOOL, MODE, EXAMPLE; + LIBRARY, TOOL, MODE, EXAMPLES_PACKAGE; public String toString() { @@ -42,8 +42,8 @@ public enum ContributionType { return "tool"; case MODE: return "mode"; - case EXAMPLE: - return "example"; + case EXAMPLES_PACKAGE: + return "examples-package"; } return null; // should be unreachable }; @@ -55,7 +55,13 @@ public enum ContributionType { */ public String getTitle() { String s = toString(); - return Character.toUpperCase(s.charAt(0)) + s.substring(1); + if (this == EXAMPLES_PACKAGE) + return Character.toUpperCase(s.charAt(0)) + + s.substring(1, s.indexOf('-') + 1) + + Character.toUpperCase(s.charAt(s.indexOf('-') + 1)) + + s.substring(s.indexOf('-') + 2); + else + return Character.toUpperCase(s.charAt(0)) + s.substring(1); } @@ -67,8 +73,8 @@ public enum ContributionType { return "tools"; case MODE: return "modes"; - case EXAMPLE: - return "examples"; + case EXAMPLES_PACKAGE: + return "examples-package"; } return null; // should be unreachable } @@ -110,8 +116,8 @@ public enum ContributionType { if ("mode".equalsIgnoreCase(s)) { return MODE; } - if ("example".equalsIgnoreCase(s)) { - return EXAMPLE; + if ("examples-package".equalsIgnoreCase(s)) { + return EXAMPLES_PACKAGE; } } return null; @@ -126,8 +132,8 @@ public enum ContributionType { return Base.getSketchbookToolsFolder(); case MODE: return Base.getSketchbookModesFolder(); - case EXAMPLE: - return Base.getSketchbookExamplesFolder(); + case EXAMPLES_PACKAGE: + return Base.getSketchbookExamplesPackagesFolder(); } return null; } @@ -190,8 +196,8 @@ public enum ContributionType { return ToolContribution.load(folder); case MODE: return ModeContribution.load(base, folder); - case EXAMPLE: - return ExampleContribution.load(folder); + case EXAMPLES_PACKAGE: + return ExamplesPackageContribution.load(folder); } return null; } @@ -209,7 +215,7 @@ public enum ContributionType { case MODE: contribs.addAll(editor.getBase().getModeContribs()); break; - case EXAMPLE: + case EXAMPLES_PACKAGE: contribs.addAll(editor.getBase().getExampleContribs()); break; } diff --git a/app/src/processing/app/contrib/ExampleContribution.java b/app/src/processing/app/contrib/ExamplesPackageContribution.java similarity index 70% rename from app/src/processing/app/contrib/ExampleContribution.java rename to app/src/processing/app/contrib/ExamplesPackageContribution.java index e7d7575c4..f94cc6669 100644 --- a/app/src/processing/app/contrib/ExampleContribution.java +++ b/app/src/processing/app/contrib/ExamplesPackageContribution.java @@ -7,15 +7,15 @@ import java.util.HashMap; import processing.app.Base; import processing.core.PApplet; -public class ExampleContribution extends LocalContribution { +public class ExamplesPackageContribution extends LocalContribution { private ArrayList compatibleModesList; - static public ExampleContribution load(File folder) { - return new ExampleContribution(folder); + static public ExamplesPackageContribution load(File folder) { + return new ExamplesPackageContribution(folder); } - private ExampleContribution(File folder) { + private ExamplesPackageContribution(File folder) { super(folder); compatibleModesList = parseCompatibleModesList(properties .get("compatibleModesList")); @@ -40,10 +40,10 @@ public class ExampleContribution extends LocalContribution { * @return true if the example is compatible with the mode of the currently * active editor */ - public static boolean isExampleCompatible(Base base, + public static boolean isExamplesPackageCompatible(Base base, File exampleLocationFolder) { File propertiesFile = new File(exampleLocationFolder, - ContributionType.EXAMPLE.toString() + ContributionType.EXAMPLES_PACKAGE.toString() + ".properties"); if (propertiesFile.exists()) { ArrayList compModesList = parseCompatibleModesList(Base @@ -58,20 +58,20 @@ public class ExampleContribution extends LocalContribution { } static public void loadMissing(Base base) { - File examplesFolder = Base.getSketchbookExamplesFolder(); - ArrayList contribExamples = base.getExampleContribs(); + File examplesFolder = Base.getSketchbookExamplesPackagesFolder(); + ArrayList contribExamples = base.getExampleContribs(); - HashMap existing = new HashMap(); - for (ExampleContribution contrib : contribExamples) { + HashMap existing = new HashMap(); + for (ExamplesPackageContribution contrib : contribExamples) { existing.put(contrib.getFolder(), contrib); } - File[] potential = ContributionType.EXAMPLE.listCandidates(examplesFolder); + File[] potential = ContributionType.EXAMPLES_PACKAGE.listCandidates(examplesFolder); // If modesFolder does not exist or is inaccessible (folks might like to // mess with folders then report it as a bug) 'potential' will be null. if (potential != null) { for (File folder : potential) { if (!existing.containsKey(folder)) { - contribExamples.add(new ExampleContribution(folder)); + contribExamples.add(new ExamplesPackageContribution(folder)); } } } @@ -79,7 +79,7 @@ public class ExampleContribution extends LocalContribution { @Override public ContributionType getType() { - return ContributionType.EXAMPLE; + return ContributionType.EXAMPLES_PACKAGE; } public ArrayList getCompatibleModesList() { From c67b0c8495e29f6d24ebda361c44505652a88e49 Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sat, 9 Aug 2014 14:11:38 +0530 Subject: [PATCH 08/11] Redesigning 'Add Examples...' button --- app/src/processing/app/Mode.java | 33 +++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 8e27e17aa..621692bb8 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -29,6 +29,7 @@ import java.io.*; import java.util.*; import javax.swing.*; +import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; @@ -739,16 +740,22 @@ public abstract class Mode { }); JPanel examplesPanel = new JPanel(); - examplesPanel.setLayout(new BoxLayout(examplesPanel, BoxLayout.PAGE_AXIS)); + examplesPanel.setLayout(new BorderLayout()); examplesPanel.setBackground(Color.WHITE); - final JLabel openExamplesManagerLabel = new JLabel("Add Example..."); - openExamplesManagerLabel.setOpaque(false); - openExamplesManagerLabel.setBorder(new EmptyBorder(10, 6, 1, 5)); - openExamplesManagerLabel.setAlignmentX(Component.LEFT_ALIGNMENT); - openExamplesManagerLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); - openExamplesManagerLabel.setForeground(new Color(0, 0, 238)); - openExamplesManagerLabel.addMouseListener(new MouseListener() { + final JPanel openExamplesManagerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + JLabel openExamplesManagerLabel = new JLabel("Add Examples..."); +// openExamplesManagerLabel.setAlignmentX(Component.LEFT_ALIGNMENT); + openExamplesManagerPanel.add(openExamplesManagerLabel); + openExamplesManagerPanel.setOpaque(false); + Border lineBorder = BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK); + Border paddingBorder = BorderFactory.createEmptyBorder(3, 5, 1, 4); + openExamplesManagerPanel.setBorder(BorderFactory.createCompoundBorder(lineBorder, paddingBorder)); +// openExamplesManagerLabel.set + openExamplesManagerPanel.setAlignmentX(Component.LEFT_ALIGNMENT); + openExamplesManagerPanel.setCursor(new Cursor(Cursor.HAND_CURSOR)); +// openExamplesManagerLabel.setForeground(new Color(0, 0, 238)); + openExamplesManagerPanel.addMouseListener(new MouseListener() { @Override public void mouseReleased(MouseEvent e) {} @@ -765,7 +772,7 @@ public abstract class Mode { @Override public void mouseClicked(MouseEvent e) { base.handleOpenExampleManager(); - openExamplesManagerLabel.setForeground(new Color(85, 26, 139)); +// openExamplesManagerLabel.setForeground(new Color(85, 26, 139)); } }); @@ -835,7 +842,7 @@ public abstract class Mode { } }); - tree.setBorder(new EmptyBorder(5, 5, 5, 5)); + tree.setBorder(new EmptyBorder(0, 5, 5, 5)); if (Base.isMacOS()) { tree.setToggleClickCount(2); } else { @@ -844,13 +851,13 @@ public abstract class Mode { JScrollPane treePane = new JScrollPane(tree); treePane.setPreferredSize(new Dimension(250, 300)); - treePane.setBorder(new EmptyBorder(5, 0, 0, 0)); + treePane.setBorder(new EmptyBorder(2, 0, 0, 0)); treePane.setOpaque(true); treePane.setBackground(Color.WHITE); treePane.setAlignmentX(Component.LEFT_ALIGNMENT); - examplesPanel.add(openExamplesManagerLabel); - examplesPanel.add(treePane); + examplesPanel.add(openExamplesManagerPanel,BorderLayout.PAGE_START); + examplesPanel.add(treePane, BorderLayout.CENTER); examplesFrame.getContentPane().add(examplesPanel); examplesFrame.pack(); From 2386d9673367e03d896197fe46cd2b8b87902c9c Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sat, 9 Aug 2014 23:54:23 +0530 Subject: [PATCH 09/11] Added 'Add Examples...' option to Open Toolbar Menu --- app/src/processing/app/Mode.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 621692bb8..fdf7170d1 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -412,6 +412,14 @@ public abstract class Mode { } }); toolbarMenu.add(item); + + item = new JMenuItem("Add Examples..."); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + base.handleOpenExampleManager(); + } + }); + toolbarMenu.add(item); // Add a list of all sketches and subfolders toolbarMenu.addSeparator(); From 9faa8eac9afbacd31504f26227886548b3505a87 Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sun, 10 Aug 2014 01:13:29 +0530 Subject: [PATCH 10/11] Solve old folders displaying --- app/src/processing/app/Base.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 986b7467c..1ae9bccfb 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -1508,7 +1508,7 @@ public class Base { JMenu submenu = new JMenu(name); // needs to be separate var otherwise would set ifound to false boolean anything = addSketches(submenu, subfolder, replaceExisting); - if (anything) { + if (anything && !name.equals("old")) { //Don't add old contributions menu.add(submenu); found = true; } From b8fddbaaeab7a6d7bb833ce8983529c29b94124e Mon Sep 17 00:00:00 2001 From: joelmoniz Date: Sun, 10 Aug 2014 22:07:01 +0530 Subject: [PATCH 11/11] Added function to colourize alternate rows of a JTree Thus improving the Examples Tree UI appearance --- app/src/processing/app/Mode.java | 98 +++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index fdf7170d1..b51e50438 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -33,6 +33,7 @@ import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; +import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.*; import processing.app.contrib.ContributionType; @@ -684,7 +685,7 @@ public abstract class Mode { public DefaultMutableTreeNode buildContributedExamplesTrees() { - DefaultMutableTreeNode node = new DefaultMutableTreeNode("Contributed Examples-Packages"); + DefaultMutableTreeNode node = new DefaultMutableTreeNode("Contributed Examples"); try { File[] subfolders = ContributionType.EXAMPLES_PACKAGE.listCandidates(examplesContribFolder); @@ -697,7 +698,6 @@ public abstract class Mode { DefaultMutableTreeNode subNode = new DefaultMutableTreeNode(sub.getName()); if (base.addSketches(subNode, sub)) { node.add(subNode); - System.out.println(subNode); int exampleNodeNumber = -1; for (int y = 0; y < subNode.getChildCount(); y++) if (subNode.getChildAt(y).toString().equals("examples-package")) @@ -709,7 +709,6 @@ public abstract class Mode { int count = exampleNode.getChildCount(); for (int x = 0; x < count; x++) { subNode.add((DefaultMutableTreeNode) exampleNode.getChildAt(0)); - System.out.println(subNode); } } } @@ -737,6 +736,98 @@ public abstract class Mode { } + /** + * Function to give a JTree a pretty alternating gray-white colouring for + * its rows. + * + * @param tree + */ + private void colourizeTreeRows(JTree tree) { + // Code in this function adapted from: + // http://mateuszstankiewicz.eu/?p=263 + tree.setCellRenderer(new DefaultTreeCellRenderer() { + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, + boolean sel, + boolean expanded, + boolean leaf, int row, + boolean hasFocus) { + JComponent c = (JComponent) super + .getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, + hasFocus); + + if (!tree.isRowSelected(row)) { + if (row % 2 == 0) { + + // Need to set this, else the gray from the odd + // rows colours this gray as well. + c.setBackground(new Color(255, 255, 255)); + + setBackgroundSelectionColor(new Color(0, 0, 255)); + setTextSelectionColor(Color.WHITE); + setBorderSelectionColor(new Color(0, 0, 255)); + } else { + + // Set background for entire component (including the image). + // Using transparency messes things up, probably since the + // transparent colour is not good friends with the images background colour. + c.setBackground(new Color(240, 240, 240)); + + // Can't use setBackgroundSelectionColor() directly, since then, the + // image's background isn't affected. + // The setUI() doesn't fix the image's background because the + // transparency likely interferes with its normal background, + // making its background lighter than the rest. +// setBackgroundNonSelectionColor(new Color(190, 190, 190)); + + setBackgroundSelectionColor(new Color(0, 0, 255)); + setTextSelectionColor(Color.WHITE); + setBorderSelectionColor(new Color(0, 0, 255)); + } + } else {// Transparent blue if selected + c.setBackground(new Color(127, 127, 255)); + } + + c.setOpaque(true); + return c; + } + + }); + + tree.setUI(new BasicTreeUI() { + + @Override + protected void paintRow(Graphics g, Rectangle clipBounds, Insets insets, + Rectangle bounds, TreePath path, int row, + boolean isExpanded, boolean hasBeenExpanded, + boolean isLeaf) { + Graphics g2 = g.create(); + + if (!tree.isRowSelected(row)) { + if (row % 2 == 0) { + // Need to set this, else the gray from the odd rows + // affects the even rows too. + g2.setColor(new Color(255, 255, 255, 128)); + } else { + // Transparent light-gray + g2.setColor(new Color(226, 226, 226, 128)); + } + } else + // Transparent blue if selected + g2.setColor(new Color(0, 0, 255, 128)); + + g2.fillRect(0, bounds.y, tree.getWidth(), bounds.height); + + g2.dispose(); + + super.paintRow(g, clipBounds, insets, bounds, path, row, isExpanded, + hasBeenExpanded, isLeaf); + } + }); + } + + public void showExamplesFrame() { if (examplesFrame == null) { examplesFrame = new JFrame(getTitle() + " " + Language.text("examples")); @@ -786,6 +877,7 @@ public abstract class Mode { final JTree tree = new JTree(buildExamplesTree()); + colourizeTreeRows(tree); tree.setOpaque(true); tree.setAlignmentX(Component.LEFT_ALIGNMENT);