JavaFXNatExampleRunner
diff --git a/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties
index 8b0c496..b48e201 100644
--- a/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties
+++ b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties
@@ -1,3 +1,3 @@
GridLayer=org.eclipse.nebula.widgets.nattable.core.example.impl.GridLayer
+SmallLayerExample=org.eclipse.nebula.widgets.nattable.core.example.impl.SmallLayerExample|A little example
big=|Huge examples
-SmallLayerExample=org.eclipse.nebula.widgets.nattable.core.example.impl.SmallLayerExample
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/META-INF/MANIFEST.MF
index aea7455..6d41089 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/META-INF/MANIFEST.MF
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/META-INF/MANIFEST.MF
@@ -5,3 +5,4 @@
Bundle-Version: 2.0.0.qualifier
Fragment-Host: org.eclipse.nebula.widgets.nattable.renderer.javafx;bundle-version="2.0.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.eclipse.nebula.widgets.nattable.core.example;bundle-version="1.0.0"
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXExample.xtend b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXExample.xtend
index 4af9382..b45b31a 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXExample.xtend
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXExample.xtend
@@ -6,7 +6,15 @@
import javafx.stage.Stage
import org.eclipse.nebula.widgets.nattable.core.layer.Layer
import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AxisImpl
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.hideshow.HideShowAxis
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.reorder.ReorderAxis
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.DimensionallyDependentLayer
import org.eclipse.nebula.widgets.nattable.core.layer.impl.DummyLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.LayerDataAccessorImpl
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.composite.CompositeLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.header.ColumnHeaderLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.header.RowHeaderLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportLayer
import org.eclipse.nebula.widgets.nattable.renderer.javafx.JavaFXNatTable
class JavaFXExample extends Application {
@@ -15,15 +23,17 @@
launch(args)
}
+ //
+
override start(Stage primaryStage) {
primaryStage.title = "NatTable -> JavaFX"
val root = new Pane
- val natTable = new JavaFXNatTable(layer, 300, 250)
+ val natTable = new JavaFXNatTable(layer)
root.children += natTable
- primaryStage.scene = new Scene(root)
+ primaryStage.scene = new Scene(root, 500, 400)
primaryStage.show
natTable.widthProperty.bind(root.widthProperty)
@@ -31,10 +41,26 @@
}
def Layer getLayer() {
- new DummyLayer(
- new AxisImpl(4, 200),
- new AxisImpl(4, 100)
- )
+ val bodyLayer = new ViewportLayer(new DummyLayer(
+ // Horizontal axis
+ new ReorderAxis(
+ new AxisImpl(10, 200) => [ setPixelSizeOfSegmentPosition(100, 0) ]
+ ) => [ reorderSegmentPosition(0, 2) ],
+
+ // Vertical axis
+ new HideShowAxis(
+ new AxisImpl(10, 100) => [ setPixelSizeOfSegmentPosition(200, 2) ]
+ ) => [ hideSegmentId(0) ]
+ ))
+
+ val columnHeaderLayer = new ColumnHeaderLayer(bodyLayer.horizontalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | columnId ]))
+ val rowHeaderLayer = new RowHeaderLayer(bodyLayer.verticalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | rowId ]))
+ val cornerLayer = new DimensionallyDependentLayer(rowHeaderLayer.horizontalAxis, columnHeaderLayer.verticalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | "" ]))
+
+ new CompositeLayer => [
+ addRow(cornerLayer, columnHeaderLayer)
+ addRow(rowHeaderLayer, bodyLayer)
+ ]
}
}
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXNatExamplesRunner.xtend b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXNatExamplesRunner.xtend
new file mode 100644
index 0000000..56810a6
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXNatExamplesRunner.xtend
@@ -0,0 +1,127 @@
+package org.eclipse.nebula.widgets.nattable.renderer.javafx.example
+
+import java.util.HashSet
+import javafx.application.Application
+import javafx.geometry.Pos
+import javafx.scene.Scene
+import javafx.scene.control.Label
+import javafx.scene.control.Tab
+import javafx.scene.control.TabPane
+import javafx.scene.control.TreeCell
+import javafx.scene.control.TreeItem
+import javafx.scene.control.TreeView
+import javafx.scene.image.Image
+import javafx.scene.image.ImageView
+import javafx.scene.layout.BorderPane
+import javafx.scene.layout.StackPane
+import javafx.stage.Stage
+import org.eclipse.nebula.widgets.nattable.core.example.index.NatExamplesIndex
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.CategoryNode
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.IndexNode
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.NatExampleNode
+import org.eclipse.nebula.widgets.nattable.renderer.javafx.JavaFXNatTable
+
+class JavaFXNatExamplesRunner extends Application {
+
+ def static void main(String[] args) {
+ launch(args)
+ }
+
+ //
+
+ val nodeImage = new Image(class.getResourceAsStream("opened_folder.png"))
+ val rootTreeItem = new TreeItem<IndexNode>(NatExamplesIndex::rootNode, new ImageView(nodeImage))
+ val tabPane = new TabPane
+
+ val exampleNodes = new HashSet<NatExampleNode>
+
+ override start(Stage primaryStage) throws Exception {
+ primaryStage.title = "NatTable -> JavaFX"
+ val grid = new BorderPane
+
+ // Nav tree
+ val indexNode = NatExamplesIndex::rootNode
+ indexNode.createTreeItem(rootTreeItem)
+ grid.left = new TreeView<IndexNode>(rootTreeItem) => [
+ showRoot = false
+ editable = true
+ cellFactory = [ treeView | new NavTreeCell(this) as TreeCell<IndexNode> ]
+ ]
+
+ // Example pane
+ grid.center = tabPane
+
+ val scene = new Scene(grid, 1000, 600)
+ scene.stylesheets += "style.css"
+ primaryStage.scene = scene
+ primaryStage.show
+
+ // Stop
+ for (exampleNode : exampleNodes)
+ exampleNode.natExample.stop
+ }
+
+ def void createTreeItem(IndexNode indexNode, TreeItem<IndexNode> treeItem) {
+ for (childIndexNodeName : indexNode.childNodeNames) {
+ val childIndexNode = indexNode.getChildNode(childIndexNodeName)
+ val childTreeItem = switch (childIndexNode) {
+ NatExampleNode: new TreeItem<IndexNode>(childIndexNode)
+ CategoryNode: new TreeItem<IndexNode>(childIndexNode, new ImageView(nodeImage))
+ }
+ childIndexNode.createTreeItem(childTreeItem)
+ treeItem.children += childTreeItem
+ }
+ }
+
+ def void openExampleInTab(NatExampleNode node) {
+ exampleNodes += node
+
+ tabPane.tabs += new Tab => [
+ text = node.displayName
+
+ content = new BorderPane => [
+ // Create example control
+ center = new StackPane => [
+ val centerPane = it
+ children += new JavaFXNatTable(node.natExample.createLayer) => [
+ widthProperty.bind(centerPane.widthProperty)
+ heightProperty.bind(centerPane.heightProperty)
+ ]
+ ]
+
+ // Description
+ val description = node.natExample.description
+ if (description != null && description.length() > 0) {
+ bottom = new StackPane => [
+ children += new Label(" Description ") => [
+ styleClass += "bordered-titled-title"
+ StackPane::setAlignment(it, Pos::TOP_LEFT)
+ ]
+
+ children += new StackPane => [
+ children += new Label(description) => [
+ styleClass += "bordered-titled-content"
+ ]
+ ]
+
+ styleClass += "bordered-titled-border"
+ ]
+ }
+ ]
+
+ onClosed = [
+ // Stop
+ node.natExample.stop
+
+ // Remove from map
+ exampleNodes.remove(node)
+ ]
+
+ tabPane.selectionModel.select(it)
+ ]
+
+ // Start
+ node.natExample.start
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/NavTreeCell.xtend b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/NavTreeCell.xtend
new file mode 100644
index 0000000..5eb2374
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/NavTreeCell.xtend
@@ -0,0 +1,37 @@
+package org.eclipse.nebula.widgets.nattable.renderer.javafx.example
+
+import javafx.scene.control.TreeCell
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.IndexNode
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.NatExampleNode
+
+class NavTreeCell extends TreeCell<IndexNode> {
+
+ val JavaFXNatExamplesRunner runner
+
+ new(JavaFXNatExamplesRunner runner) {
+ this.runner = runner
+ }
+
+ override startEdit() {
+ super.startEdit
+
+ if (item instanceof NatExampleNode)
+ runner.openExampleInTab(item as NatExampleNode)
+ }
+
+ override updateItem(IndexNode item, boolean empty) {
+ super.updateItem(item, empty)
+
+ if (empty) {
+ text = null
+ graphic = null
+ } else {
+ text = string
+ graphic = treeItem.graphic
+ }
+ }
+
+ def private String getString() {
+ item?.displayName ?: ""
+ }
+}
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/TreeViewSample.java b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/TreeViewSample.java
new file mode 100644
index 0000000..3ff4d17
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/TreeViewSample.java
@@ -0,0 +1,184 @@
+package org.eclipse.nebula.widgets.nattable.renderer.javafx.example;
+import java.util.Arrays;
+import java.util.List;
+
+import javafx.application.Application;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.event.EventHandler;
+import javafx.scene.Node;
+import javafx.scene.Scene;
+import javafx.scene.control.TextField;
+import javafx.scene.control.TreeCell;
+import javafx.scene.control.TreeItem;
+import javafx.scene.control.TreeView;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.layout.VBox;
+import javafx.scene.paint.Color;
+import javafx.stage.Stage;
+import javafx.util.Callback;
+
+public class TreeViewSample extends Application {
+
+ private final Node rootIcon =
+ new ImageView(new Image(getClass().getResourceAsStream("opened_folder.png")));
+ private final Image depIcon =
+ new Image(getClass().getResourceAsStream("opened_folder.png"));
+ List<Employee> employees = Arrays.<Employee>asList(
+ new Employee("Ethan Williams", "Sales Department"),
+ new Employee("Emma Jones", "Sales Department"),
+ new Employee("Michael Brown", "Sales Department"),
+ new Employee("Anna Black", "Sales Department"),
+ new Employee("Rodger York", "Sales Department"),
+ new Employee("Susan Collins", "Sales Department"),
+ new Employee("Mike Graham", "IT Support"),
+ new Employee("Judy Mayer", "IT Support"),
+ new Employee("Gregory Smith", "IT Support"),
+ new Employee("Jacob Smith", "Accounts Department"),
+ new Employee("Isabella Johnson", "Accounts Department"));
+ TreeItem<String> rootNode =
+ new TreeItem<String>("MyCompany Human Resources", rootIcon);
+
+ public static void main(String[] args) {
+ Application.launch(args);
+ }
+
+ @Override
+ public void start(Stage stage) {
+ rootNode.setExpanded(true);
+ for (Employee employee : employees) {
+ TreeItem<String> empLeaf = new TreeItem<String>(employee.getName());
+ boolean found = false;
+ for (TreeItem<String> depNode : rootNode.getChildren()) {
+ if (depNode.getValue().contentEquals(employee.getDepartment())){
+ depNode.getChildren().add(empLeaf);
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ TreeItem<String> depNode = new TreeItem<String>(
+ employee.getDepartment(),
+ new ImageView(depIcon)
+ );
+ rootNode.getChildren().add(depNode);
+ depNode.getChildren().add(empLeaf);
+ }
+ }
+
+ stage.setTitle("Tree View Sample");
+ VBox box = new VBox();
+ final Scene scene = new Scene(box, 400, 300);
+ scene.setFill(Color.LIGHTGRAY);
+
+ TreeView<String> treeView = new TreeView<String>(rootNode);
+ treeView.setEditable(true);
+ treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
+ @Override
+ public TreeCell<String> call(TreeView<String> p) {
+ return new TextFieldTreeCellImpl();
+ }
+ });
+
+ box.getChildren().add(treeView);
+ stage.setScene(scene);
+ stage.show();
+ }
+
+ private final class TextFieldTreeCellImpl extends TreeCell<String> {
+
+ private TextField textField;
+
+ public TextFieldTreeCellImpl() {
+ }
+
+ @Override
+ public void startEdit() {
+ super.startEdit();
+
+ if (textField == null) {
+ System.out.println("edit!");
+ createTextField();
+ }
+ setText(null);
+ setGraphic(textField);
+ textField.selectAll();
+ }
+
+ @Override
+ public void cancelEdit() {
+ super.cancelEdit();
+ setText((String) getItem());
+ setGraphic(getTreeItem().getGraphic());
+ }
+
+ @Override
+ public void updateItem(String item, boolean empty) {
+ super.updateItem(item, empty);
+
+ if (empty) {
+ setText(null);
+ setGraphic(null);
+ } else {
+ if (isEditing()) {
+ if (textField != null) {
+ textField.setText(getString());
+ }
+ setText(null);
+ setGraphic(textField);
+ } else {
+ setText(getString());
+ setGraphic(getTreeItem().getGraphic());
+ }
+ }
+ }
+
+ private void createTextField() {
+ textField = new TextField(getString());
+ textField.setOnKeyReleased(new EventHandler<KeyEvent>() {
+
+ @Override
+ public void handle(KeyEvent t) {
+ if (t.getCode() == KeyCode.ENTER) {
+ commitEdit(textField.getText());
+ } else if (t.getCode() == KeyCode.ESCAPE) {
+ cancelEdit();
+ }
+ }
+ });
+ }
+
+ private String getString() {
+ return getItem() == null ? "" : getItem().toString();
+ }
+ }
+
+ public static class Employee {
+
+ private final SimpleStringProperty name;
+ private final SimpleStringProperty department;
+
+ private Employee(String name, String department) {
+ this.name = new SimpleStringProperty(name);
+ this.department = new SimpleStringProperty(department);
+ }
+
+ public String getName() {
+ return name.get();
+ }
+
+ public void setName(String fName) {
+ name.set(fName);
+ }
+
+ public String getDepartment() {
+ return department.get();
+ }
+
+ public void setDepartment(String fName) {
+ department.set(fName);
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/opened_folder.png b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/opened_folder.png
new file mode 100644
index 0000000..6f2c5f7
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/opened_folder.png
Binary files differ
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/style.css b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/style.css
new file mode 100644
index 0000000..477d90e
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/style.css
@@ -0,0 +1,24 @@
+.button1{
+ -fx-text-fill: #006464;
+ -fx-background-color: #DFB951;
+ -fx-border-radius: 20;
+ -fx-background-radius: 20;
+ -fx-padding: 5;
+}
+
+.bordered-titled-title {
+ -fx-background-color: white;
+ -fx-translate-y: -16;
+}
+
+.bordered-titled-border {
+ -fx-content-display: top;
+ -fx-border-insets: 20 15 15 15;
+ -fx-background-color: white;
+ -fx-border-color: black;
+ -fx-border-width: 2;
+}
+
+.bordered-titled-content {
+ -fx-padding: 26 10 10 10;
+}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend b/org.eclipse.nebula.widgets.nattable.renderer.javafx/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend
index fed9af0..9bd1cbd 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.javafx/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend
@@ -16,8 +16,7 @@
val Layer layer
- new(Layer layer, double width, double height) {
- super(width, height)
+ new(Layer layer) {
this.layer = layer
paintLayer