Over-writable CSS interpreter
This commit is contained in:
parent
d33413052c
commit
f06377004a
|
@ -0,0 +1,9 @@
|
|||
package Classes.css.core;
|
||||
|
||||
import javafx.scene.Node;
|
||||
|
||||
public interface Rule{
|
||||
|
||||
public void apply(Node target) throws Exception;
|
||||
|
||||
}
|
|
@ -0,0 +1,104 @@
|
|||
package Classes.css.core;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import Classes.css.core.rule.JavaFX;
|
||||
import Classes.css.core.rule.Padding;
|
||||
import Classes.css.core.rule.Position;
|
||||
import javafx.scene.Node;
|
||||
|
||||
public class Ruleset {
|
||||
|
||||
/* Attributes */
|
||||
private Node target;
|
||||
private ArrayList<Rule> rule;
|
||||
|
||||
|
||||
/* Builder -> static instance builder */
|
||||
public static Ruleset load(Node target) {
|
||||
|
||||
/* (1) Create instance */
|
||||
Ruleset instance = new Ruleset(target);
|
||||
|
||||
/* (2) Chain design pattern */
|
||||
return instance;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Constructor */
|
||||
private Ruleset(Node target) {
|
||||
|
||||
/* (1) Store target */
|
||||
this.target = target;
|
||||
|
||||
/* (2) Init. rule list */
|
||||
this.rule = new ArrayList<Rule>();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Add a rule */
|
||||
public Ruleset add(String l_side, Object... r_side) throws Exception{
|
||||
|
||||
|
||||
/* (1) Init.
|
||||
------------------------------------ */
|
||||
/* (1) If no argument -> abort */
|
||||
if( r_side.length == 0 )
|
||||
throw new Exception("No @r_side given");
|
||||
|
||||
/* (2) Init. rule container */
|
||||
Rule new_rule = null;
|
||||
|
||||
|
||||
/* (1) Manage Rule Type (auto Builder)
|
||||
------------------------------------ */
|
||||
/* (1) Padding*/
|
||||
if( l_side == "padding" )
|
||||
new_rule = (Rule) new Padding(r_side);
|
||||
|
||||
/* (2) Position */
|
||||
else if( l_side == "top" || l_side == "left" || l_side == "right" || l_side == "bottom" )
|
||||
new_rule = (Rule) new Position(l_side, (int) r_side[0]);
|
||||
|
||||
|
||||
/* (x) If nothing custom -> suppose java fx rule */
|
||||
else
|
||||
new_rule = (Rule) new JavaFX(l_side, (String) r_side[0]);
|
||||
|
||||
|
||||
|
||||
/* (2) Add the rule to the ruleset
|
||||
------------------------------------ */
|
||||
/* (1) Add the rule to the ruleset (only if not null) */
|
||||
if( new_rule != null )
|
||||
this.rule.add( new_rule );
|
||||
|
||||
/* (2) Chain design pattern */
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Apply all rules */
|
||||
public void apply() throws Exception{
|
||||
|
||||
/* (1) Init. meter */
|
||||
int i = 0;
|
||||
int il = this.rule.size();
|
||||
|
||||
/* (2) Apply each rule */
|
||||
for( ; i < il ; i++ )
|
||||
this.rule.get(i).apply(this.target);
|
||||
|
||||
/* (3) Stop the Chain design pattern */
|
||||
return;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package Classes.css.core.rule;
|
||||
|
||||
import Classes.css.core.Rule;
|
||||
import javafx.scene.Node;
|
||||
|
||||
public class JavaFX implements Rule{
|
||||
|
||||
/* Attributes */
|
||||
private String l_side;
|
||||
private String r_side;
|
||||
|
||||
|
||||
/* Constructor -> Dispatch attributes */
|
||||
public JavaFX(String l_side, String r_side){
|
||||
|
||||
/* (1) Initialize values */
|
||||
this.l_side = l_side;
|
||||
this.r_side = r_side;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void apply(Node target){
|
||||
|
||||
/* (1) Prefix with '-fx-' */
|
||||
String css_prop = "-fx-"+this.l_side+": "+this.r_side+";"; // "name: val;"
|
||||
|
||||
/* (2) Apply to target */
|
||||
target.setStyle(css_prop);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
package Classes.css.core.rule;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import Classes.css.core.Rule;
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.scene.Node;
|
||||
import javafx.scene.layout.Region;
|
||||
|
||||
public class Padding implements Rule{
|
||||
|
||||
/* Attributes */
|
||||
private Integer top;
|
||||
private Integer right;
|
||||
private Integer bottom;
|
||||
private Integer left;
|
||||
|
||||
|
||||
/* Constructor -> Dispatch attributes */
|
||||
public Padding(Object[] r_side) throws Exception{
|
||||
|
||||
|
||||
/* (1) Initialization
|
||||
------------------------------------------*/
|
||||
/* (1) Initialize values */
|
||||
this.top = null;
|
||||
this.left = null;
|
||||
this.bottom = null;
|
||||
this.right = null;
|
||||
|
||||
/* (2) Cast Object[] to ArrayList<Integer> */
|
||||
ArrayList<Integer>_r_side = this.auto_cast(r_side);
|
||||
|
||||
|
||||
|
||||
/* (2) Manage/store values
|
||||
------------------------------------------*/
|
||||
switch(r_side.length){
|
||||
|
||||
/* (1) If 4 -> (top, right, bottom, left) */
|
||||
case 4:
|
||||
this.top = _r_side.get(0);
|
||||
this.right = _r_side.get(1);
|
||||
this.bottom = _r_side.get(2);
|
||||
this.left = _r_side.get(3);
|
||||
break;
|
||||
|
||||
/* (2) If 3 -> (top, right+left, bottom) */
|
||||
case 3:
|
||||
this.top = _r_side.get(0);
|
||||
this.right = _r_side.get(1);
|
||||
this.left = _r_side.get(1);
|
||||
this.bottom = _r_side.get(2);
|
||||
break;
|
||||
|
||||
/* (3) If 2 -> (top+botton, right+left) */
|
||||
case 2:
|
||||
this.top = _r_side.get(0);
|
||||
this.bottom = _r_side.get(0);
|
||||
this.right = _r_side.get(1);
|
||||
this.left = _r_side.get(1);
|
||||
break;
|
||||
|
||||
/* (4) If 1 -> (top+botton+right+left) */
|
||||
case 1:
|
||||
this.top = _r_side.get(0);
|
||||
this.bottom = _r_side.get(0);
|
||||
this.right = _r_side.get(0);
|
||||
this.left = _r_side.get(0);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void apply(Node target){
|
||||
|
||||
/* (1) Set padding inset */
|
||||
Insets pad_inset = new Insets(this.top, this.right, this.bottom, this.left);
|
||||
|
||||
/* (2) Apply to target */
|
||||
Region _target = (Region) target;
|
||||
_target.setPadding(pad_inset);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Cast from Object[] to Integer[] */
|
||||
private ArrayList<Integer> auto_cast(Object[] cast_in) throws Exception{
|
||||
|
||||
/* (1) Init. output */
|
||||
ArrayList<Integer> cast_out = new ArrayList<Integer>();
|
||||
|
||||
/* (2) Parse input to try to parse values */
|
||||
for( Object obj_in : cast_in )
|
||||
cast_out.add( Integer.valueOf(obj_in.toString()) );
|
||||
|
||||
/* (3) Return casted array */
|
||||
return cast_out;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
package Classes.css.core.rule;
|
||||
|
||||
import Classes.css.core.Rule;
|
||||
import javafx.scene.Node;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
|
||||
public class Position implements Rule{
|
||||
|
||||
/* Attributes */
|
||||
private String direction;
|
||||
private Integer offset;
|
||||
|
||||
|
||||
/* Constructor -> Dispatch attributes */
|
||||
public Position(String l_side, int r_side){
|
||||
|
||||
this.direction = l_side;
|
||||
this.offset = r_side;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void apply(Node target) throws Exception{
|
||||
|
||||
/* (1) Initialization
|
||||
------------------------------------ */
|
||||
/* (1) If not anchor pane -> abort */
|
||||
if( !(target.getParent() instanceof AnchorPane) )
|
||||
throw new Exception("Target's parent is not an 'AnchorPane'");
|
||||
|
||||
/* (2) Cast for readability */
|
||||
double _offset = this.offset;
|
||||
|
||||
|
||||
/* (2) Manage directions
|
||||
------------------------------------ */
|
||||
/* (1) Direction: TOP */
|
||||
if( this.direction == "top" )
|
||||
AnchorPane.setTopAnchor(target, _offset);
|
||||
|
||||
/* (2) Direction: LEFT */
|
||||
else if( this.direction == "left" )
|
||||
AnchorPane.setLeftAnchor(target, _offset);
|
||||
|
||||
/* (3) Direction: RIGHT */
|
||||
else if( this.direction == "right" )
|
||||
AnchorPane.setRightAnchor(target, _offset);
|
||||
|
||||
/* (4) Direction: BOTTOM */
|
||||
else if( this.direction == "bottom" )
|
||||
AnchorPane.setBottomAnchor(target, _offset);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue