blob: 6a7c484a2caea91b28c8286187dee67a652b68e7 [file] [log] [blame]
package org.eclipse.fx.ui.controls.sample;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TitledPane;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.eclipse.fx.ui.controls.tree.SortableTreeItem;
import org.eclipse.fx.ui.controls.tree.TreeItemComparator;
public class SortableTreeItemSample extends Application {
public static void main(String[] args) {
launch(args);
}
private ToggleGroup sortGroup;
private CheckBox cbReverse;
@Override
public void start(Stage stage) throws Exception {
try {
Parent root = createContents();
Scene scene = new Scene(root, 800, 600);
stage.setScene(scene);
stage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private Parent createContents() {
VBox vbox = new VBox(6);
vbox.getChildren().add(createInputPane());
Node demoPane = createDemoPane();
VBox.setVgrow(demoPane, Priority.ALWAYS);
vbox.getChildren().add(demoPane);
return new BorderPane(vbox);
}
private Node createInputPane() {
sortGroup = new ToggleGroup();
ToggleButton noSort = new ToggleButton("not sorting");
noSort.setUserData("noSort");
noSort.setToggleGroup(sortGroup);
noSort.setSelected(true);
ToggleButton byLastName = new ToggleButton("sort by last name");
byLastName.setUserData("byLastName");
byLastName.setToggleGroup(sortGroup);
ToggleButton byFirstName = new ToggleButton("sort by first name");
byFirstName.setUserData("byFirstName");
byFirstName.setToggleGroup(sortGroup);
HBox hbox = new HBox();
hbox.getChildren().addAll(noSort, byLastName, byFirstName);
cbReverse = new CheckBox("reverse");
cbReverse.setMaxHeight(Double.MAX_VALUE);
cbReverse.disableProperty().bind(Bindings.createBooleanBinding(() -> {
return sortGroup.getSelectedToggle() == null || sortGroup.getSelectedToggle().getUserData().equals("noSort");
}, sortGroup.selectedToggleProperty()));
HBox pane = new HBox(6);
pane.getChildren().addAll(hbox, cbReverse);
TitledPane result = new TitledPane("Sort Options", pane);
result.setCollapsible(false);
return result;
}
private Node createDemoPane() {
HBox hbox = new HBox(6);
Node sortedTree = createSortedTree();
HBox.setHgrow(sortedTree, Priority.ALWAYS);
hbox.getChildren().add(sortedTree);
return hbox;
}
private Node createSortedTree() {
SortableTreeItem<Actor> root = getTreeModel();
root.comparatorProperty().bind(Bindings.createObjectBinding(() -> {
switch ((String)sortGroup.getSelectedToggle().getUserData()) {
case "noSort":
return null;
case "byLastName":
return TreeItemComparator.create((actor1, actor2) -> {
int result = actor1.lastname.compareToIgnoreCase(actor2.lastname);
return cbReverse.isSelected() ? result * -1 : result;
});
case "byFirstName":
return TreeItemComparator.create((actor1, actor2) -> {
int result = 0;
if (actor1.firstname == null)
result = -1;
else if (actor2.firstname == null)
result = 1;
else
result = actor1.firstname.compareToIgnoreCase(actor2.firstname);
return cbReverse.isSelected() ? result * -1 : result;
});
}
return null;
}, sortGroup.selectedToggleProperty(), cbReverse.selectedProperty()));
TreeView<Actor> treeView = new TreeView<>(root);
treeView.setShowRoot(false);
TitledPane pane = new TitledPane("Filtered TreeView", treeView);
pane.setCollapsible(false);
pane.setMaxHeight(Double.MAX_VALUE);
return pane;
}
private SortableTreeItem<Actor> getTreeModel() {
SortableTreeItem<Actor> root = new SortableTreeItem<>(new Actor("Root"));
SortableTreeItem<Actor> folder1 = createFolder("Folder 1");
folder1.setExpanded(true);
root.getInternalChildren().add(folder1);
root.getInternalChildren().add(createFolder("Folder 2"));
root.getInternalChildren().add(createFolder("Folder 3"));
return root;
}
private SortableTreeItem<Actor> createFolder(String name) {
SortableTreeItem<Actor> folder = new SortableTreeItem<>(new Actor(name));
getActorList().forEach(actor -> folder.getInternalChildren().add(new SortableTreeItem<>(actor)));
return folder;
}
private Iterable<Actor> getActorList() {
ObservableList<Actor> actorList = FXCollections.observableArrayList(
new Actor("Jack", "Nicholson"),
new Actor("Marlon", "Brando"),
new Actor("Robert", "De Niro"),
new Actor("Al", "Pacino"),
new Actor("Daniel","Day-Lewis"),
new Actor("Dustin", "Hoffman"),
new Actor("Tom", "Hanks"),
new Actor("Anthony", "Hopkins"),
new Actor("Paul", "Newman"),
new Actor("Denzel", "Washington"),
new Actor("Spencer", "Tracy"),
new Actor("Laurence", "Olivier"),
new Actor("Jack", "Lemmon"),
new Actor("Jeff", "Bridges"),
new Actor("James", "Stewart"),
new Actor("Sean", "Penn"),
new Actor("Michael", "Caine"),
new Actor("Morgan", "Freeman"),
new Actor("Robert", "Duvall"),
new Actor("Gene", "Hackman"),
new Actor("Clint", "Eastwood"),
new Actor("Gregory", "Peck"),
new Actor("Robin", "Williams"),
new Actor("Ben", "Kingsley"),
new Actor("Philip", "Seymour Hoffman"));
return actorList;
}
private static class Actor {
public String firstname;
public String lastname;
public Actor(String string) {
this.lastname = string;
}
public Actor(String firstname, String lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
@Override
public String toString() {
return firstname == null ? lastname : firstname + " " + lastname;
}
}
}