package com.rgi.view.pane; import java.awt.image.BufferedImage; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.stream.Stream; import javafx.beans.value.ChangeListener; import javafx.geometry.HPos; import javafx.geometry.VPos; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.control.cell.CheckBoxTreeCell; import javafx.scene.layout.Pane; import com.rgi.common.BoundingBox; import com.rgi.common.Dimensions; import com.rgi.common.coordinate.CoordinateReferenceSystem; import com.rgi.common.coordinate.CrsCoordinate; import com.rgi.common.tile.TileOrigin; import com.rgi.common.tile.scheme.TileScheme; import com.rgi.store.tiles.TileHandle; import com.rgi.store.tiles.TileStoreException; import com.rgi.store.tiles.TileStoreReader; import com.rgi.view.TileLoaderBridge; public class TreePane extends Pane { private final Collection<TileStoreReader> tileStoreReaders; private final TreeView<TileLoaderBridge> tree; public TreePane(final Collection<TileStoreReader> tileStoreReaders) throws Exception { this.tileStoreReaders = tileStoreReaders; this.tree = this.createTree(this.createDummyRootNode()); this.getChildren().add(this.tree); } private TreeView<TileLoaderBridge> createTree(final TreeItem<TileLoaderBridge> rootItem) throws TileStoreException { TreeView<TileLoaderBridge> createTree = new TreeView<>(rootItem); createTree.setEditable(false); /* * Create listener for nodes * set the bridge to the selected Item */ createTree.getSelectionModel().selectedItemProperty().addListener((ChangeListener<TreeItem<TileLoaderBridge>>) (observable, oldValue, newValue) -> { if(newValue != null) { //show } else { //hide } }); createTree.setCellFactory(CheckBoxTreeCell.<TileLoaderBridge>forTreeView()); /* * Add the readers to the list */ for(TileStoreReader reader: this.tileStoreReaders) { TreeItem<TileLoaderBridge> item = new TreeItem<>(new TileLoaderBridge(reader)); rootItem.getChildren().add(item); } createTree.setRoot(rootItem); createTree.setShowRoot(false); return createTree; } public TreeView<TileLoaderBridge> getTree() { return this.tree; } public void addTreeItem(final TileStoreReader tileStoreReader) throws TileStoreException { TreeItem<TileLoaderBridge> item = new TreeItem<>(new TileLoaderBridge(tileStoreReader)); this.tree.getRoot().getChildren().add(item); } public void addTreeItem(final TileStoreReader tileStoreReader, final TreeItem<TileLoaderBridge> rootItem) throws TileStoreException { TreeItem<TileLoaderBridge> item = new TreeItem<>(new TileLoaderBridge(tileStoreReader)); rootItem.getChildren().add(item); } private TreeItem<TileLoaderBridge> createDummyRootNode() throws Exception { try(TileStoreReader dummyReader = new TileStoreReader(){ @Override public void close() throws Exception { //nada } @Override public BoundingBox getBounds() throws TileStoreException { return new BoundingBox(0.0,0.0,0.0,0.0); } @Override public long countTiles() throws TileStoreException { return 0; } @Override public long getByteSize() throws TileStoreException { return 0; } @Override public BufferedImage getTile(final int column, final int row, final int zoomLevel) throws TileStoreException { return null; } @Override public BufferedImage getTile(final CrsCoordinate coordinate, final int zoomLevel) throws TileStoreException { return null; } @Override public Set<Integer> getZoomLevels() throws TileStoreException { Set<Integer> set = new HashSet<>(); set.add(-1); return set; } @Override public Stream<TileHandle> stream() throws TileStoreException { return null; } @Override public Stream<TileHandle> stream(final int zoomLevel) throws TileStoreException { return null; } @Override public CoordinateReferenceSystem getCoordinateReferenceSystem() throws TileStoreException { return new CoordinateReferenceSystem("EPSG", 4326); } @Override public String getName() { return "Dummy Root"; } @Override public String getImageType() throws TileStoreException { return "none"; } @Override public Dimensions<Integer> getImageDimensions() throws TileStoreException { return null; } @Override public TileScheme getTileScheme() throws TileStoreException { return null; } @Override public TileOrigin getTileOrigin() { return null; } }) { return new TreeItem<>(new TileLoaderBridge(dummyReader)); } } /* * The following methods resize the window properly * (non-Javadoc) * @see javafx.scene.Parent#layoutChildren() */ @Override protected void layoutChildren() { double width = this.getWidth(); double height = this.getHeight(); this.layoutInArea(this.tree, 0, 0, width, height, 0, HPos.CENTER, VPos.CENTER); } @Override protected double computePrefWidth(final double height) { return 250; } @Override protected double computePrefHeight(final double width) { return 500; } }