From 9460f2272f88e54259a5d68f3b051a3982b91235 Mon Sep 17 00:00:00 2001 From: Daniel Abeshouse Date: Wed, 18 Feb 2026 16:46:33 -0500 Subject: [PATCH 1/5] Center and align the control flow panel --- .../org/alice/ide/controlflow/components/ControlFlowPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ide/src/main/java/org/alice/ide/controlflow/components/ControlFlowPanel.java b/core/ide/src/main/java/org/alice/ide/controlflow/components/ControlFlowPanel.java index 10a4527848..efd0906442 100644 --- a/core/ide/src/main/java/org/alice/ide/controlflow/components/ControlFlowPanel.java +++ b/core/ide/src/main/java/org/alice/ide/controlflow/components/ControlFlowPanel.java @@ -67,7 +67,7 @@ public ControlFlowPanel(ControlFlowComposite composite) { this.internalAddComponent(BoxUtilities.createHorizontalSliver(8)); } } - this.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); + this.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 0)); } @Override From 9b14c11bf5059ad42c89ba53ac4f17834ff29bae Mon Sep 17 00:00:00 2001 From: Daniel Abeshouse Date: Tue, 24 Feb 2026 10:58:13 -0500 Subject: [PATCH 2/5] Add border to labels in mini control blocks --- .../components/MiniControlFlowStatementTemplate.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/ide/src/main/java/org/alice/ide/controlflow/components/MiniControlFlowStatementTemplate.java b/core/ide/src/main/java/org/alice/ide/controlflow/components/MiniControlFlowStatementTemplate.java index 16ea9860c8..84cefcee76 100644 --- a/core/ide/src/main/java/org/alice/ide/controlflow/components/MiniControlFlowStatementTemplate.java +++ b/core/ide/src/main/java/org/alice/ide/controlflow/components/MiniControlFlowStatementTemplate.java @@ -45,6 +45,7 @@ import edu.cmu.cs.dennisc.java.util.ResourceBundleUtilities; import edu.cmu.cs.dennisc.javax.swing.tooltips.JToolTip; +import org.alice.ide.Theme; import org.alice.ide.ast.draganddrop.statement.ExpressionStatementTemplateDragModel; import org.alice.ide.ast.draganddrop.statement.StatementTemplateDragModel; import org.alice.ide.templates.StatementTemplate; @@ -136,6 +137,7 @@ protected void handleDisplayable() { this.label.setForegroundColor(UIManager.getColor("Alice.Comment.foreground")); } //this.label.setFontToScaledFont( 1.2f ); + this.label.setBorder(Theme.BLOCK_BORDER); this.addComponent(this.label); this.setToolTipText(""); } From 3d04552d83917f56ce6c825d183f2bfbce1afda8 Mon Sep 17 00:00:00 2001 From: Daniel Abeshouse Date: Tue, 24 Feb 2026 11:51:28 -0500 Subject: [PATCH 3/5] Base knurl color on the background color --- .../org/alice/stageide/themes/FlatLaf.properties | 3 ++- .../java/org/lgna/croquet/views/MutableList.java | 4 ++-- .../src/main/java/org/alice/ide/DefaultTheme.java | 15 +++++++++++++++ core/ide/src/main/java/org/alice/ide/Theme.java | 2 ++ .../croquet/components/KnurlDragComponent.java | 9 ++++++--- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/alice-ide/src/main/resources/org/alice/stageide/themes/FlatLaf.properties b/alice-ide/src/main/resources/org/alice/stageide/themes/FlatLaf.properties index c5be6cf5ea..dbe5b8536e 100644 --- a/alice-ide/src/main/resources/org/alice/stageide/themes/FlatLaf.properties +++ b/alice-ide/src/main/resources/org/alice/stageide/themes/FlatLaf.properties @@ -84,7 +84,8 @@ Alice.Block.background = #FFFFFF # Text/outlines Alice.Block.foreground = #F2F2F7 # Dots on the edge -Alice.Block.knurlForeground = #D9D9D9 +Alice.Block.lightKnurlForeground = #D9D9D9 +Alice.Block.darkKnurlForeground = #3E3E41 # contrasting text/backgrounds Alice.Block.contrastForeground = #3E3E41 diff --git a/core/croquet/src/main/java/org/lgna/croquet/views/MutableList.java b/core/croquet/src/main/java/org/lgna/croquet/views/MutableList.java index 7409739495..8d9f624912 100644 --- a/core/croquet/src/main/java/org/lgna/croquet/views/MutableList.java +++ b/core/croquet/src/main/java/org/lgna/croquet/views/MutableList.java @@ -110,7 +110,7 @@ public void layoutContainer(Container parent) { } private static final Color BASE_COLOR = UIManager.getColor("List.background"); - private static final Color KNURL_COLOR = UIManager.getColor("Alice.Block.knurlForeground"); + private static final Color KNURL_COLOR = UIManager.getColor("Alice.Block.darkKnurlForeground"); private static final Color OUTLINE_COLOR = UIManager.getColor("Alice.differentBackground"); private static final Color SELECTED_OUTLINE_COLOR = UIManager.getColor("List.selectionBackground"); @@ -153,7 +153,7 @@ protected void paintComponent(Graphics g) { g2.drawRoundRect(0, 0, width, height, 8, 8); g2.setStroke(prevStroke); - g2.setPaint(KNURL_COLOR); + g2.setPaint(KNURL_COLOR); KnurlUtilities.paintKnurl5(g, 2, 2, 6, height - 5); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, prevAntialiasing == null ? RenderingHints.VALUE_ANTIALIAS_DEFAULT : prevAntialiasing); diff --git a/core/ide/src/main/java/org/alice/ide/DefaultTheme.java b/core/ide/src/main/java/org/alice/ide/DefaultTheme.java index fc7af64029..5b6f9ca00f 100644 --- a/core/ide/src/main/java/org/alice/ide/DefaultTheme.java +++ b/core/ide/src/main/java/org/alice/ide/DefaultTheme.java @@ -53,6 +53,21 @@ */ public class DefaultTheme implements Theme { + // Closer to zero the darker it is. This threshold is arbitrary and may need adjustment. + private static final int DARK_THRESHOLD = 600; + + @Override + public Color getKnurlColorFor(Color backgroundColor) { + return isDark(backgroundColor) + ? UIManager.getColor("Alice.Block.lightKnurlForeground") + : UIManager.getColor("Alice.Block.darkKnurlForeground"); + } + + private static boolean isDark(Color color) { + int brightness = color.getRed() + color.getGreen() + color.getBlue(); + return brightness < DARK_THRESHOLD; + } + @Override public Color getColorFor(Class cls) { if (Statement.class.isAssignableFrom(cls)) { diff --git a/core/ide/src/main/java/org/alice/ide/Theme.java b/core/ide/src/main/java/org/alice/ide/Theme.java index bb86917a8c..7686f09f1a 100644 --- a/core/ide/src/main/java/org/alice/ide/Theme.java +++ b/core/ide/src/main/java/org/alice/ide/Theme.java @@ -68,6 +68,8 @@ public interface Theme { public static final int BLOCK_MARGINS_HEIGHT = 1; public static final Border BLOCK_BORDER = BorderFactory.createEmptyBorder(BLOCK_MARGINS_HEIGHT, BLOCK_MARGINS_WIDTH, BLOCK_MARGINS_HEIGHT, BLOCK_MARGINS_WIDTH); + Color getKnurlColorFor(Color backgroundColor); + public Color getColorFor(Class cls); public Color getColorFor(Node node); diff --git a/core/ide/src/main/java/org/alice/ide/croquet/components/KnurlDragComponent.java b/core/ide/src/main/java/org/alice/ide/croquet/components/KnurlDragComponent.java index e06cd46aec..372bb15ded 100644 --- a/core/ide/src/main/java/org/alice/ide/croquet/components/KnurlDragComponent.java +++ b/core/ide/src/main/java/org/alice/ide/croquet/components/KnurlDragComponent.java @@ -46,6 +46,7 @@ import edu.cmu.cs.dennisc.java.awt.ColorUtilities; import edu.cmu.cs.dennisc.java.awt.KnurlUtilities; import org.alice.ide.Theme; +import org.alice.ide.ThemeUtilities; import org.lgna.croquet.DragModel; import org.lgna.croquet.views.AwtComponentView; import org.lgna.croquet.views.DragComponent; @@ -54,7 +55,6 @@ import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JToolTip; -import javax.swing.UIManager; import java.awt.*; import java.awt.event.MouseEvent; @@ -238,12 +238,15 @@ protected void paintEpilogue(Graphics2D g2, int x, int y, int width, int height) Shape shape = this.createShape(x, y, width, height); this.paintOutline(g2, shape); if (isKnurlDesired()) { - Color c = this.isActive() ? getOutlineColor() : UIManager.getColor("Alice.Block.knurlForeground"); - g2.setColor(c); + g2.setColor(getKnurlColor()); KnurlUtilities.paintKnurl5(g2, x + this.getDockInsetLeft(), y + 2, KNURL_WIDTH, height - 5); } } + protected Color getKnurlColor() { + return this.isActive() ? getOutlineColor() : ThemeUtilities.getActiveTheme().getKnurlColorFor(getBackgroundColor()); + } + public void addComponent(AwtComponentView component) { this.internalAddComponent(component); } From 27eec9ea6f983d2d9ff6c9a2791e7485f51c442f Mon Sep 17 00:00:00 2001 From: Daniel Abeshouse Date: Tue, 24 Feb 2026 11:52:11 -0500 Subject: [PATCH 4/5] Code tidying --- .../main/java/org/alice/ide/DefaultTheme.java | 2 +- .../src/main/java/org/alice/ide/Theme.java | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/ide/src/main/java/org/alice/ide/DefaultTheme.java b/core/ide/src/main/java/org/alice/ide/DefaultTheme.java index 5b6f9ca00f..37f3a79f80 100644 --- a/core/ide/src/main/java/org/alice/ide/DefaultTheme.java +++ b/core/ide/src/main/java/org/alice/ide/DefaultTheme.java @@ -83,7 +83,7 @@ public Color getColorFor(Class cls) { private static Color getStatementColor(Class cls) { if (Comment.class.isAssignableFrom(cls)) { return UIManager.getColor("Alice.Comment.background"); - } else if (org.lgna.project.ast.LocalDeclarationStatement.class.isAssignableFrom(cls)) { + } else if (LocalDeclarationStatement.class.isAssignableFrom(cls)) { // aka variable creation return UIManager.getColor("Alice.Block.background"); } else if (ClassUtilities.isAssignableToAtLeastOne(cls, AbstractStatementWithBody.class, ConditionalStatement.class)) { diff --git a/core/ide/src/main/java/org/alice/ide/Theme.java b/core/ide/src/main/java/org/alice/ide/Theme.java index 7686f09f1a..c89470080f 100644 --- a/core/ide/src/main/java/org/alice/ide/Theme.java +++ b/core/ide/src/main/java/org/alice/ide/Theme.java @@ -54,26 +54,26 @@ * @author Dennis Cosgrove */ public interface Theme { - public static final Dimension EXTRA_SMALL_RECT_ICON_SIZE = new Dimension(24, 18); - public static final Dimension SMALL_RECT_ICON_SIZE = new Dimension(32, 24); - public static final Dimension MEDIUM_RECT_ICON_SIZE = new Dimension(40, 30); - public static final Dimension LARGE_RECT_ICON_SIZE = new Dimension(120, 90); + Dimension EXTRA_SMALL_RECT_ICON_SIZE = new Dimension(24, 18); + Dimension SMALL_RECT_ICON_SIZE = new Dimension(32, 24); + Dimension MEDIUM_RECT_ICON_SIZE = new Dimension(40, 30); + Dimension LARGE_RECT_ICON_SIZE = new Dimension(120, 90); - public static final Dimension EXTRA_SMALL_SQUARE_ICON_SIZE = new Dimension(16, 16); - public static final Dimension SMALL_SQUARE_ICON_SIZE = new Dimension(22, 22); - public static final Dimension MEDIUM_SQUARE_ICON_SIZE = new Dimension(32, 32); - public static final Dimension LARGE_SQUARE_ICON_SIZE = new Dimension(90, 90); + Dimension EXTRA_SMALL_SQUARE_ICON_SIZE = new Dimension(16, 16); + Dimension SMALL_SQUARE_ICON_SIZE = new Dimension(22, 22); + Dimension MEDIUM_SQUARE_ICON_SIZE = new Dimension(32, 32); + Dimension LARGE_SQUARE_ICON_SIZE = new Dimension(90, 90); - public static final int BLOCK_MARGINS_WIDTH = 2; - public static final int BLOCK_MARGINS_HEIGHT = 1; - public static final Border BLOCK_BORDER = BorderFactory.createEmptyBorder(BLOCK_MARGINS_HEIGHT, BLOCK_MARGINS_WIDTH, BLOCK_MARGINS_HEIGHT, BLOCK_MARGINS_WIDTH); + int BLOCK_MARGINS_WIDTH = 2; + int BLOCK_MARGINS_HEIGHT = 1; + Border BLOCK_BORDER = BorderFactory.createEmptyBorder(BLOCK_MARGINS_HEIGHT, BLOCK_MARGINS_WIDTH, BLOCK_MARGINS_HEIGHT, BLOCK_MARGINS_WIDTH); Color getKnurlColorFor(Color backgroundColor); - public Color getColorFor(Class cls); + Color getColorFor(Class cls); - public Color getColorFor(Node node); + Color getColorFor(Node node); - public Color getCodeColor(Code code); + Color getCodeColor(Code code); } From 193321ac73549bd090ae0c3d282a9e11e7d2e072 Mon Sep 17 00:00:00 2001 From: Daniel Abeshouse Date: Tue, 24 Feb 2026 17:49:26 -0500 Subject: [PATCH 5/5] Remove space I did not intend --- .../src/main/java/org/lgna/croquet/views/MutableList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/croquet/src/main/java/org/lgna/croquet/views/MutableList.java b/core/croquet/src/main/java/org/lgna/croquet/views/MutableList.java index 8d9f624912..70a4e611f4 100644 --- a/core/croquet/src/main/java/org/lgna/croquet/views/MutableList.java +++ b/core/croquet/src/main/java/org/lgna/croquet/views/MutableList.java @@ -153,7 +153,7 @@ protected void paintComponent(Graphics g) { g2.drawRoundRect(0, 0, width, height, 8, 8); g2.setStroke(prevStroke); - g2.setPaint(KNURL_COLOR); + g2.setPaint(KNURL_COLOR); KnurlUtilities.paintKnurl5(g, 2, 2, 6, height - 5); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, prevAntialiasing == null ? RenderingHints.VALUE_ANTIALIAS_DEFAULT : prevAntialiasing);