blob: e498a22239abe2e48ad0325ab64775beb09376f8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012 Red Hat, Inc.
* All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.bpmn2.modeler.core.merrimac.dialogs;
import java.util.Hashtable;
import java.util.Map.Entry;
import org.eclipse.bpmn2.modeler.core.adapters.ExtendedPropertiesProvider;
import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.graphiti.ui.editor.DiagramEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.List;
public class RefListEditingDialog extends AbstractObjectEditingDialog {
protected EStructuralFeature feature;
List sourceList;
Button addButton;
Button removeButton;
Button addAllButton;
Button removeAllButton;
Button moveUpButton;
Button moveDownButton;
List targetList;
java.util.List<EObject> result = new java.util.ArrayList<EObject>();
public RefListEditingDialog(DiagramEditor editor, EObject object, EStructuralFeature feature) {
super(editor, object);
this.feature = feature;
}
@Override
protected Composite createDialogContent(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(3,false));
sourceList = new List(composite,SWT.BORDER|SWT.MULTI);
sourceList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
sourceList.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateButtons();
}
});
Composite buttons = new Composite(composite, SWT.NONE);
buttons.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false, 1, 1));
buttons.setLayout(new FillLayout(SWT.VERTICAL));
addButton = new Button(buttons,SWT.PUSH);
addButton.setText(Messages.RefListEditingDialog_Add);
addButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveSelection(sourceList,targetList);
}
});
removeButton = new Button(buttons,SWT.PUSH);
removeButton.setText(Messages.RefListEditingDialog_Remove);
removeButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveSelection(targetList,sourceList);
}
});
addAllButton = new Button(buttons,SWT.PUSH);
addAllButton.setText(Messages.RefListEditingDialog_Add_All);
addAllButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
sourceList.selectAll();
moveSelection(sourceList,targetList);
}
});
removeAllButton = new Button(buttons,SWT.PUSH);
removeAllButton.setText(Messages.RefListEditingDialog_Remove_All);
removeAllButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
targetList.selectAll();
moveSelection(targetList,sourceList);
}
});
moveUpButton = new Button(buttons,SWT.PUSH);
moveUpButton.setText(Messages.RefListEditingDialog_Move_Up);
moveUpButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveUp();
}
});
moveDownButton = new Button(buttons,SWT.PUSH);
moveDownButton.setText(Messages.RefListEditingDialog_Move_Down);
moveDownButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveDown();
}
});
targetList = new List(composite,SWT.BORDER|SWT.MULTI);
targetList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
targetList.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateButtons();
}
});
java.util.List<EObject> targets = (java.util.List<EObject>) object.eGet(feature);
for (EObject value : targets) {
String key = "" + targetList.getItemCount(); //$NON-NLS-1$
targetList.add( ExtendedPropertiesProvider.getTextValue(value) );
targetList.setData(key, value);
}
Hashtable<String, Object> sources = ExtendedPropertiesProvider.getChoiceOfValues(object, feature);
for (Entry<String, Object> entry : sources.entrySet()) {
if (!targets.contains(entry.getValue())) {
String key = "" + sourceList.getItemCount(); //$NON-NLS-1$
sourceList.add(entry.getKey());
Object value = entry.getValue();
// this can not be null!
Assert.isTrue(value instanceof EObject);
sourceList.setData(key, value);
}
}
updateButtons();
return composite;
}
public java.util.List<EObject> getResult() {
return result;
}
@Override
protected void okPressed() {
// compute result list
int size = targetList.getItemCount();
for (int i=0; i<size; ++i) {
String key = "" + i; //$NON-NLS-1$
result.add((EObject)targetList.getData(key));
}
super.okPressed();
}
private void moveSelection(List sourceList, List targetList) {
int[] sourceIndex = sourceList.getSelectionIndices();
int[] targetIndex = new int[sourceIndex.length];
for (int i=0; i<sourceIndex.length; ++i) {
targetIndex[i] = targetList.getItemCount();
String key = "" + sourceIndex[i]; //$NON-NLS-1$
Object value = sourceList.getData(key);
String s = sourceList.getItem( sourceIndex[i] );
targetList.add(s);
key = "" + targetIndex[i]; //$NON-NLS-1$
targetList.setData(key,value);
}
sourceList.remove(sourceIndex);
targetList.select(targetIndex);
updateButtons();
}
private void moveUp() {
int index = targetList.getSelectionIndex();
Assert.isTrue(index>0);
swap(index,index-1);
}
private void moveDown() {
int index = targetList.getSelectionIndex();
int end = targetList.getItemCount() - 1;
Assert.isTrue(index>0 && index<end);
swap(index,index+1);
}
private void swap(int index1, int index2) {
String item1 = targetList.getItem(index1);
String key1 = "" + index1; //$NON-NLS-1$
Object value1 = targetList.getData(key1);
String key2 = "" + index2; //$NON-NLS-1$
Object value2 = targetList.getData(key2);
targetList.remove(index1);
targetList.add(item1, index2);
targetList.setData(key1,value2);
targetList.setData(key2,value1);
targetList.setSelection(index2);
updateButtons();
}
private void updateButtons() {
addButton.setEnabled(sourceList.getSelectionCount()>0);
removeButton.setEnabled(targetList.getSelectionCount()>0);
addAllButton.setEnabled(sourceList.getItemCount()>0);
removeAllButton.setEnabled(targetList.getItemCount()>0);
if ( targetList.getSelectionCount()==1 ) {
int end = targetList.getItemCount() - 1;
int index = targetList.getSelectionIndex();
moveUpButton.setEnabled(index!=0);
moveDownButton.setEnabled(index!=end);
}
else {
moveUpButton.setEnabled(false);
moveDownButton.setEnabled(false);
}
}
@Override
protected String getPreferenceKey() {
return object.eClass().getName() + "." + feature.getName(); //$NON-NLS-1$
}
}