/******************************************************************************* * 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 java.util.Objects; import java.util.Optional; 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.service.AuditLog; public abstract class CrosshairListener extends MouseActionAdapter implements ActionState, KeyListener { private final BasicActionState basicState; private final boolean triggerAction = true; private Point pickPoint; private Point2D point; public CrosshairListener(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[] { basicState.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 void setButtonMaskEx(int buttonMask) { // Zero is used to disable the mouse adapter if (buttonMask == 0 && this.buttonMaskEx != 0) { // Convention to delete cross-lines on the views when selecting another action this.setPoint(new Point2D.Double(Double.NaN, Double.NaN)); } super.setButtonMaskEx(buttonMask); } @Override public String toString() { return basicState.getActionW().getTitle(); } private static ViewCanvas<?> getViewCanvas(InputEvent e) { Object source = e.getSource(); if (source instanceof ViewCanvas) { return (ViewCanvas<?>) source; } return null; } @Override public void mousePressed(MouseEvent e) { if (basicState.isActionEnabled()) { int buttonMask = getButtonMaskEx(); if ((e.getModifiersEx() & buttonMask) != 0) { ViewCanvas<?> panner = getViewCanvas(e); if (Objects.nonNull(panner)) { pickPoint = e.getPoint(); setPoint(panner.getImageCoordinatesFromMouse(e.getX(), e.getY())); } } } } @Override public void mouseDragged(MouseEvent e) { if (basicState.isActionEnabled()) { int buttonMask = getButtonMaskEx(); if ((e.getModifiersEx() & buttonMask) != 0) { ViewCanvas<?> panner = getViewCanvas(e); if (Objects.nonNull(panner) && Objects.nonNull(pickPoint)) { setPoint(panner.getImageCoordinatesFromMouse(e.getX(), e.getY())); } } } } @Override public void mouseReleased(MouseEvent e) { if (basicState.isActionEnabled()) { int buttonMask = getButtonMask(); if ((e.getModifiers() & buttonMask) != 0) { ViewCanvas<?> panner = getViewCanvas(e); Optional.ofNullable(panner).ifPresent(p -> p.getJComponent().repaint()); } } } public void reset() { pickPoint = null; } @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } }