blob: 8c8e09087877b54865690c6e420993c272c4751c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009, 2011, 2017 Profactor GbmH, fortiss GmbH
* 2020 Primetals Technologies Germany GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Gerhard Ebenhofer, Alois Zoitl
* - initial API and implementation and/or initial documentation
* Alois Zoitl - added selection hover feedback
*******************************************************************************/
package org.eclipse.fordiac.ide.gef.policies;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.RoundedRectangle;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.fordiac.ide.gef.editparts.AbstractConnectableEditPart;
import org.eclipse.fordiac.ide.gef.preferences.DiagramPreferences;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
/**
* NonResizeableEditPolicy with a rounded EtchedBorder and moveHandles (move
* cursor) on each side.
*/
public class ModifiedNonResizeableEditPolicy extends NonResizableEditPolicy {
private int arc = DiagramPreferences.CORNER_DIM;
private Insets insets = new Insets(2);
/**
* Constructor.
*
* @param arc the arc
* @param insets the insets
*/
public ModifiedNonResizeableEditPolicy(final int arc, final Insets insets) {
super();
this.arc = arc;
this.insets = insets;
}
/**
* Default constructor.
*/
public ModifiedNonResizeableEditPolicy() {
super();
}
@Override
public void deactivate() {
super.deactivate();
removeSelectionFeedbackFigure();
}
@Override
protected List<? extends IFigure> createSelectionHandles() {
final List<ModifiedMoveHandle> list = new ArrayList<>(1);
list.add(new ModifiedMoveHandle((GraphicalEditPart) getHost(), insets, arc));
removeSelectionFeedbackFigure();
return list;
}
private RoundedRectangle selectionFeedback;
@Override
public void showTargetFeedback(final Request request) {
super.showTargetFeedback(request);
if (isFeedbackRequest(request) && (null == selectionFeedback) && (null == handles)) {
// we don't have already a feedback showing and we are not selected
selectionFeedback = createSelectionFeedbackFigure();
if (null != selectionFeedback) {
addFeedback(selectionFeedback);
}
}
}
private boolean isFeedbackRequest(final Request request) {
return (REQ_SELECTION.equals(request.getType()))
|| (REQ_SELECTION_HOVER.equals(request.getType()) || isValidConnectionRequest(request));
}
private boolean isValidConnectionRequest(final Request request) {
return (getHost() instanceof AbstractConnectableEditPart)
&& ((AbstractConnectableEditPart) getHost()).isConnectable()
&& (REQ_RECONNECT_SOURCE.equals(request.getType()) || REQ_RECONNECT_TARGET.equals(request.getType())
|| REQ_CONNECTION_END.equals(request.getType()));
}
private RoundedRectangle createSelectionFeedbackFigure() {
if (getHost() instanceof GraphicalEditPart) {
final GraphicalEditPart ep = ((GraphicalEditPart) getHost());
final RoundedRectangle newSelFeedbackFigure = new RoundedRectangle();
newSelFeedbackFigure.setAlpha(ModifiedMoveHandle.SELECTION_FILL_ALPHA);
newSelFeedbackFigure.setOutline(false);
newSelFeedbackFigure.setBounds(getSelectableFigureBounds(ep));
newSelFeedbackFigure.setCornerDimensions(new Dimension(arc, arc));
newSelFeedbackFigure.setForegroundColor(ModifiedMoveHandle.getSelectionColor());
newSelFeedbackFigure.setBackgroundColor(ModifiedMoveHandle.getSelectionColor());
return newSelFeedbackFigure;
}
return null;
}
private static Rectangle getSelectableFigureBounds(final GraphicalEditPart ep) {
return ep.getFigure().getBounds().getExpanded(2, 2);
}
@Override
public void eraseTargetFeedback(final Request request) {
super.showTargetFeedback(request);
removeSelectionFeedbackFigure();
}
private void removeSelectionFeedbackFigure() {
if (selectionFeedback != null) {
removeFeedback(selectionFeedback);
selectionFeedback = null;
}
}
@Override
protected IFigure createDragSourceFeedbackFigure() {
final Figure r = new Figure();
r.setBorder(new ModifiedMoveHandle.SelectionBorder(arc));
r.setBounds(getInitialFeedbackBounds());
r.validate();
addFeedback(r);
return r;
}
}