Browse Source

swing border

Ranides Atterwim 2 years ago
parent
commit
e944e0380b

+ 9 - 2
assira.ui/src/main/antlr4/net/ranides/grammars/generated/CssGrammar.g4

@@ -41,8 +41,8 @@ borderCSS_Style
     ;
     ;
 
 
 borderSwingSimple
 borderSwingSimple
-    : borderSwingSimple_Style WS numberUnit WS color (WS color)?
-    | borderSwingSimple_Style WS color (WS color)? WS numberUnit
+    : borderSwingSimple_Style WS borderSwingSimple_Type (WS color)? (WS color)?
+    | borderSwingSimple_Style WS borderSwingSimple_Type (WS color)? (WS color)?
     ;
     ;
 
 
 borderSwingSimple_Style
 borderSwingSimple_Style
@@ -51,9 +51,16 @@ borderSwingSimple_Style
     | SWING_BORDER_bevel_soft
     | SWING_BORDER_bevel_soft
     ;
     ;
 
 
+borderSwingSimple_Type
+    : SWING_BORDER_raised
+    | SWING_BORDER_lowered
+    ;
+
 SWING_BORDER_etched: 'etched';
 SWING_BORDER_etched: 'etched';
 SWING_BORDER_bevel: 'bevel';
 SWING_BORDER_bevel: 'bevel';
 SWING_BORDER_bevel_soft: 'soft-bevel';
 SWING_BORDER_bevel_soft: 'soft-bevel';
+SWING_BORDER_raised: 'raised';
+SWING_BORDER_lowered: 'lowered';
 
 
 borderSize
 borderSize
     : borderSizeComponent #borderSize1
     : borderSizeComponent #borderSize1

+ 61 - 17
assira.ui/src/main/java/net/ranides/assira/ui/primitives/CssParser.java

@@ -16,7 +16,10 @@ import net.ranides.grammars.generated.CssGrammarLexer;
 import net.ranides.grammars.generated.CssGrammarParser;
 import net.ranides.grammars.generated.CssGrammarParser;
 
 
 import javax.swing.*;
 import javax.swing.*;
+import javax.swing.border.BevelBorder;
 import javax.swing.border.Border;
 import javax.swing.border.Border;
+import javax.swing.border.EtchedBorder;
+import javax.swing.border.SoftBevelBorder;
 import java.awt.*;
 import java.awt.*;
 import java.util.NoSuchElementException;
 import java.util.NoSuchElementException;
 import java.util.List;
 import java.util.List;
@@ -301,28 +304,69 @@ public class CssParser {
                         CustomBevelBorder.newInstance(size.map(CssBorderSize::getSize), color, CustomBevelBorder.LOWERED)
                         CustomBevelBorder.newInstance(size.map(CssBorderSize::getSize), color, CustomBevelBorder.LOWERED)
                     );
                     );
                 }
                 }
-//                case SWING_ETCHED: {
-//                    List<Color> colors = node.children("color").map(v -> COLOR.single(v)).list();
-//                    Object color1;
-//                    Object color2;
-//                    if(colors.size() == 1) {
-//                        Color color0 = colors.get(0);
-//                        color1 = color0.brighter();
-//                        color2 = color0.darker();
-//                    } else {
-//                        color1 = colors.get(0);
-//                        color2 = colors.get(1);
-//                    }
-//
-//                    Integer size0 = node.children("numberUnit").single().map(v -> NUMBER_UNIT.single(v)).get();
-//
-//                    BorderFactory.createEtchedBorder(size0, )
-//                }
                 default:
                 default:
                     throw new UnsupportedOperationException("Unsupported border style: " + style);
                     throw new UnsupportedOperationException("Unsupported border style: " + style);
             }
             }
 
 
 
 
+        })
+        .mapRule("borderSwingSimple", node -> {
+            CssBorderStyle style = BORDER_STYLE.first(node.child("borderSwingSimple_Style"));
+            String type = node.child("borderSwingSimple_Type").text();
+            List<Color> colors = node.children("color").map(v -> COLOR.single(v)).list();
+
+            boolean typeRaised;
+            switch (type) {
+                case "lowered":
+                    typeRaised = false;
+                    break;
+                case "raised":
+                    typeRaised = true;
+                    break;
+                default:
+                    throw new UnsupportedOperationException("Unsupported botder type: " + type);
+            }
+
+            switch (style) {
+                case SWING_ETCHED: {
+                    int etchedType = typeRaised ? EtchedBorder.RAISED : EtchedBorder.LOWERED;
+                    if (colors.size() == 2) {
+                        return BorderFactory.createEtchedBorder(etchedType, colors.get(0), colors.get(1));
+                    }
+                    if (colors.size() == 1) {
+                        return BorderFactory.createEtchedBorder(etchedType, colors.get(0).brighter(), colors.get(0).darker());
+                    }
+                    if (colors.size() == 0) {
+                        return BorderFactory.createEtchedBorder(etchedType);
+                    }
+                }
+                case SWING_BEVEL: {
+                    int bevelType = typeRaised ? BevelBorder.RAISED : BevelBorder.LOWERED;
+                    if (colors.size() == 2) {
+                        return BorderFactory.createBevelBorder(bevelType, colors.get(0), colors.get(1));
+                    }
+                    if (colors.size() == 1) {
+                        return BorderFactory.createBevelBorder(bevelType, colors.get(0).brighter(), colors.get(0).darker());
+                    }
+                    if (colors.size() == 0) {
+                        return BorderFactory.createBevelBorder(bevelType);
+                    }
+                }
+                case SWING_BEVEL_SOFT: {
+                    int softBevelType = typeRaised ? SoftBevelBorder.RAISED : SoftBevelBorder.LOWERED;
+                    if (colors.size() == 2) {
+                        return BorderFactory.createSoftBevelBorder(softBevelType, colors.get(0), colors.get(1));
+                    }
+                    if (colors.size() == 1) {
+                        return BorderFactory.createSoftBevelBorder(softBevelType, colors.get(0).brighter(), colors.get(0).darker());
+                    }
+                    if (colors.size() == 0) {
+                        return BorderFactory.createSoftBevelBorder(softBevelType);
+                    }
+                }
+                default:
+                    throw new UnsupportedOperationException("Unsupported border style: " + style);
+            }
         })
         })
         .prepare();
         .prepare();
 
 

+ 15 - 0
assira.ui/src/test/java/net/ranides/assira/ui/primitives/CssParserTest.java

@@ -341,6 +341,21 @@ public class CssParserTest {
         ImageAssert.assertEquals("borders/border1ridge2.bmp", paintBorder(panel, CssParser.border(panel, "ridge 4px")));
         ImageAssert.assertEquals("borders/border1ridge2.bmp", paintBorder(panel, CssParser.border(panel, "ridge 4px")));
     }
     }
 
 
+    @Test
+    public void testBorder2() throws IOException {
+        JPanel panel = new JPanel();
+        panel.setBackground(new Color(128,192,192));
+        panel.setForeground(Color.RED);
+
+        ImageAssert.assertEquals("borders/border2etched1.bmp", paintBorder(panel, CssParser.border(panel, "etched raised #800 #080")));
+        ImageAssert.assertEquals("borders/border2etched2.bmp", paintBorder(panel, CssParser.border(panel, "etched raised #080")));
+        ImageAssert.assertEquals("borders/border2etched3.bmp", paintBorder(panel, CssParser.border(panel, "etched raised")));
+
+        ImageAssert.assertEquals("borders/border2soft1.bmp", paintBorder(panel, CssParser.border(panel, "soft-bevel raised #0a8 #084")));
+        ImageAssert.assertEquals("borders/border2soft2.bmp", paintBorder(panel, CssParser.border(panel, "soft-bevel raised #080")));
+        ImageAssert.assertEquals("borders/border2soft3.bmp", paintBorder(panel, CssParser.border(panel, "soft-bevel raised")));
+    }
+
     @Test
     @Test
     public void testBorderSize() {
     public void testBorderSize() {
         assertEquals("2px", CssParser.PARSER.parse("borderSize", "2px").text() );
         assertEquals("2px", CssParser.PARSER.parse("borderSize", "2px").text() );

BIN
assira.ui/src/test/resources/borders/border2etched1.bmp


BIN
assira.ui/src/test/resources/borders/border2etched2.bmp


BIN
assira.ui/src/test/resources/borders/border2etched3.bmp


BIN
assira.ui/src/test/resources/borders/border2soft1.bmp


BIN
assira.ui/src/test/resources/borders/border2soft2.bmp


BIN
assira.ui/src/test/resources/borders/border2soft3.bmp