/*
* Freeplane - mind map editor
* Copyright (C) 2008 Dimitry Polivaev
*
* This file author is Dimitry Polivaev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.view.swing.ui;
import java.awt.Component;
import java.awt.Frame;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import org.freeplane.core.ui.ControllerPopupMenuListener;
import org.freeplane.core.ui.IMouseListener;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.features.link.LinkController;
import org.freeplane.features.map.IMapSelection;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
import org.freeplane.view.swing.map.MapView;
/**
* @author Dimitry Polivaev
* 06.01.2009
*/
/**
* The MouseListener which belongs to MapView
*/
public class DefaultMapMouseListener implements IMouseListener {
public DefaultMapMouseListener() {
}
protected void handlePopup(final MouseEvent e) {
if (e.isPopupTrigger()) {
Component popup = null;
final Component popupForModel;
final MapView mapView = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
final ModeController modeController = Controller.getCurrentController().getModeController();
if(mapView != null){
final java.lang.Object obj = mapView.detectCollision(e.getPoint());
popupForModel= LinkController.getController(modeController).getPopupForModel(obj);
}
else{
popupForModel = null;
}
if (popupForModel != null) {
final ControllerPopupMenuListener popupListener = new ControllerPopupMenuListener();
popupForModel.addHierarchyListener(popupListener);
popup = popupForModel;
}
else {
popup = modeController.getUserInputListenerFactory().getMapPopup();
}
Component component = e.getComponent();
if(popup instanceof JPopupMenu) {
((JPopupMenu)popup).show(component, e.getX(), e.getY());
}
else {
Point locationOnScreen = component.getLocationOnScreen();
final Component window;
if(popup instanceof Window){
window= popup;
}
else{
final Frame frame = UITools.getFrame();
final JDialog d = new JDialog(frame, popup.getName());
d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
d.setModal(false);
d.add(popup);
d.pack();
d.addWindowFocusListener(new WindowFocusListener() {
public void windowLostFocus(WindowEvent e) {
}
public void windowGainedFocus(WindowEvent e) {
frame.addWindowFocusListener(new WindowFocusListener() {
public void windowLostFocus(WindowEvent e) {
}
public void windowGainedFocus(WindowEvent e) {
d.setVisible(false);
frame.removeWindowFocusListener(this);
}
});
d.removeWindowFocusListener(this);
}
});
window = d;
}
window.setLocation(locationOnScreen.x+e.getX(), locationOnScreen.y + e.getY());
window.setVisible(true);
}
}
}
public void mouseClicked(final MouseEvent e) {
final Object source = e.getSource();
if(! (source instanceof MapView))
return;
final MapView map = (MapView) source;
final Controller controller = map.getModeController().getController();
final IMapSelection selection = controller.getSelection();
if(selection != null){
final NodeModel selected = selection.getSelected();
if(selected != null)
controller.getMapViewManager().getComponent(selected).requestFocusInWindow();
}
}
public void mouseEntered(final MouseEvent e) {
}
public void mouseExited(final MouseEvent e) {
}
public void mouseMoved(final MouseEvent e) {
}
public void mousePressed(final MouseEvent e) {
if (e.isPopupTrigger()) {
handlePopup(e);
}
else if (e.getButton() == MouseEvent.BUTTON1){
final MapView mapView = getMapView(e.getComponent());
if(mapView != null){
mapView.setMoveCursor(true);
originX = e.getX();
originY = e.getY();
}
}
e.consume();
}
public void mouseReleased(final MouseEvent e) {
final MapView mapView = getMapView(e.getComponent());
if(mapView != null)
mapView.setMoveCursor(false);
originX = -1;
originY = -1;
handlePopup(e);
e.consume();
}
// // final private Controller controller;
protected int originX = -1;
protected int originY = -1;
/**
*
*/
public void mouseDragged(final MouseEvent e) {
final JComponent component = (JComponent) e.getComponent();
final MapView mapView = getMapView(component);
if(mapView == null)
return;
if (originX >= 0) {
final int dx = originX - e.getX();
final int dy = originY - e.getY();
final Rectangle visibleRect = component.getVisibleRect();
final Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
final boolean isEventPointVisible = visibleRect.contains(r);
if (isEventPointVisible)
mapView.scrollBy(dx, dy);
else {
mapView.scrollBy(dx/3, dy/3);
originX += dx/3;
originY += dy/3;
}
}
}
private MapView getMapView(final Component component) {
if(component instanceof MapView)
return (MapView) component;
return (MapView) SwingUtilities.getAncestorOfClass(MapView.class, component);
}
}