package copyto.ui.tests; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.beans.BeanProperties; import org.eclipse.core.databinding.beans.BeansObservables; import org.eclipse.core.databinding.conversion.Converter; import org.eclipse.core.databinding.observable.Observables; import org.eclipse.core.databinding.observable.Realm; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.property.Properties; import org.eclipse.core.databinding.property.map.IMapProperty; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.databinding.viewers.IViewerObservableList; import org.eclipse.jface.databinding.viewers.ViewerSupport; import org.eclipse.jface.databinding.viewers.ViewersObservables; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.junit.Test; import org.osgi.service.prefs.Preferences; import copyto.core.TargetBooleanParam; import copyto.core.TargetParam; import copyto.core.models.BooleanTargetParamModel; import copyto.core.models.StringTargetParamModel; import copyto.core.models.TargetParamsModel; public class TargetManagementTests { public class TargetParamsViewer { private TableViewer viewer; private DataBindingContext dbx; private IObservableValue viewerSingleSelectionValue; private IObservableList items; private IViewerObservableList viewerMultiSelectionList; public TargetParamsViewer(Composite parent, TargetParamsModel model) { dbx = new DataBindingContext(); parent.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent event) { dbx.dispose(); } }); items = BeansObservables.observeList(model, "params", TargetParam.class); createViewer(parent); createButtons(parent); } protected void createViewer(Composite parent) { final Composite client = new Composite(parent, SWT.NULL); // client.setLayout(new FillLayout(SWT.VERTICAL)); final TableColumnLayout tableLayout = new TableColumnLayout(); client.setLayout(tableLayout); viewer = new TableViewer(client, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION); final Table table = viewer.getTable(); table.setLinesVisible(true); table.setHeaderVisible(true); table.setFont(parent.getFont()); table.addKeyListener(new KeyAdapter() { @Override public void keyPressed(final KeyEvent e) { if (e.keyCode == SWT.DEL) { removeSelected(); } } }); viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { editSelected(); } }); Map<String, String> columns = getColumns(); for (Entry<String, String> entry : columns.entrySet()) { final TableViewerColumn viewerColumn = new TableViewerColumn( viewer, SWT.LEFT); viewerColumn.getColumn().setText(entry.getValue()); tableLayout.setColumnData(viewerColumn.getColumn(), new ColumnWeightData(10)); } ViewerSupport.bind(viewer, items, BeanProperties.values(columns .keySet().toArray(new String[columns.size()]))); } protected Map<String, String> getColumns() { Map<String, String> columns = new LinkedHashMap<String, String>(); columns.put("name", "Name"); columns.put("class.name", "Type"); columns.put("stringValue", "Value"); return columns; } UpdateValueStrategy selectionToBooleanConverter() { final UpdateValueStrategy modelToTarget = new UpdateValueStrategy(); modelToTarget.setConverter(new Converter(Object.class, boolean.class) { public Object convert(final Object fromObject) { return fromObject != null; } }); return modelToTarget; } protected void editSelected() { } protected void removeSelected() { Iterator<?> it = getViewerMultiSelectionList().iterator(); while (it.hasNext()) { items.remove(it.next()); } } protected IObservableValue getViewerSelectionValue() { if (viewerSingleSelectionValue == null) { viewerSingleSelectionValue = ViewersObservables .observeSingleSelection(viewer); } return viewerSingleSelectionValue; } protected IObservableList getViewerMultiSelectionList() { if (viewerMultiSelectionList == null) { viewerMultiSelectionList = ViewersObservables .observeMultiSelection(viewer); } return viewerMultiSelectionList; } protected void createButtons(Composite parent) { Composite client = new Composite(parent, SWT.NULL); GridLayoutFactory.swtDefaults().applyTo(client); Button button = new Button(client, SWT.PUSH); button.setText("Add..."); button = new Button(client, SWT.PUSH); button.setText("Edit..."); dbx.bindValue(SWTObservables.observeEnabled(button), getViewerSelectionValue(), null, selectionToBooleanConverter()); button = new Button(client, SWT.PUSH); button.setText("Remove"); dbx.bindValue(SWTObservables.observeEnabled(button), getViewerSelectionValue(), null, selectionToBooleanConverter()); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { removeSelected(); } }); } } @Test public void saveTargetParams() throws Exception { TargetParamsModel model = new TargetParamsModel(); model.getParams().add( new StringTargetParamModel("paste_code", "${copyto.text}")); model.getParams().add( new BooleanTargetParamModel("paste_private", true, "P")); InstanceScope instanceScope = new InstanceScope(); IPath path = instanceScope.getLocation(); Preferences preferences = instanceScope.getNode(getClass().getName()); model.save(preferences); preferences.flush(); } public class DialogBuilder { private TargetParamsModel model; private Map<String, String> params; DialogBuilder(Composite parent, TargetParamsModel model) { Composite client = new Composite(parent, SWT.NULL); GridLayoutFactory.swtDefaults().numColumns(2).applyTo(client); this.model = model; final DataBindingContext dbx = new DataBindingContext(); parent.addDisposeListener(new DisposeListener() { public void widgetDisposed(final DisposeEvent event) { dbx.dispose(); } }); params = new HashMap<String, String>(); final IMapProperty selfMap = Properties.selfMap(String.class, String.class); final IObservableMap observableParams = selfMap.observe(params); for (final TargetParam<?> param : model.getParams()) { final IObservableValue observeMapEntry = Observables .observeMapEntry(observableParams, param.getName()); Label label = new Label(parent, SWT.LEFT); label.setText(param.getName()); IObservableValue controlObservable = createControl(client, param); UpdateValueStrategy targetToModel = new UpdateValueStrategy() .setConverter(new Converter(Object.class, String.class) { public Object convert(Object fromObject) { return param.getValue().toString(); } }); params.put(param.getName(), param.getValue().toString()); dbx.bindValue(controlObservable, observeMapEntry, null, null); } } private IObservableValue createControl(Composite parent, TargetParam<?> param) { if (param instanceof TargetBooleanParam) { Button control = new Button(parent, SWT.CHECK); control.setText(param.getName()); return SWTObservables.observeSelection(control); } else { Text control = new Text(parent, SWT.BORDER); return SWTObservables.observeText(control); } } public Map<String, String> getParams() { return params; } } @Test public void dialogText() { final Display display = new Display(); Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() { public void run() { final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); TargetParamsModel model = new TargetParamsModel(); model.getParams().add( new StringTargetParamModel("paste_code", "${copyto.text}")); model.getParams() .add( new BooleanTargetParamModel("paste_private", true, "P")); // new TargetParamsViewer(shell, model); DialogBuilder dialog = new DialogBuilder(shell, model); shell.setSize(400, 200); shell.open(); // The SWT event loop Display display = Display.getCurrent(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } Map<String, String> params = dialog.getParams(); for (Entry<String, String> entry : params.entrySet()) { System.out.println(entry.getKey() + " => " + entry.getValue()); } } }); } }