/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.eclipse.flow.common.view.property; /* * Copyright 2005 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Control; import org.eclipse.swt.widgets.Shell; /** * Dialog for editing a list. * * @author <a href="mailto:kris_verlaenen@hotmail.com">Kris Verlaenen</a> */ public abstract class EditMapDialog<S, T> extends EditBeanDialog<Map<S, T>> { private Class<? extends EditBeanDialog<T>> editItemDialogClass; private Map<S, T> newMap; private ListViewer listViewer; private Button removeButton; private Button editButton; protected EditMapDialog(Shell parentShell, String title, Class<? extends EditBeanDialog<T>> editItemDialogClass) { super(parentShell, title); this.editItemDialogClass = editItemDialogClass; } protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 2; composite.setLayout(gridLayout); listViewer = new ListViewer(composite, SWT.SINGLE); listViewer.add(newMap.keySet().toArray()); listViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { removeButton.setEnabled(!event.getSelection().isEmpty()); editButton.setEnabled(!event.getSelection().isEmpty()); } }); GridData gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; gridData.horizontalAlignment = GridData.FILL; gridData.verticalAlignment = GridData.FILL; gridData.verticalSpan = 3; listViewer.getList().setLayoutData(gridData); Button addButton = new Button(composite, SWT.NONE); addButton.setText("Add"); gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.verticalAlignment = GridData.BEGINNING; addButton.setLayoutData(gridData); addButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { addItem(); } }); removeButton = new Button(composite, SWT.NONE); removeButton.setText("Remove"); removeButton.setEnabled(false); gridData = new GridData(); gridData.verticalAlignment = GridData.BEGINNING; removeButton.setLayoutData(gridData); removeButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { removeItem(); } }); editButton = new Button(composite, SWT.NONE); editButton.setText("Edit"); editButton.setEnabled(false); gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.verticalAlignment = GridData.BEGINNING; editButton.setLayoutData(gridData); editButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { editItem(); } }); return composite; } public void setValue(Map<S, T> value) { super.setValue(value); if (value == null) { this.newMap = new HashMap<S, T>(); } else { this.newMap = new HashMap<S, T>((Map<S, T>) value); } } protected Map<S, T> updateValue(Map<S, T> value) { return newMap; } @SuppressWarnings("unchecked") private void addItem() { EditBeanDialog<T> dialog = createEditItemDialog(); dialog.setValue(createItem()); int code = dialog.open(); S key = ((MapItemDialog<S>) dialog).getKey(); T result = dialog.getValue(); if (code != CANCEL) { T object = newMap.put(key, result); if (object == null) { listViewer.add(key); } } } protected abstract T createItem(); @SuppressWarnings("unchecked") private void editItem() { EditBeanDialog<T> dialog = createEditItemDialog(); Iterator<S> iterator = ((StructuredSelection) listViewer.getSelection()).iterator(); if (iterator.hasNext()) { S key = iterator.next(); ((MapItemDialog<S>) dialog).setKey(key); dialog.setValue(newMap.get(key)); int code = dialog.open(); T result = dialog.getValue(); if (code != CANCEL) { newMap.put(key, result); } } } @SuppressWarnings("unchecked") private void removeItem() { Iterator<S> iterator = ((StructuredSelection) listViewer.getSelection()).iterator(); // single selection only allowed if (iterator.hasNext()) { S key = iterator.next(); newMap.remove(key); listViewer.remove(key); } } protected EditBeanDialog<T> createEditItemDialog() { try { return (EditBeanDialog<T>) editItemDialogClass.getConstructor( new Class[] { Shell.class }).newInstance( new Object[] { getShell() }); } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } } }