diff --git a/app/src/processing/app/contrib/StatusPanel.java b/app/src/processing/app/contrib/StatusPanel.java
index da1e250ff..bfc07ad2d 100644
--- a/app/src/processing/app/contrib/StatusPanel.java
+++ b/app/src/processing/app/contrib/StatusPanel.java
@@ -344,10 +344,7 @@ class StatusPanel extends JPanel {
String.format("%s", Language.text("contrib.messages.update_restart"));
static String updateDescription(Contribution contrib) {
- // Avoid ugly synthesized bold
-// Font boldFont = ManagerFrame.SMALL_BOLD;
-// String fontFace = "";
- String fontFace = "";
+ String fontFace = "";
StringBuilder desc = new StringBuilder();
desc.append("");
diff --git a/app/src/processing/app/laf/FlatLaf.properties b/app/src/processing/app/laf/FlatLaf.properties
index f0988360e..d21d94540 100644
--- a/app/src/processing/app/laf/FlatLaf.properties
+++ b/app/src/processing/app/laf/FlatLaf.properties
@@ -1,8 +1,3 @@
-# TODO sort out how to import this via the language properties
-# (probably needs to be set programmatically instead)
-defaultFont = 14 "Processing Sans", "Open Sans", "Noto Sans", Roboto, Arial
-
-
# The default is 8, which creates tiny nubby scroll bars
ScrollBar.width = 16
diff --git a/app/src/processing/app/platform/DefaultPlatform.java b/app/src/processing/app/platform/DefaultPlatform.java
index e56aad6d5..fb59494eb 100644
--- a/app/src/processing/app/platform/DefaultPlatform.java
+++ b/app/src/processing/app/platform/DefaultPlatform.java
@@ -36,6 +36,7 @@ import com.sun.jna.Library;
import com.sun.jna.Native;
import processing.app.Base;
+import processing.app.Language;
import processing.app.Preferences;
import processing.app.ui.Toolkit;
import processing.awt.ShimAWT;
@@ -113,9 +114,15 @@ public class DefaultPlatform {
// (i.e. Nimbus on Linux) with our custom components is badness.
// dummy font call so that it's registered for FlatLaf
- Toolkit.getSansFont(12, Font.PLAIN);
+ Font defaultFont = Toolkit.getSansFont(14, Font.PLAIN);
+
// pull in FlatLaf.properties from the processing.app.laf folder
FlatLaf.registerCustomDefaultsSource("processing.app.laf");
+
+ // defaultFont = 14 "Processing Sans", "Open Sans", "Noto Sans", Roboto, Arial
+ //UIManager.put("defaultFont", "14 \"Processing Sans\", \"Open Sans\", \"Noto Sans\", Roboto, Arial");
+ UIManager.put("defaultFont", defaultFont);
+
// start with Light, but updateTheme() will be called soon
UIManager.setLookAndFeel(new FlatLightLaf());
diff --git a/app/src/processing/app/ui/Toolkit.java b/app/src/processing/app/ui/Toolkit.java
index fb759442e..a365ed41d 100644
--- a/app/src/processing/app/ui/Toolkit.java
+++ b/app/src/processing/app/ui/Toolkit.java
@@ -30,8 +30,6 @@ import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
-import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.RenderingHints;
@@ -54,7 +52,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
-import java.util.Locale;
import java.util.regex.Pattern;
import javax.swing.Action;
@@ -1109,13 +1106,12 @@ public class Toolkit {
// A 5-minute search didn't turn up any such event in the Java API.
// Also, should we use the Toolkit associated with the editor window?
static private boolean checkRetina() {
- GraphicsDevice graphicsDevice = GraphicsEnvironment
- .getLocalGraphicsEnvironment()
- .getDefaultScreenDevice();
- GraphicsConfiguration graphicsConfig = graphicsDevice
- .getDefaultConfiguration();
+ AffineTransform tx = GraphicsEnvironment
+ .getLocalGraphicsEnvironment()
+ .getDefaultScreenDevice()
+ .getDefaultConfiguration()
+ .getDefaultTransform();
- AffineTransform tx = graphicsConfig.getDefaultTransform();
return Math.round(tx.getScaleX()) == 2;
}
@@ -1187,11 +1183,7 @@ public class Toolkit {
/** Get the name of the default (built-in) monospaced font. */
static public String getMonoFontName() {
- if (monoFont == null) {
- // create a dummy version if the font has never been loaded (rare)
- getMonoFont(12, Font.PLAIN);
- }
- return monoFont.getName();
+ return getMonoFont(12, Font.PLAIN).getName();
}
@@ -1203,30 +1195,30 @@ public class Toolkit {
* https://www.oracle.com/java/technologies/javase/11-relnote-issues.html#JDK-8191522
*/
static public Font getMonoFont(int size, int style) {
- if (monoFont == null) {
- try {
-// monoFont = createFont("SourceCodePro-Regular.ttf", Font.PLAIN, size);
-// monoBoldFont = createFont("SourceCodePro-Bold.ttf", Font.BOLD, size);
- monoFont = createFont("SourceCodePro-Regular.ttf", size);
- monoBoldFont = createFont("SourceCodePro-Bold.ttf", size);
+ // Prior to 4.0 beta 9, we had a manual override for
+ // individual languages to use SansSerif instead.
+ // In beta 9, that was moved to the language translation file.
+ // https://github.com/processing/processing/issues/2886
+ // https://github.com/processing/processing/issues/4944
+ String fontFamilyMono = Language.text("font.family.mono");
- // https://github.com/processing/processing/issues/2886
- // https://github.com/processing/processing/issues/4944
- String lang = Language.getLanguage();
- if ("el".equals(lang) ||
- "ar".equals(lang) ||
- Locale.CHINESE.getLanguage().equals(lang) ||
- Locale.JAPANESE.getLanguage().equals(lang) ||
- Locale.KOREAN.getLanguage().equals(lang)) {
- monoFont = new Font("Monospaced", Font.PLAIN, size);
- monoBoldFont = new Font("Monospaced", Font.BOLD, size);
+ if (monoFont == null || monoBoldFont == null) {
+ try {
+ if ("Source Code Pro".equals(fontFamilyMono)) {
+ monoFont = initFont("SourceCodePro-Regular.ttf", size);
+ monoBoldFont = initFont("SourceCodePro-Bold.ttf", size);
}
} catch (Exception e) {
Messages.err("Could not load mono font", e);
- monoFont = new Font("Monospaced", Font.PLAIN, size);
- monoBoldFont = new Font("Monospaced", Font.BOLD, size);
}
}
+
+ // If not using Source Code Pro above, or an Exception was thrown
+ if (monoFont == null || monoBoldFont == null) {
+ monoFont = new Font(fontFamilyMono, Font.PLAIN, size);
+ monoBoldFont = new Font(fontFamilyMono, Font.BOLD, size);
+ }
+
if (style == Font.BOLD) {
if (size == monoBoldFont.getSize()) {
return monoBoldFont;
@@ -1243,77 +1235,36 @@ public class Toolkit {
}
- /*
static public String getSansFontName() {
- if (sansFont == null) {
- // create a dummy version if the font has never been loaded (rare)
- getSansFont(12, Font.PLAIN);
- }
- return sansFont.getName();
- }
- */
-
-
- static public Font getSansFont() {
- return getSansFont(0, Font.PLAIN);
- }
-
-
- static public Font getBoldFont() {
- return getSansFont(0, Font.BOLD);
+ return getSansFont(12, Font.PLAIN).getName();
}
static public Font getSansFont(int size, int style) {
- if (sansFont == null) {
+ // Prior to 4.0 beta 9, we had a manual override for
+ // individual languages to use SansSerif instead.
+ // In beta 9, that was moved to the language translation file.
+ // https://github.com/processing/processing/issues/2886
+ // https://github.com/processing/processing/issues/4944
+ String fontFamilySans = Language.text("font.family.sans");
+
+ if (sansFont == null || sansBoldFont == null) {
try {
- sansFont = createFont("ProcessingSans-Regular.ttf", size);
- sansBoldFont = createFont("ProcessingSans-Bold.ttf", size);
- // test what the synthesized bold looks like
- //sansBoldFont = sansFont.deriveFont(Font.BOLD);
-
- /*
- // during beta 9, a bit of testing to make sure the right font is used
- GraphicsEnvironment ge =
- GraphicsEnvironment.getLocalGraphicsEnvironment();
- Font[] fonts = ge.getAllFonts();
- // even though these both come through as 'plain' the styles work
- for (Font font : fonts) {
- if (font.getName().contains("Processing")) {
- System.out.println(font);
- }
- }
- // there are no bold fonts
- for (Font font : fonts) {
- if (font.getStyle() == Font.BOLD) {
- System.out.println("found bold: " + font);
- }
- }
- // these pass, with the current code; even without doing
- // deriveFont(Font.BOLD) before the registerFont() call.
- Font f = new Font("Processing Sans", Font.BOLD, 12);
- System.out.println("hopefully ProcessingSans-Bold: " + f.getPSName());
- f = new Font("Processing Sans", Font.PLAIN, 12);
- System.out.println("hopefully ProcessingSans-Regular: " + f.getPSName());
- */
-
- // https://github.com/processing/processing/issues/2886
- // https://github.com/processing/processing/issues/4944
- String lang = Language.getLanguage();
- if ("el".equals(lang) ||
- "ar".equals(lang) ||
- Locale.CHINESE.getLanguage().equals(lang) ||
- Locale.JAPANESE.getLanguage().equals(lang) ||
- Locale.KOREAN.getLanguage().equals(lang)) {
- sansFont = new Font("SansSerif", Font.PLAIN, size);
- sansBoldFont = new Font("SansSerif", Font.BOLD, size);
+ if ("Processing Sans".equals(fontFamilySans)) {
+ sansFont = initFont("ProcessingSans-Regular.ttf", size);
+ sansBoldFont = initFont("ProcessingSans-Bold.ttf", size);
}
} catch (Exception e) {
Messages.err("Could not load sans font", e);
- sansFont = new Font("SansSerif", Font.PLAIN, size);
- sansBoldFont = new Font("SansSerif", Font.BOLD, size);
}
}
+
+ // If not using "Processing Sans" above, or an Exception was thrown
+ if (sansFont == null || sansBoldFont == null) {
+ sansFont = new Font(fontFamilySans, Font.PLAIN, size);
+ sansBoldFont = new Font(fontFamilySans, Font.BOLD, size);
+ }
+
if (style == Font.BOLD) {
if (size == sansBoldFont.getSize() || size == 0) {
return sansBoldFont;
@@ -1331,12 +1282,12 @@ public class Toolkit {
/**
- * Get a font from the lib/fonts folder. Our default fonts are also
- * installed there so that the monospace (and others) can be used by other
- * font listing calls (i.e. it appears in the list of monospace fonts in
- * the Preferences window, and can be used by HTMLEditorKit for WebFrame).
+ * Load a built-in font from the Processing lib/fonts folder and register
+ * it with the GraphicsEnvironment so that it's broadly available.
+ * (i.e. shows up in getFontList() works, so it appears in the list of fonts
+ * in the Preferences window, and can be used by HTMLEditorKit for WebFrame.)
*/
- static private Font createFont(String filename, int size) throws IOException, FontFormatException {
+ static private Font initFont(String filename, int size) throws IOException, FontFormatException {
File fontFile = Platform.getContentFile("lib/fonts/" + filename);
if (fontFile == null || !fontFile.exists()) {
@@ -1357,13 +1308,8 @@ public class Toolkit {
Font font = Font.createFont(Font.TRUETYPE_FONT, input);
input.close();
- // make sure it's the correct weight (plain or bold) and specify a size
-// System.out.println("about to derive " + font);
-// font = font.deriveFont(style, size);
-// System.out.println("derived to " + font);
-
- GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
- ge.registerFont(font);
+ // Register the font to be available for other function calls
+ GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);
return font.deriveFont((float) size);
}
diff --git a/build/shared/lib/languages/PDE.properties b/build/shared/lib/languages/PDE.properties
index 54a05e4b6..e6bd62eb3 100644
--- a/build/shared/lib/languages/PDE.properties
+++ b/build/shared/lib/languages/PDE.properties
@@ -5,6 +5,10 @@
# ---------------------------------------
+font.family.sans = Processing Sans
+font.family.mono = Source Code Pro
+
+
# ---------------------------------------
# Menu
diff --git a/build/shared/lib/languages/PDE_ar.properties b/build/shared/lib/languages/PDE_ar.properties
index 3572ec04d..ce2bc31e9 100644
--- a/build/shared/lib/languages/PDE_ar.properties
+++ b/build/shared/lib/languages/PDE_ar.properties
@@ -5,6 +5,11 @@
# ---------------------------------------
+# Use the built-in fonts because they have full character support
+font.family.sans = SansSerif
+font.family.mono = Monospaced
+
+
# ---------------------------------------
# Menu
diff --git a/build/shared/lib/languages/PDE_ja.properties b/build/shared/lib/languages/PDE_ja.properties
index a2c7b00f3..45b30a06a 100644
--- a/build/shared/lib/languages/PDE_ja.properties
+++ b/build/shared/lib/languages/PDE_ja.properties
@@ -5,6 +5,11 @@
# ---------------------------------------
+# Use the built-in fonts because they have full character support
+font.family.sans = SansSerif
+font.family.mono = Monospaced
+
+
# ---------------------------------------
# Menu
diff --git a/build/shared/lib/languages/PDE_ko.properties b/build/shared/lib/languages/PDE_ko.properties
index f7156963d..0f13cb121 100644
--- a/build/shared/lib/languages/PDE_ko.properties
+++ b/build/shared/lib/languages/PDE_ko.properties
@@ -5,6 +5,11 @@
# ---------------------------------------
+# Use the built-in fonts because they have full character support
+font.family.sans = SansSerif
+font.family.mono = Monospaced
+
+
# ---------------------------------------
# Menu
diff --git a/build/shared/lib/languages/PDE_zh.properties b/build/shared/lib/languages/PDE_zh.properties
index c8a6f916c..3d87c6af5 100644
--- a/build/shared/lib/languages/PDE_zh.properties
+++ b/build/shared/lib/languages/PDE_zh.properties
@@ -5,6 +5,11 @@
# ---------------------------------------
+# Use the built-in fonts because they have full character support
+font.family.sans = SansSerif
+font.family.mono = Monospaced
+
+
# ---------------------------------------
# Menu
diff --git a/todo.txt b/todo.txt
index c66eb0791..185cbefd3 100755
--- a/todo.txt
+++ b/todo.txt
@@ -11,6 +11,9 @@ X https://github.com/processing/processing4/issues/491
X git bisect good ccc62c6 / git bisect bad f583eef
X https://github.com/processing/processing4/commit/0f9b290398aac86ef56fe3c4e9c3ff88fdd53466
X introduces https://github.com/processing/processing4/issues/519
+X can't ship before ui.font and language bits sorted out
+X otherwise the override to use Source Sans Pro will hose other languages
+X make note of language change (Greek also removed)
export application
X fix Export to Application on macOS with Apple Silicon
@@ -246,8 +249,7 @@ _ dialog formatting fixes
_ move all (formerly Lucida) dialog formatting into Messages
_ currently a couple other classes that use it
_ create a version that works nicely with FlatLaf
-_ can't ship before ui.font and language bits sorted out
-_ otherwise the override to use Source Sans Pro will hose other languages
+_ fix fonts in the welcome page
_ using other JavaFX classes now that they're modules
_ https://github.com/processing/processing4-javafx/issues/15
_ update theme instructions