/******************************************************************************* * Copyright (c) 2014, 2016 itemis AG 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: * Matthias Wienand (itemis AG) - initial API and implementation * *******************************************************************************/ package org.eclipse.gef.mvc.fx.parts; import org.eclipse.gef.common.adapt.AdapterKey; import org.eclipse.gef.fx.nodes.GeometryNode; import org.eclipse.gef.fx.utils.NodeUtils; import org.eclipse.gef.geometry.planar.ICurve; import org.eclipse.gef.geometry.planar.IGeometry; import com.google.common.reflect.TypeToken; import com.google.inject.Provider; import javafx.scene.effect.DropShadow; import javafx.scene.effect.Effect; import javafx.scene.paint.Color; import javafx.scene.shape.StrokeType; /** * The {@link HoverFeedbackPart} is an {@link AbstractFeedbackPart} that is * parameterized by <code>GeometryNode<IGeometry></code>. * * @author mwienand * */ public class HoverFeedbackPart extends AbstractFeedbackPart<GeometryNode<IGeometry>> { private Provider<? extends IGeometry> feedbackGeometryProvider; /** * Default constructor. */ public HoverFeedbackPart() { } @Override protected GeometryNode<IGeometry> doCreateVisual() { GeometryNode<IGeometry> visual = new GeometryNode<>(); visual.setFill(Color.TRANSPARENT); visual.setMouseTransparent(true); visual.setManaged(false); visual.setStrokeType(StrokeType.OUTSIDE); visual.setStrokeWidth(1); // hover specific visual.setEffect(getHoverFeedbackEffect()); visual.setStroke(getHoverStroke()); return visual; } @Override public void doRefreshVisual(GeometryNode<IGeometry> visual) { if (getAnchoragesUnmodifiable().size() != 1) { return; } IGeometry feedbackGeometry = getFeedbackGeometry(); if (feedbackGeometry == null) { return; } // FIXME: Investigate why the StrokeType needs to be set before setting // the geometry in order to prevent a vertical offset. if (feedbackGeometry instanceof ICurve) { // stroke centered visual.setStrokeType(StrokeType.CENTERED); } else { // stroke outside visual.setStrokeType(StrokeType.OUTSIDE); } visual.setGeometry(feedbackGeometry); } /** * Returns the {@link IGeometry} that is provided by this part's * {@link #setGeometryProvider(Provider) geometry provider}. * * @return The {@link IGeometry} that is provided by this part's geometry * provider. */ protected IGeometry getFeedbackGeometry() { return NodeUtils.sceneToLocal(getVisual().getParent(), feedbackGeometryProvider.get()); } /** * Returns the {@link Effect} that is provided by the * <code>Provider<Effect></code> of this part's first anchorage. * * @return The {@link Effect} that is provided by the * <code>Provider<Effect></code> of this part's first * anchorage. */ public Effect getHoverFeedbackEffect() { DropShadow effect = new DropShadow(); effect.setRadius(3); return effect; } /** * Returns the {@link Color} that is used to stroke hover feedback. * * @return The {@link Color} that is used to stroke hover feedback. */ @SuppressWarnings("serial") protected Color getHoverStroke() { Provider<Color> hoverFeedbackColorProvider = getViewer() .getAdapter(AdapterKey.get(new TypeToken<Provider<Color>>() { }, DefaultHoverFeedbackPartFactory.HOVER_FEEDBACK_COLOR_PROVIDER)); return hoverFeedbackColorProvider == null ? DefaultHoverFeedbackPartFactory.DEFAULT_HOVER_FEEDBACK_COLOR : hoverFeedbackColorProvider.get(); } /** * Sets the <code>Provider<IGeometry></code> of this part to the given * value. * * @param geometryProvider * The new <code>Provider<IGeometry></code> for this part. */ public void setGeometryProvider( Provider<? extends IGeometry> geometryProvider) { feedbackGeometryProvider = geometryProvider; } }