/*
* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
*/
package test.scenegraph.binding;
import com.sun.javafx.collections.ImmutableObservableList;
import java.lang.reflect.Constructor;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.*;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.image.Image;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.Group;
import javafx.scene.effect.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.control.Labeled;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import test.scenegraph.binding.BindingApp.Factory;
import test.scenegraph.binding.BindingApp.NodeAndBindee;
import static test.scenegraph.binding.Factories.Package.*;
/**
*
* @author Sergey Grinev
*/
public enum Factories implements Factory {
//
Rectangle(shapes, new DefaultFactory() {
public NodeAndBindee create() {
Rectangle rect = new Rectangle(100, 100, 100, 100);
rect.setArcHeight(20);
rect.setArcWidth(20);
rect.setEffect(new Reflection());
addStroke(rect);
return new BindingApp.NodeAndBindee(rect, rect);
}
}),
Circle(shapes, new DefaultFactory() {
public NodeAndBindee create() {
Circle node = new Circle(100,100,50);
node.setEffect(new DropShadow());
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
Arc(shapes, new DefaultFactory() {
public NodeAndBindee create() {
Arc node = new Arc();
node.setCenterX(50.0f);
node.setCenterY(50.0f);
node.setRadiusX(25.0f);
node.setRadiusY(25.0f);
node.setStartAngle(45.0f);
node.setLength(270.0f);
node.setType(ArcType.ROUND);
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
ArcTo(shapes, new DefaultFactory() {
public NodeAndBindee create() {
MoveTo moveTo = new MoveTo(50, 50);
ArcTo node = new ArcTo();
node.setX(100.0f);
node.setY(100.0f);
node.setRadiusX(50.0f);
node.setRadiusY(50.0f);
Path path = new Path(moveTo, node);
addStroke(path);
return new BindingApp.NodeAndBindee(path, node);
}
}),
CubicCurve(shapes, new DefaultFactory() {
public NodeAndBindee create() {
CubicCurve node = new CubicCurve();
node.setStartX(0.0f);
node.setStartY(50.0f);
node.setControlX1(80.0f);
node.setControlY1(250.0f);
node.setControlX2(60.0f);
node.setControlY2(-50.0f);
node.setEndX(128.0f);
node.setEndY(50.0f);
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
// ClosePath(shapes, new DefaultFactory() {
//
// public NodeAndBindee create() {
// ClosePath node = new ClosePath();
// addStroke(node);
// return new BindingApp.NodeAndBindee(node, node);
// }
// }),
CubicCurveTo(shapes, new DefaultFactory() {
public NodeAndBindee create() {
MoveTo moveTo = new MoveTo(50, 50);
CubicCurveTo node = new CubicCurveTo();
node.setControlX1(80.0f);
node.setControlY1(250.0f);
node.setControlX2(60.0f);
node.setControlY2(-50.0f);
Path path = new Path(moveTo, node);
addStroke(path);
return new BindingApp.NodeAndBindee(path, node);
}
}),
Ellipse(shapes, new DefaultFactory() {
public NodeAndBindee create() {
Ellipse node = new Ellipse();
node.setCenterX(50.0f);
node.setCenterY(50.0f);
node.setRadiusX(20.0f);
node.setRadiusY(40.0f);
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
HLineTo(shapes, new DefaultFactory() {
public NodeAndBindee create() {
MoveTo moveTo = new MoveTo(50, 50);
HLineTo node = new HLineTo(100);
Path path = new Path(moveTo, node);
addStroke(path);
return new BindingApp.NodeAndBindee(path, node);
}
}),
Line(shapes, new DefaultFactory() {
public NodeAndBindee create() {
Line node = new Line(20, 20, 100, 50);
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
LineTo(shapes, new DefaultFactory() {
public NodeAndBindee create() {
MoveTo moveTo = new MoveTo(50, 50);
LineTo node = new LineTo(100, 80);
Path path = new Path(moveTo, node);
addStroke(path);
return new BindingApp.NodeAndBindee(path, node);
}
}),
MoveTo(shapes, new DefaultFactory() {
public NodeAndBindee create() {
MoveTo moveTo = new MoveTo(50, 50);
LineTo node = new LineTo(100, 80);
Path path = new Path(moveTo, node);
addStroke(path);
return new BindingApp.NodeAndBindee(path, moveTo);
}
}),
Path(shapes, new DefaultFactory() {
public NodeAndBindee create() {
MoveTo moveTo = new MoveTo(50, 50);
LineTo node = new LineTo(100, 80);
LineTo node2 = new LineTo(200, 180);
Path path = new Path(moveTo, node, node2);
addStroke(path);
return new BindingApp.NodeAndBindee(path, path);
}
}),
// PathElement(shapes, new DefaultFactory() {
//
// public NodeAndBindee create() {
// PathElement node = new PathElement();
// addStroke(node);
// return new BindingApp.NodeAndBindee(node, node);
// }
// }),
Polygon(shapes, new DefaultFactory() {
public NodeAndBindee create() {
Polygon node = new Polygon();
node.getPoints().addAll(new Double[]{
0.0, 0.0,
120.0, 10.0,
10.0, 120.0});
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
Polyline(shapes, new DefaultFactory() {
public NodeAndBindee create() {
Polyline node = new Polyline(new double[]{10, 10, 30, 30, 40, 60, 50, 15});
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
QuadCurve(shapes, new DefaultFactory() {
public NodeAndBindee create() {
QuadCurve node = new QuadCurve();
node.setStartX(0.0f);
node.setStartY(10.0f);
node.setEndX(12.0f);
node.setEndY(120.0f);
node.setControlX(125.0f);
node.setControlY(0.0f);
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
QuadCurveTo(shapes, new DefaultFactory() {
public NodeAndBindee create() {
MoveTo moveTo = new MoveTo(50, 50);
QuadCurveTo node = new QuadCurveTo();
node.setControlX(125);
node.setControlY(0);
Path path = new Path(moveTo, node);
addStroke(path);
return new BindingApp.NodeAndBindee(path, path); }
}),
SVGPath(shapes, new DefaultFactory() {
public NodeAndBindee create() {
SVGPath node = new SVGPath();
node.setContent("M40,60 C42,148 144,30 25,32");
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
VLineTo(shapes, new DefaultFactory() {
public NodeAndBindee create() {
MoveTo moveTo = new MoveTo(50, 50);
VLineTo node = new VLineTo(100);
Path path = new Path(moveTo, node);
addStroke(path);
return new BindingApp.NodeAndBindee(path, node);
}
}),
//
//
DropShadow(effects, new EffectFactory() {
@Override
public Effect getEffect() {
return new DropShadow();
}
})
,Shadow(effects, new EffectFactory() {
@Override
public Effect getEffect() {
return new Shadow();
}
})
,Reflection(effects, new EffectFactory() {
@Override
public Effect getEffect() {
return new Reflection();
}
})
,Blend(effects, new DefaultFactory() {
public NodeAndBindee create() {
Rectangle rect0 = new Rectangle(10, 10, 200, 200);
rect0.setFill(new LinearGradient(0, 0, 0.25, 0.25, true, CycleMethod.REFLECT, new Stop[] { new Stop(0, Color.RED), new Stop(1, Color.YELLOW)} ));
Rectangle rect = new Rectangle(50, 50, 100, 50);
rect.setFill(Color.GREEN);
Blend b = new Blend();
b.setOpacity(0.7);
b.setMode(BlendMode.ADD);
b.setTopInput(new ColorInput(30, 30, 100, 80, Color.BLUE));
rect.setEffect(b);
Group group = new Group(rect0,rect);
return new NodeAndBindee(group, b);
}
})
,Bloom(effects, new DefaultFactory() {
public NodeAndBindee create() {
Group group = new Group();
Bloom bloom = new Bloom();
group.setEffect(bloom);
Rectangle r1 = new Rectangle (10, 10, 160, 80);
r1.setFill(Color.DARKBLUE);
Rectangle r2 = new Rectangle (50, 50, 50, 50);
r1.setFill(Color.YELLOW);
group.getChildren().add(r1);
group.getChildren().add(r2);
return new NodeAndBindee(group, bloom);
}
})
,BoxBlur(effects, new EffectFactory() {
@Override
public Effect getEffect() {
return new BoxBlur();
}
})
,ColorAdjust(effects, new EffectFactory() {
@Override
public Effect getEffect() {
return new ColorAdjust();
}
})
,DisplacementMap(effects, new DefaultFactory() {
@Override
public Constraint getConstraints(String name) {
NumberConstraints nc = (NumberConstraints) super.getConstraints(name);
switch(nc) {
case offsetX:
case offsetY:
return NumberConstraints.offsetForDisplacementMap;
default:
return nc;
}
}
public NodeAndBindee create() {
Group group = new Group();
DisplacementMap dm = new DisplacementMap(Consts.MAP_WAVES);
group.setEffect(dm);
Rectangle r1 = new Rectangle (50, 50, 200, 80);
r1.setFill(Color.DARKBLUE);
Rectangle r2 = new Rectangle (0, 0, 250, 200);
r1.setFill(Color.TRANSPARENT);
group.getChildren().add(r1);
group.getChildren().add(r2);
return new NodeAndBindee(group, dm);
}
})
,Flood(effects, new EffectFactory() {
@Override
public Effect getEffect() {
ColorInput temp = new ColorInput();
temp.setX(0);
temp.setY(0);
temp.setWidth(50);
temp.setHeight(50);
return temp;
}
})
,GaussianBlur(effects, new EffectFactory() {
@Override
public Effect getEffect() {
return new GaussianBlur();
}
})
,Glow(effects, new EffectFactory() {
@Override
public Effect getEffect() {
return new Glow();
}
})
,Identity(effects, new EffectFactory() {
@Override
public Effect getEffect() {
return new ImageInput(new Image(Factories.class.getResourceAsStream("/test/scenegraph/resources/car.png")));
}
})
,InnerShadow(effects, new EffectFactory() {
@Override
public Effect getEffect() {
return new InnerShadow();
}
})
//
//
,font(text, new DefaultFactory() {
public NodeAndBindee create() {
Text node = new Text("XO");
node.setTranslateX(50);
node.setTranslateY(150);
node.setFont(Font.font("Arial", 60));
addStroke(node);
return new BindingApp.NodeAndBindee(node, node);
}
})
//
//
,button(controls, new DefaultFactory() {
public NodeAndBindee create() {
Button node = new Button();
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
})
,buttonGraphic(controls, new DefaultFactory() {
@Override
public boolean verifyConstraint(String name) {
return !name.startsWith("center") && !name.startsWith("layout");
}
public NodeAndBindee create() {
Button node = new Button();
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node.getGraphic());
}
})
,label(controls, new DefaultFactory() {
public NodeAndBindee create() {
Label node = new Label();
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
})
,checkBox(controls, new DefaultFactory() {
public NodeAndBindee create() {
CheckBox node = new CheckBox();
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
ChoiceBox(controls, new DefaultFactory() {
public NodeAndBindee create() {
ChoiceBox node = new ChoiceBox(defaultList);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
HtmlEditor(controls, new DefaultFactory() {
public NodeAndBindee create() {
Node node = null;
try {
Class> htmlEditorCl = Class.forName("javafx.scene.web.HTMLEditor");
for(Constructor constructor : htmlEditorCl.getDeclaredConstructors()) {
if(constructor.getGenericParameterTypes().length == 0) {
constructor.setAccessible(true);
node = (Node) constructor.newInstance();
prepareControl((Control)node);
}
}
} catch (Exception ignored) {
System.err.println("Warning: HtmlEditor is not currently supported in JavaFX Embedded");
}
return new BindingApp.NodeAndBindee(node, node);
}
}),
Hyperlink(controls, new DefaultFactory() {
public NodeAndBindee create() {
Hyperlink node = new Hyperlink("http://javafx.com");
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
ListView(controls, new DefaultFactory() {
public NodeAndBindee create() {
ListView node = new ListView(defaultList);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
MenuBar(controls, new DefaultFactory() {
public NodeAndBindee create() {
final Menu menu1 = new Menu("File");
final Menu menu2 = new Menu("Options");
final Menu menu3 = new Menu("Help");
MenuBar node = new MenuBar();
node.getMenus().addAll(menu1, menu2, menu3);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
MenuButton(controls, new DefaultFactory() {
public NodeAndBindee create() {
MenuButton node = new MenuButton();
node.getItems().addAll(new MenuItem("Burger"), new MenuItem("Hot Dog"));
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
PasswordBox(controls, new DefaultFactory() {
public NodeAndBindee create() {
PasswordField node = new PasswordField();
node.setText("very weak password");
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
ProgressBar(controls, new DefaultFactory() {
public NodeAndBindee create() {
ProgressBar node = new ProgressBar(.75);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
ProgressIndicator(controls, new DefaultFactory() {
public NodeAndBindee create() {
ProgressIndicator node = new ProgressIndicator(.45);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
RadioButton(controls, new DefaultFactory() {
public NodeAndBindee create() {
RadioButton node = new RadioButton();
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
Separator(controls, new DefaultFactory() {
public NodeAndBindee create() {
Separator node = new Separator();
ToolBar toolBar = new ToolBar(
new Button("New"),
node,
new Button("Open"));
prepareControl(toolBar);
return new BindingApp.NodeAndBindee(toolBar, node);
}
}),
ScrollBar(controls, new DefaultFactory() {
public NodeAndBindee create() {
ScrollBar node = new ScrollBar();
node.setMin(0);
node.setMax(100);
node.setValue(50);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
Slider(controls, new DefaultFactory() {
public NodeAndBindee create() {
Slider node = new Slider(0,100,50);
//TODO: after fix of RT-11969 consider returning this functionality
// node.setShowTickLabels(true);
// node.setShowTickMarks(true);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
TableView(controls, new DefaultFactory() {
public NodeAndBindee create() {
TableView node = new TableView();
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));
node.getColumns().setAll(firstNameCol, lastNameCol);
ObservableList items = FXCollections.observableArrayList();
items.add(new Person("First name", "Last name"));
node.setItems(items);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
TextArea(controls, new DefaultFactory() {
public NodeAndBindee create() {
TextArea node = new TextArea();
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
TextField(controls, new DefaultFactory() {
public NodeAndBindee create() {
TextField node = new TextField();
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
ToggleButton(controls, new DefaultFactory() {
public NodeAndBindee create() {
ToggleButton node = new ToggleButton();
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
ToggleButtonSelected(controls, new DefaultFactory() {
public NodeAndBindee create() {
ToggleButton node = new ToggleButton();
node.selectedProperty().setValue(Boolean.TRUE);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
ToolBar(controls, new DefaultFactory() {
public NodeAndBindee create() {
ToolBar node = new ToolBar(
new Button("New"),
new Button("Open"),
new Button("Save"));
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
}),
TreeView(controls, new DefaultFactory(){
public NodeAndBindee create() {
TreeItem root = new TreeItem("Root Node");
root.setExpanded(true);
root.getChildren().addAll(
new TreeItem("Item 1"),
new TreeItem("Item 2"),
new TreeItem("Item 3"));
TreeView node = new TreeView(root);
prepareControl(node);
return new BindingApp.NodeAndBindee(node, node);
}
})//
;
public static void main(String[] args) { // for debug
BindingApp.factory = Factories.Slider;
BindingApp.main(null);
}
public enum Package {
shapes("javafx.scene.shape"),
effects("javafx.scene.effect"),
text("javafx.scene.text"),
controls("javafx.scene.control");
public final String fullName;
private Package(String fullName){
this.fullName = fullName;
}
};
// enum elements and mirror for Factory interface to simplify access
private final Factory factory;
public final Package packageName;
private Factories(Package p, Factory factory) {
this.factory = factory;
this.packageName = p;
}
public NodeAndBindee create() {
return factory.create();
}
public Constraint getConstraints(String name) {
return factory.getConstraints(name);
}
public boolean verifyConstraint(String name) {
return factory.verifyConstraint(name);
}
static abstract class DefaultFactory implements Factory {
public Constraint getConstraints(String name) {
NumberConstraints c = NumberConstraints._default;
try {
c = NumberConstraints.valueOf(name);
} catch (java.lang.IllegalArgumentException e) {
System.err.println("ERROR: model lacks constraints: " + name);
//use default for now
}
return c;
}
public boolean verifyConstraint(String name) {
return true;
}
}
//utility
private static abstract class EffectFactory extends DefaultFactory {
public abstract Effect getEffect();
public NodeAndBindee create() {
Effect effect = getEffect();
Rectangle rect = new Rectangle(100, 100, 100, 100);
rect.setFill(Color.LIGHTGREEN);
rect.setStroke(Color.DARKGREEN);
rect.setArcHeight(20);
rect.setArcWidth(30);
rect.setEffect(effect);
return new NodeAndBindee(rect, effect);
}
}
private static final ObservableList defaultList = FXCollections.observableArrayList("item 1", "item 2", "longlonglonglonglonglongitem");
private static void addStroke(Shape shape) {
shape.setFill(Color.LIGHTGREEN);
shape.setStroke(Color.DARKGREEN);
shape.getStrokeDashArray().add(10.);
shape.getStrokeDashArray().add(8.);
}
private static void prepareControl(Control control) {
control.setLayoutX(50);
control.setLayoutY(50);
control.setPrefSize(100, 50);
control.setMinSize(100, 50);
control.setMaxSize(100, 50);
if (control instanceof Labeled) {
Labeled l = (Labeled)control;
Circle circle = new Circle(10);
addStroke(circle);
l.setGraphic(circle);
l.setText("XO");
}
}
}