/******************************************************************************* * Copyright (c) 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 java.util.ArrayList; import java.util.List; import java.util.Map; import org.eclipse.gef.common.adapt.AdapterKey; import org.eclipse.gef.fx.utils.NodeUtils; import org.eclipse.gef.geometry.planar.IGeometry; import com.google.common.reflect.TypeToken; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import javafx.scene.Node; import javafx.scene.paint.Color; /** * * @author mwienand * */ public class DefaultHoverFeedbackPartFactory implements IFeedbackPartFactory { /** * The binding name for the primary selection color. */ public static final String HOVER_FEEDBACK_COLOR_PROVIDER = "HOVER_FEEDBACK_COLOR_PROVIDER"; /** * The role name for the <code>Provider<IGeometry></code> that will be * used to generate hover feedback. */ public static final String HOVER_FEEDBACK_GEOMETRY_PROVIDER = "HOVER_FEEDBACK_GEOMETRY_PROVIDER"; /** * Defines the default {@link Color} for hover feedback. */ public static final Color DEFAULT_HOVER_FEEDBACK_COLOR = Color .web("#5a61af"); @Inject private Injector injector; @Override public List<IFeedbackPart<? extends Node>> createFeedbackParts( List<? extends IVisualPart<? extends Node>> targets, Map<Object, Object> contextMap) { // check that we have targets if (targets == null || targets.isEmpty()) { throw new IllegalArgumentException( "Part factory is called without targets."); } if (targets.size() > 1) { throw new IllegalArgumentException( "Cannot create feedback for multiple targets."); } final IVisualPart<? extends Node> target = targets.iterator().next(); List<IFeedbackPart<? extends Node>> feedbackParts = new ArrayList<>(); // determine feedback geometry @SuppressWarnings("serial") final Provider<? extends IGeometry> hoverFeedbackGeometryProvider = target .getAdapter(AdapterKey .get(new TypeToken<Provider<? extends IGeometry>>() { }, HOVER_FEEDBACK_GEOMETRY_PROVIDER)); if (hoverFeedbackGeometryProvider != null) { Provider<IGeometry> geometryInSceneProvider = new Provider<IGeometry>() { @Override public IGeometry get() { return NodeUtils.localToScene(target.getVisual(), hoverFeedbackGeometryProvider.get()); } }; HoverFeedbackPart part = injector .getInstance(HoverFeedbackPart.class); part.setGeometryProvider(geometryInSceneProvider); feedbackParts.add(part); } return feedbackParts; } }