From a4f112ce10c9d1c5080c4ba8e69726badf686a84 Mon Sep 17 00:00:00 2001 From: A Pottinger Date: Sun, 19 Apr 2020 23:12:50 -0700 Subject: [PATCH] Switch to VAqua on Mac for dark mode and non-terrible jfilechooser. --- app/build.xml | 3 +- .../app/platform/DefaultPlatform.java | 64 ++++++++++++++++++- app/src/processing/app/ui/EditorConsole.java | 3 +- build/build.xml | 2 + java/build.xml | 1 + .../mode/java/debug/VariableInspector.java | 2 +- 6 files changed, 71 insertions(+), 4 deletions(-) diff --git a/app/build.xml b/app/build.xml index 2fdf8afe0..1ece8d30e 100644 --- a/app/build.xml +++ b/app/build.xml @@ -39,7 +39,8 @@ lib/ant.jar; lib/ant-launcher.jar; lib/jna.jar; - lib/jna-platform.jar" + lib/jna-platform.jar; + lib/vaqua7.jar" debug="on" nowarn="true"> diff --git a/app/src/processing/app/platform/DefaultPlatform.java b/app/src/processing/app/platform/DefaultPlatform.java index 97afad1fc..27b7a2151 100644 --- a/app/src/processing/app/platform/DefaultPlatform.java +++ b/app/src/processing/app/platform/DefaultPlatform.java @@ -23,14 +23,19 @@ package processing.app.platform; +import java.awt.Color; +import java.awt.Component; import java.awt.Desktop; +import java.awt.Graphics; import java.io.File; import java.net.URI; +import javax.swing.Icon; import javax.swing.UIManager; import com.sun.jna.Library; import com.sun.jna.Native; +import org.violetlib.aqua.AquaLookAndFeel; import processing.app.Base; import processing.app.Preferences; @@ -75,7 +80,20 @@ public class DefaultPlatform { public void setLookAndFeel() throws Exception { String laf = Preferences.get("editor.laf"); if (laf == null || laf.length() == 0) { // normal situation - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + if (System.getProperty("os.name", "").startsWith("Mac OS")) { + UIManager.setLookAndFeel("org.violetlib.aqua.AquaLookAndFeel"); + + Icon collapse = new MacTreeIcon(true); + Icon open = new MacTreeIcon(false); + Icon leaf = new MacEmptyIcon(); + UIManager.put("Tree.closedIcon", leaf); + UIManager.put("Tree.openIcon", leaf); + UIManager.put("Tree.collapsedIcon", open); + UIManager.put("Tree.expandedIcon", collapse); + UIManager.put("Tree.leafIcon", leaf); + } else { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } } else { UIManager.setLookAndFeel(laf); } @@ -188,4 +206,48 @@ public class DefaultPlatform { return ZOOM_DEFAULT_SIZING; } + class MacEmptyIcon implements Icon { + private final int SIZE = 1; + + public MacEmptyIcon() { + } + + public int getIconWidth() { + return SIZE; + } + + public int getIconHeight() { + return SIZE; + } + + public void paintIcon(Component c, Graphics g, int x, int y) {} + } + + class MacTreeIcon implements Icon { + private final int SIZE = 12; + private final boolean isOpen; + + public MacTreeIcon(boolean newIsOpen) { + isOpen = newIsOpen; + } + + public int getIconWidth() { + return SIZE; + } + + public int getIconHeight() { + return SIZE; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + g.setColor(Color.GRAY); + + g.drawLine(x + SIZE / 2 - 3, y + SIZE / 2, x + SIZE / 2 + 3, y + SIZE / 2); + + if (!isOpen) { + g.drawLine(x + SIZE / 2, y + SIZE / 2 - 3, x + SIZE / 2, y + SIZE / 2 + 3); + } + } + } + } diff --git a/app/src/processing/app/ui/EditorConsole.java b/app/src/processing/app/ui/EditorConsole.java index 186e692b9..ecdd6e897 100644 --- a/app/src/processing/app/ui/EditorConsole.java +++ b/app/src/processing/app/ui/EditorConsole.java @@ -188,7 +188,8 @@ public class EditorConsole extends JScrollPane { StyleConstants.setBold(errStyle, font.isBold()); StyleConstants.setItalic(errStyle, font.isItalic()); - if (UIManager.getLookAndFeel().getID().equals("Nimbus")) { + String lookAndFeel = UIManager.getLookAndFeel().getID(); + if (lookAndFeel.equals("Nimbus") || lookAndFeel.equals("VAqua")) { getViewport().setBackground(bgColor); consoleTextPane.setOpaque(false); consoleTextPane.setBackground(new Color(0, 0, 0, 0)); diff --git a/build/build.xml b/build/build.xml index 0f0ecd49e..94e33eb48 100644 --- a/build/build.xml +++ b/build/build.xml @@ -424,6 +424,7 @@ + @@ -721,6 +722,7 @@ + diff --git a/java/build.xml b/java/build.xml index ff397d21e..98dda0f15 100644 --- a/java/build.xml +++ b/java/build.xml @@ -54,6 +54,7 @@ + diff --git a/java/src/processing/mode/java/debug/VariableInspector.java b/java/src/processing/mode/java/debug/VariableInspector.java index 7b1227150..682d7e8c5 100644 --- a/java/src/processing/mode/java/debug/VariableInspector.java +++ b/java/src/processing/mode/java/debug/VariableInspector.java @@ -610,7 +610,7 @@ public class VariableInspector extends JDialog { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - setForeground(tree.isEnabled() ? Color.BLACK : Color.GRAY); + //setForeground(tree.isEnabled() ? Color.BLACK : Color.GRAY); if (value instanceof VariableNode) { VariableNode var = (VariableNode) value;