--- /dev/null
+package org.argeo.suite.ui.widgets;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Generic popup context menu for TableViewer to enable single sourcing between
+ * CMS and Workbench
+ */
+public abstract class AbstractConnectContextMenu {
+
+ private Shell parentShell;
+ private Shell shell;
+ // Local context
+
+ private final static String KEY_ACTION_ID = "actionId";
+ private final String[] defaultActions;
+ private Map<String, Button> actionButtons = new HashMap<String, Button>();
+
+ public AbstractConnectContextMenu(Display display, String[] defaultActions) {
+ parentShell = display.getActiveShell();
+ shell = new Shell(parentShell, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
+ this.defaultActions = defaultActions;
+ }
+
+ protected void createControl() {
+ shell.setLayout(EclipseUiUtils.noSpaceGridLayout());
+ Composite boxCmp = new Composite(shell, SWT.NO_FOCUS | SWT.BORDER);
+ boxCmp.setLayout(EclipseUiUtils.noSpaceGridLayout());
+// CmsUiUtils.style(boxCmp, ConnectUiStyles.CONTEXT_MENU_BOX);
+ createContextMenu(boxCmp);
+ shell.addShellListener(new ActionsShellListener());
+ }
+
+ protected void createContextMenu(Composite boxCmp) {
+ ActionsSelListener asl = new ActionsSelListener();
+ for (String actionId : defaultActions) {
+ Button btn = new Button(boxCmp, SWT.FLAT | SWT.LEAD);
+ btn.setText(getLabel(actionId));
+ btn.setLayoutData(EclipseUiUtils.fillWidth());
+ CmsUiUtils.markup(btn);
+// CmsUiUtils.style(btn, actionId + ConnectUiStyles.BUTTON_SUFFIX);
+ btn.setData(KEY_ACTION_ID, actionId);
+ btn.addSelectionListener(asl);
+ actionButtons.put(actionId, btn);
+ }
+ }
+
+ protected void setVisible(boolean visible, String... buttonIds) {
+ for (String id : buttonIds) {
+ Button button = actionButtons.get(id);
+ button.setVisible(visible);
+ GridData gd = (GridData) button.getLayoutData();
+ gd.heightHint = visible ? SWT.DEFAULT : 0;
+ }
+ }
+
+ public void show(Control source, Point location, IStructuredSelection selection) {
+ if (shell.isDisposed()) {
+ shell = new Shell(Display.getCurrent(), SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
+ createControl();
+ }
+ if (shell.isVisible())
+ shell.setVisible(false);
+
+ if (aboutToShow(source, location, selection)) {
+ shell.pack();
+ shell.layout();
+ if (source instanceof Control)
+ shell.setLocation(((Control) source).toDisplay(location.x, location.y));
+ shell.open();
+ }
+ }
+
+ protected Shell getParentShell() {
+ return parentShell;
+ }
+
+ class StyleButton extends Label {
+ private static final long serialVersionUID = 7731102609123946115L;
+
+ public StyleButton(Composite parent, int swtStyle) {
+ super(parent, swtStyle);
+ }
+ }
+
+ class ActionsSelListener extends SelectionAdapter {
+ private static final long serialVersionUID = -1041871937815812149L;
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Object eventSource = e.getSource();
+ if (eventSource instanceof Button) {
+ Button pressedBtn = (Button) eventSource;
+ performAction((String) pressedBtn.getData(KEY_ACTION_ID));
+ shell.close();
+ }
+ }
+ }
+
+ class ActionsShellListener extends org.eclipse.swt.events.ShellAdapter {
+ private static final long serialVersionUID = -5092341449523150827L;
+
+ @Override
+ public void shellDeactivated(ShellEvent e) {
+ setVisible(false);
+ shell.setVisible(false);
+ //shell.close();
+ }
+ }
+
+ protected abstract boolean performAction(String actionId);
+
+ protected abstract boolean aboutToShow(Control source, Point location, IStructuredSelection selection);
+
+ protected abstract String getLabel(String actionId);
+}