package org.freeplane.plugin.workspace.components; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; import javax.swing.JTree; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.event.TreeModelEvent; import org.freeplane.core.util.LogUtils; import org.freeplane.plugin.workspace.WorkspaceController; import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode; import org.freeplane.plugin.workspace.model.WorkspaceModel; import org.freeplane.plugin.workspace.model.WorkspaceModelEvent; import org.freeplane.plugin.workspace.model.WorkspaceModelListener; import org.freeplane.plugin.workspace.model.WorkspaceTreeModel; public class ExpandedStateHandler implements TreeExpansionListener, WorkspaceModelListener { private Set<String> expandedNodeKeys = new LinkedHashSet<String>(); private final JTree treeView; public ExpandedStateHandler(JTree tree) { this.treeView = tree; } public void treeExpanded(TreeExpansionEvent event) { final AWorkspaceTreeNode node = (AWorkspaceTreeNode)event.getPath().getLastPathComponent(); expandedNodeKeys.add(node.getKey()); } public void treeCollapsed(TreeExpansionEvent event) { final AWorkspaceTreeNode node = (AWorkspaceTreeNode)event.getPath().getLastPathComponent(); expandedNodeKeys.remove(node.getKey()); } public void treeNodesChanged(TreeModelEvent e) { //setExpandedState((WorkspaceModelEvent) e); } public void treeNodesInserted(TreeModelEvent e) { //setExpandedState((WorkspaceModelEvent) e); } public void treeNodesRemoved(TreeModelEvent e) { //setExpandedState((WorkspaceModelEvent) e); } public void treeStructureChanged(TreeModelEvent e) { WorkspaceTreeModel treeModel = WorkspaceController.getCurrentModel().getRoot().getModel(); setExpandedStates(treeModel, false); } public void projectAdded(WorkspaceModelEvent event) { //setExpandedState(event); String key = ((AWorkspaceTreeNode) event.getTreePath().getLastPathComponent()).getKey()+"/"+event.getProject().getProjectID(); expandedNodeKeys.add(key); } public void projectRemoved(WorkspaceModelEvent event) { //setExpandedState(event); } public void registerModel(WorkspaceModel model) { if(model == null) { return; } model.removeTreeModelListener(this); model.addWorldModelListener(this); } public void setExpandedStates(WorkspaceTreeModel targetModel, boolean cleanInvalidEntries) { Iterator<String> iter = expandedNodeKeys.iterator(); try { while(iter.hasNext()) { AWorkspaceTreeNode node = targetModel.getNode(iter.next()); if(node != null) { treeView.expandPath(node.getTreePath()); } else { if(cleanInvalidEntries) { iter.remove(); } } } } catch (Exception e) { LogUtils.warn("Exception in org.freeplane.plugin.workspace.components.ExpandedStateHandler.setExpandedStates(targetModel, cleanInvalidEntries): aborted"); } } }