|
@@ -5,6 +5,7 @@ import net.ranides.assira.generic.ValueUtils;
|
|
|
import net.ranides.assira.grammar.G4Node;
|
|
import net.ranides.assira.grammar.G4Node;
|
|
|
import net.ranides.assira.grammar.G4Selector;
|
|
import net.ranides.assira.grammar.G4Selector;
|
|
|
import net.ranides.assira.grammar.G4SelectorBuilder;
|
|
import net.ranides.assira.grammar.G4SelectorBuilder;
|
|
|
|
|
+import net.ranides.assira.ui.model.CssUnitAngle;
|
|
|
import net.ranides.assira.ui.model.CssUnit;
|
|
import net.ranides.assira.ui.model.CssUnit;
|
|
|
import net.ranides.grammars.generated.UiGrammarParser;
|
|
import net.ranides.grammars.generated.UiGrammarParser;
|
|
|
|
|
|
|
@@ -14,8 +15,8 @@ import java.awt.*;
|
|
|
@UtilityClass
|
|
@UtilityClass
|
|
|
public class ParseCssUnit {
|
|
public class ParseCssUnit {
|
|
|
|
|
|
|
|
- public static final G4Selector<CssUnit> UNIT = new G4SelectorBuilder<CssUnit>()
|
|
|
|
|
- .withName("CssUnit:UNIT")
|
|
|
|
|
|
|
+ public static final G4Selector<CssUnit> UNIT_LENGTH = new G4SelectorBuilder<CssUnit>()
|
|
|
|
|
+ .withName("CssUnit:UNIT_LENGTH")
|
|
|
.withParser(GrammarBase.PARSER)
|
|
.withParser(GrammarBase.PARSER)
|
|
|
.valueForToken(UiGrammarParser.CSS2_UNIT_PX, CssUnit.PX)
|
|
.valueForToken(UiGrammarParser.CSS2_UNIT_PX, CssUnit.PX)
|
|
|
.valueForToken(UiGrammarParser.CSS2_UNIT_PT, CssUnit.PT)
|
|
.valueForToken(UiGrammarParser.CSS2_UNIT_PT, CssUnit.PT)
|
|
@@ -47,17 +48,36 @@ public class ParseCssUnit {
|
|
|
.valueForToken(UiGrammarParser.CSS2_UNIT_VMIN, CssUnit.VMIN)
|
|
.valueForToken(UiGrammarParser.CSS2_UNIT_VMIN, CssUnit.VMIN)
|
|
|
.prepare();
|
|
.prepare();
|
|
|
|
|
|
|
|
|
|
+ public static final G4Selector<CssUnitAngle> UNIT_ANGLE = new G4SelectorBuilder<CssUnitAngle>()
|
|
|
|
|
+ .withName("CssUnit:UNIT")
|
|
|
|
|
+ .withParser(GrammarBase.PARSER)
|
|
|
|
|
+ .valueForToken(UiGrammarParser.CSS4_DEG, CssUnitAngle.DEG)
|
|
|
|
|
+ .valueForToken(UiGrammarParser.CSS4_RAD, CssUnitAngle.RAD)
|
|
|
|
|
+ .valueForToken(UiGrammarParser.CSS4_GRAD, CssUnitAngle.GRAD)
|
|
|
|
|
+ .valueForToken(UiGrammarParser.CSS4_TURN, CssUnitAngle.TURN)
|
|
|
|
|
+ .prepare();
|
|
|
|
|
+
|
|
|
public static final G4Selector<Integer> LENGTH = new G4SelectorBuilder<Integer>()
|
|
public static final G4Selector<Integer> LENGTH = new G4SelectorBuilder<Integer>()
|
|
|
.withName("CssUnit:LENGTH")
|
|
.withName("CssUnit:LENGTH")
|
|
|
.withParser(GrammarBase.PARSER)
|
|
.withParser(GrammarBase.PARSER)
|
|
|
.mapRule(UiGrammarParser.RULE_length, node -> {
|
|
.mapRule(UiGrammarParser.RULE_length, node -> {
|
|
|
Number number = ParsePrimitives.parseNumber(node.child("number"));
|
|
Number number = ParsePrimitives.parseNumber(node.child("number"));
|
|
|
- CssUnit unit = UNIT.single(node.child("unit"));
|
|
|
|
|
|
|
+ CssUnit unit = UNIT_LENGTH.single(node.child("unitLength"));
|
|
|
return Math.round(length(node, number, unit).floatValue());
|
|
return Math.round(length(node, number, unit).floatValue());
|
|
|
|
|
|
|
|
})
|
|
})
|
|
|
.prepare();
|
|
.prepare();
|
|
|
|
|
|
|
|
|
|
+ public static final G4Selector<Double> ANGLE = new G4SelectorBuilder<Double>()
|
|
|
|
|
+ .withName("CssUnit:ANGLE")
|
|
|
|
|
+ .withParser(GrammarBase.PARSER)
|
|
|
|
|
+ .mapRule(UiGrammarParser.RULE_angle, node -> {
|
|
|
|
|
+ Number number = ParsePrimitives.parseNumber(node.child("number"));
|
|
|
|
|
+ CssUnitAngle unit = UNIT_ANGLE.optional(node).orElse(CssUnitAngle.DEG);
|
|
|
|
|
+ return angle(number, unit).doubleValue();
|
|
|
|
|
+ })
|
|
|
|
|
+ .prepare();
|
|
|
|
|
+
|
|
|
public static int length(JComponent component, String value) {
|
|
public static int length(JComponent component, String value) {
|
|
|
return GrammarBase.parseSingle(LENGTH, "length", component, value);
|
|
return GrammarBase.parseSingle(LENGTH, "length", component, value);
|
|
|
}
|
|
}
|
|
@@ -129,6 +149,28 @@ public class ParseCssUnit {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public static Number angle(String value) {
|
|
|
|
|
+ return GrammarBase.parseSingle(ANGLE, "angle", value);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static Number angle(Number number, CssUnitAngle unit) {
|
|
|
|
|
+ double v = number.doubleValue();
|
|
|
|
|
+
|
|
|
|
|
+ switch (unit) {
|
|
|
|
|
+ case DEG:
|
|
|
|
|
+ return number;
|
|
|
|
|
+ case RAD:
|
|
|
|
|
+ return 180.0 * v / Math.PI;
|
|
|
|
|
+ case GRAD:
|
|
|
|
|
+ return 0.9 * v;
|
|
|
|
|
+ case TURN:
|
|
|
|
|
+ return 360.0 * v;
|
|
|
|
|
+
|
|
|
|
|
+ default:
|
|
|
|
|
+ throw new UnsupportedOperationException("Unsupported unit: " + unit);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private static double computeEm(JComponent component) {
|
|
private static double computeEm(JComponent component) {
|
|
|
return 1.3333 * component.getFont().getSize();
|
|
return 1.3333 * component.getFont().getSize();
|
|
|
}
|
|
}
|