/******************************************************************************* * Copyright (c) 2017 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.ui.actions; import org.eclipse.gef.mvc.fx.viewer.IViewer; import org.eclipse.jface.action.ContributionItem; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; /** * The {@link AbstractViewerContributionItem} is a specialization of * {@link ContributionItem} * * @author mwienand * */ public abstract class AbstractViewerContributionItem extends ContributionItem implements IViewerDependent { private IViewer viewer; private ChangeListener<Boolean> activationListener = new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { if (newValue.booleanValue()) { register(); } else { unregister(); } } }; /** * Constructs a new {@link AbstractViewerContributionItem}. */ protected AbstractViewerContributionItem() { } /** * Returns the {@link IViewer} for which this {@link IViewerAction} was * {@link #init(IViewer) initialized}. * * @return The {@link IViewer} for which this {@link IViewerAction} was * {@link #init(IViewer) initialized}. */ protected IViewer getViewer() { return viewer; } @Override public void init(IViewer viewer) { if (this.viewer == viewer) { // nothing changed return; } // unregister listeners and clean up for the old viewer if (this.viewer != null) { this.viewer.activeProperty().removeListener(activationListener); if (this.viewer.isActive()) { unregister(); } } // save new viewer this.viewer = viewer; // register listeners and prepare for the new viewer if (this.viewer != null) { this.viewer.activeProperty().addListener(activationListener); if (this.viewer.isActive()) { register(); } } } @Override public boolean isEnabled() { return getViewer() != null && getViewer().isActive(); } /** * This method is called when this item obtains an {@link IViewer} which is * {@link IViewer#activeProperty() active} or when a previously obtained * viewer is activated. */ protected void register() { } /** * This method is called when this item loses an {@link IViewer} which is * {@link IViewer#activeProperty() active} or when a previously obtained * viewer is deactivated. */ protected void unregister() { } }