package com.tilisty.data;
import java.util.ArrayList;
import javafx.collections.ObservableList;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import com.tilisty.models.IObserver;
import com.tilisty.models.TiViewModel;
import com.tilisty.models.TilistyModel;
import com.tilisty.views.TilistyView;
import com.tilisty.views.ViewItem;
/**
* The Base class for the Tree View showing the views which
* are available for editing.
*
* @author Jason Simpson <jsnsimpson@gmail.com>
* @version 1.0
*
*/
public class TilistyTreeView extends TreeView<String> implements IObserver {
private TreeItem<String> treeRoot;
private ArrayList<TiViewModel> currentViews;
public TilistyTreeView() {
super();
this.treeRoot = new TreeItem<String>("VIEWS");
this.currentViews = new ArrayList<TiViewModel>();
this.setupTree();
this.setupObserving();
}
/**
* Setup the observing
* @see TilistyTreeView.update
*/
private void setupObserving() {
TilistyModel.getInstance().addObserver(TilistyModel.UPDATE_VIEWS, this);
}
/**
* Sets up some basic treeview properties
*/
public void setupTree() {
this.setPrefWidth(TilistyView.APP_WIDTH*0.32);
this.setPrefHeight(TilistyView.APP_HEIGHT-3);
this.setHeight(TilistyView.APP_HEIGHT-3);
this.setMinHeight(TilistyView.APP_HEIGHT-3);
this.setRoot(this.treeRoot);
}
/**
* Update the tree view with the new lsit of TiViewModels
* as the list has been updated.
*
* @param views
*/
public void updateViews(ArrayList<TiViewModel> views) {
ArrayList<ViewItem> parents = new ArrayList<ViewItem>();
for(int i = 0; i < views.size(); i++) {
ViewItem tree = new ViewItem(views.get(i));
if(views.get(i).getChildren().size() > 0) {
ArrayList<ViewItem> trees = this.recursiveChildren(views.get(i));
for(int p = 0; p < trees.size(); p++) {
tree.getChildren().add(trees.get(p));
}
}
parents.add(tree);
}
this.treeRoot.getChildren().addAll(parents);
}
/**
* If the TiViewModel has associated children
* we need to add them recursively to the tree view (until there are no more
* children of the children!).
*
* @param tiView
* @return ArrayList\<ViewItem\>
*/
private ArrayList<ViewItem> recursiveChildren(TiViewModel tiView) {
ArrayList<ViewItem> trees = new ArrayList<ViewItem>();
ArrayList<TiViewModel> children = tiView.getChildren();
for(int i = 0; i < children.size(); i++) {
ViewItem item = new ViewItem(children.get(i));
if(children.get(i).getChildren().size() > 0) {
ArrayList<ViewItem> trs = this.recursiveChildren(children.get(i));
for(int p = 0; p < trs.size(); p++) {
item.getChildren().add(trs.get(p));
}
}
trees.add(item);
}
return trees;
}
/**
* This is the listener to the change of TiViewModel list from the
* TilistyModel. We are only listening to one namespace here
* so there is no need to test what type of update it is.
*
* @param int ns - the namespace of the update
*/
@Override
public void update(int ns, String message) {
ArrayList<TiViewModel> views = TilistyModel.getInstance().getViews();
ArrayList<TiViewModel> newViews = new ArrayList<TiViewModel>();
for(int i = 0; i < views.size(); i++) {
int index = this.currentViews.indexOf(views.get(i));
if(index == -1) {
this.currentViews.add(views.get(i));
newViews.add(views.get(i));
}
}
this.updateViews(newViews);
}
public void removeAllChildren() {
ObservableList<TreeItem<String>> children = this.treeRoot.getChildren();
this.treeRoot.getChildren().removeAll(children);
}
}