package org.goko.common.preferences.fieldeditor.preference; import java.util.ArrayList; import java.util.Iterator; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; 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; import org.goko.common.preferences.fieldeditor.objectcollection.CollectionObject; import org.goko.common.preferences.fieldeditor.objectcollection.CollectionObjectLabelProvider; import org.goko.common.preferences.fieldeditor.objectcollection.CollectionObjectSelectionDialog; import org.goko.core.common.exception.GkException; /** * Object collection editor * @author PsyKo * */ public class ObjectCollectionFieldEditor extends PreferenceFieldEditor<Composite> { private static final String SEPARATOR = ";"; java.util.List<CollectionObject> availableObjects; java.util.List<CollectionObject> selectedObjects; private ListViewer listViewer; private CollectionObjectSelectionDialog selectionDialog; private Button removeButton; public ObjectCollectionFieldEditor(Composite parent, int style) { super(parent, style); availableObjects = new ArrayList<CollectionObject>(); selectedObjects = new ArrayList<CollectionObject>(); createControls(parent, style); setLayout(new GridLayout(2, false)); } /** (inheritDoc) * @see org.goko.common.preferences.fieldeditor.preference.PreferenceFieldEditor#createControls(org.eclipse.swt.widgets.Composite, int) */ @Override protected void createControls(Composite parent, int style) { super.createControls(parent, style); listViewer = new ListViewer(this, SWT.BORDER | SWT.V_SCROLL); List list = listViewer.getList(); list.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); listViewer.setContentProvider(new ArrayContentProvider()); listViewer.setLabelProvider(new CollectionObjectLabelProvider()); listViewer.setInput(selectedObjects); listViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { updateButton(); } }); Composite composite = new Composite(this, SWT.NONE); composite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); GridLayout gl_composite = new GridLayout(1, false); gl_composite.marginWidth = 0; gl_composite.marginHeight = 0; composite.setLayout(gl_composite); Button addButton = new Button(composite, SWT.NONE); addButton.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { selectionDialog = new CollectionObjectSelectionDialog(getShell()); java.util.List<CollectionObject> unselectedObjects = new ArrayList<CollectionObject>(availableObjects); unselectedObjects.removeAll(selectedObjects); selectionDialog.setAvailableObjects(unselectedObjects); int result = selectionDialog.open(); if(result == Window.OK){ ArrayList<CollectionObject> localSelectedObjects = new ArrayList<CollectionObject>(selectedObjects); localSelectedObjects.addAll(selectionDialog.getSelectedObjects()); ObjectCollectionFieldEditor.this.setSelectedObjects(localSelectedObjects); } } }); GridData gd_addButton = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); gd_addButton.widthHint = 80; addButton.setLayoutData(gd_addButton); addButton.setBounds(0, 0, 75, 25); addButton.setText("Add"); removeButton = new Button(composite, SWT.NONE); removeButton.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { ArrayList<CollectionObject> localSelectedObjects = new ArrayList<CollectionObject>(selectedObjects); IStructuredSelection selection = (IStructuredSelection) listViewer.getSelection(); if(!selection.isEmpty()){ Iterator iterator = selection.iterator(); while(iterator.hasNext()){ localSelectedObjects.remove(iterator.next()); } ObjectCollectionFieldEditor.this.setSelectedObjects(localSelectedObjects); } updateButton(); } }); removeButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); removeButton.setText("Remove"); Button btnMoveUp = new Button(composite, SWT.NONE); btnMoveUp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); btnMoveUp.setBounds(0, 0, 75, 25); btnMoveUp.setText("Up"); btnMoveUp.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { ArrayList<CollectionObject> localSelectedObjects = new ArrayList<CollectionObject>(selectedObjects); IStructuredSelection selection = (IStructuredSelection) listViewer.getSelection(); if(!selection.isEmpty()){ CollectionObject selected = (CollectionObject) selection.getFirstElement(); int previousIndex = localSelectedObjects.indexOf(selected); if(previousIndex > 0){ localSelectedObjects.remove(selected); localSelectedObjects.add(previousIndex - 1, selected); ObjectCollectionFieldEditor.this.setSelectedObjects(localSelectedObjects); listViewer.setSelection(selection); } } updateButton(); } }); Button btnMoveDown = new Button(composite, SWT.NONE); btnMoveDown.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); btnMoveDown.setBounds(0, 0, 75, 25); btnMoveDown.setText("Down"); btnMoveDown.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { ArrayList<CollectionObject> localSelectedObjects = new ArrayList<CollectionObject>(selectedObjects); IStructuredSelection selection = (IStructuredSelection) listViewer.getSelection(); if(!selection.isEmpty()){ CollectionObject selected = (CollectionObject) selection.getFirstElement(); int previousIndex = localSelectedObjects.indexOf(selected); if(previousIndex < CollectionUtils.size(localSelectedObjects) - 1){ localSelectedObjects.remove(selected); localSelectedObjects.add(previousIndex + 1, selected); ObjectCollectionFieldEditor.this.setSelectedObjects(localSelectedObjects); listViewer.setSelection(selection); } } updateButton(); } }); updateButton(); } protected void updateButton(){ IStructuredSelection selection = (IStructuredSelection) listViewer.getSelection(); removeButton.setEnabled(!selection.isEmpty()); } /** (inheritDoc) * @see org.goko.common.preferences.fieldeditor.preference.PreferenceFieldEditor#setDefaultValue() */ @Override protected void setDefaultValue() throws GkException { setSelectedObjects(new ArrayList<CollectionObject>()); } /** (inheritDoc) * @see org.goko.common.preferences.fieldeditor.FieldEditor#loadValue() */ /** (inheritDoc) * @see org.goko.common.preferences.fieldeditor.preference.PreferenceFieldEditor#loadValue() */ @Override protected void loadValue() throws GkException { String listString = getPreferenceStore().getString(getPreferenceName()); String[] tokens = StringUtils.split(listString, SEPARATOR); java.util.List<CollectionObject> lstObject = new ArrayList<CollectionObject>(); if(tokens != null && tokens.length > 0){ for (String value : tokens) { CollectionObject obj = findObject(value); if(obj != null){ lstObject.add(obj); } } } setSelectedObjects(lstObject); } private CollectionObject findObject(String value){ if(CollectionUtils.isNotEmpty(availableObjects)){ for (CollectionObject collectionObject : availableObjects) { if(StringUtils.equals(value, collectionObject.getValue())){ return collectionObject; } } } return null; } /** (inheritDoc) * @see org.goko.common.preferences.fieldeditor.preference.PreferenceFieldEditor#storeValue() */ @Override protected void storeValue() throws GkException { String listString = StringUtils.EMPTY; if(CollectionUtils.isNotEmpty(selectedObjects)){ for (CollectionObject collectionObject : selectedObjects) { listString += collectionObject.getValue(); listString += SEPARATOR; } } getPreferenceStore().setValue(getPreferenceName(), listString); } /** * @return the availableObjects */ public java.util.List<CollectionObject> getAvailableObjects() { return availableObjects; } /** * @param availableObjects the availableObjects to set */ public void setAvailableObjects(java.util.List<CollectionObject> availableObjects) { this.availableObjects = availableObjects; } /** * @return the selectObjects */ public java.util.List<CollectionObject> getSelectedObjects() { return selectedObjects; } /** * @param selectObjects the selectObjects to set */ public void setSelectedObjects(java.util.List<CollectionObject> selectObjects) { this.selectedObjects = selectObjects; if(listViewer != null){ listViewer.setInput(selectObjects); } } }