Jelajahi Sumber

assira.ui - swing geometric primitives

Ranides Atterwim 1 tahun lalu
induk
melakukan
3936e8ed2e

+ 1 - 1
assira.ui/src/main/antlr4/imports/CssUnit.g4

@@ -8,7 +8,7 @@ length:
 
 length2
     : length WS length
-    | length WS length
+    | length CS length
     ;
 
 length4

+ 18 - 0
assira.ui/src/main/antlr4/imports/SwingGeometry.g4

@@ -0,0 +1,18 @@
+grammar SwingGeometry;
+
+import BasePrimitives, CssUnit;
+
+coords2
+    : length2
+    | numberInt2
+    ;
+
+coords4
+    : length4
+    | numberInt4
+    ;
+
+coords
+    : lengths
+    | numberInts
+    ;

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

@@ -1,6 +1,6 @@
 grammar UiGrammar;
 
-import BasePrimitives, CssColor, CssUnit, CssBorder, SwingBorder, SwingFont, CssFont;
+import BasePrimitives, CssColor, CssUnit, CssBorder, SwingBorder, SwingFont, CssFont, SwingGeometry;
 
 root_colors
     : color (WS color)+ EOF    #color_list
@@ -25,4 +25,16 @@ root_font
 font
     : fontSwing
     | fontCss
-    ;
+    ;
+
+root_coords
+    : coords EOF
+    ;
+
+root_coords2
+    : coords2 EOF
+    ;
+
+root_coords4
+    : coords4 EOF
+    ;

+ 57 - 0
assira.ui/src/main/java/net/ranides/assira/ui/parsers/ParseSwingGeometry.java

@@ -0,0 +1,57 @@
+package net.ranides.assira.ui.parsers;
+
+import lombok.experimental.UtilityClass;
+import net.ranides.assira.grammar.G4Selector;
+import net.ranides.assira.grammar.G4SelectorBuilder;
+import net.ranides.grammars.generated.UiGrammarParser;
+
+import java.awt.*;
+import java.util.List;
+
+@UtilityClass
+public class ParseSwingGeometry {
+
+    public static final G4Selector<List<Integer>> COORDS = new G4SelectorBuilder<List<Integer>>()
+        .withName("ParseSwingCoords:COORDS")
+        .withParser(GrammarBase.PARSER)
+        .mapRule(UiGrammarParser.RULE_length2, node -> {
+            return ParseCssUnit.LENGTH.list(node);
+        })
+        .mapRule(UiGrammarParser.RULE_length4, node -> {
+            return ParseCssUnit.LENGTH.list(node);
+        })
+        .mapRule(UiGrammarParser.RULE_lengths, node -> {
+            return ParseCssUnit.LENGTH.list(node);
+        })
+        .mapRule(UiGrammarParser.RULE_numberInt2, node -> {
+            return ParsePrimitives.INT.list(node);
+        })
+        .mapRule(UiGrammarParser.RULE_numberInt4, node -> {
+            return ParsePrimitives.INT.list(node);
+        })
+        .mapRule(UiGrammarParser.RULE_numberInts, node -> {
+            return ParsePrimitives.INT.list(node);
+        })
+        .prepare();
+
+    public static Point parsePoint(String value) {
+        List<Integer> ints = GrammarBase.parseSingle(COORDS, "root_coords2", value);
+        return new Point(ints.get(0), ints.get(1));
+    }
+
+    public static Dimension parseDimension(String value) {
+        List<Integer> ints = GrammarBase.parseSingle(COORDS, "root_coords2", value);
+        return new Dimension(ints.get(0), ints.get(1));
+    }
+
+    public static Rectangle parseRectangle(String value) {
+        List<Integer> ints = GrammarBase.parseSingle(COORDS, "root_coords4", value);
+        return new Rectangle(ints.get(0), ints.get(1), ints.get(2), ints.get(3));
+    }
+
+    public static Insets parseInsets(String value) {
+        List<Integer> ints = GrammarBase.parseSingle(COORDS, "root_coords4", value);
+        return new Insets(ints.get(0), ints.get(1), ints.get(2), ints.get(3));
+    }
+
+}

+ 3 - 0
assira.ui/src/test/java/net/ranides/assira/ui/parsers/ParseCssUnitTest.java

@@ -17,6 +17,9 @@ public class ParseCssUnitTest {
     public void multipleLength() {
         assertEquals(Arrays.asList(15, 30), GrammarBase.parseStream(ParseCssUnit.LENGTH, "length2", "15px 30px").list());
         assertEquals(Arrays.asList(15, 30, 151, 27), GrammarBase.parseStream(ParseCssUnit.LENGTH, "length4", "15px 30px 4cm 20pt").list());
+
+        assertArrayEquals(new Integer[]{15, 30}, GrammarBase.parseStream(ParseCssUnit.LENGTH, "length2", "15px 30px").array(Integer[]::new));
+        assertArrayEquals(new Integer[]{15, 30, 151, 27}, GrammarBase.parseStream(ParseCssUnit.LENGTH, "length4", "15px 30px 4cm 20pt").array(Integer[]::new));
     }
 
     @Test

+ 47 - 0
assira.ui/src/test/java/net/ranides/assira/ui/parsers/ParseSwingGeometryTest.java

@@ -0,0 +1,47 @@
+package net.ranides.assira.ui.parsers;
+
+import org.junit.Test;
+
+import java.awt.*;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class ParseSwingGeometryTest {
+
+    @Test
+    public void testPoint() {
+        assertEquals(new Point(10,15), ParseSwingGeometry.parsePoint("10 15"));
+        assertEquals(new Point(10,15), ParseSwingGeometry.parsePoint("10, 15"));
+        assertEquals(new Point(10,15), ParseSwingGeometry.parsePoint("10px 15px"));
+        assertEquals(new Point(10,15), ParseSwingGeometry.parsePoint("10px, 15px"));
+    }
+
+    @Test
+    public void testDimension() {
+        assertEquals(new Dimension(10,15), ParseSwingGeometry.parseDimension("10 15"));
+        assertEquals(new Dimension(10,15), ParseSwingGeometry.parseDimension("10, 15"));
+        assertEquals(new Dimension(10,15), ParseSwingGeometry.parseDimension("10px 15px"));
+        assertEquals(new Dimension(10,15), ParseSwingGeometry.parseDimension("10px, 15px"));
+    }
+
+    @Test
+    public void testRectangle() {
+        assertEquals(new Rectangle(10, 15, 20, 40), ParseSwingGeometry.parseRectangle("10 15 20 40"));
+        assertEquals(new Rectangle(10, 15, 20, 40), ParseSwingGeometry.parseRectangle("10, 15, 20, 40"));
+        assertEquals(new Rectangle(10, 15, 20, 40), ParseSwingGeometry.parseRectangle("10px 15px 20px 40px"));
+        assertEquals(new Rectangle(10, 15, 20, 40), ParseSwingGeometry.parseRectangle("10px, 15px, 20px, 40px"));
+    }
+
+    @Test
+    public void testInsets() {
+        assertEquals(new Insets(10, 15, 20, 40), ParseSwingGeometry.parseInsets("10 15 20 40"));
+        assertEquals(new Insets(10, 15, 20, 40), ParseSwingGeometry.parseInsets("10, 15, 20, 40"));
+        assertEquals(new Insets(10, 15, 20, 40), ParseSwingGeometry.parseInsets("10px 15px 20px 40px"));
+        assertEquals(new Insets(10, 15, 20, 40), ParseSwingGeometry.parseInsets("10px, 15px, 20px, 40px"));
+//        assertThrows(IllegalArgumentException.class, () -> {
+//            ParseSwingGeometry.parseInsets("10px, 15px, 20px, 40px");
+//        });
+    }
+
+}