diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java
index b9d86282f..027a33f9e 100644
--- a/app/src/processing/app/Base.java
+++ b/app/src/processing/app/Base.java
@@ -185,6 +185,9 @@ public class Base {
// run static initialization that grabs all the prefs
Preferences.init();
+ // get colors for ui elements (after prefs, since depends on font choices)
+ Theme.init();
+
if (!SingleInstance.alreadyRunning(args)) {
// Set the look and feel before opening the window
try {
diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java
index 82373badc..60677bbf6 100644
--- a/app/src/processing/app/Mode.java
+++ b/app/src/processing/app/Mode.java
@@ -190,11 +190,12 @@ public abstract class Mode {
}
- /**
- * Setup additional elements that are only required when running with a GUI,
- * rather than from the command-line. Note that this will not be called when
- * the Mode is used from the command line (because Base will be null).
- */
+// /**
+// * Setup additional elements that are only required when running with a GUI,
+// * rather than from the command-line. Note that this will not be called when
+// * the Mode is used from the command line (because Base will be null).
+// */
+ /*
public void setupGUI() {
try {
// First load the default theme data for the whole PDE.
@@ -226,6 +227,7 @@ public abstract class Mode {
"Could not load theme.txt, please re-install Processing", e);
}
}
+ */
public File getContentFile(String path) {
@@ -795,12 +797,14 @@ public abstract class Mode {
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+ /*
// Get attributes/values from the theme.txt file. To discourage burying this
// kind of information in code where it doesn't belong (and is difficult to
// track down), these don't have a "default" option as a second parameter.
- /** @since 3.0a6 */
+ // removing, this doesn't seem to have been in use
+ /// @since 3.0a6
public String getString(String attribute) {
return theme.get(attribute);
}
@@ -878,6 +882,7 @@ public abstract class Mode {
// }
return outgoing;
}
+ */
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
diff --git a/app/src/processing/app/Settings.java b/app/src/processing/app/Settings.java
index ca4aacad1..e30592361 100644
--- a/app/src/processing/app/Settings.java
+++ b/app/src/processing/app/Settings.java
@@ -106,7 +106,12 @@ public class Settings {
public void save() {
- PrintWriter writer = PApplet.createWriter(file);
+ save(file); // save back to the original file
+ }
+
+
+ public void save(File outputFile) {
+ PrintWriter writer = PApplet.createWriter(outputFile);
for (String key : table.keySet()) {
writer.println(key + "=" + table.get(key));
diff --git a/app/src/processing/app/contrib/ContributionManager.java b/app/src/processing/app/contrib/ContributionManager.java
index 4638c64d5..6c6b09196 100644
--- a/app/src/processing/app/contrib/ContributionManager.java
+++ b/app/src/processing/app/contrib/ContributionManager.java
@@ -141,14 +141,6 @@ public class ContributionManager {
/**
* Non-blocking call to download and install a contribution in a new thread.
- *
- * @param url
- * Direct link to the contribution.
- * @param toBeReplaced
- * The Contribution that will be replaced by this library being
- * installed (e.g. an advertised version of a contribution, or the
- * old version of a contribution that is being updated). Must not be
- * null.
*/
static void downloadAndInstall(final Base base,
final URL url,
diff --git a/app/src/processing/app/contrib/ManagerFrame.java b/app/src/processing/app/contrib/ManagerFrame.java
index 3e25531bf..de38eb444 100644
--- a/app/src/processing/app/contrib/ManagerFrame.java
+++ b/app/src/processing/app/contrib/ManagerFrame.java
@@ -28,6 +28,7 @@ import javax.swing.*;
import processing.app.*;
import processing.app.ui.Editor;
+import processing.app.ui.Theme;
import processing.app.ui.Toolkit;
@@ -109,9 +110,11 @@ public class ManagerFrame {
frame.setResizable(true);
- Container c = frame.getContentPane();
- c.add(tabs);
- c.setBackground(base.getDefaultMode().getColor("manager.tab.background"));
+// Container c = frame.getContentPane();
+// c.add(tabs);
+// c.setBackground(Theme.getColor("manager.tab.background"));
+ frame.getContentPane().add(tabs);
+ updateTheme();
frame.validate();
frame.repaint();
@@ -124,6 +127,11 @@ public class ManagerFrame {
}
+ protected void updateTheme() {
+ frame.getContentPane().setBackground(Theme.getColor("manager.tab.background"));
+ }
+
+
/**
* Close the window after an OK or Cancel.
*/
@@ -142,20 +150,16 @@ public class ManagerFrame {
}
});
// handle window closing commands for ctrl/cmd-W or hitting ESC.
- Toolkit.registerWindowCloseKeys(frame.getRootPane(), new ActionListener() {
- public void actionPerformed(ActionEvent actionEvent) {
- disposeFrame();
- }
- });
+ Toolkit.registerWindowCloseKeys(frame.getRootPane(), actionEvent -> disposeFrame());
frame.getContentPane().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
- //System.out.println(e);
- KeyStroke wc = Toolkit.WINDOW_CLOSE_KEYSTROKE;
- if ((e.getKeyCode() == KeyEvent.VK_ESCAPE)
- || (KeyStroke.getKeyStrokeForEvent(e).equals(wc))) {
- disposeFrame();
- }
+ //System.out.println(e);
+ KeyStroke wc = Toolkit.WINDOW_CLOSE_KEYSTROKE;
+ if ((e.getKeyCode() == KeyEvent.VK_ESCAPE)
+ || (KeyStroke.getKeyStrokeForEvent(e).equals(wc))) {
+ disposeFrame();
+ }
}
});
}
diff --git a/app/src/processing/app/contrib/ManagerTabs.java b/app/src/processing/app/contrib/ManagerTabs.java
index 8cc1e5d33..571a059c7 100644
--- a/app/src/processing/app/contrib/ManagerTabs.java
+++ b/app/src/processing/app/contrib/ManagerTabs.java
@@ -40,6 +40,7 @@ import javax.swing.border.EmptyBorder;
import processing.app.Base;
import processing.app.Mode;
+import processing.app.ui.Theme;
import processing.app.ui.Toolkit;
@@ -100,14 +101,14 @@ public class ManagerTabs extends Box {
// But use the default (Java) mode settings just in case.
mode = base.getDefaultMode();
- textColor[SELECTED] = mode.getColor("manager.tab.text.selected.color");
- textColor[UNSELECTED] = mode.getColor("manager.tab.text.unselected.color");
- font = mode.getFont("manager.tab.text.font");
+ textColor[SELECTED] = Theme.getColor("manager.tab.text.selected.color");
+ textColor[UNSELECTED] = Theme.getColor("manager.tab.text.unselected.color");
+ font = Theme.getFont("manager.tab.text.font");
- tabColor[SELECTED] = mode.getColor("manager.tab.selected.color");
- tabColor[UNSELECTED] = mode.getColor("manager.tab.unselected.color");
+ tabColor[SELECTED] = Theme.getColor("manager.tab.selected.color");
+ tabColor[UNSELECTED] = Theme.getColor("manager.tab.unselected.color");
- gradient = mode.makeGradient("manager.tab", Toolkit.zoom(400), HIGH);
+ gradient = Theme.makeGradient("manager.tab", Toolkit.zoom(400), HIGH);
setBorder(new EmptyBorder(BORDER, BORDER, BORDER, BORDER));
diff --git a/app/src/processing/app/contrib/ModeContribution.java b/app/src/processing/app/contrib/ModeContribution.java
index 672e188b0..464941ad0 100644
--- a/app/src/processing/app/contrib/ModeContribution.java
+++ b/app/src/processing/app/contrib/ModeContribution.java
@@ -80,7 +80,7 @@ public class ModeContribution extends LocalContribution {
* @param className name of class and full package, or null to use default
*/
public ModeContribution(Base base, File folder,
- String className) throws Exception {
+ String className) throws Exception {
super(folder);
className = initLoader(base, className);
if (className != null) {
@@ -89,9 +89,9 @@ public class ModeContribution extends LocalContribution {
Constructor> con = modeClass.getConstructor(Base.class, File.class);
mode = (Mode) con.newInstance(base, folder);
mode.setClassLoader(loader);
- if (base != null) {
- mode.setupGUI();
- }
+// if (base != null) {
+// mode.setupGUI();
+// }
}
}
diff --git a/app/src/processing/app/syntax/JEditTextArea.java b/app/src/processing/app/syntax/JEditTextArea.java
index 78830031e..89f6dbb22 100644
--- a/app/src/processing/app/syntax/JEditTextArea.java
+++ b/app/src/processing/app/syntax/JEditTextArea.java
@@ -183,11 +183,11 @@ public class JEditTextArea extends JComponent
}
- public void updateAppearance() {
+ public void updateTheme() {
// This default version will update the fonts and not much else.
// It's expected to always be overridden by the PdeTextArea version,
// but it's here if a Mode author *really* must avoid PdeTextArea.
- painter.updateAppearance();
+ painter.updateTheme();
repaint();
}
diff --git a/app/src/processing/app/syntax/PdeTextArea.java b/app/src/processing/app/syntax/PdeTextArea.java
index 9fd6eafd5..26e0f1134 100644
--- a/app/src/processing/app/syntax/PdeTextArea.java
+++ b/app/src/processing/app/syntax/PdeTextArea.java
@@ -29,6 +29,7 @@ import java.util.Map;
import processing.app.Mode;
import processing.app.ui.Editor;
+import processing.app.ui.Theme;
/**
@@ -62,7 +63,7 @@ public class PdeTextArea extends JEditTextArea {
// load settings from theme.txt
Mode mode = editor.getMode();
- gutterGradient = mode.makeGradient("editor", Editor.LEFT_GUTTER, 500);
+ gutterGradient = Theme.makeGradient("editor", Editor.LEFT_GUTTER, 500);
}
@@ -84,8 +85,8 @@ public class PdeTextArea extends JEditTextArea {
*/
@Override
- public void updateAppearance() {
- ((PdeTextAreaPainter) painter).updateAppearance(editor.getMode());
+ public void updateTheme() {
+ ((PdeTextAreaPainter) painter).updateTheme();
repaint();
}
diff --git a/app/src/processing/app/syntax/PdeTextAreaDefaults.java b/app/src/processing/app/syntax/PdeTextAreaDefaults.java
index f216c1620..74e9590f1 100644
--- a/app/src/processing/app/syntax/PdeTextAreaDefaults.java
+++ b/app/src/processing/app/syntax/PdeTextAreaDefaults.java
@@ -26,6 +26,7 @@
package processing.app.syntax;
import processing.app.*;
+import processing.app.ui.Theme;
/**
@@ -50,45 +51,45 @@ public class PdeTextAreaDefaults extends TextAreaDefaults {
rows = 5;
styles = new SyntaxStyle[Token.ID_COUNT];
- updateAppearance(mode);
+ updateTheme();
}
- protected void updateAppearance(Mode mode) {
- fgcolor = mode.getColor("editor.fgcolor");
- bgcolor = mode.getColor("editor.bgcolor");
+ protected void updateTheme() {
+ fgcolor = Theme.getColor("editor.fgcolor");
+ bgcolor = Theme.getColor("editor.bgcolor");
- styles[Token.COMMENT1] = mode.getStyle("comment1");
- styles[Token.COMMENT2] = mode.getStyle("comment2");
+ styles[Token.COMMENT1] = Theme.getStyle("comment1");
+ styles[Token.COMMENT2] = Theme.getStyle("comment2");
- styles[Token.KEYWORD1] = mode.getStyle("keyword1");
- styles[Token.KEYWORD2] = mode.getStyle("keyword2");
- styles[Token.KEYWORD3] = mode.getStyle("keyword3");
- styles[Token.KEYWORD4] = mode.getStyle("keyword4");
- styles[Token.KEYWORD5] = mode.getStyle("keyword5");
- styles[Token.KEYWORD6] = mode.getStyle("keyword6");
+ styles[Token.KEYWORD1] = Theme.getStyle("keyword1");
+ styles[Token.KEYWORD2] = Theme.getStyle("keyword2");
+ styles[Token.KEYWORD3] = Theme.getStyle("keyword3");
+ styles[Token.KEYWORD4] = Theme.getStyle("keyword4");
+ styles[Token.KEYWORD5] = Theme.getStyle("keyword5");
+ styles[Token.KEYWORD6] = Theme.getStyle("keyword6");
- styles[Token.FUNCTION1] = mode.getStyle("function1");
- styles[Token.FUNCTION2] = mode.getStyle("function2");
- styles[Token.FUNCTION3] = mode.getStyle("function3");
- styles[Token.FUNCTION4] = mode.getStyle("function4");
+ styles[Token.FUNCTION1] = Theme.getStyle("function1");
+ styles[Token.FUNCTION2] = Theme.getStyle("function2");
+ styles[Token.FUNCTION3] = Theme.getStyle("function3");
+ styles[Token.FUNCTION4] = Theme.getStyle("function4");
- styles[Token.LITERAL1] = mode.getStyle("literal1");
- styles[Token.LITERAL2] = mode.getStyle("literal2");
+ styles[Token.LITERAL1] = Theme.getStyle("literal1");
+ styles[Token.LITERAL2] = Theme.getStyle("literal2");
- styles[Token.LABEL] = mode.getStyle("label");
- styles[Token.OPERATOR] = mode.getStyle("operator");
+ styles[Token.LABEL] = Theme.getStyle("label");
+ styles[Token.OPERATOR] = Theme.getStyle("operator");
// area that's not in use by the text (replaced with tildes)
- styles[Token.INVALID] = mode.getStyle("invalid");
+ styles[Token.INVALID] = Theme.getStyle("invalid");
- caretColor = mode.getColor("editor.caret.color");
- selectionColor = mode.getColor("editor.selection.color");
- lineHighlight = mode.getBoolean("editor.linehighlight");
- lineHighlightColor = mode.getColor("editor.linehighlight.color");
- bracketHighlight = mode.getBoolean("editor.brackethighlight");
- bracketHighlightColor = mode.getColor("editor.brackethighlight.color");
- eolMarkers = mode.getBoolean("editor.eolmarkers");
- eolMarkerColor = mode.getColor("editor.eolmarkers.color");
+ caretColor = Theme.getColor("editor.caret.color");
+ selectionColor = Theme.getColor("editor.selection.color");
+ lineHighlight = Theme.getBoolean("editor.linehighlight");
+ lineHighlightColor = Theme.getColor("editor.linehighlight.color");
+ bracketHighlight = Theme.getBoolean("editor.brackethighlight");
+ bracketHighlightColor = Theme.getColor("editor.brackethighlight.color");
+ eolMarkers = Theme.getBoolean("editor.eolmarkers");
+ eolMarkerColor = Theme.getColor("editor.eolmarkers.color");
}
}
diff --git a/app/src/processing/app/syntax/PdeTextAreaPainter.java b/app/src/processing/app/syntax/PdeTextAreaPainter.java
index 2a11f55dc..ad5ea3bab 100644
--- a/app/src/processing/app/syntax/PdeTextAreaPainter.java
+++ b/app/src/processing/app/syntax/PdeTextAreaPainter.java
@@ -33,9 +33,9 @@ import javax.swing.text.BadLocationException;
import javax.swing.text.Segment;
import javax.swing.text.Utilities;
-import processing.app.Mode;
import processing.app.Problem;
import processing.app.ui.Editor;
+import processing.app.ui.Theme;
/**
@@ -87,25 +87,26 @@ public class PdeTextAreaPainter extends TextAreaPainter {
* minor additions or overrides added in a Mode's own theme.txt file.
*/
//public void setMode(Mode mode) {
- protected void updateAppearance(Mode mode) {
- errorUnderlineColor = mode.getColor("editor.error.underline.color");
- warningUnderlineColor = mode.getColor("editor.warning.underline.color");
+ @Override
+ protected void updateTheme() {
+ errorUnderlineColor = Theme.getColor("editor.error.underline.color");
+ warningUnderlineColor = Theme.getColor("editor.warning.underline.color");
- gutterTextFont = mode.getFont("editor.gutter.text.font");
- gutterTextColor = mode.getColor("editor.gutter.text.color");
+ gutterTextFont = Theme.getFont("editor.gutter.text.font");
+ gutterTextColor = Theme.getColor("editor.gutter.text.color");
gutterPastColor = new Color(gutterTextColor.getRed(),
gutterTextColor.getGreen(),
gutterTextColor.getBlue(),
96);
- gutterLineHighlightColor = mode.getColor("editor.gutter.linehighlight.color");
+ gutterLineHighlightColor = Theme.getColor("editor.gutter.linehighlight.color");
// pull in changes for syntax style, as well as foreground and background color
if (defaults instanceof PdeTextAreaDefaults) {
- ((PdeTextAreaDefaults) defaults).updateAppearance(mode);
+ ((PdeTextAreaDefaults) defaults).updateTheme();
}
- // needs to happen after PdeTextAreaDefaults.updateAppearance(mode)
- super.updateAppearance();
+ // needs to happen *after* PdeTextAreaDefaults.updateTheme()
+ super.updateTheme();
}
diff --git a/app/src/processing/app/syntax/SyntaxStyle.java b/app/src/processing/app/syntax/SyntaxStyle.java
index 3c6fb301b..b72f2739f 100644
--- a/app/src/processing/app/syntax/SyntaxStyle.java
+++ b/app/src/processing/app/syntax/SyntaxStyle.java
@@ -10,6 +10,7 @@
package processing.app.syntax;
import java.awt.Color;
+import java.util.StringTokenizer;
/**
@@ -32,6 +33,21 @@ public class SyntaxStyle {
this.bold = bold;
}
+
+ static public SyntaxStyle fromString(String str) {
+ StringTokenizer st = new StringTokenizer(str, ",");
+
+ String s = st.nextToken();
+ if (s.indexOf("#") == 0) s = s.substring(1);
+ Color color = new Color(Integer.parseInt(s, 16));
+
+ s = st.nextToken();
+ boolean bold = s.contains("bold");
+ //boolean italic = s.contains("italic");
+
+ return new SyntaxStyle(color, bold);
+ }
+
/** Returns the color specified in this style. */
public Color getColor() {
diff --git a/app/src/processing/app/syntax/TextAreaPainter.java b/app/src/processing/app/syntax/TextAreaPainter.java
index 41eb6fb74..02fdd431e 100644
--- a/app/src/processing/app/syntax/TextAreaPainter.java
+++ b/app/src/processing/app/syntax/TextAreaPainter.java
@@ -73,11 +73,11 @@ public class TextAreaPainter extends JComponent implements TabExpander {
setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
- updateAppearance();
+ updateTheme();
}
- protected void updateAppearance() {
+ protected void updateTheme() {
setForeground(defaults.fgcolor);
setBackground(defaults.bgcolor);
diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java
index b6a3bf81c..754cdd303 100644
--- a/app/src/processing/app/ui/Editor.java
+++ b/app/src/processing/app/ui/Editor.java
@@ -247,7 +247,6 @@ public abstract class Editor extends JFrame implements RunnerListener {
// if (pta != null) {
// pta.setMode(mode);
// }
- updateAppearance();
splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, upper, footer);
@@ -272,7 +271,6 @@ public abstract class Editor extends JFrame implements RunnerListener {
return status;
}
-
@Override
public void finishDraggingTo(int location) {
super.finishDraggingTo(location);
@@ -304,6 +302,9 @@ public abstract class Editor extends JFrame implements RunnerListener {
contentPain.setTransferHandler(new FileDropHandler());
+ // set all fonts and colors
+ updateTheme();
+
// Finish preparing Editor
pack();
@@ -345,19 +346,6 @@ public abstract class Editor extends JFrame implements RunnerListener {
}
- public void updateAppearance() {
- /*
- PdeTextArea pta = getPdeTextArea();
- // will be null if a subclass has overridden createTextArea()
- // to return something besides a PdeTextArea
- if (pta != null) {
- pta.updateAppearance();
- }
- */
- textarea.updateAppearance();
- }
-
-
protected JEditTextArea createTextArea() {
return new JEditTextArea(new PdeTextAreaDefaults(mode),
new PdeInputHandler(this));
@@ -552,6 +540,9 @@ public abstract class Editor extends JFrame implements RunnerListener {
}
+ /**
+ * Rebuild the Toolbar after turning debug on/off.
+ */
public void rebuildToolbar() {
toolbar.rebuild();
toolbar.revalidate(); // necessary to handle sub-components
@@ -580,11 +571,39 @@ public abstract class Editor extends JFrame implements RunnerListener {
* with things in the Preferences window.
*/
public void applyPreferences() {
- // Update fonts and other items controllable from the prefs
-// textarea.getPainter().updateAppearance();
-// textarea.repaint();
- textarea.updateAppearance();
- console.updateAppearance();
+ // Even though this is only updating the theme (colors, icons), subclasses
+ // use this to apply other preferences (i.e. error checking changes in Java Mode).
+ updateTheme();
+
+// // Update fonts and other items controllable from the prefs
+//// textarea.getPainter().updateAppearance();
+//// textarea.repaint();
+// textarea.updateTheme();
+// console.updateTheme();
+ }
+
+
+ public void updateTheme() {
+ /*
+ PdeTextArea pta = getPdeTextArea();
+ // will be null if a subclass has overridden createTextArea()
+ // to return something besides a PdeTextArea
+ if (pta != null) {
+ pta.updateAppearance();
+ }
+ */
+ header.updateTheme();
+ toolbar.updateTheme();
+ textarea.updateTheme();
+ errorColumn.updateTheme();
+ status.updateTheme();
+ console.updateTheme();
+ errorTable.updateTheme();
+
+ toolTipFont = Toolkit.getSansFont(Toolkit.zoom(9), Font.PLAIN);
+ toolTipTextColor = Theme.getColor("errors.selection.fgcolor");
+ toolTipWarningColor = Theme.getColor("errors.selection.warning.bgcolor");
+ toolTipErrorColor = Theme.getColor("errors.selection.error.bgcolor");
}
@@ -2973,28 +2992,21 @@ public abstract class Editor extends JFrame implements RunnerListener {
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
- static Font font;
- static Color textColor;
- static Color bgColorWarning;
- static Color bgColorError;
+ static Font toolTipFont;
+ static Color toolTipTextColor;
+ static Color toolTipWarningColor;
+ static Color toolTipErrorColor;
public void statusToolTip(JComponent comp, String message, boolean error) {
- if (font == null) {
- font = Toolkit.getSansFont(Toolkit.zoom(9), Font.PLAIN);
- textColor = mode.getColor("errors.selection.fgcolor");
- bgColorWarning = mode.getColor("errors.selection.warning.bgcolor");
- bgColorError = mode.getColor("errors.selection.error.bgcolor");
- }
-
- Color bgColor = error ? bgColorError : bgColorWarning;
+ Color bgColor = error ? toolTipErrorColor : toolTipWarningColor;
int m = Toolkit.zoom(3);
String css =
String.format("margin: %d %d %d %d; ", -m, -m, -m, -m) +
String.format("padding: %d %d %d %d; ", m, m, m, m) +
"background: #" + PApplet.hex(bgColor.getRGB(), 8).substring(2) + ";" +
- "font-family: " + font.getFontName() + ", sans-serif;" +
- "font-size: " + font.getSize() + "px;";
+ "font-family: " + toolTipFont.getFontName() + ", sans-serif;" +
+ "font-size: " + toolTipFont.getSize() + "px;";
String content =
"
" + message + "
";
comp.setToolTipText(content);
diff --git a/app/src/processing/app/ui/EditorConsole.java b/app/src/processing/app/ui/EditorConsole.java
index 105fc05ea..c42a59442 100644
--- a/app/src/processing/app/ui/EditorConsole.java
+++ b/app/src/processing/app/ui/EditorConsole.java
@@ -133,7 +133,7 @@ public class EditorConsole extends JScrollPane {
/**
* Update the font family and sizes based on the Preferences window.
*/
- protected void updateAppearance() {
+ protected void updateTheme() {
Font font = Preferences.getFont("editor.font.family", "console.font.size", Font.PLAIN);
StyleConstants.setFontFamily(stdStyle, font.getFamily());
@@ -157,9 +157,9 @@ public class EditorConsole extends JScrollPane {
consoleDoc.setParagraphAttributes(0, 0, standard, true);
// build styles for different types of console output
- Color bgColor = mode.getColor("console.color");
- Color fgColorOut = mode.getColor("console.output.color");
- Color fgColorErr = mode.getColor("console.error.color");
+ Color bgColor = Theme.getColor("console.color");
+ Color fgColorOut = Theme.getColor("console.output.color");
+ Color fgColorErr = Theme.getColor("console.error.color");
// Make things line up with the Editor above. If this is ever removed,
// setBorder(null) should be called instead. The defaults are nasty.
diff --git a/app/src/processing/app/ui/EditorFooter.java b/app/src/processing/app/ui/EditorFooter.java
index 7d9258c31..d45685a94 100644
--- a/app/src/processing/app/ui/EditorFooter.java
+++ b/app/src/processing/app/ui/EditorFooter.java
@@ -163,20 +163,20 @@ public class EditorFooter extends Box {
public void updateMode() {
Mode mode = editor.getMode();
- textColor[SELECTED] = mode.getColor("footer.text.selected.color");
- textColor[UNSELECTED] = mode.getColor("footer.text.unselected.color");
- font = mode.getFont("footer.text.font");
+ textColor[SELECTED] = Theme.getColor("footer.text.selected.color");
+ textColor[UNSELECTED] = Theme.getColor("footer.text.unselected.color");
+ font = Theme.getFont("footer.text.font");
- tabColor[SELECTED] = mode.getColor("footer.tab.selected.color");
- tabColor[UNSELECTED] = mode.getColor("footer.tab.unselected.color");
+ tabColor[SELECTED] = Theme.getColor("footer.tab.selected.color");
+ tabColor[UNSELECTED] = Theme.getColor("footer.tab.unselected.color");
- updateColor = mode.getColor("footer.updates.color");
+ updateColor = Theme.getColor("footer.updates.color");
- gradient = mode.makeGradient("footer", 400, HIGH);
+ gradient = Theme.makeGradient("footer", 400, HIGH);
// Set the default background color in case the window size reported
// incorrectly by the OS, or we miss an update event of some kind
// https://github.com/processing/processing/issues/3919
- bgColor = mode.getColor("footer.gradient.bottom");
+ bgColor = Theme.getColor("footer.gradient.bottom");
setBackground(bgColor);
}
diff --git a/app/src/processing/app/ui/EditorHeader.java b/app/src/processing/app/ui/EditorHeader.java
index e64990a54..2868d28e5 100644
--- a/app/src/processing/app/ui/EditorHeader.java
+++ b/app/src/processing/app/ui/EditorHeader.java
@@ -97,7 +97,7 @@ public class EditorHeader extends JComponent {
public EditorHeader(Editor eddie) {
this.editor = eddie;
- updateMode();
+ updateTheme();
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
@@ -141,21 +141,19 @@ public class EditorHeader extends JComponent {
}
- public void updateMode() {
- Mode mode = editor.getMode();
+ public void updateTheme() {
+ textColor[SELECTED] = Theme.getColor("header.text.selected.color");
+ textColor[UNSELECTED] = Theme.getColor("header.text.unselected.color");
+ font = Theme.getFont("header.text.font");
- textColor[SELECTED] = mode.getColor("header.text.selected.color");
- textColor[UNSELECTED] = mode.getColor("header.text.unselected.color");
- font = mode.getFont("header.text.font");
+ tabColor[SELECTED] = Theme.getColor("header.tab.selected.color");
+ tabColor[UNSELECTED] = Theme.getColor("header.tab.unselected.color");
- tabColor[SELECTED] = mode.getColor("header.tab.selected.color");
- tabColor[UNSELECTED] = mode.getColor("header.tab.unselected.color");
-
- arrowColor = mode.getColor("header.tab.arrow.color");
+ arrowColor = Theme.getColor("header.tab.arrow.color");
//modifiedColor = mode.getColor("editor.selection.color");
- modifiedColor = mode.getColor("header.tab.modified.color");
+ modifiedColor = Theme.getColor("header.tab.modified.color");
- gradient = mode.makeGradient("header", 400, HIGH);
+ gradient = Theme.makeGradient("header", 400, HIGH);
}
diff --git a/app/src/processing/app/ui/EditorStatus.java b/app/src/processing/app/ui/EditorStatus.java
index 8affa8c6a..791ce7dd3 100644
--- a/app/src/processing/app/ui/EditorStatus.java
+++ b/app/src/processing/app/ui/EditorStatus.java
@@ -125,7 +125,7 @@ public class EditorStatus extends BasicSplitPaneDivider {
super(ui);
this.editor = editor;
empty();
- updateMode();
+ updateTheme();
addMouseListener(new MouseAdapter() {
@@ -219,27 +219,26 @@ public class EditorStatus extends BasicSplitPaneDivider {
}
- public void updateMode() {
- Mode mode = editor.getMode();
-
- urlColor = mode.getColor("status.url.fgcolor");
+ protected void updateTheme() {
+ urlColor = Theme.getColor("status.url.fgcolor");
fgColor = new Color[] {
- mode.getColor("status.notice.fgcolor"),
- mode.getColor("status.error.fgcolor"),
- mode.getColor("status.error.fgcolor"),
- mode.getColor("status.warning.fgcolor"),
- mode.getColor("status.warning.fgcolor")
+ Theme.getColor("status.notice.fgcolor"),
+ Theme.getColor("status.error.fgcolor"),
+ Theme.getColor("status.error.fgcolor"),
+ Theme.getColor("status.warning.fgcolor"),
+ Theme.getColor("status.warning.fgcolor")
};
bgColor = new Color[] {
- mode.getColor("status.notice.bgcolor"),
- mode.getColor("status.error.bgcolor"),
- mode.getColor("status.error.bgcolor"),
- mode.getColor("status.warning.bgcolor"),
- mode.getColor("status.warning.bgcolor")
+ Theme.getColor("status.notice.bgcolor"),
+ Theme.getColor("status.error.bgcolor"),
+ Theme.getColor("status.error.bgcolor"),
+ Theme.getColor("status.warning.bgcolor"),
+ Theme.getColor("status.warning.bgcolor")
};
+ Mode mode = editor.getMode();
bgImage = new Image[] {
mode.loadImage("/lib/status/notice.png"),
mode.loadImage("/lib/status/error.png"),
@@ -248,8 +247,8 @@ public class EditorStatus extends BasicSplitPaneDivider {
mode.loadImage("/lib/status/warning.png")
};
- font = mode.getFont("status.font");
- glyphFont = mode.getFont("status.emoji.font");
+ font = Theme.getFont("status.font");
+ glyphFont = Theme.getFont("status.emoji.font");
metrics = null;
}
diff --git a/app/src/processing/app/ui/EditorToolbar.java b/app/src/processing/app/ui/EditorToolbar.java
index 5c22d78e1..2f27a9dd1 100644
--- a/app/src/processing/app/ui/EditorToolbar.java
+++ b/app/src/processing/app/ui/EditorToolbar.java
@@ -78,8 +78,6 @@ abstract public class EditorToolbar extends JPanel implements KeyListener {
base = editor.getBase();
mode = editor.getMode();
- gradient = mode.makeGradient("toolbar", Toolkit.zoom(400), HIGH);
-
rebuild();
}
@@ -92,8 +90,6 @@ abstract public class EditorToolbar extends JPanel implements KeyListener {
box.add(Box.createHorizontalStrut(Editor.LEFT_GUTTER));
rolloverLabel = new JLabel();
- rolloverLabel.setFont(mode.getFont("toolbar.rollover.font"));
- rolloverLabel.setForeground(mode.getColor("toolbar.rollover.color"));
for (EditorButton button : buttons) {
box.add(button);
@@ -122,6 +118,16 @@ abstract public class EditorToolbar extends JPanel implements KeyListener {
setLayout(new BorderLayout());
add(box, BorderLayout.CENTER);
+
+ updateTheme();
+ }
+
+
+ public void updateTheme() {
+ gradient = Theme.makeGradient("toolbar", Toolkit.zoom(400), HIGH);
+
+ rolloverLabel.setFont(Theme.getFont("toolbar.rollover.font"));
+ rolloverLabel.setForeground(Theme.getColor("toolbar.rollover.color"));
}
@@ -298,32 +304,32 @@ abstract public class EditorToolbar extends JPanel implements KeyListener {
Color backgroundColor;
Color outlineColor;
-
- @SuppressWarnings("deprecation")
public ModeSelector() {
title = mode.getTitle(); //.toUpperCase();
- titleFont = mode.getFont("mode.title.font");
- titleColor = mode.getColor("mode.title.color");
+
+ addMouseListener(new MouseAdapter() {
+ public void mousePressed(MouseEvent event) {
+ JPopupMenu popup = editor.getModePopup();
+ popup.show(ModeSelector.this, event.getX(), event.getY());
+ }
+ });
+
+ updateTheme();
+ }
+
+ public void updateTheme() {
+ titleFont = Theme.getFont("mode.title.font");
+ titleColor = Theme.getColor("mode.title.color");
// getGraphics() is null and no offscreen yet
titleWidth = getToolkit().getFontMetrics(titleFont).stringWidth(title);
- addMouseListener(new MouseAdapter() {
- public void mousePressed(MouseEvent event) {
- JPopupMenu popup = editor.getModePopup();
- popup.show(ModeSelector.this, event.getX(), event.getY());
- }
- });
-
- //background = mode.getGradient("reversed", 100, EditorButton.DIM);
- backgroundColor = mode.getColor("mode.background.color");
- outlineColor = mode.getColor("mode.outline.color");
+ backgroundColor = Theme.getColor("mode.background.color");
+ outlineColor = Theme.getColor("mode.outline.color");
}
@Override
public void paintComponent(Graphics screen) {
-// Toolkit.debugOpacity(this);
-
Dimension size = getSize();
width = 0;
if (width != size.width || height != size.height) {
@@ -334,10 +340,6 @@ abstract public class EditorToolbar extends JPanel implements KeyListener {
Graphics g = offscreen.getGraphics();
Graphics2D g2 = Toolkit.prepareGraphics(g);
- //Toolkit.clearGraphics(g, width, height);
-// g.clearRect(0, 0, width, height);
-// g.setColor(Color.GREEN);
-// g.fillRect(0, 0, width, height);
g.setFont(titleFont);
if (titleAscent == 0) {
diff --git a/app/src/processing/app/ui/ErrorTable.java b/app/src/processing/app/ui/ErrorTable.java
index 8abfdf77a..13804f4a4 100644
--- a/app/src/processing/app/ui/ErrorTable.java
+++ b/app/src/processing/app/ui/ErrorTable.java
@@ -39,7 +39,6 @@ import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import processing.app.Language;
-import processing.app.Mode;
import processing.app.Problem;
@@ -73,11 +72,12 @@ public class ErrorTable extends JTable {
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.editor = editor;
- JTableHeader header = getTableHeader();
+ //JTableHeader header = getTableHeader();
+ //Mode mode = editor.getMode();
+ //header.setDefaultRenderer(new GradyHeaderRenderer(mode));
+ //setDefaultRenderer(Object.class, new GradyRowRenderer(mode));
+ updateTheme();
- Mode mode = editor.getMode();
- header.setDefaultRenderer(new GradyHeaderRenderer(mode));
- setDefaultRenderer(Object.class, new GradyRowRenderer(mode));
//setShowGrid(false);
setIntercellSpacing(new Dimension(0, 0));
@@ -116,12 +116,18 @@ public class ErrorTable extends JTable {
}
});
- header.setReorderingAllowed(false);
+ getTableHeader().setReorderingAllowed(false);
setFillsViewportHeight(true);
ToolTipManager.sharedInstance().registerComponent(this);
}
+ protected void updateTheme() {
+ getTableHeader().setDefaultRenderer(new GradyHeaderRenderer());
+ setDefaultRenderer(Object.class, new GradyRowRenderer());
+ }
+
+
public void clearRows() {
DefaultTableModel dtm = (DefaultTableModel) getModel();
dtm.setRowCount(0);
@@ -145,12 +151,12 @@ public class ErrorTable extends JTable {
static class GradyHeaderRenderer extends JLabel implements TableCellRenderer {
- public GradyHeaderRenderer(Mode mode) {
- setFont(mode.getFont("errors.header.font"));
+ public GradyHeaderRenderer() {
+ setFont(Theme.getFont("errors.header.font"));
setAlignmentX(LEFT_ALIGNMENT);
- setForeground(mode.getColor("errors.header.fgcolor"));
- setBackground(mode.getColor("errors.header.bgcolor"));
+ setForeground(Theme.getColor("errors.header.fgcolor"));
+ setBackground(Theme.getColor("errors.header.bgcolor"));
setOpaque(true);
}
@@ -191,19 +197,19 @@ public class ErrorTable extends JTable {
Color errorIndicatorColor;
Color warningIndicatorColor;
- public GradyRowRenderer(Mode mode) {
- setFont(mode.getFont("errors.row.font"));
+ public GradyRowRenderer() {
+ setFont(Theme.getFont("errors.row.font"));
setAlignmentX(LEFT_ALIGNMENT);
- textColor = mode.getColor("errors.row.fgcolor");
- bgColor = mode.getColor("errors.row.bgcolor");
- textColorSelected = mode.getColor("errors.selection.fgcolor");
- bgColorSelected = mode.getColor("errors.selection.bgcolor");
- bgColorError = mode.getColor("errors.selection.error.bgcolor");
- bgColorWarning = mode.getColor("errors.selection.warning.bgcolor");
+ textColor = Theme.getColor("errors.row.fgcolor");
+ bgColor = Theme.getColor("errors.row.bgcolor");
+ textColorSelected = Theme.getColor("errors.selection.fgcolor");
+ bgColorSelected = Theme.getColor("errors.selection.bgcolor");
+ bgColorError = Theme.getColor("errors.selection.error.bgcolor");
+ bgColorWarning = Theme.getColor("errors.selection.warning.bgcolor");
- errorIndicatorColor = mode.getColor("errors.indicator.error.color");
- warningIndicatorColor = mode.getColor("errors.indicator.warning.color");
+ errorIndicatorColor = Theme.getColor("errors.indicator.error.color");
+ warningIndicatorColor = Theme.getColor("errors.indicator.warning.color");
setOpaque(true);
}
diff --git a/app/src/processing/app/ui/ExamplesFrame.java b/app/src/processing/app/ui/ExamplesFrame.java
index 70258650d..42de2b4d0 100644
--- a/app/src/processing/app/ui/ExamplesFrame.java
+++ b/app/src/processing/app/ui/ExamplesFrame.java
@@ -183,7 +183,7 @@ public class ExamplesFrame extends JFrame {
}
// Special cell renderer that takes the UI zoom into account
- tree.setCellRenderer(new ZoomTreeCellRenderer(mode));
+ tree.setCellRenderer(new ZoomTreeCellRenderer());
JScrollPane treePane = new JScrollPane(tree);
treePane.setPreferredSize(Toolkit.zoom(250, 300));
diff --git a/app/src/processing/app/ui/MarkerColumn.java b/app/src/processing/app/ui/MarkerColumn.java
index 8d6371fbd..f6c98dc76 100644
--- a/app/src/processing/app/ui/MarkerColumn.java
+++ b/app/src/processing/app/ui/MarkerColumn.java
@@ -54,8 +54,6 @@ import processing.core.PApplet;
public class MarkerColumn extends JPanel {
protected Editor editor;
-// static final int WIDE = 12;
-
private Color errorColor;
private Color warningColor;
@@ -66,16 +64,13 @@ public class MarkerColumn extends JPanel {
public MarkerColumn(Editor editor, int height) {
this.editor = editor;
- Mode mode = editor.getMode();
- errorColor = mode.getColor("editor.column.error.color");
- warningColor = mode.getColor("editor.column.warning.color");
+ updateTheme();
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
scrollToMarkerAt(e.getY());
}
});
-
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(final MouseEvent e) {
showMarkerHover(e.getY());
@@ -84,6 +79,12 @@ public class MarkerColumn extends JPanel {
}
+ protected void updateTheme() {
+ errorColor = Theme.getColor("editor.column.error.color");
+ warningColor = Theme.getColor("editor.column.warning.color");
+ }
+
+
@Override
public void repaint() {
recalculateMarkerPositions();
diff --git a/app/src/processing/app/ui/SketchbookFrame.java b/app/src/processing/app/ui/SketchbookFrame.java
index ae36203a2..8a214a102 100644
--- a/app/src/processing/app/ui/SketchbookFrame.java
+++ b/app/src/processing/app/ui/SketchbookFrame.java
@@ -119,7 +119,7 @@ public class SketchbookFrame extends JFrame {
}
// Special cell renderer that takes the UI zoom into account
- tree.setCellRenderer(new ZoomTreeCellRenderer(mode));
+ tree.setCellRenderer(new ZoomTreeCellRenderer());
// Check whether sketch book is empty or not
TreeModel treeModel = tree.getModel();
diff --git a/app/src/processing/app/ui/Theme.java b/app/src/processing/app/ui/Theme.java
new file mode 100644
index 000000000..4f1bd214d
--- /dev/null
+++ b/app/src/processing/app/ui/Theme.java
@@ -0,0 +1,140 @@
+/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
+
+/*
+ Part of the Processing project - http://processing.org
+
+ Copyright (c) 2021 The Processing Foundation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+package processing.app.ui;
+
+import processing.app.Base;
+import processing.app.Messages;
+import processing.app.Platform;
+import processing.app.Settings;
+import processing.app.syntax.SyntaxStyle;
+import processing.core.PApplet;
+import processing.core.PConstants;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.awt.image.WritableRaster;
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+
+
+public class Theme {
+ static Settings theme;
+
+ static public void init() {
+ load();
+ }
+
+ static public void load() {
+ try {
+ File inputFile = Platform.getContentFile("lib/theme.txt");
+ if (inputFile == null) {
+ throw new RuntimeException("Missing required file (theme.txt), you may need to reinstall.");
+ }
+ // First load the default theme data for the whole PDE.
+ theme = new Settings(inputFile);
+
+ /*
+ // The mode-specific theme.txt file should only contain additions,
+ // and in extremely rare cases, it might override entries from the
+ // main theme. Do not override for style changes unless they are
+ // objectively necessary for your Mode.
+ File modeTheme = new File(folder, "theme/theme.txt");
+ if (modeTheme.exists()) {
+ // Override the built-in settings with what the theme provides
+ theme.load(modeTheme);
+ }
+ */
+
+ // https://github.com/processing/processing/issues/5445
+ File sketchbookTheme = getSketchbookFile();
+// new File(Base.getSketchbookFolder(), "theme.txt");
+ if (sketchbookTheme.exists()) {
+ theme.load(sketchbookTheme);
+ }
+
+ // other things that have to be set explicitly for the defaults
+ theme.setColor("run.window.bgcolor", SystemColor.control);
+
+ } catch (IOException e) {
+ Messages.showError("Problem loading theme.txt",
+ "Could not load theme.txt, please re-install Processing", e);
+ }
+ }
+
+ static public void save() {
+ theme.save(getSketchbookFile());
+ }
+
+
+ static public File getSketchbookFile() {
+ return new File(Base.getSketchbookFolder(), "theme.txt");
+ }
+
+
+ static public boolean getBoolean(String attribute) {
+ return theme.getBoolean(attribute);
+ }
+
+
+ static public int getInteger(String attribute) {
+ return theme.getInteger(attribute);
+ }
+
+
+ static public Color getColor(String attribute) {
+ return theme.getColor(attribute);
+ }
+
+
+ static public Font getFont(String attribute) {
+ return theme.getFont(attribute);
+ }
+
+
+ static public SyntaxStyle getStyle(String attribute) {
+ //String str = Preferences.get("editor.token." + attribute + ".style");
+ String str = theme.get("editor.token." + attribute + ".style");
+ if (str == null) {
+ throw new IllegalArgumentException("No style found for " + attribute);
+ }
+ return SyntaxStyle.fromString(str);
+ }
+
+
+ static public Image makeGradient(String attribute, int wide, int high) {
+ int top = getColor(attribute + ".gradient.top").getRGB();
+ int bot = getColor(attribute + ".gradient.bottom").getRGB();
+
+ BufferedImage outgoing =
+ new BufferedImage(wide, high, BufferedImage.TYPE_INT_RGB);
+ int[] row = new int[wide];
+ WritableRaster wr = outgoing.getRaster();
+ for (int i = 0; i < high; i++) {
+ int rgb = PApplet.lerpColor(top, bot, i / (float)(high-1), PConstants.RGB);
+ Arrays.fill(row, rgb);
+ wr.setDataElements(0, i, wide, 1, row);
+ }
+ return outgoing;
+ }
+}
\ No newline at end of file
diff --git a/app/src/processing/app/ui/ZoomTreeCellRenderer.java b/app/src/processing/app/ui/ZoomTreeCellRenderer.java
index 616b63dbe..7077f8bdf 100644
--- a/app/src/processing/app/ui/ZoomTreeCellRenderer.java
+++ b/app/src/processing/app/ui/ZoomTreeCellRenderer.java
@@ -33,8 +33,8 @@ import processing.app.Mode;
public class ZoomTreeCellRenderer extends DefaultTreeCellRenderer {
- public ZoomTreeCellRenderer(Mode mode) {
- setFont(mode.getFont("tree.font"));
+ public ZoomTreeCellRenderer() {
+ setFont(Theme.getFont("tree.font"));
}
@Override
diff --git a/build/shared/lib/defaults.txt b/build/shared/lib/defaults.txt
index 6805114d4..0f163c54e 100644
--- a/build/shared/lib/defaults.txt
+++ b/build/shared/lib/defaults.txt
@@ -247,38 +247,6 @@ editor.laf.linux = javax.swing.plaf.nimbus.NimbusLookAndFeel
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-# TEXT - KEYWORDS, LITERALS
-# For an explanation of these tags, see Token.java:
-# processing/app/src/processing/app/syntax/Token.java
-
-editor.token.function1.style = #006699,plain
-editor.token.function2.style = #006699,plain
-editor.token.function3.style = #669900,plain
-editor.token.function4.style = #006699,bold
-
-editor.token.keyword1.style = #33997e,plain
-editor.token.keyword2.style = #33997e,plain
-editor.token.keyword3.style = #669900,plain
-editor.token.keyword4.style = #d94a7a,plain
-editor.token.keyword5.style = #e2661a,plain
-editor.token.keyword6.style = #33997e,plain
-
-editor.token.literal1.style = #7D4793,plain
-editor.token.literal2.style = #718a62,plain
-
-editor.token.operator.style = #006699,plain
-
-editor.token.label.style = #666666,bold
-
-editor.token.comment1.style = #666666,plain
-editor.token.comment2.style = #666666,plain
-
-editor.token.invalid.style = #666666,bold
-
-
-# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
# which platforms to export by default
#export.application.platform.windows = true
#export.application.platform.macosx = true
diff --git a/build/shared/lib/theme.txt b/build/shared/lib/theme.txt
index 88083bd24..a473ccf0d 100644
--- a/build/shared/lib/theme.txt
+++ b/build/shared/lib/theme.txt
@@ -53,7 +53,7 @@ buttons.bgcolor = #000000
## size of divider between editing area and the console
#divider.size = 0
## the larger divider on windows is ugly with the little arrows
-## this makes it large enough to see (mouse changes) and use,
+## this makes it large enough to see (mouse changes) and use,
## but keeps it from being annoyingly obtrusive
#divider.size.windows = 2
@@ -174,3 +174,35 @@ manager.tab.background = #132638
# tree for Examples and Sketchbook windows
tree.font = processing.sans,plain,12
+
+
+# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+# TEXT - KEYWORDS, LITERALS
+# For an explanation of these tags, see Token.java:
+# processing/app/src/processing/app/syntax/Token.java
+
+editor.token.function1.style = #006699,plain
+editor.token.function2.style = #006699,plain
+editor.token.function3.style = #669900,plain
+editor.token.function4.style = #006699,bold
+
+editor.token.keyword1.style = #33997e,plain
+editor.token.keyword2.style = #33997e,plain
+editor.token.keyword3.style = #669900,plain
+editor.token.keyword4.style = #d94a7a,plain
+editor.token.keyword5.style = #e2661a,plain
+editor.token.keyword6.style = #33997e,plain
+
+editor.token.literal1.style = #7D4793,plain
+editor.token.literal2.style = #718a62,plain
+
+editor.token.operator.style = #006699,plain
+
+editor.token.label.style = #666666,bold
+
+editor.token.comment1.style = #666666,plain
+editor.token.comment2.style = #666666,plain
+
+editor.token.invalid.style = #666666,bold
diff --git a/build/shared/tools/ThemeEngine/src/processing/app/tools/ThemeEngine.java b/build/shared/tools/ThemeEngine/src/processing/app/tools/ThemeEngine.java
index 945129268..f2e1d0a9c 100644
--- a/build/shared/tools/ThemeEngine/src/processing/app/tools/ThemeEngine.java
+++ b/build/shared/tools/ThemeEngine/src/processing/app/tools/ThemeEngine.java
@@ -21,9 +21,11 @@ public class ThemeEngine implements Tool {
public void run() {
//setVisible(true);
//Preferences.init();
+
for (Editor editor : base.getEditors()) {
- System.out.println("Updating settings for " + editor.getSketch().getName());
- editor.applyPreferences();
+ System.out.println("Updating theme for " + editor.getSketch().getName());
+ //editor.applyPreferences();
+ editor.updateTheme();
}
}
}
diff --git a/java/src/processing/mode/java/ASTViewer.java b/java/src/processing/mode/java/ASTViewer.java
index 7b5cb239a..bac758c6f 100644
--- a/java/src/processing/mode/java/ASTViewer.java
+++ b/java/src/processing/mode/java/ASTViewer.java
@@ -50,7 +50,7 @@ class ASTViewer {
return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus);
}
};
- tree.setCellRenderer(new ZoomTreeCellRenderer(editor.getMode()));
+ tree.setCellRenderer(new ZoomTreeCellRenderer());
window.addComponentListener(new ComponentAdapter() {
@Override
public void componentHidden(ComponentEvent e) {
diff --git a/java/src/processing/mode/java/ShowUsage.java b/java/src/processing/mode/java/ShowUsage.java
index ca2473409..09f90236a 100644
--- a/java/src/processing/mode/java/ShowUsage.java
+++ b/java/src/processing/mode/java/ShowUsage.java
@@ -82,7 +82,7 @@ class ShowUsage {
JScrollPane sp2 = new JScrollPane();
tree = new JTree();
ZoomTreeCellRenderer renderer =
- new ZoomTreeCellRenderer(editor.getMode());
+ new ZoomTreeCellRenderer();
tree.setCellRenderer(renderer);
renderer.setLeafIcon(null);
renderer.setClosedIcon(null);
diff --git a/todo.txt b/todo.txt
index 016050760..689d34023 100755
--- a/todo.txt
+++ b/todo.txt
@@ -18,6 +18,15 @@ X trying to save the user from themselves here is just messier than needed
X opt to open a new editor window rather than weird error messages
X https://github.com/processing/processing4/issues/189
X add ProRes 4444 support to Movie Maker
+X major theme changes
+X move theme out of Mode and into its own Theme class
+X remove setMode()/updateAppearance(), replace with updateTheme()
+X Theme has static access, update throughout the code
+X pieces in place to handle updates to theme while still running
+X ignore theme.txt for Modes (no longer a Mode thing)
+X move syntax colors out of preferences.txt and into theme.txt
+X (because it can also be accessed via the sketchbook)
+_ https://github.com/processing/processing/wiki/Dark-Theme-for-PDE
api changes
X Editor.applyPreferences() was protected, now public