/* ViewerTagTree.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.TagFocusSelector;
import org.signalml.app.action.selector.TagStyleFocusSelector;
import org.signalml.app.action.tag.ActivateTagAction;
import org.signalml.app.action.tag.EditTagAnnotationAction;
import org.signalml.app.action.tag.EditTagDescriptionAction;
import org.signalml.app.action.tag.EditTagStylesAction;
import org.signalml.app.action.tag.RemoveTagAction;
import org.signalml.app.document.DocumentFlowIntegrator;
import org.signalml.app.document.TagDocument;
import org.signalml.app.document.signal.SignalDocument;
import org.signalml.app.model.tag.TagTreeModel;
import org.signalml.app.view.common.components.cellrenderers.TagTreeCellRenderer;
import org.signalml.app.view.signal.PositionedTag;
import org.signalml.app.view.tag.EditTagAnnotationDialog;
import org.signalml.app.view.tag.EditTagDescriptionDialog;
import org.signalml.app.view.tag.TagStylePaletteDialog;
import org.signalml.plugin.export.signal.Document;
import org.signalml.plugin.export.signal.Tag;
import org.signalml.plugin.export.signal.TagStyle;
import org.signalml.plugin.export.view.AbstractViewerTree;
import org.signalml.plugin.impl.PluginAccessClass;
/** ViewerTagTree
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class ViewerTagTree extends AbstractViewerTree implements TagFocusSelector, TagStyleFocusSelector {
private static final long serialVersionUID = 1L;
private ActionFocusSupport afSupport = new ActionFocusSupport(this);
private JPopupMenu signalDocumentPopupMenu;
private JPopupMenu tagDocumentPopupMenu;
private JPopupMenu tagStylePopupMenu;
private JPopupMenu tagPopupMenu;
private ActionFocusManager actionFocusManager;
private DocumentFlowIntegrator documentFlowIntegrator;
private TagStylePaletteDialog tagStylePaletteDialog;
private EditTagAnnotationDialog editTagAnnotationDialog;
private EditTagDescriptionDialog editTagDescriptionDialog;
private ActivateDocumentAction activateDocumentAction;
private ActivateTagAction activateTagAction;
private CloseDocumentAction closeDocumentAction;
private RemoveTagAction removeTagAction;
private EditTagAnnotationAction editTagAnnotationAction;
private EditTagStylesAction editTagStylesAction;
private EditTagDescriptionAction editTagDescriptionAction;
private SignalDocument activeSignalDocument;
private TagDocument activeTagDocument;
private PositionedTag activeTag;
private TagStyle activeTagStyle;
public ViewerTagTree(TagTreeModel model) {
super(model);
setCellRenderer(new TagTreeCellRenderer(model.getIconProducer()));
expandPath(new TreePath(new Object[] {model.getRoot()}));
addMouseListener(new MouseEventHandler());
}
@Override
public TagTreeModel getModel() {
return (TagTreeModel) super.getModel();
}
@Override
public PositionedTag getActiveTag() {
return activeTag;
}
@Override
public TagDocument getActiveTagDocument() {
return activeTagDocument;
}
@Override
public Document getActiveDocument() {
return (activeTagDocument != null ? activeTagDocument : activeSignalDocument);
}
@Override
public TagStyle getActiveTagStyle() {
return activeTagStyle;
}
@Override
public SignalDocument getActiveSignalDocument() {
return activeSignalDocument;
}
@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;
activeTagDocument = null;
activeTag = null;
activeTagStyle = null;
if (path != null) {
Object last = path.getLastPathComponent();
if (last instanceof SignalDocument) {
activeSignalDocument = (SignalDocument) last;
popupMenu = getSignalDocumentPopupMenu();
}
else if (last instanceof TagDocument) {
activeSignalDocument = (SignalDocument) path.getPathComponent(1);
activeTagDocument = (TagDocument) last;
popupMenu = getTagDocumentPopupMenu();
}
else if (last instanceof TagStyle) {
activeTagStyle = (TagStyle) last;
activeTagDocument = (TagDocument) path.getPathComponent(2);
activeSignalDocument = (SignalDocument) path.getPathComponent(1);
popupMenu = getTagStylePopupMenu();
}
else if (last instanceof Tag) {
activeTagDocument = (TagDocument) path.getPathComponent(2);
activeSignalDocument = (SignalDocument) path.getPathComponent(1);
int index = activeSignalDocument.getTagDocuments().indexOf(activeTagDocument);
activeTag = new PositionedTag((Tag) last,index);
popupMenu = getTagPopupMenu();
}
}
afSupport.fireActionFocusChanged();
return popupMenu;
}
private JPopupMenu getSignalDocumentPopupMenu() {
if (signalDocumentPopupMenu == null) {
signalDocumentPopupMenu = new JPopupMenu();
signalDocumentPopupMenu.add(getActivateDocumentAction());
signalDocumentPopupMenu.addSeparator();
signalDocumentPopupMenu.add(getCloseDocumentAction());
PluginAccessClass.getGUIImpl().addToTagTreeSignalDocumentPopupMenu(signalDocumentPopupMenu);
}
return signalDocumentPopupMenu;
}
private JPopupMenu getTagDocumentPopupMenu() {
if (tagDocumentPopupMenu == null) {
tagDocumentPopupMenu = new JPopupMenu();
tagDocumentPopupMenu.add(getActivateDocumentAction());
tagDocumentPopupMenu.addSeparator();
tagDocumentPopupMenu.add(getEditTagStylesAction());
tagDocumentPopupMenu.add(getEditTagDescriptionAction());
tagDocumentPopupMenu.addSeparator();
tagDocumentPopupMenu.add(getCloseDocumentAction());
PluginAccessClass.getGUIImpl().addToTagTreeTagDocumentPopupMenu(tagDocumentPopupMenu);
}
return tagDocumentPopupMenu;
}
private JPopupMenu getTagStylePopupMenu() {
if (tagStylePopupMenu == null) {
tagStylePopupMenu = new JPopupMenu();
tagStylePopupMenu.add(getEditTagStylesAction());
PluginAccessClass.getGUIImpl().addToTagTreeTagStylePopupMenu(tagStylePopupMenu);
}
return tagStylePopupMenu;
}
private JPopupMenu getTagPopupMenu() {
if (tagPopupMenu == null) {
tagPopupMenu = new JPopupMenu();
tagPopupMenu.add(getActivateTagAction());
tagPopupMenu.addSeparator();
tagPopupMenu.add(getEditTagAnnotationAction());
tagPopupMenu.addSeparator();
tagPopupMenu.add(getRemoveTagAction());
PluginAccessClass.getGUIImpl().addToTagTreeTagPopupMenu(tagPopupMenu);
}
return tagPopupMenu;
}
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 TagStylePaletteDialog getTagStylePaletteDialog() {
return tagStylePaletteDialog;
}
public void setTagStylePaletteDialog(TagStylePaletteDialog tagStylePaletteDialog) {
this.tagStylePaletteDialog = tagStylePaletteDialog;
}
public EditTagAnnotationDialog getEditTagAnnotationDialog() {
return editTagAnnotationDialog;
}
public void setEditTagAnnotationDialog(EditTagAnnotationDialog editTagAnnotationDialog) {
this.editTagAnnotationDialog = editTagAnnotationDialog;
}
public EditTagDescriptionDialog getEditTagDescriptionDialog() {
return editTagDescriptionDialog;
}
public void setEditTagDescriptionDialog(EditTagDescriptionDialog editTagDescriptionDialog) {
this.editTagDescriptionDialog = editTagDescriptionDialog;
}
public ActivateDocumentAction getActivateDocumentAction() {
if (activateDocumentAction == null) {
activateDocumentAction = new ActivateDocumentAction(actionFocusManager,this);
}
return activateDocumentAction;
}
public ActivateTagAction getActivateTagAction() {
if (activateTagAction == null) {
activateTagAction = new ActivateTagAction(actionFocusManager,this);
}
return activateTagAction;
}
public CloseDocumentAction getCloseDocumentAction() {
if (closeDocumentAction == null) {
closeDocumentAction = new CloseDocumentAction(this);
closeDocumentAction.setDocumentFlowIntegrator(documentFlowIntegrator);
}
return closeDocumentAction;
}
public RemoveTagAction getRemoveTagAction() {
if (removeTagAction == null) {
removeTagAction = new RemoveTagAction(this);
}
return removeTagAction;
}
public EditTagAnnotationAction getEditTagAnnotationAction() {
if (editTagAnnotationAction == null) {
editTagAnnotationAction = new EditTagAnnotationAction(this);
editTagAnnotationAction.setEditTagAnnotationDialog(editTagAnnotationDialog);
}
return editTagAnnotationAction;
}
public EditTagStylesAction getEditTagStylesAction() {
if (editTagStylesAction == null) {
editTagStylesAction = new EditTagStylesAction(this);
editTagStylesAction.setTagStylePaletteDialog(tagStylePaletteDialog);
}
return editTagStylesAction;
}
public EditTagDescriptionAction getEditTagDescriptionAction() {
if (editTagDescriptionAction == null) {
editTagDescriptionAction = new EditTagDescriptionAction(this);
editTagDescriptionAction.setEditTagDescriptionDialog(editTagDescriptionDialog);
}
return editTagDescriptionAction;
}
private class MouseEventHandler extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
ViewerTagTree tree = (ViewerTagTree) 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) {
ViewerTagTree tree = (ViewerTagTree) 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 TagStyle) {
getEditTagStylesAction().actionPerformed(new ActionEvent(tree,0,"edit"));
}
else if (target instanceof Tag) {
getActivateTagAction().actionPerformed(new ActionEvent(tree,0,"activate"));
}
// ignore dbl clicks on other tree nodes
}
}
}
}
}