/*******************************************************************************
* 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:
* Alexander Nyßen (itemis AG) - initial API and implementation
* Matthias Wienand (itemis AG) - contributions for Bugzilla #481810
*
*******************************************************************************/
package org.eclipse.gef.mvc.fx.handlers;
import org.eclipse.gef.mvc.fx.models.HoverModel;
import org.eclipse.gef.mvc.fx.parts.IContentPart;
import org.eclipse.gef.mvc.fx.parts.IHandlePart;
import org.eclipse.gef.mvc.fx.parts.IRootPart;
import javafx.scene.Node;
import javafx.scene.input.MouseEvent;
/**
* The {@link HoverOnHoverHandler} is an {@link IOnHoverHandler} that hovers its
* {@link #getHost() host} by altering the {@link HoverModel} when the
* {@link #getHost() host} is hovered by the mouse.
*
* @author anyssen
*
*/
public class HoverOnHoverHandler extends AbstractHandler
implements IOnHoverHandler {
/**
* Returns the {@link HoverModel} that is manipulated by this
* {@link HoverOnHoverHandler}.
*
* @return The {@link HoverModel} of the host's viewer.
*/
protected HoverModel getHoverModel() {
return getHost().getViewer().getAdapter(HoverModel.class);
}
@Override
public void hover(MouseEvent e) {
// do nothing in case there is an explicit event target
if (!isHover(e)) {
return;
}
getHoverModel().setHover(getHost());
}
@Override
public void hoverIntent(Node hoverIntent) {
HoverModel hoverModel = getHoverModel();
if (!isRegistered(hoverIntent) && getHost() instanceof IRootPart) {
hoverModel.setHoverIntent(null);
} else if (isRegisteredForHost(hoverIntent)) {
if (getHost() instanceof IHandlePart) {
if (!getHost().getAnchoragesUnmodifiable()
.containsKey(hoverModel.getHoverIntent())) {
hoverModel.setHoverIntent(null);
}
} else if (getHost() instanceof IContentPart) {
hoverModel.setHoverIntent(
(IContentPart<? extends Node>) getHost());
} else if (getHost() instanceof IRootPart) {
hoverModel.setHoverIntent(null);
}
}
}
/**
* Returns <code>true</code> if the given {@link MouseEvent} should trigger
* hover. Otherwise returns <code>false</code>. Per default, returns
* <code>true</code> if the mouse target is not registered in the visual
* part map or it is registered for this {@link HoverOnHoverHandler}'s host.
*
* @param event
* The {@link MouseEvent} in question.
* @return <code>true</code> to indicate that the given {@link MouseEvent}
* should trigger hover, otherwise <code>false</code>.
*/
protected boolean isHover(MouseEvent event) {
return !isRegistered(event.getTarget())
|| isRegisteredForHost(event.getTarget());
}
}