/*********************************************************************
* Copyright (c) 2005, 2019 SAP SE
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
*    SAP SE - initial API, implementation and documentation
*    mgorning - Bug 391523 - Revise getSelectionInfo...() in IToolBehaviorProvider
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.ui.internal.util.draw2d;

import org.eclipse.draw2d.BendpointLocator;
import org.eclipse.draw2d.Cursors;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.MidpointLocator;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.SharedCursors;
import org.eclipse.gef.handles.BendpointHandle;
import org.eclipse.gef.tools.ConnectionBendpointTracker;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.impl.AddBendpointContext;
import org.eclipse.graphiti.features.context.impl.MoveBendpointContext;
import org.eclipse.graphiti.features.context.impl.RemoveBendpointContext;
import org.eclipse.graphiti.tb.IConnectionSelectionInfo;
import org.eclipse.graphiti.ui.internal.config.IConfigurationProviderInternal;
import org.eclipse.graphiti.ui.internal.figures.GFFigureUtil;
import org.eclipse.graphiti.ui.internal.util.DataTypeTransformation;
import org.eclipse.graphiti.ui.platform.IConfigurationProvider;
import org.eclipse.graphiti.util.IColorConstant;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;

/**
 * A circular handle which is placed on a bendpoint of a connection. It can be
 * used to move or create the bendpoints of the connection edit-part.
 * 
 * @noinstantiate This class is not intended to be instantiated by clients.
 * @noextend This class is not intended to be subclassed by clients.
 */
public class GFBendpointHandle extends BendpointHandle {

	/**
	 * Enumeration of the supported types of the bendpoint handle (create/move).
	 */
	public enum Type {
		CREATE, MOVE
	};

	/**
	 * The line-width of the handle.
	 */
	private static int LINE_WIDTH = 1;

	/**
	 * The handle-dimension for the bendpoint handle type CREATE.
	 */
	private static Dimension HANDLE_DIMENSION_CREATE = new Dimension(6, 6);

	/**
	 * The handle-dimension for the bendpoint handle type MOVE.
	 */
	private static Dimension HANDLE_DIMENSION_MOVE = new Dimension(8, 8);

	/**
	 * The foreground color for resizable directions.
	 */
	private static Color FG_COLOR_PRIMARY;

	/**
	 * The foreground color for not-resizable directions.
	 */
	private static Color FG_COLOR_SECONDARY;

	/**
	 * The background color for primary-selected, resizable directions.
	 */
	private static Color BG_COLOR_PRIMARY;

	/**
	 * The background color for secondary-selected, resizable directions.
	 */
	private static Color BG_COLOR_SECONDARY;

	// ========================================================================

	/**
	 * The configuration provider, which can be used to access the environment.
	 */
	private IConfigurationProviderInternal configurationProvider;

	/**
	 * The request type of the drag tracker (create/move bendpoint).
	 */
	private String dragTrackerType;

	private IConnectionSelectionInfo connectionSelectionInfo;

	/**
	 * Creates a new GFBendpointHandle.
	 * 
	 * @param owner
	 *            The connection edit-part associated with this handle.
	 * @param index
	 *            The index of the bendpoint.
	 * @param locatorIndex
	 *            The index used for the bendpoint locator.
	 * @param configurationProvider
	 *            The configuration provider, which can be used to access the
	 *            environment.
	 * @param type
	 *            The type of the bendpoint handle (create/move).
	 */
	public GFBendpointHandle(ConnectionEditPart owner, int index, int locatorIndex,
			IConfigurationProviderInternal configurationProvider, Type type,
			IConnectionSelectionInfo connectionSelectionInfo) {
		super();
		this.connectionSelectionInfo = connectionSelectionInfo;
		setCursor(Cursors.NO);

		setConfigurationProvider(configurationProvider);

		setOwner(owner);
		setIndex(index);

		setOpaque(false);

		if (Type.CREATE.equals(type)) {
			setLocator(new MidpointLocator(getConnection(), locatorIndex));
			if (checkAddBendpointFeature()) {
				setCursor(SharedCursors.SIZEALL);
			}
			dragTrackerType = RequestConstants.REQ_CREATE_BENDPOINT;
			setPreferredSize(HANDLE_DIMENSION_CREATE);
		} else if (Type.MOVE.equals(type)) {
			setLocator(new BendpointLocator(getConnection(), locatorIndex));
			if (checkMoveBendpointFeature()) {
				setCursor(SharedCursors.SIZEALL);
			}
			dragTrackerType = RequestConstants.REQ_MOVE_BENDPOINT;
			setPreferredSize(HANDLE_DIMENSION_MOVE);
		} else {
			setCursor(null);
		}
	}

	/**
	 * Overridden to create a {@link ConnectionBendpointTracker} if dragging is
	 * supported. The request type of the drag tracker depends on the bendpoint
	 * handle type (create/move).
	 */
	@Override
	protected DragTracker createDragTracker() {
		ConnectionBendpointTracker tracker = null;
		if (dragTrackerType != null) {
			if (((dragTrackerType.equals(RequestConstants.REQ_MOVE_BENDPOINT)) && checkMoveBendpointFeature())
					|| ((dragTrackerType.equals(RequestConstants.REQ_CREATE_BENDPOINT)) && checkRemoveBendpointFeature())) {
				tracker = new ConnectionBendpointTracker((ConnectionEditPart) getOwner(), getIndex());
				tracker.setType(dragTrackerType);
				tracker.setDefaultCursor(getCursor());
			}
		}
		return tracker;
	}

	/**
	 * Returns <code>true</code> if the handles owner is the primary selection.
	 * If not, it must be the secondary selection.
	 * 
	 * @return <code>true</code> if the handles owner is the primary selection.
	 */
	private boolean isPrimarySelected() {
		return getOwner().getSelected() == EditPart.SELECTED_PRIMARY;
	}

	/**
	 * Paints a circular handle which is placed on the specified bendpoint of
	 * the connection edit-part.
	 */
	@Override
	public void paintFigure(Graphics g) {
		g.setAntialias(SWT.ON);
		g.setLineWidth(getLineWidth());

		boolean primary = isPrimarySelected();
		Color fg;
		Color bg;
		if (primary) {
			fg = getFgColorPrimary();
			bg = getBgColorPrimary();
		} else { // (!primary)
			fg = getFgColorSecondary();
			bg = getBgColorSecondary();
		}
		if (fg != null)
			g.setForegroundColor(fg);
		if (bg != null)
			g.setBackgroundColor(bg);

		Rectangle r = GFFigureUtil.getAdjustedRectangle(getBounds(), 1.0, getLineWidth());
		g.fillOval(r);
		g.drawOval(r);
	}

	private Color getFgColorPrimary() {
		if (connectionSelectionInfo != null) {
			IColorConstant color = connectionSelectionInfo.getPrimarySelectionBendpointForegroundColor();
			if (color != null) {
				Color swtColor = DataTypeTransformation.toSwtColor(configurationProvider.getResourceRegistry(), color);
				return swtColor;
			}
		}
		if (FG_COLOR_PRIMARY == null || FG_COLOR_PRIMARY.isDisposed()) {
			FG_COLOR_PRIMARY = configurationProvider.getResourceRegistry().getSwtColor("cc6a01"); //$NON-NLS-1$
		}
		return FG_COLOR_PRIMARY;
	}

	private Color getFgColorSecondary() {
		if (connectionSelectionInfo != null) {
			IColorConstant color = connectionSelectionInfo.getSecondarySelectionBendpointForegroundColor();
			if (color != null) {
				Color swtColor = DataTypeTransformation.toSwtColor(configurationProvider.getResourceRegistry(), color);
				return swtColor;
			}
		}
		if (FG_COLOR_SECONDARY == null || FG_COLOR_SECONDARY.isDisposed()) {
			FG_COLOR_SECONDARY = configurationProvider.getResourceRegistry().getSwtColor("cc6a01"); //$NON-NLS-1$
		}
		return FG_COLOR_SECONDARY;
	}

	private Color getBgColorPrimary() {
		if (connectionSelectionInfo != null) {
			IColorConstant color = connectionSelectionInfo.getPrimarySelectionBendpointBackgroundColor();
			if (color != null) {
				Color swtColor = DataTypeTransformation.toSwtColor(configurationProvider.getResourceRegistry(), color);
				return swtColor;
			}
		}
		if (BG_COLOR_PRIMARY == null || BG_COLOR_PRIMARY.isDisposed()) {
			BG_COLOR_PRIMARY = configurationProvider.getResourceRegistry().getSwtColor("ffaa2f"); //$NON-NLS-1$
		}
		return BG_COLOR_PRIMARY;
	}

	private Color getBgColorSecondary() {
		if (connectionSelectionInfo != null) {
			IColorConstant color = connectionSelectionInfo.getSecondarySelectionBendpointBackgroundColor();
			if (color != null) {
				Color swtColor = DataTypeTransformation.toSwtColor(configurationProvider.getResourceRegistry(), color);
				return swtColor;
			}
		}
		if (BG_COLOR_SECONDARY == null || BG_COLOR_SECONDARY.isDisposed()) {
			BG_COLOR_SECONDARY = configurationProvider.getResourceRegistry().getSwtColor("ffffff"); //$NON-NLS-1$
		}
		return BG_COLOR_SECONDARY;
	}

	/**
	 * Returns the line-width adjusted with the current zoom-level.
	 * 
	 * @return The line-width adjusted with the current zoom-level.
	 */
	private int getLineWidth() {
		double zoom = GFHandleHelper.getZoomLevel(getConfigurationProvider());
		return Math.max(1, (int) (zoom * LINE_WIDTH));
	}

	private boolean checkMoveBendpointFeature() {
		boolean ret = false;
		IFeatureProvider fp = getConfigurationProvider().getFeatureProvider();
		ret = (null != fp.getMoveBendpointFeature(new MoveBendpointContext(null)));
		return ret;
	}

	private boolean checkAddBendpointFeature() {
		boolean ret = false;
		IFeatureProvider fp = getConfigurationProvider().getFeatureProvider();
		ret = (null != fp.getAddBendpointFeature(new AddBendpointContext(null, 0, 0, 0)));
		return ret;
	}

	private boolean checkRemoveBendpointFeature() {
		boolean ret = false;
		IFeatureProvider fp = getConfigurationProvider().getFeatureProvider();
		ret = (null != fp.getRemoveBendpointFeature(new RemoveBendpointContext(null, null)));
		return ret;
	}

	private void setConfigurationProvider(IConfigurationProviderInternal configurationProvider) {
		this.configurationProvider = configurationProvider;
	}

	protected IConfigurationProvider getConfigurationProvider() {
		return configurationProvider;
	}

	@Override
	protected boolean isFixed() {
		if (checkMoveBendpointFeature() || checkRemoveBendpointFeature()) {
			return false;
		}
		return super.isFixed();
	}

}
