blob: 0b7102795a51864b6750a925ea7fd31642c7f515 [file] [log] [blame]
/*********************************************************************
* 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 365172 - Shape Selection Info Solid Line
* 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.Cursors;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.handles.AbstractHandle;
import org.eclipse.gef.tools.DragEditPartsTracker;
import org.eclipse.graphiti.mm.algorithms.styles.LineStyle;
import org.eclipse.graphiti.tb.IShapeSelectionInfo;
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.util.IColorConstant;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
/**
* A rectangular handle, which completely surrounds the owner edit-part. It
* serves as selection highlighting and can also be used to move the owner
* 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 GFSurroundingHandle extends AbstractHandle {
/**
* The line-width of the handle.
*/
private static int LINE_WIDTH = 1;
/**
* The handle-insets are used to locate the handle as described in
* {@link ZoomingInsetsHandleLocator}.
*/
private static Insets HANDLE_INSETS = new Insets(LINE_WIDTH, LINE_WIDTH, LINE_WIDTH, LINE_WIDTH);
/**
* The foreground color to use.
*/
private static Color FG_COLOR;
// ========================================================================
/**
* @return the fG_COLOR_RESIZABLE
*/
public Color getFG_COLOR() {
if (shapeSelectionInfo != null) {
IColorConstant color = shapeSelectionInfo.getColor();
if (color != null) {
Color swtColor = DataTypeTransformation.toSwtColor(configurationProvider.getResourceRegistry(), color);
return swtColor;
}
}
if (FG_COLOR == null || FG_COLOR.isDisposed())
FG_COLOR = configurationProvider.getResourceRegistry().getSwtColor("ff850f"); //$NON-NLS-1$
return FG_COLOR;
}
/**
* The configuration provider, which can be used to access the environment.
*/
private IConfigurationProviderInternal configurationProvider;
/**
* Indicates, if moving the owner edit-part via this handle is supported.
*/
private boolean movable;
private IShapeSelectionInfo shapeSelectionInfo = null;
/**
* Creates a new GFSurroundingHandle.
*
* @param owner
* The owner editpart associated with this handle.
* @param configurationProvider
* The configuration provider, which can be used to access the
* environment.
* @param movable
* Indicates, if moving the owner edit-part via this handle is
* supported.
* @param shapeSelectionInfo
*/
public GFSurroundingHandle(GraphicalEditPart owner, IConfigurationProviderInternal configurationProvider,
boolean movable, IShapeSelectionInfo shapeSelectionInfo) {
this.configurationProvider = configurationProvider;
this.movable = movable;
this.shapeSelectionInfo = shapeSelectionInfo;
setOwner(owner);
setLocator(new ZoomingInsetsHandleLocator(owner.getFigure(), configurationProvider, HANDLE_INSETS));
setOpaque(false);
if (movable) {
setCursor(Cursors.SIZEALL);
} else {
setCursor(null);
}
}
/**
* Overridden to create a {@link DragEditPartsTracker}, if moving is
* supported.
*/
@Override
protected DragTracker createDragTracker() {
if (movable) {
DragEditPartsTracker tracker = new DragEditPartsTracker(getOwner());
tracker.setDefaultCursor(getCursor());
return tracker;
} else {
return null;
}
}
/**
* Returns <code>true</code> if the point (x,y) is contained within this
* handle. This means, that the point is on the outline of the handle, not
* inside the handle.
*
* @return <code>true</code> if the point (x,y) is contained within this
* handle.
*/
@Override
public boolean containsPoint(int x, int y) {
// true, if inside bounds but not inside inner rectangle
if (!getBounds().contains(x, y))
return false;
Rectangle inner = GFFigureUtil.getAdjustedRectangle(getBounds(), 1.0, 2 * getLineWidth());
return !inner.contains(x, y);
}
/**
* Returns a point along the right edge of the handle.
*
* @see org.eclipse.gef.Handle#getAccessibleLocation()
*/
@Override
public Point getAccessibleLocation() {
Point p = getBounds().getTopRight().translate(-1, getBounds().height / 4);
translateToAbsolute(p);
return p;
}
/**
* Paints a rectangular handle surrounding the owner edit-part.
*/
@Override
public void paintFigure(Graphics g) {
g.setAntialias(SWT.ON);
g.setLineWidth(getLineWidth());
Rectangle r = GFFigureUtil.getAdjustedRectangle(getBounds(), 1.0, getLineWidth());
prepareForDrawing(g);
g.drawLine(r.getTopLeft(), r.getTopRight());
g.drawLine(r.getBottomLeft(), r.getBottomRight());
g.drawLine(r.getTopRight(), r.getBottomRight());
g.drawLine(r.getTopLeft(), r.getBottomLeft());
}
private void prepareForDrawing(Graphics g) {
Color fg = getFG_COLOR();
if (shapeSelectionInfo != null) {
LineStyle lineStyle = shapeSelectionInfo.getLineStyle();
int draw2dLineStyle = DataTypeTransformation.toDraw2dLineStyle(lineStyle);
g.setLineStyle(draw2dLineStyle);
} else {
// default line style for selection
int[] dash = new int[] { 2, 2 };
int dashZoomed[];
double zoom = GFHandleHelper.getZoomLevel(configurationProvider);
if (zoom == 1.0) {
dashZoomed = dash;
} else {
dashZoomed = new int[dash.length];
for (int i = 0; i < dashZoomed.length; i++) {
dashZoomed[i] = Math.max(1, (int) (zoom * dash[i]));
}
}
g.setLineStyle(Graphics.LINE_CUSTOM);
g.setLineDash(dashZoomed);
}
// It is necessary to set the color. This ensures the support for the
// high contrast mode.
setForegroundColor(fg);
g.setForegroundColor(getForegroundColor());
}
/**
* 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(configurationProvider);
return Math.max(1, (int) (zoom * LINE_WIDTH));
}
}