/* ViewerSignalTree.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.selector.ActionFocusListener;
import org.signalml.app.action.selector.ActionFocusManager;
import org.signalml.app.action.selector.ActionFocusSupport;
import org.signalml.app.action.selector.SignalPageFocusSelector;
import org.signalml.app.action.workspace.ActivateSignalPageAction;
import org.signalml.app.document.DocumentFlowIntegrator;
import org.signalml.app.document.signal.SignalDocument;
import org.signalml.app.model.signal.SignalPageTreeNode;
import org.signalml.app.model.signal.SignalTreeModel;
import org.signalml.plugin.export.signal.Document;
import org.signalml.plugin.export.view.AbstractViewerTree;
import org.signalml.plugin.impl.PluginAccessClass;
/** ViewerSignalTree
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class ViewerSignalTree extends AbstractViewerTree implements SignalPageFocusSelector {
private static final long serialVersionUID = 1L;
private ActionFocusSupport afSupport = new ActionFocusSupport(this);
private JPopupMenu documentPopupMenu;
private JPopupMenu signalPagePopupMenu;
private ActionFocusManager actionFocusManager;
private DocumentFlowIntegrator documentFlowIntegrator;
private ActivateDocumentAction activateDocumentAction;
private ActivateSignalPageAction activateSignalPageAction;
private CloseDocumentAction closeDocumentAction;
private SignalDocument activeSignalDocument;
private int activePage;
public ViewerSignalTree(SignalTreeModel model) {
super(model);
setCellRenderer(new SignalTreeCellRenderer());
expandPath(new TreePath(new Object[] {model.getRoot()}));
addMouseListener(new MouseEventHandler());
}
@Override
public SignalTreeModel getModel() {
return (SignalTreeModel) super.getModel();
}
@Override
public SignalDocument getActiveSignalDocument() {
return activeSignalDocument;
}
@Override
public Document getActiveDocument() {
return activeSignalDocument;
}
@Override
public int getSignalPage() {
return activePage;
}
@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;
activeSignalDocument = null;
activePage = -1;
if (path != null) {
Object last = path.getLastPathComponent();
if (last instanceof SignalDocument) {
activeSignalDocument = (SignalDocument) last;
popupMenu = getDocumentPopupMenu();
}
else if (last instanceof SignalPageTreeNode) {
activePage = ((SignalPageTreeNode) last).getPage();
activeSignalDocument = (SignalDocument) path.getPathComponent(1);
popupMenu = getSignalPagePopupMenu();
}
}
afSupport.fireActionFocusChanged();
return popupMenu;
}
private JPopupMenu getDocumentPopupMenu() {
if (documentPopupMenu == null) {
documentPopupMenu = new JPopupMenu();
documentPopupMenu.add(getActivateDocumentAction());
documentPopupMenu.addSeparator();
documentPopupMenu.add(getCloseDocumentAction());
PluginAccessClass.getGUIImpl().addToSignalTreeDocumentPopupMenu(documentPopupMenu);
}
return documentPopupMenu;
}
private JPopupMenu getSignalPagePopupMenu() {
if (signalPagePopupMenu == null) {
signalPagePopupMenu = new JPopupMenu();
signalPagePopupMenu.add(getActivateSignalPageAction());
PluginAccessClass.getGUIImpl().addToSignalTreeSignalPagePopupMenu(signalPagePopupMenu);
}
return signalPagePopupMenu;
}
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 ActivateSignalPageAction getActivateSignalPageAction() {
if (activateSignalPageAction == null) {
activateSignalPageAction = new ActivateSignalPageAction(actionFocusManager,this);
}
return activateSignalPageAction;
}
public CloseDocumentAction getCloseDocumentAction() {
if (closeDocumentAction == null) {
closeDocumentAction = new CloseDocumentAction(this);
closeDocumentAction.setDocumentFlowIntegrator(documentFlowIntegrator);
}
return closeDocumentAction;
}
private class MouseEventHandler extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
ViewerSignalTree tree = (ViewerSignalTree) 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) {
ViewerSignalTree tree = (ViewerSignalTree) 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 SignalPageTreeNode) {
getActivateSignalPageAction().actionPerformed(new ActionEvent(tree,0,"activate"));
}
// ignore dbl clicks on other tree nodes
}
}
}
}
}