package org.esa.snap.rcp.actions.layer.overlay; import com.bc.ceres.glayer.Layer; import com.bc.ceres.glayer.support.AbstractLayerListener; import org.esa.snap.rcp.SnapApp; import org.esa.snap.rcp.util.SelectionSupport; import org.esa.snap.ui.product.ProductSceneView; import org.netbeans.api.annotations.common.NullAllowed; import org.openide.util.actions.Presenter; import javax.swing.AbstractAction; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenuItem; import javax.swing.JToggleButton; import java.awt.Component; import java.awt.event.ActionEvent; /** * Monitor the state of overlays to either be enable or disable. * * @author Muhammad.bc * @author Marco Peters * @author Norman Fomferra */ public abstract class AbstractOverlayAction extends AbstractAction implements Presenter.Toolbar, Presenter.Menu, Presenter.Popup, SelectionSupport.Handler<ProductSceneView>{ private final AbstractLayerListener layerListener = new AbstractLayerListener() { @Override public void handleLayersAdded(Layer parentLayer, Layer[] childLayers) { updateActionState(); } @Override public void handleLayersRemoved(Layer parentLayer, Layer[] childLayers) { updateActionState(); } }; protected AbstractOverlayAction() { SnapApp.getDefault().getSelectionSupport(ProductSceneView.class).addHandler(this); initActionProperties(); updateActionState(); } protected void updateActionState() { ProductSceneView view = getSelectedProductSceneView(); if (view != null) { setEnabled(getActionEnabledState(view)); setSelected(getActionSelectionState(view)); } else { setEnabled(false); setSelected(false); } } @Override public void selectionChange(@NullAllowed ProductSceneView oldValue, @NullAllowed ProductSceneView newValue) { if (oldValue != null) { oldValue.getRootLayer().removeListener(layerListener); } if (newValue != null) { newValue.getRootLayer().addListener(layerListener); } updateActionState(); } @Override public void actionPerformed(ActionEvent e) { setOverlayEnableState(getSelectedProductSceneView()); updateActionState(); } @Override public JMenuItem getMenuPresenter() { JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(this); menuItem.setIcon(null); return menuItem; } @Override public JMenuItem getPopupPresenter() { return getMenuPresenter(); } @Override public Component getToolbarPresenter() { JToggleButton toggleButton = new JToggleButton(this); toggleButton.setText(null); return toggleButton; } protected abstract void initActionProperties(); /** * Compute the state of a ProductSceneView that is selected. * * @param view // get the selected productSceneView * @return // return the state of the Overlay within the ProductSceneView */ protected abstract boolean getActionSelectionState(ProductSceneView view); protected abstract boolean getActionEnabledState(ProductSceneView view); protected abstract void setOverlayEnableState(ProductSceneView view); protected ProductSceneView getSelectedProductSceneView() { return SnapApp.getDefault().getSelectedProductSceneView(); } protected boolean isSelected() { return Boolean.TRUE.equals(getValue(SELECTED_KEY)); } private void setSelected(boolean selected) { putValue(SELECTED_KEY, selected); } }