/* ViewerWorkspaceTree.java created 2007-09-11
*
*/
package org.signalml.app.view.workspace;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.tree.TreePath;
import org.signalml.app.action.document.ActivateDocumentAction;
import org.signalml.app.action.document.CloseDocumentAction;
import org.signalml.app.action.document.OpenMRUDAction;
import org.signalml.app.action.selector.ActionFocusEvent;
import org.signalml.app.action.selector.ActionFocusListener;
import org.signalml.app.action.selector.ActionFocusManager;
import org.signalml.app.action.selector.ActionFocusSupport;
import org.signalml.app.action.selector.DocumentFocusSelector;
import org.signalml.app.action.selector.MRUDFocusSelector;
import org.signalml.app.document.DocumentFlowIntegrator;
import org.signalml.app.document.mrud.MRUDEntry;
import org.signalml.app.model.workspace.WorkspaceTreeModel;
import org.signalml.plugin.export.signal.Document;
import org.signalml.plugin.export.view.AbstractViewerTree;
import org.signalml.plugin.impl.PluginAccessClass;
/** ViewerWorkspaceTree
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class ViewerWorkspaceTree extends AbstractViewerTree implements ActionFocusListener, DocumentFocusSelector, MRUDFocusSelector {
private static final long serialVersionUID = 1L;
private ActionFocusSupport afSupport = new ActionFocusSupport(this);
private ActionFocusManager actionFocusManager;
private DocumentFlowIntegrator documentFlowIntegrator;
private JPopupMenu documentPopupMenu;
private JPopupMenu mrudPopupMenu;
private JPopupMenu otherPopupMenu;
private ActivateDocumentAction activateDocumentAction;
private CloseDocumentAction closeDocumentAction;
private OpenMRUDAction openMRUDAction;
private Document activeDocument;
private MRUDEntry activeMRUDEntry;
public ViewerWorkspaceTree(WorkspaceTreeModel model) {
super(model);
setCellRenderer(new WorkspaceTreeCellRenderer());
expandPath(new TreePath(new Object[] {model.getRoot(), model.getChild(model.getRoot(), 0)}));
expandPath(new TreePath(new Object[] {model.getRoot(), model.getChild(model.getRoot(), 1)}));
addMouseListener(new MouseEventHandler());
}
@Override
public WorkspaceTreeModel getModel() {
return (WorkspaceTreeModel) super.getModel();
}
@Override
public Document getActiveDocument() {
return activeDocument;
}
@Override
public MRUDEntry getActiveMRUDEntry() {
return activeMRUDEntry;
}
@Override
public void addActionFocusListener(ActionFocusListener listener) {
afSupport.addActionFocusListener(listener);
}
@Override
public void removeActionFocusListener(ActionFocusListener listener) {
afSupport.removeActionFocusListener(listener);
}
@Override
public JPopupMenu getComponentPopupMenu() {
return focus(getSelectionPath());
}
private JPopupMenu focus(TreePath path) {
JPopupMenu popupMenu = null;
activeDocument = null;
activeMRUDEntry = null;
if (path != null) {
Object last = path.getLastPathComponent();
if (last instanceof Document) {
activeDocument = (Document) last;
popupMenu = getDocumentPopupMenu();
}
else if (last instanceof MRUDEntry) {
activeMRUDEntry = (MRUDEntry) last;
popupMenu = getMRUDPopupMenu();
}
}
if (popupMenu == null) {
popupMenu = getOtherPopupMenu();
}
afSupport.fireActionFocusChanged();
return popupMenu;
}
private JPopupMenu getDocumentPopupMenu() {
if (documentPopupMenu == null) {
documentPopupMenu = new JPopupMenu();
documentPopupMenu.add(getActivateDocumentAction());
documentPopupMenu.addSeparator();
documentPopupMenu.addSeparator();
documentPopupMenu.add(getCloseDocumentAction());
PluginAccessClass.getGUIImpl().addToWorkspaceTreeDocumentPopupMenu(documentPopupMenu);
}
return documentPopupMenu;
}
private JPopupMenu getMRUDPopupMenu() {
if (mrudPopupMenu == null) {
mrudPopupMenu = new JPopupMenu();
mrudPopupMenu.add(getOpenMRUDAction());
PluginAccessClass.getGUIImpl().addToWorkspaceTreeMRUDPopupMenu(mrudPopupMenu);
}
return mrudPopupMenu;
}
private JPopupMenu getOtherPopupMenu() {
if (otherPopupMenu == null) {
otherPopupMenu = new JPopupMenu();
// empty pop up menu
PluginAccessClass.getGUIImpl().addToWorkspaceTreeOtherPopupMenu(otherPopupMenu);
}
return otherPopupMenu;
}
public ActionFocusManager getActionFocusManager() {
return actionFocusManager;
}
public void setActionFocusManager(ActionFocusManager actionFocusManager) {
this.actionFocusManager = actionFocusManager;
}
public DocumentFlowIntegrator getDocumentFlowIntegrator() {
return documentFlowIntegrator;
}
public void setDocumentFlowIntegrator(DocumentFlowIntegrator documentFlowIntegrator) {
this.documentFlowIntegrator = documentFlowIntegrator;
}
public ActivateDocumentAction getActivateDocumentAction() {
if (activateDocumentAction == null) {
activateDocumentAction = new ActivateDocumentAction(actionFocusManager, this);
}
return activateDocumentAction;
}
public CloseDocumentAction getCloseDocumentAction() {
if (closeDocumentAction == null) {
closeDocumentAction = new CloseDocumentAction(this);
closeDocumentAction.setDocumentFlowIntegrator(documentFlowIntegrator);
}
return closeDocumentAction;
}
public OpenMRUDAction getOpenMRUDAction() {
if (openMRUDAction == null) {
openMRUDAction = new OpenMRUDAction(this);
openMRUDAction.setDocumentFlowIntegrator(documentFlowIntegrator);
}
return openMRUDAction;
}
@Override
public void actionFocusChanged(ActionFocusEvent e) {
Document document = actionFocusManager.getActiveDocument();
if (document != null) {
setSelectionPath(getModel().getTreePathToRoot(document));
}
}
private class MouseEventHandler extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
ViewerWorkspaceTree tree = (ViewerWorkspaceTree) e.getSource();
if (SwingUtilities.isRightMouseButton(e) && (e.getClickCount() == 1)) {
TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
tree.setSelectionPath(selPath);
}
}
@Override
public void mouseClicked(MouseEvent e) {
ViewerWorkspaceTree tree = (ViewerWorkspaceTree) e.getSource();
if (SwingUtilities.isLeftMouseButton(e) && (e.getClickCount() % 2) == 0) {
int selRow = tree.getRowForLocation(e.getX(), e.getY());
TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
focus(selPath);
if (selRow >= 0) {
Object target = selPath.getLastPathComponent();
if (target instanceof Document) {
getActivateDocumentAction().actionPerformed(new ActionEvent(tree,0,"activate"));
} else if (target instanceof MRUDEntry) {
getOpenMRUDAction().actionPerformed(new ActionEvent(tree,0,"open"));
}
// ignore dbl clicks on other tree nodes
}
}
}
}
}