/**
*
*/
package de.hannesniederhausen.storynotes.ui.internal.navigation.widgets;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Shell;
/**
* @author Hannes Niederhausen
*
*/
public class ChoiceDialog extends Dialog implements FocusListener, IDoubleClickListener, KeyListener {
private IActionProvider actionProvider;
private ILabelProvider labelProvider;
private TableViewer viewer;
private Shell shell;
private final Object model;
private IEclipseContext context;
public ChoiceDialog(Shell parent, int style,
IEclipseContext context, ILabelProvider labelProvider,
IActionProvider actionProvider, Object model) {
super(parent, style);
this.context = context;
this.model = model;
init(parent);
this.actionProvider = actionProvider;
this.labelProvider = labelProvider;
}
private void init(Shell parent) {
shell = new Shell(parent, SWT.NO_TRIM | SWT.ON_TOP);
shell.setSize(400, 300);
shell.setLayout(new GridLayout());
viewer = new TableViewer(shell);
viewer.setLabelProvider(new LabelProvider());
viewer.setContentProvider(new ContentProvider());
viewer.addDoubleClickListener(this);
viewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
viewer.getControl().addFocusListener(this);
viewer.getControl().addKeyListener(this);
}
public Shell getShell() {
return shell;
}
public void setInput(Object input) {
viewer.setInput(input);
}
public void open() {
getShell().setVisible(true);
setFocus();
}
public void setFocus() {
viewer.getControl().setFocus();
}
@Override
public void focusGained(FocusEvent arg0) {
}
@Override
public void focusLost(FocusEvent arg0) {
getShell().close();
}
@Override
public void doubleClick(DoubleClickEvent event) {
processSelection();
}
private void processSelection() {
IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
if (sel.isEmpty())
return;
Object o = sel.getFirstElement();
if (o instanceof IAction) {
((IAction) o).run();
} else {
context.get(ESelectionService.class).setSelection(o);
}
if (!getShell().isDisposed()) {
getShell().close();
}
}
private class ContentProvider extends ArrayContentProvider {
@Override
public Object[] getElements(Object arg0) {
IAction[] actions = null;
if (actionProvider==null) {
actions = new IAction[0];
} else {
actions = actionProvider.getActions(model);
}
Object[] elements = super.getElements(arg0);
if (actions.length==0) {
return elements;
}
Object[] results = new Object[actions.length+elements.length];
System.arraycopy(actions, 0, results, 0, actions.length);
System.arraycopy(elements, 0, results, actions.length, elements.length);
return results;
}
}
private class LabelProvider implements ILabelProvider {
@Override
public void addListener(ILabelProviderListener arg0) {
}
@Override
public void dispose() {
}
@Override
public boolean isLabelProperty(Object arg0, String arg1) {
return false;
}
@Override
public void removeListener(ILabelProviderListener arg0) {
}
@Override
public Image getImage(Object arg0) {
return labelProvider.getImage(arg0);
}
@Override
public String getText(Object arg0) {
if (arg0 instanceof IAction) {
return ((IAction) arg0).getText();
}
return labelProvider.getText(arg0);
}
}
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode==SWT.CR) {
processSelection();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}