/**
* author: Marcel Genzmehr
* 10.08.2011
*/
package org.freeplane.plugin.workspace.controller;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.List;
import javax.swing.JTree;
import javax.swing.tree.TreePath;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.WorkspaceUtils;
import org.freeplane.plugin.workspace.components.WorkspaceNodeRenderer;
import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
/**
*
*/
public class DefaultWorkspaceMouseHandler implements MouseListener, MouseMotionListener {
private TreePath lastSelection = null;
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
/***********************************************************************************
* METHODS
**********************************************************************************/
public final TreePath getLastSelectionPath() {
return lastSelection;
}
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
public void mouseClicked(MouseEvent e) {
if(e.isConsumed()) {
return;
}
TreePath path = ((JTree) e.getSource()).getPathForLocation(e.getX(), e.getY());
WorkspaceController.getController().getWorkspaceViewTree().addSelectionPath(path);
if (path != null) {
AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
// encode buttons
int eventType = 0;
if (e.getButton() == MouseEvent.BUTTON1) {
eventType += WorkspaceActionEvent.MOUSE_LEFT;
}
if (e.getButton() == MouseEvent.BUTTON3) {
eventType += WorkspaceActionEvent.MOUSE_RIGHT;
}
if (e.getClickCount() % 2 == 0) {
eventType += WorkspaceActionEvent.MOUSE_DBLCLICK;
}
else {
eventType += WorkspaceActionEvent.MOUSE_CLICK;
}
WorkspaceActionEvent event = new WorkspaceActionEvent(node, eventType, e.getX(), e.getY(), e.getComponent());
List<IWorkspaceNodeActionListener> nodeEventListeners = WorkspaceController.getIOController().getNodeActionListeners(node.getClass(), eventType);
if(nodeEventListeners != null) {
for(IWorkspaceNodeActionListener listener : nodeEventListeners) {
if(event.isConsumed()) {
break;
}
listener.handleAction(event);
}
}
if (!event.isConsumed() && node instanceof IWorkspaceNodeActionListener) {
((IWorkspaceNodeActionListener) node).handleAction(event);
}
}
else {
if (e.getButton() == MouseEvent.BUTTON3) {
//WorkspaceController.getController().getPopups().showWorkspacePopup(e.getComponent(), e.getX(), e.getY());
((AWorkspaceTreeNode) WorkspaceUtils.getModel().getRoot()).showPopup(e.getComponent(), e.getX(), e.getY());
}
}
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
JTree tree = ((JTree) e.getSource());
TreePath path = tree.getPathForLocation(e.getX(), e.getY());
if(path == getLastSelectionPath()) {
return;
}
WorkspaceNodeRenderer renderer = (WorkspaceNodeRenderer) tree.getCellRenderer();
if(path != null && path != getLastSelectionPath()) {
lastSelection = path;
renderer.highlightRow(tree.getRowForLocation(e.getX(), e.getY()));
tree.repaint();
}
else if(getLastSelectionPath() != null) {
lastSelection = null;
renderer.highlightRow(-1);
tree.repaint();
}
}
}