Przeglądaj źródła

CSS: solid matte border

Ranides Atterwim 2 lat temu
rodzic
commit
2a3e6443c0

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

@@ -57,8 +57,8 @@ SWING_BORDER_bevel_soft: 'soft-bevel';
 
 borderSize
     : borderSizeComponent #borderSize1
-    | borderSizeComponent borderSizeComponent #borderSize2
-    | borderSizeComponent borderSizeComponent borderSizeComponent borderSizeComponent #borderSize4
+    | borderSizeComponent WS borderSizeComponent #borderSize2
+    | borderSizeComponent WS borderSizeComponent WS borderSizeComponent WS borderSizeComponent #borderSize4
     ;
 
 borderSizeComponent

+ 18 - 4
assira.ui/src/main/java/net/ranides/assira/ui/primitives/CssParser.java

@@ -230,10 +230,13 @@ public class CssParser {
 
             switch (style) {
                 case SOLID:
-                    return BorderFactory.createLineBorder(
-                        color.orElseGet(() -> node.get(COMPONENT).get().getBackground()),
-                        size.orElse(CssBorderSize.SINGLE).left
-                    );
+                    Color icolor = color.orElseGet(() -> node.get(COMPONENT).get().getBackground());
+                    CssBorderSize isize = size.orElse(CssBorderSize.SINGLE);
+                    if(isize.isSimple()) {
+                        return BorderFactory.createLineBorder(icolor, isize.getSize());
+                    } else {
+                        return BorderFactory.createMatteBorder(isize.top, isize.left, isize.bottom, isize.right, icolor);
+                    }
                 case OUTSET:
                     return CustomBevelBorder.newInstance(size.map(CssBorderSize::getLeft), color, CustomBevelBorder.RAISED);
                 case INSET:
@@ -304,6 +307,17 @@ public class CssParser {
         private final int left;
         private final int bottom;
         private final int right;
+
+        public boolean isSimple() {
+            return top == left && top == bottom && top == right;
+        }
+
+        public int getSize() {
+            if(!isSimple()) {
+                throw new IllegalArgumentException("This type of border requires simple border size");
+            }
+            return left;
+        }
     }
 
 

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

@@ -322,6 +322,17 @@ public class CssParserTest {
         ImageAssert.assertEquals("borders/border1d.bmp", paintBorder(panel, CssParser.border(panel, "outset 4px")));
         ImageAssert.assertEquals("borders/border1e.bmp", paintBorder(panel, CssParser.border(panel, "outset #800")));
         ImageAssert.assertEquals("borders/border1f.bmp", paintBorder(panel, CssParser.border(panel, "outset")));
+
+        ImageAssert.assertEquals("borders/border1g.bmp", paintBorder(panel, CssParser.border(panel, "solid #800 1px 2px 3px 4px")));
+    }
+
+    @Test
+    public void testBorderSize() {
+        assertEquals("2px", CssParser.PARSER.parse("borderSize", "2px").text() );
+        assertEquals("2px 4px", CssParser.PARSER.parse("borderSize", "2px 4px").text() );
+        assertEquals("2px 4px 8px 2px", CssParser.PARSER.parse("borderSize", "2px 4px 8px 2px").text() );
+
+        assertEquals("2px", CssParser.PARSER.parse("borderSize", "2px4px8px2px").text() );
     }
 
     private BufferedImage paintBorder(JPanel panel, Border border) throws IOException {

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


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


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


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


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