package org.freeplane.view.swing.ui;
import java.awt.event.InputEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.Set;
import org.freeplane.core.resources.IFreeplanePropertyListener;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.ui.IMouseWheelEventHandler;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
import org.freeplane.view.swing.map.MapView;
/**
* @author foltin
*/
public class DefaultMouseWheelListener implements MouseWheelListener {
private static final int HORIZONTAL_SCROLL_MASK = InputEvent.SHIFT_MASK | InputEvent.BUTTON1_MASK
| InputEvent.BUTTON2_MASK | InputEvent.BUTTON3_MASK;
public static final String RESOURCES_WHEEL_VELOCITY = "wheel_velocity";
private static int SCROLL_SKIPS = 8;
private static final int ZOOM_MASK = InputEvent.CTRL_MASK;
// // final private Controller controller;
/**
*
*/
public DefaultMouseWheelListener() {
super();
// this.controller = controller;
ResourceController.getResourceController().addPropertyChangeListener(new IFreeplanePropertyListener() {
public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
if (propertyName.equals(DefaultMouseWheelListener.RESOURCES_WHEEL_VELOCITY)) {
DefaultMouseWheelListener.SCROLL_SKIPS = Integer.parseInt(newValue);
}
}
});
DefaultMouseWheelListener.SCROLL_SKIPS = ResourceController.getResourceController().getIntProperty(
DefaultMouseWheelListener.RESOURCES_WHEEL_VELOCITY, 8);
}
/*
* (non-Javadoc)
* @see
* freeplane.modes.ModeController.MouseWheelEventHandler#handleMouseWheelEvent
* (java.awt.event.MouseWheelEvent)
*/
public void mouseWheelMoved(final MouseWheelEvent e) {
final MapView mapView = (MapView) e.getSource();
final ModeController mController = mapView.getModeController();
if (mController.isBlocked()) {
return;
}
final Set<IMouseWheelEventHandler> registeredMouseWheelEventHandler = mController.getUserInputListenerFactory()
.getMouseWheelEventHandlers();
for (final IMouseWheelEventHandler handler : registeredMouseWheelEventHandler) {
final boolean result = handler.handleMouseWheelEvent(e);
if (result) {
return;
}
}
if ((e.getModifiers() & DefaultMouseWheelListener.ZOOM_MASK) != 0) {
float newZoomFactor = 1f + Math.abs((float) e.getWheelRotation()) / 10f;
if (e.getWheelRotation() < 0) {
newZoomFactor = 1 / newZoomFactor;
}
final float oldZoom = ((MapView) e.getComponent()).getZoom();
float newZoom = oldZoom / newZoomFactor;
newZoom = (float) Math.rint(newZoom * 1000f) / 1000f;
newZoom = Math.max(1f / 32f, newZoom);
newZoom = Math.min(32f, newZoom);
if (newZoom != oldZoom) {
Controller.getCurrentController().getMapViewManager().setZoom(newZoom);
}
}
else if ((e.getModifiers() & DefaultMouseWheelListener.HORIZONTAL_SCROLL_MASK) != 0) {
((MapView) e.getComponent()).scrollBy(DefaultMouseWheelListener.SCROLL_SKIPS * e.getWheelRotation(), 0);
}
else {
((MapView) e.getComponent()).scrollBy(0, DefaultMouseWheelListener.SCROLL_SKIPS * e.getWheelRotation());
}
}
}