/*******************************************************************************
* 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.model.utils.imp;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.swing.JDialog;
import org.weasis.core.api.gui.util.MathUtil;
import org.weasis.core.ui.dialog.MeasureDialog;
import org.weasis.core.ui.editor.image.ViewCanvas;
import org.weasis.core.ui.model.graphic.AbstractDragGraphic;
import org.weasis.core.ui.model.graphic.DragGraphic;
import org.weasis.core.ui.model.graphic.Graphic;
import org.weasis.core.ui.model.utils.Draggable;
import org.weasis.core.ui.util.ColorLayerUI;
import org.weasis.core.ui.util.MouseEventDouble;
public class DefaultDragSequence implements Draggable {
protected final DragGraphic graphic;
private final Point2D lastPoint;
private Integer handlePointIndex;
public DefaultDragSequence(DragGraphic graphic) {
this(graphic, DragGraphic.UNDEFINED);
}
public DefaultDragSequence(DragGraphic graphic, Integer handlePointIndex) {
this.graphic = Objects.requireNonNull(graphic);
this.handlePointIndex = handlePointIndex;
this.lastPoint = new Point2D.Double();
}
@Override
public void startDrag(MouseEventDouble evt) {
graphic.setResizeOrMoving(Boolean.TRUE);
lastPoint.setLocation(evt.getImageX(), evt.getImageY());
if (!graphic.isGraphicComplete()) {
if (graphic.getPts().isEmpty()) {
graphic.getPts().add(evt.getImageCoordinates());
}
if (!graphic.isGraphicComplete()) {
graphic.getPts().add(evt.getImageCoordinates());
}
// force index to match actual dragging point
handlePointIndex = graphic.getPts().size() - 1;
}
}
@Override
public void drag(MouseEventDouble evt) {
Double deltaX = evt.getImageX() - lastPoint.getX();
Double deltaY = evt.getImageY() - lastPoint.getY();
if (MathUtil.isDifferentFromZero(deltaX) || MathUtil.isDifferentFromZero(deltaY)) {
lastPoint.setLocation(evt.getImageCoordinates());
handlePointIndex = graphic.moveAndResizeOnDrawing(handlePointIndex, deltaX, deltaY, evt);
graphic.buildShape(evt);
graphic.setResizeOrMoving(Boolean.TRUE);
}
}
@Override
public Boolean completeDrag(MouseEventDouble mouseEvent) {
if (mouseEvent != null) {
if (!graphic.isGraphicComplete()) {
if (graphic.getPtsNumber() == DragGraphic.UNDEFINED && mouseEvent.getClickCount() == 2
&& !mouseEvent.isConsumed()) {
List<Point2D.Double> handlePointList = graphic.getPts();
if (!graphic.isLastPointValid()) {
handlePointList.remove(handlePointList.size() - 1);
}
graphic.setPointNumber(handlePointList.size());
} else if (graphic.isLastPointValid()) {
graphic.getPts().add(mouseEvent.getImageCoordinates());
handlePointIndex = graphic.getPts().size() - 1; // forces index to match actual dragging point
}
} else if (graphic.getShape() != null && graphic.isShapeValid()) {
// The shape is not repainted because it is identical to the previous one.
// Force to repaint the handles of the shape by setting to null.
// Repaint also measurement labels which is entirely computed on mouse click release
graphic.setResizeOrMoving(Boolean.FALSE);
graphic.setShape(null, mouseEvent);
graphic.buildShape(mouseEvent);
if (mouseEvent.getClickCount() == 2 && !mouseEvent.isConsumed()) {
ViewCanvas<?> graphPane = graphic.getDefaultView2d(mouseEvent);
if (graphPane != null) {
// Do not open properties dialog for graphic with undefined points (like polyline) => double
// click conflict
boolean isEditingGraph = false;
Optional<Graphic> first = graphPane.getGraphicManager().getFirstGraphicIntersecting(mouseEvent);
if (first.isPresent() && first.get() instanceof AbstractDragGraphic) {
AbstractDragGraphic dragGraph = (AbstractDragGraphic) first.get();
if (dragGraph.getSelected() && dragGraph.getVariablePointsNumber()) {
List<DragGraphic> selectedDragGraphList =
graphPane.getGraphicManager().getSelectedDragableGraphics();
if (selectedDragGraphList.size() == 1 && !dragGraph.isOnGraphicLabel(mouseEvent)
&& dragGraph.getHandlePointIndex(mouseEvent) >= 0) {
isEditingGraph = true;
}
}
}
if (!isEditingGraph && graphPane.getGraphicManager().getSelectedGraphics().size() == 1) {
ColorLayerUI layer = ColorLayerUI.createTransparentLayerUI(graphPane.getJComponent());
final ArrayList<DragGraphic> list = new ArrayList<>();
list.add(graphic);
JDialog dialog = new MeasureDialog(graphPane, list);
ColorLayerUI.showCenterScreen(dialog, layer);
mouseEvent.consume();
}
}
}
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
}