diff --git a/app/src/processing/app/contrib/ContributionTab.java b/app/src/processing/app/contrib/ContributionTab.java index a4a86a5e9..9d8ba34d5 100644 --- a/app/src/processing/app/contrib/ContributionTab.java +++ b/app/src/processing/app/contrib/ContributionTab.java @@ -58,7 +58,7 @@ public class ContributionTab { JButton restartButton; JLabel categoryLabel; JLabel loaderLabel; - + JPanel errorPanel; JTextPane errorMessage; JButton tryAgainButton; @@ -68,7 +68,7 @@ public class ContributionTab { Editor editor; String category; ContributionListing contribListing; - + JProgressBar progressBar; @@ -123,8 +123,8 @@ public class ContributionTab { // panel.add(filler); // return panel; // } - - + + public void showFrame(final Editor editor, boolean activateErrorPanel, @@ -153,7 +153,7 @@ public class ContributionTab { filterLabel = new JLabel("Filter"); filterLabel.setOpaque(false); } - + /*restartButton = new JButton(Language.text("contrib.restart")); restartButton.setVisible(false); restartButton.addActionListener(new ActionListener() { @@ -201,7 +201,7 @@ public class ContributionTab { });*/ - + GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); // layout.setAutoCreateContainerGaps(true); @@ -242,7 +242,7 @@ public class ContributionTab { } - /** Creates and arranges the Swing components in the dialog. + /** Creates and arranges the Swing components in the dialog. */ private void createComponents() { @@ -250,9 +250,9 @@ public class ContributionTab { categoryChooser = new JComboBox(); categoryChooser.setMaximumRowCount(20); - + updateCategoryChooser(); - + categoryChooser.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { category = (String) categoryChooser.getSelectedItem(); @@ -265,9 +265,9 @@ public class ContributionTab { }); filterField = new FilterField(); - + buildErrorPanel(); - + } private void buildErrorPanel(){ errorPanel = new JPanel(); @@ -282,17 +282,17 @@ public class ContributionTab { + "Please verify your network connection again, then try connecting again."); errorMessage.setMaximumSize(new Dimension(450, 50)); errorMessage.setOpaque(false); - + StyledDocument doc = errorMessage.getStyledDocument(); SimpleAttributeSet center = new SimpleAttributeSet(); StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); doc.setParagraphAttributes(0, doc.getLength(), center, false); - - + + closeButton = new JButton("X"); closeButton.setContentAreaFilled(false); closeButton.addActionListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { contributionManagerDialog.makeAndShowTab(false, false); @@ -302,7 +302,7 @@ public class ContributionTab { tryAgainButton.setContentAreaFilled(false); tryAgainButton.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.BLACK, 1),BorderFactory.createEmptyBorder(3, 0, 3, 0))); tryAgainButton.addActionListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { contributionManagerDialog.makeAndShowTab(false, true); @@ -342,11 +342,12 @@ public class ContributionTab { // } Collections.sort(categories); // categories.add(0, ContributionManagerDialog.ANY_CATEGORY); + @SuppressWarnings("unused") boolean categoriesFound = false; categoryChooser.addItem(ContributionManagerDialog.ANY_CATEGORY); for (String s : categories) { categoryChooser.addItem(s); - if (!s.equals("Unknown")) { + if (!s.equals(Contribution.UNKNOWN_CATEGORY)) { categoriesFound = true; } } @@ -405,6 +406,15 @@ public class ContributionTab { } } + protected void setFilterText(String filter) { + if (filter == null || filter.isEmpty()) { + filterField.setText(""); + } else { + filterField.setText(filter); + } + filterField.applyFilter(); + } + // private JPanel getPlaceholder() { // return contributionListPanel.statusPlaceholder; diff --git a/app/src/processing/app/contrib/ModeContribution.java b/app/src/processing/app/contrib/ModeContribution.java index d9200572a..bcc0b4b0d 100644 --- a/app/src/processing/app/contrib/ModeContribution.java +++ b/app/src/processing/app/contrib/ModeContribution.java @@ -24,8 +24,12 @@ package processing.app.contrib; import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; +import java.net.URL; import java.net.URLClassLoader; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import processing.app.Base; import processing.app.Mode; @@ -77,8 +81,7 @@ public class ModeContribution extends LocalContribution { private ModeContribution(Base base, File folder, String className) throws Exception { super(folder); - - className = initLoader(className); + className = initLoader(base, className); if (className != null) { Class modeClass = loader.loadClass(className); Base.log("Got mode class " + modeClass); @@ -131,11 +134,11 @@ public class ModeContribution extends LocalContribution { try { contribModes.add(new ModeContribution(base, folder, null)); } catch (NoSuchMethodError nsme) { - System.err.println(folder.getName() + " contains an incompatible Mode"); - System.err.println(nsme.getMessage()); + System.err.println(folder.getName() + " is not compatible with this version of Processing"); +// System.err.println(nsme.getMessage()); } catch (NoClassDefFoundError ncdfe) { - System.err.println(folder.getName() + " contains an incompatible Mode"); - System.err.println(ncdfe.getMessage()); + System.err.println(folder.getName() + " is not compatible with this version of Processing"); +// System.err.println(ncdfe.getMessage()); } catch (IgnorableException ig) { Base.log(ig.getMessage()); } catch (Throwable e) { @@ -176,6 +179,88 @@ public class ModeContribution extends LocalContribution { return loader.equals(other.loader) && mode.equals(other.getMode()); } + public String initLoader(Base base, String className) throws Exception { + + File modeDirectory = new File(folder, getTypeName()); + if (modeDirectory.exists()) { + Base.log("checking mode folder regarding " + className); + // If no class name specified, search the main .jar for the + // full name package and mode name. + if (className == null) { + String shortName = folder.getName(); + File mainJar = new File(modeDirectory, shortName + ".jar"); + if (mainJar.exists()) { + className = findClassInZipFile(shortName, mainJar); + } else { + throw new IgnorableException(mainJar.getAbsolutePath() + " does not exist."); + } + + if (className == null) { + throw new IgnorableException("Could not find " + shortName + + " class inside " + mainJar.getAbsolutePath()); + } + } + + ArrayList extraUrls = new ArrayList<>(); + if (imports != null && imports.size() > 0) { + // if the mode has any dependencies (defined as imports in mode.properties), + // add the dependencies to the classloader + + HashMap installedModes = new HashMap<>(); + for(Mode m: base.getModeList()){ + // Base.log("Mode contrib: " + m.getClass().getName() + " : "+ m.getFolder()); + installedModes.put(m.getClass().getName(), m); + } + + for(String modeImport: imports){ + if (installedModes.containsKey(modeImport)) { + Base.log("Found mode dependency " + modeImport); + File[] archives = Base.listJarFiles(new File(installedModes.get(modeImport). + getFolder().getAbsolutePath() + File.separator + "mode")); + if (archives != null && archives.length > 0) { + for (int i = 0; i < archives.length; i++) { + // Base.log("Adding jar dependency: " + archives[i].getAbsolutePath()); + extraUrls.add(archives[i].toURI().toURL()); + } + } + } else { + throw new IgnorableException("Dependency mode "+ modeImport + " could not be" + + " found. Can't load " + className); + } + } + } + + // Add .jar and .zip files from the "mode" folder into the classpath + File[] archives = Base.listJarFiles(modeDirectory); + if (archives != null && archives.length > 0) { + int arrLen = archives.length + extraUrls.size(); + URL[] urlList = new URL[arrLen]; + + int j = 0; + for (; j < extraUrls.size(); j++) { + //Base.log("Found archive " + archives[j] + " for " + getName()); + urlList[j] = extraUrls.get(j); + } + + for (int k = 0; k < archives.length; k++,j++) { + Base.log("Found archive " + archives[k] + " for " + getName()); + urlList[j] = archives[k].toURI().toURL(); + } + + loader = new URLClassLoader(urlList); + Base.log("loading above JARs with loader " + loader); +// System.out.println("listing classes for loader " + loader); +// listClasses(loader); + } + } + + // If no archives were found, just use the regular ClassLoader + if (loader == null) { + loader = Thread.currentThread().getContextClassLoader(); + } + return className; + } + // static protected List discover(File folder) { // File[] folders = listCandidates(folder, "mode"); @@ -185,4 +270,4 @@ public class ModeContribution extends LocalContribution { // return Arrays.asList(folders); // } // } -} +} \ No newline at end of file diff --git a/app/src/processing/app/contrib/ToolContribution.java b/app/src/processing/app/contrib/ToolContribution.java index 4e6dbb764..f5d5479a1 100644 --- a/app/src/processing/app/contrib/ToolContribution.java +++ b/app/src/processing/app/contrib/ToolContribution.java @@ -46,6 +46,11 @@ public class ToolContribution extends LocalContribution implements Tool { } catch (VerifyError ve) { // incompatible // avoid the excessive error spew that happens here + } catch (NoClassDefFoundError ncdfe) { + if (ncdfe.getMessage().contains("processing/app/Editor")) { + System.err.println("The Editor class has moved to the processing.app.ui package in Processing 3"); + } + } catch (Throwable e) { // unknown error e.printStackTrace(); } @@ -105,7 +110,7 @@ public class ToolContribution extends LocalContribution implements Tool { // } - static public ArrayList loadAll(File toolsFolder) { + static public List loadAll(File toolsFolder) { File[] list = ContributionType.TOOL.listCandidates(toolsFolder); ArrayList outgoing = new ArrayList(); // If toolsFolder does not exist or is inaccessible (stranger things have diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index 5eb732df8..b318e51d7 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -1288,6 +1288,11 @@ public abstract class Editor extends JFrame implements RunnerListener { System.err.println("The " + ncdfe.getMessage() + " class is no longer available."); Base.loge("Incompatible Tool found during tool.init()", ncdfe); + } catch (AbstractMethodError ame) { + System.err.println("\"" + tool.getMenuTitle() + "\" is not " + + "compatible with this version of Processing"); +// ame.printStackTrace(); + } catch (Error err) { System.err.println("An error occurred inside \"" + tool.getMenuTitle() + "\""); err.printStackTrace(); diff --git a/build/build.xml b/build/build.xml index ce91bb27b..5f4315b57 100644 --- a/build/build.xml +++ b/build/build.xml @@ -99,7 +99,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -547,6 +547,18 @@ --> + + + + + diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties index e5bd9914b..84f7900c9 100644 --- a/build/shared/lib/languages/PDE.properties +++ b/build/shared/lib/languages/PDE.properties @@ -350,6 +350,7 @@ editor.status.missing.right_curly_bracket = Missing right curly bracket "}" editor.status.missing.add = Consider adding "%s" editor.status.reserved_words = "color" and "int" are reserved words & cannot be used as variable names editor.status.undefined_method = The function "%s(%s)" does not exist +editor.status.undefined_constructor = The constructor "%s(%s)" does not exist editor.status.empty_param = The function "%s()" does not expect any parameters editor.status.wrong_param = The function "%s()" expects parameters like: "%s(%s)" editor.status.undef_global_var = The global variable "%s" does not exist diff --git a/core/src/processing/awt/PGraphicsJava2D.java b/core/src/processing/awt/PGraphicsJava2D.java index 9a4288bca..d64b31edd 100644 --- a/core/src/processing/awt/PGraphicsJava2D.java +++ b/core/src/processing/awt/PGraphicsJava2D.java @@ -2903,6 +2903,9 @@ public class PGraphicsJava2D extends PGraphics { if ((sourceX == 0) && (sourceY == 0) && (sourceWidth == sourceImage.width) && (sourceHeight == sourceImage.height)) { +// System.out.format("%d %d %dx%d %d%n", targetX, targetY, +// sourceImage.width, sourceImage.height, +// sourceImage.pixels.length); raster.setDataElements(targetX, targetY, sourceImage.width, sourceImage.height, sourceImage.pixels); diff --git a/core/src/processing/core/PApplet.java b/core/src/processing/core/PApplet.java index 44ea61124..4569ef34f 100644 --- a/core/src/processing/core/PApplet.java +++ b/core/src/processing/core/PApplet.java @@ -5294,7 +5294,8 @@ public class PApplet implements PConstants { } // if it's a .gif image, test to see if it has transparency - if (extension.equals("gif") || extension.equals("png")) { + if (extension.equals("gif") || extension.equals("png") || + extension.equals("unknown")) { image.checkAlpha(); } @@ -10651,6 +10652,24 @@ public class PApplet implements PConstants { } + public void attribPosition(String name, float x, float y, float z) { + if (recorder != null) recorder.attribPosition(name, x, y, z); + g.attribPosition(name, x, y, z); + } + + + public void attribNormal(String name, float nx, float ny, float nz) { + if (recorder != null) recorder.attribNormal(name, nx, ny, nz); + g.attribNormal(name, nx, ny, nz); + } + + + public void attribColor(String name, int color) { + if (recorder != null) recorder.attribColor(name, color); + g.attribColor(name, color); + } + + public void attrib(String name, float... values) { if (recorder != null) recorder.attrib(name, values); g.attrib(name, values); diff --git a/core/src/processing/core/PGraphics.java b/core/src/processing/core/PGraphics.java index 3e8eb9626..e19ced77d 100644 --- a/core/src/processing/core/PGraphics.java +++ b/core/src/processing/core/PGraphics.java @@ -1239,6 +1239,21 @@ public class PGraphics extends PImage implements PConstants { } + public void attribPosition(String name, float x, float y, float z) { + showMissingWarning("attrib"); + } + + + public void attribNormal(String name, float nx, float ny, float nz) { + showMissingWarning("attrib"); + } + + + public void attribColor(String name, int color) { + showMissingWarning("attrib"); + } + + public void attrib(String name, float... values) { showMissingWarning("attrib"); } diff --git a/core/src/processing/core/PImage.java b/core/src/processing/core/PImage.java index c8142540d..18755711c 100644 --- a/core/src/processing/core/PImage.java +++ b/core/src/processing/core/PImage.java @@ -309,18 +309,31 @@ public class PImage implements PConstants, Cloneable { BufferedImage bi = (BufferedImage) img; width = bi.getWidth(); height = bi.getHeight(); - pixels = new int[width * height]; - pixels = ((DataBufferInt) bi.getRaster().getDataBuffer()).getData(); int type = bi.getType(); - if (type == BufferedImage.TYPE_INT_ARGB) { - format = ARGB; - } else if (type == BufferedImage.TYPE_INT_RGB) { - for (int i = 0; i < pixels.length; i++) { - pixels[i] = 0xFF000000 | pixels[i]; + if (type == BufferedImage.TYPE_3BYTE_BGR || + type == BufferedImage.TYPE_4BYTE_ABGR) { + pixels = new int[width * height]; + bi.getRGB(0, 0, width, height, pixels, 0, width); + if (type == BufferedImage.TYPE_4BYTE_ABGR) { + format = ARGB; + } else { + opaque(); + } + } else { + DataBuffer db = bi.getRaster().getDataBuffer(); + if (db instanceof DataBufferInt) { + pixels = ((DataBufferInt) db).getData(); + if (type == BufferedImage.TYPE_INT_ARGB) { + format = ARGB; + } else if (type == BufferedImage.TYPE_INT_RGB) { + opaque(); + } } } - - } else { // go the old school java 1.0 route + } + // Implements fall-through if not DataBufferInt above, or not a + // known type, or not DataBufferInt for the data itself. + if (pixels == null) { // go the old school Java 1.0 route width = img.getWidth(null); height = img.getHeight(null); pixels = new int[width * height]; @@ -1263,6 +1276,14 @@ public class PImage implements PConstants, Cloneable { } + /** Set the high bits of all pixels to opaque. */ + protected void opaque() { + for (int i = 0; i < pixels.length; i++) { + pixels[i] = 0xFF000000 | pixels[i]; + } + } + + /** * Optimized code for building the blur kernel. * further optimized blur code (approx. 15% for radius=20) diff --git a/core/src/processing/core/PShape.java b/core/src/processing/core/PShape.java index 190aa0058..cdb78414b 100644 --- a/core/src/processing/core/PShape.java +++ b/core/src/processing/core/PShape.java @@ -716,6 +716,17 @@ public class PShape implements PConstants { } + public void attribPosition(String name, float x, float y, float z) { + } + + public void attribNormal(String name, float nx, float ny, float nz) { + } + + + public void attribColor(String name, int color) { + } + + public void attrib(String name, float... values) { } diff --git a/core/src/processing/core/ThinkDifferent.java b/core/src/processing/core/ThinkDifferent.java index ca299be6a..ca2903f91 100644 --- a/core/src/processing/core/ThinkDifferent.java +++ b/core/src/processing/core/ThinkDifferent.java @@ -71,6 +71,7 @@ public class ThinkDifferent { } + // Called via reflection from PSurfaceAWT and others static public void setIconImage(Image image) { // When already set, is a sun.awt.image.MultiResolutionCachedImage on OS X // Image current = application.getDockIconImage(); diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 0ba4c01d1..6a3692ae6 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -2625,39 +2625,73 @@ public class PGraphicsOpenGL extends PGraphics { } + @Override + public void attribPosition(String name, float x, float y, float z) { + VertexAttribute attrib = attribImpl(name, VertexAttribute.POSITION, + PGL.FLOAT, 3); + if (attrib != null) attrib.set(x, y, z); + } + + + @Override + public void attribNormal(String name, float nx, float ny, float nz) { + VertexAttribute attrib = attribImpl(name, VertexAttribute.NORMAL, + PGL.FLOAT, 3); + if (attrib != null) attrib.set(nx, ny, nz); + } + + + @Override + public void attribColor(String name, int color) { + VertexAttribute attrib = attribImpl(name, VertexAttribute.COLOR, PGL.INT, 1); + if (attrib != null) attrib.set(new int[] {color}); + } + + @Override public void attrib(String name, float... values) { - VertexAttribute attrib = attribImpl(name, PGL.FLOAT, values.length); + VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, + PGL.FLOAT, values.length); if (attrib != null) attrib.set(values); } @Override public void attrib(String name, int... values) { - VertexAttribute attrib = attribImpl(name, PGL.INT, values.length); + VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, + PGL.INT, values.length); if (attrib != null) attrib.set(values); } @Override public void attrib(String name, boolean... values) { - VertexAttribute attrib = attribImpl(name, PGL.BOOL, values.length); + VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, + PGL.BOOL, values.length); if (attrib != null) attrib.set(values); } - protected VertexAttribute attribImpl(String name, int type, int size) { + protected VertexAttribute attribImpl(String name, int kind, int type, int size) { if (4 < size) { PGraphics.showWarning("Vertex attributes cannot have more than 4 values"); return null; } VertexAttribute attrib = polyAttribs.get(name); if (attrib == null) { - attrib = new VertexAttribute(this, name, type, size); + attrib = new VertexAttribute(this, name, kind, type, size); polyAttribs.put(name, attrib); inGeo.initAttrib(attrib); tessGeo.initAttrib(attrib); } + if (attrib.kind != kind) { + PGraphics.showWarning("The attribute kind cannot be changed after creation"); + return null; + } + if (attrib.type != type) { + PGraphics.showWarning("The attribute type cannot be changed after creation"); + return null; + } if (attrib.size != size) { PGraphics.showWarning("New value for vertex attribute has wrong number of values"); return null; @@ -7398,23 +7432,17 @@ public class PGraphicsOpenGL extends PGraphics { int lastModified; boolean active; - VertexAttribute(PGraphicsOpenGL pg, String name, int type, int size) { + VertexAttribute(PGraphicsOpenGL pg, String name, int kind, int type, int size) { this.pg = pg; this.name = name; + this.kind = kind; this.type = type; this.size = size; - tessSize = size; - - if (name.indexOf("pos") == 0 && type == PGL.FLOAT && size == 3) { - kind = POSITION; - tessSize = 4; - } else if (name.indexOf("norm") == 0 && type == PGL.FLOAT && size == 3) { - kind = NORMAL; - } else if (name.indexOf("color") == 0 && type == PGL.INT && size == 1) { - kind = COLOR; + if (kind == POSITION) { + tessSize = 4; // for w } else { - kind = OTHER; + tessSize = size; } if (type == PGL.FLOAT) { @@ -7520,6 +7548,16 @@ public class PGraphicsOpenGL extends PGraphics { return length * tessSize * elementSize; } + void set(float x, float y, float z) { + fvalues[0] = x; + fvalues[1] = y; + fvalues[2] = z; + } + + void set(int c) { + ivalues[0] = c; + } + void set(float[] values) { PApplet.arrayCopy(values, 0, fvalues, 0, size); } diff --git a/core/src/processing/opengl/PShapeOpenGL.java b/core/src/processing/opengl/PShapeOpenGL.java index f3c130383..a73319d37 100644 --- a/core/src/processing/opengl/PShapeOpenGL.java +++ b/core/src/processing/opengl/PShapeOpenGL.java @@ -1170,38 +1170,73 @@ public class PShapeOpenGL extends PShape { } } + + @Override + public void attribPosition(String name, float x, float y, float z) { + VertexAttribute attrib = attribImpl(name, VertexAttribute.POSITION, + PGL.FLOAT, 3); + if (attrib != null) attrib.set(x, y, z); + } + + + @Override + public void attribNormal(String name, float nx, float ny, float nz) { + VertexAttribute attrib = attribImpl(name, VertexAttribute.NORMAL, + PGL.FLOAT, 3); + if (attrib != null) attrib.set(nx, ny, nz); + } + + + @Override + public void attribColor(String name, int color) { + VertexAttribute attrib = attribImpl(name, VertexAttribute.COLOR, PGL.INT, 1); + if (attrib != null) attrib.set(new int[] {color}); + } + + @Override public void attrib(String name, float... values) { - VertexAttribute attrib = attribImpl(name, PGL.FLOAT, values.length); + VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.FLOAT, + values.length); if (attrib != null) attrib.set(values); } @Override public void attrib(String name, int... values) { - VertexAttribute attrib = attribImpl(name, PGL.INT, values.length); + VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.INT, + values.length); if (attrib != null) attrib.set(values); } @Override public void attrib(String name, boolean... values) { - VertexAttribute attrib = attribImpl(name, PGL.BOOL, values.length); + VertexAttribute attrib = attribImpl(name, VertexAttribute.OTHER, PGL.BOOL, + values.length); if (attrib != null) attrib.set(values); } - protected VertexAttribute attribImpl(String name, int type, int size) { + protected VertexAttribute attribImpl(String name, int kind, int type, int size) { if (4 < size) { PGraphics.showWarning("Vertex attributes cannot have more than 4 values"); return null; } VertexAttribute attrib = polyAttribs.get(name); if (attrib == null) { - attrib = new VertexAttribute(pg, name, type, size); + attrib = new VertexAttribute(pg, name, kind, type, size); polyAttribs.put(name, attrib); inGeo.initAttrib(attrib); } + if (attrib.kind != kind) { + PGraphics.showWarning("The attribute kind cannot be changed after creation"); + return null; + } + if (attrib.type != type) { + PGraphics.showWarning("The attribute type cannot be changed after creation"); + return null; + } if (attrib.size != size) { PGraphics.showWarning("New value for vertex attribute has wrong number of values"); return null; diff --git a/core/todo.txt b/core/todo.txt index 5b745d5ab..b52e7d504 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -46,6 +46,9 @@ X https://github.com/processing/processing/issues/3413 X SVG briefly broken for Java2D X https://github.com/processing/processing/issues/3417 X change how font metrics are pulled to fix text width issues +X check alpha when image extension is "unknown" +X https://github.com/processing/processing/issues/3442 +X add support for more Image types (BGR) with PImage(java.awt.Image) constructor threading headaches X sketch not always showing with empty draw() @@ -93,6 +96,10 @@ X errors with loading SVGs in P3D/P2D X https://github.com/processing/processing/issues/3379 X sketch window briefly appears on top left corner when using OpenGL X https://github.com/processing/processing/issues/3308 +X add attrib() method +X https://github.com/processing/processing/issues/2963 +X andres needs input on how the api works +o assign this to DXF as well? contribs X Fix NullPointerException in DepthSorter @@ -130,6 +137,8 @@ _ update wiki/docs to say "don't override sketchXxxx() methods" beta X move Java2D and JavaFX classes to their own packages _ make notes about this in the README +_ move AWT image loading into PImageAWT +_ look into how GL and FX will handle from there _ run only the necessary pieces on the EDT _ in part because FX doesn't even use the EDT _ re-check the Linux frame visibility stuff @@ -175,10 +184,6 @@ _ https://www.linkedin.com/pulse/oracle-just-removed-javafx-support-arm-jan-sn opengl _ hard crash at 1920x1080, mirrored, Casey's GT 650M 1GB -_ add attrib() method -_ https://github.com/processing/processing/issues/2963 -_ andres needs input on how the api works -_ assign this to DXF as well? _ window loses focus after maximizing _ https://github.com/processing/processing/issues/3339 diff --git a/java/libraries/pdf/examples/LargePage/LargePage.pde b/java/libraries/pdf/examples/LargePage/LargePage.pde index 8e6e92009..58a6d596d 100644 --- a/java/libraries/pdf/examples/LargePage/LargePage.pde +++ b/java/libraries/pdf/examples/LargePage/LargePage.pde @@ -5,6 +5,7 @@ * than the screen. When PDF is used as the renderer * (the third parameter of size) the display window * does not open. The file is saved to the sketch folder. + * You can open it by "Sketch->Show Sketch Folder." */ diff --git a/java/src/processing/mode/java/pdex/ErrorMessageSimplifier.java b/java/src/processing/mode/java/pdex/ErrorMessageSimplifier.java index fe0827fe8..64482276f 100644 --- a/java/src/processing/mode/java/pdex/ErrorMessageSimplifier.java +++ b/java/src/processing/mode/java/pdex/ErrorMessageSimplifier.java @@ -164,6 +164,21 @@ public class ErrorMessageSimplifier { } break; + case IProblem.UndefinedConstructor: + if (args.length == 2) { + String constructorName = args[0]; + // For messages such as "contructor sketch_name.ClassXYZ() is undefined", change + // constructor name to "ClassXYZ()". See #3434 + if (constructorName.contains(".")) { + // arg[0] contains sketch name twice: sketch_150705a.sketch_150705a.Thing + constructorName = constructorName.substring(constructorName.indexOf('.') + 1); + constructorName = constructorName.substring(constructorName.indexOf('.') + 1); + } + String constructorArgs = removePackagePrefixes(args[args.length - 1]); + result = Language.interpolate("editor.status.undefined_constructor", constructorName, constructorArgs); + } + break; + case IProblem.UndefinedMethod: if (args.length > 2) { String methodName = args[args.length - 2]; diff --git a/todo.txt b/todo.txt index cfd9dbfa2..6ae0f9424 100644 --- a/todo.txt +++ b/todo.txt @@ -18,6 +18,12 @@ X https://github.com/processing/processing/issues/3394 X Tweak mode broken (re: new settings() function) X https://github.com/processing/processing/issues/3435 X looks like 'class' def from tweak needs to go below setup +X change "PythonMode contains an incompatible Mode" message +X to "PythonMode is not compatible with Processing 3" +X another "incompatible tool" case +X java.lang.AbstractMethodError +X at processing.app.contrib.ToolContribution.init(ToolContribution.java:134) +X unfortunately happens at a level where we can only println about it manager X changed compatibleModesList to modes in examples.properties @@ -42,6 +48,8 @@ X https://github.com/processing/processing/issues/3111 X Re-enable export to application with command line X https://github.com/processing/processing/pull/3451 X https://github.com/processing/processing/issues/2760 +X change undefined constructor error message for clarity +X https://github.com/processing/processing/issues/3434 gsoc X Mode problems window wasn't doing line breaks @@ -65,6 +73,10 @@ X https://github.com/processing/processing/issues/3429 X https://github.com/processing/processing/pull/3438 X CM with updated statusPanel and error popup X https://github.com/processing/processing/pull/3452 +X allow modes to import other modes +X https://github.com/processing/processing/pull/3444 +X CM list converted into table +X https://github.com/processing/processing/pull/3454 cleaning o libraries in java tabs (separate .java files) are reported missing @@ -77,6 +89,7 @@ contribs pending _ Ready to add contributed example packages? _ https://github.com/processing/processing/issues/2953 + beta _ make modes load their parent class _ https://github.com/processing/processing/issues/3443 @@ -134,6 +147,7 @@ _ recent menu gets huge with other p5 versions on osx pde/build +_ Cannot find "processing.core" library. Line 12 in tab sketch_150704a _ dim out the Run button if there are compile errors detected _ the AST checker has better error message handling for those cases _ and hitting Run replaces the useful error with something weird