/*******************************************************************************
* Copyright (c) 2015, 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.examples.logo.parts;
import java.util.Set;
import org.eclipse.gef.common.collections.SetMultimapChangeListener;
import org.eclipse.gef.mvc.fx.parts.AbstractHandlePart;
import org.eclipse.gef.mvc.fx.parts.IVisualPart;
import org.eclipse.gef.mvc.fx.viewer.IViewer;
import javafx.scene.Node;
public abstract class AbstractLogoHoverHandlePart<T extends Node> extends AbstractHandlePart<T> {
private boolean registered = false;
private final SetMultimapChangeListener<IVisualPart<? extends Node>, String> parentAnchoragesChangeListener = new SetMultimapChangeListener<IVisualPart<? extends Node>, String>() {
private IViewer getViewer(Set<? extends IVisualPart<? extends Node>> anchorages) {
for (IVisualPart<? extends Node> anchorage : anchorages) {
if (anchorage.getRoot() != null && anchorage.getRoot().getViewer() != null) {
return anchorage.getRoot().getViewer();
}
}
return null;
}
@Override
public void onChanged(
org.eclipse.gef.common.collections.SetMultimapChangeListener.Change<? extends IVisualPart<? extends Node>, ? extends String> change) {
IViewer oldViewer = getViewer(change.getPreviousContents().keySet());
IViewer newViewer = getViewer(change.getSetMultimap().keySet());
if (registered && oldViewer != null && oldViewer != newViewer) {
oldViewer.unsetAdapter(AbstractLogoHoverHandlePart.this);
}
if (!registered && newViewer != null && oldViewer != newViewer) {
newViewer.setAdapter(AbstractLogoHoverHandlePart.this,
String.valueOf(System.identityHashCode(AbstractLogoHoverHandlePart.this)));
}
}
};
@Override
protected void doRefreshVisual(T visual) {
// automatically layed out by its parent
}
@Override
protected void register(IViewer viewer) {
if (registered) {
return;
}
super.register(viewer);
registered = true;
}
@Override
public void setParent(IVisualPart<? extends Node> newParent) {
if (getParent() != null) {
getParent().getAnchoragesUnmodifiable().removeListener(parentAnchoragesChangeListener);
}
if (newParent != null) {
newParent.getAnchoragesUnmodifiable().addListener(parentAnchoragesChangeListener);
}
super.setParent(newParent);
}
@Override
protected void unregister(IViewer viewer) {
if (!registered) {
return;
}
super.unregister(viewer);
registered = false;
}
}