/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.ui.editor.image;
import java.awt.Point;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import org.weasis.core.api.gui.util.ActionState;
import org.weasis.core.api.gui.util.ActionW;
import org.weasis.core.api.gui.util.BasicActionState;
import org.weasis.core.api.gui.util.MouseActionAdapter;
import org.weasis.core.api.media.data.ImageElement;
import org.weasis.core.api.service.AuditLog;
import org.weasis.core.ui.model.utils.bean.PanPoint;
public abstract class PannerListener extends MouseActionAdapter implements ActionState, KeyListener {
private final BasicActionState basicState;
private final boolean triggerAction = true;
protected Point pickPoint;
private Point2D point;
public PannerListener(ActionW action, Point2D point) {
this.basicState = new BasicActionState(action);
this.point = point == null ? new Point2D.Double() : point;
}
@Override
public void enableAction(boolean enabled) {
basicState.enableAction(enabled);
}
@Override
public boolean isActionEnabled() {
return basicState.isActionEnabled();
}
@Override
public boolean registerActionState(Object c) {
return basicState.registerActionState(c);
}
@Override
public void unregisterActionState(Object c) {
basicState.unregisterActionState(c);
}
public Point2D getPoint() {
return (Point2D) point.clone();
}
public void setPoint(Point2D point) {
if (point != null) {
this.point = point;
pointChanged(point);
AuditLog.LOGGER.info("action:{} val:{},{}", //$NON-NLS-1$
new Object[] { getActionW().cmd(), point.getX(), point.getY() });
}
}
public boolean isTriggerAction() {
return triggerAction;
}
@Override
public ActionW getActionW() {
return basicState.getActionW();
}
public String getValueToDisplay() {
return "x:" + point.getX() + ", y:" + point.getY(); //$NON-NLS-1$ //$NON-NLS-2$
}
public abstract void pointChanged(Point2D point);
@Override
public String toString() {
return basicState.getActionW().getTitle();
}
protected ViewCanvas<? extends ImageElement> getViewCanvas(InputEvent e) {
Object source = e.getSource();
if (source instanceof ViewCanvas) {
return (ViewCanvas<?>) source;
}
return null;
}
@Override
public void mousePressed(MouseEvent e) {
int buttonMask = getButtonMaskEx();
if ((e.getModifiersEx() & buttonMask) != 0) {
ViewCanvas<?> panner = getViewCanvas(e);
if (panner != null) {
pickPoint = e.getPoint();
if (panner.getViewModel() != null) {
double scale = panner.getViewModel().getViewScale();
setPoint(new PanPoint(PanPoint.State.DRAGSTART, -(pickPoint.getX() / scale),
-(pickPoint.getY() / scale)));
}
}
}
}
@Override
public void mouseDragged(MouseEvent e) {
int buttonMask = getButtonMaskEx();
if (!e.isConsumed() && (e.getModifiersEx() & buttonMask) != 0) {
ViewCanvas<?> panner = getViewCanvas(e);
if (panner != null) {
if (pickPoint != null && panner.getViewModel() != null) {
double scale = panner.getViewModel().getViewScale();
setPoint(new PanPoint(PanPoint.State.DRAGGING, -((e.getX() - pickPoint.getX()) / scale),
-((e.getY() - pickPoint.getY()) / scale)));
panner.addPointerType(ViewCanvas.CENTER_POINTER);
}
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
int buttonMask = getButtonMask();
if (!e.isConsumed() && (e.getModifiers() & buttonMask) != 0) {
ViewCanvas<?> panner = getViewCanvas(e);
if (panner != null) {
panner.resetPointerType(ViewCanvas.CENTER_POINTER);
panner.getJComponent().repaint();
}
}
}
public void reset() {
pickPoint = null;
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
setPoint(new PanPoint(PanPoint.State.MOVE, 5, 0));
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
setPoint(new PanPoint(PanPoint.State.MOVE, 0, 5));
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
setPoint(new PanPoint(PanPoint.State.MOVE, -5, 0));
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
setPoint(new PanPoint(PanPoint.State.MOVE, 0, -5));
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}