/**
* author: Marcel Genzmehr
* 30.08.2011
*/
package org.freeplane.plugin.workspace.controller;
import java.util.Iterator;
import java.util.Stack;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
import org.freeplane.plugin.workspace.model.WorkspaceIndexedTreeModel;
/**
*
*/
public class DefaultWorkspaceExpansionStateHandler extends AWorkspaceExpansionStateHandler implements TreeExpansionListener {
private static boolean locked = false;
private Stack<String> collapseStack;
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
public DefaultWorkspaceExpansionStateHandler() {
super();
collapseStack = new Stack<String>();
}
/***********************************************************************************
* METHODS
**********************************************************************************/
/**
* {@inheritDoc}
*/
public void restoreExpansionStates() {
lock();
WorkspaceIndexedTreeModel model = WorkspaceController.getController().getWorkspaceModel();
JTree view = WorkspaceController.getController().getWorkspaceViewTree();
Iterator<String> iterator = getSet().iterator();
while(iterator.hasNext()) {
String key = iterator.next();
if(model.containsNode(key)) {
view.expandPath(model.getNode(key).getTreePath());
} else {
iterator.remove();
}
}
while(!collapseStack.isEmpty()) {
String key = collapseStack.pop();
if(model.containsNode(key)) {
view.collapsePath(model.getNode(key).getTreePath());
}
}
unlock();
}
public void reset() {
removeAll();
}
private boolean lock() {
if(locked()) return false;
locked = true;
return true;
}
private void unlock() {
locked = false;
}
private boolean locked() {
return locked;
}
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
/**
* {@inheritDoc}
*/
public void treeExpanded(TreeExpansionEvent event) {
AWorkspaceTreeNode node = (AWorkspaceTreeNode) event.getPath().getLastPathComponent();
if(node != null) {
String key = node.getKey();
if(key != null) {
if(locked() && !getSet().contains(key)){
collapseStack.push(key);
} else {
addPathKey(key);
}
}
}
}
/**
* {@inheritDoc}
*/
public void treeCollapsed(TreeExpansionEvent event) {
if(locked()) return;
AWorkspaceTreeNode node = (AWorkspaceTreeNode) event.getPath().getLastPathComponent();
if(node != null) {
String key = node.getKey();
if(key != null && getSet().contains(key)) {
removePathKey(key);
}
}
}
}