package com.netifera.platform.ui.spaces.actions; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import com.netifera.platform.api.model.layers.ILayerProvider; public abstract class ChooseLayerAction extends Action { public ChooseLayerAction(String text, ImageDescriptor icon) { super(text, SWT.DROP_DOWN); setImageDescriptor(icon); } @Override public void run() { Menu menu = new Menu(Display.getDefault().getActiveShell(), SWT.POP_UP); for (final ILayerProvider provider: getLayers()) { if (provider.getLayerName() == null) continue; MenuItem item = new MenuItem(menu, SWT.RADIO); item.setSelection(getActiveLayer() == provider); item.setText(provider.getLayerName()); item.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { if (getActiveLayer() == provider) { setActiveLayer(null); } else { setActiveLayer(provider); } } }); } menu.setLocation(Display.getDefault().getCursorLocation()); menu.setVisible(true); } protected abstract List<ILayerProvider> getLayers(); protected abstract ILayerProvider getActiveLayer(); protected abstract void setActiveLayer(ILayerProvider provider); }