/* * Copyright (c) 2006 Borland Software Corporation * * All rights reserved. This program and the accompanying materials * are 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: * Tatiana Fesenko (Borland) - initial API and implementation */ package org.eclipse.uml2.diagram.common.parameter; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gmf.runtime.common.core.util.StringStatics; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; 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; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.uml2.diagram.common.Messages; import org.eclipse.uml2.diagram.common.parameter.celleditors.BooleanCellEditor; import org.eclipse.uml2.diagram.common.parameter.celleditors.DirectionCellEditor; import org.eclipse.uml2.diagram.common.parameter.celleditors.PositiveIntegerCellEditor; import org.eclipse.uml2.diagram.common.parameter.celleditors.TypeDialogCellEditor; import org.eclipse.uml2.uml.Expression; import org.eclipse.uml2.uml.LiteralInteger; import org.eclipse.uml2.uml.LiteralString; import org.eclipse.uml2.uml.Operation; import org.eclipse.uml2.uml.Parameter; import org.eclipse.uml2.uml.Type; import org.eclipse.uml2.uml.UMLFactory; import org.eclipse.uml2.uml.UMLPackage; import org.eclipse.uml2.uml.ValueSpecification; public class EditPropertyParametersDialog extends TrayDialog { private static final int TABLE_HEIGHT = 100; private static final int ADD_ID = IDialogConstants.CLIENT_ID + 1; private static final int REMOVE_ID = ADD_ID + 1; private static final int UP_ID = REMOVE_ID + 1; private static final int DOWN_ID = UP_ID + 1; private TableViewer myTableViewer; private final Operation myOperation; private final Operation myOldOperation; public static final Type NULL_TYPE = UMLFactory.eINSTANCE.createClass(); private final AdapterFactory myAdapterFactory; public EditPropertyParametersDialog(Shell parentShell, Operation operation, AdapterFactory af) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); myAdapterFactory = af; myOldOperation = operation; myOperation = (Operation) EcoreUtil.copy(operation); setHelpAvailable(false); } @Override protected Control createButtonBar(Composite parent) { Control buttonSection = super.createButtonBar(parent); ((GridData) buttonSection.getLayoutData()).grabExcessVerticalSpace = false; return buttonSection; } @Override protected void okPressed() { try { new EditPropertyParametersCommand(myOldOperation, myOperation).execute(new NullProgressMonitor(), null); } catch (ExecutionException e) { e.printStackTrace(); } finally { super.okPressed(); } } @Override protected Control createDialogArea(Composite parent) { getShell().setText(Messages.EditPropertyParametersDialog_dialog_select_parameters); Composite parentComposite = (Composite) super.createDialogArea(parent); createAddRemoveButtonBar(parentComposite); Table table = buildTable(parentComposite); GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true); tableLayoutData.heightHint = TABLE_HEIGHT; table.setLayoutData(tableLayoutData); myTableViewer = createTableViewer(table); myTableViewer.setInput(myOperation); return parentComposite; } private Table buildTable(Composite parent) { Table table = new Table(parent, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION); table.setLinesVisible(true); table.setHeaderVisible(true); TableColumn name = new TableColumn(table, SWT.LEFT, 0); name.setText(EditParametersTableConstants.NAME); name.setWidth(70); TableColumn types = new TableColumn(table, SWT.LEFT, 1); types.setText(EditParametersTableConstants.TYPES); types.setWidth(70); TableColumn direction = new TableColumn(table, SWT.LEFT, 2); direction.setText(EditParametersTableConstants.DIRECTION); direction.setWidth(70); TableColumn multiplicity = new TableColumn(table, SWT.LEFT, 3); multiplicity.setText(EditParametersTableConstants.MULTIPLICITY); multiplicity.setWidth(70); TableColumn defaultValue = new TableColumn(table, SWT.LEFT, 4); defaultValue.setText(EditParametersTableConstants.DEFAULT_VALUE); defaultValue.setWidth(70); TableColumn isOrdered = new TableColumn(table, SWT.LEFT, 5); isOrdered.setText(EditParametersTableConstants.IS_ORDERED); isOrdered.setWidth(70); TableColumn isUnique = new TableColumn(table, SWT.LEFT, 6); isUnique.setText(EditParametersTableConstants.IS_UNIQUE); isUnique.setWidth(70); return table; } private Control createAddRemoveButtonBar(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; layout.horizontalSpacing = 0; layout.numColumns = 0; // this is incremented by createButton composite.setLayout(layout); final GridData data = new GridData(SWT.END, SWT.BEGINNING, false, false); composite.setLayoutData(data); composite.setFont(parent.getFont()); createAddButton(composite); createRemoveButton(composite); createUpButton(composite); createDownButton(composite); return composite; } private void createRemoveButton(Composite composite) { Button removeButton = createButton(composite, REMOVE_ID, Messages.EditPropertyParametersDialog_button_remove, false); removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) myTableViewer.getSelection(); Object selected = selection.getFirstElement(); myOperation.getOwnedParameters().remove(selected); myTableViewer.refresh(); myTableViewer.getControl().setFocus(); } }); } private void createAddButton(Composite composite) { Button addButton = createButton(composite, ADD_ID, Messages.EditPropertyParametersDialog_button_add, false); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Parameter newParameter = UMLFactory.eINSTANCE.createParameter(); newParameter.setName(Messages.EditPropertyParametersDialog_button_parameter); newParameter.createDefaultValue(null, null, UMLPackage.eINSTANCE.getLiteralString()); myOperation.getOwnedParameters().add(newParameter); myTableViewer.refresh(); myTableViewer.getControl().setFocus(); myTableViewer.setSelection(new StructuredSelection(newParameter)); } }); } private void createUpButton(Composite composite) { Button addButton = createButton(composite, UP_ID, Messages.EditPropertyParametersDialog_button_up, false); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) myTableViewer.getSelection(); Parameter selected = (Parameter) selection.getFirstElement(); if (selected == null) { return; } int index = myOperation.getOwnedParameters().indexOf(selected); if (index - 1 < 0) { return; } myOperation.getOwnedParameters().remove(selected); myOperation.getOwnedParameters().add(index - 1, selected); myTableViewer.refresh(); myTableViewer.getControl().setFocus(); } }); } private void createDownButton(Composite composite) { Button addButton = createButton(composite, DOWN_ID, Messages.EditPropertyParametersDialog_button_down, false); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) myTableViewer.getSelection(); Parameter selected = (Parameter) selection.getFirstElement(); if (selected == null) { return; } int index = myOperation.getOwnedParameters().indexOf(selected); if (index + 1 > myOperation.getOwnedParameters().size() - 1) { return; } myOperation.getOwnedParameters().remove(selected); myOperation.getOwnedParameters().add(index + 1, selected); myTableViewer.refresh(); myTableViewer.getControl().setFocus(); } }); } private TableViewer createTableViewer(Table table) { final TableViewer viewer = new TableViewer(table); viewer.setColumnProperties(EditParametersTableConstants.COLUMN_PROPERTIES); viewer.setUseHashlookup(true); viewer.setContentProvider(new ParametersContentProvider()); addCellEditors(table, viewer); viewer.setCellModifier(new ParametersCellModifier() { @Override public void updateViewer(Parameter parameter, String property) { viewer.update(parameter, new String[] { property }); } }); viewer.setLabelProvider(new ParameterLabelProvider()); return viewer; } private void addCellEditors(Table table, TableViewer viewer) { CellEditor name = new TextCellEditor(table); // CellEditor types = new TypeCellEditor(table, getTypeProposals()); CellEditor types = new TypeDialogCellEditor(table, myAdapterFactory, myOldOperation, UMLPackage.eINSTANCE.getTypedElement_Type()); CellEditor direction = new DirectionCellEditor(table); CellEditor multiplicity = new PositiveIntegerCellEditor(table); CellEditor defaultValue = new TextCellEditor(table); CellEditor isOrdered = new BooleanCellEditor(table); CellEditor isUnique = new BooleanCellEditor(table); CellEditor[] editors = new CellEditor[] { name, types, direction, multiplicity, defaultValue, isOrdered, isUnique }; viewer.setCellEditors(editors); } private class ParametersContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { return ((Operation) inputElement).getOwnedParameters().toArray(); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } private static class ParameterLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { Parameter p = (Parameter) element; switch (columnIndex) { case EditParametersTableConstants.NAME_POS: return p.getName() != null ? p.getName() : StringStatics.BLANK; case EditParametersTableConstants.TYPES_POS: return p.getType() != null ? p.getType().getName() : StringStatics.BLANK; case EditParametersTableConstants.MULTIPLICITY_POS: return Integer.toString(p.getUpper()); case EditParametersTableConstants.DIRECTION_POS: return p.getDirection().toString(); case EditParametersTableConstants.DEFAULT_VALUE_POS: ValueSpecification defValue = p.getDefaultValue(); if (defValue == null) { return StringStatics.BLANK; } return new ValueSpecificationToStringConverter().doSwitch(defValue); case EditParametersTableConstants.IS_ORDERED_POS: return Boolean.toString(p.isOrdered()); case EditParametersTableConstants.IS_UNIQUE_POS: return Boolean.toString(p.isUnique()); default: return StringStatics.HYPHEN; } } } public static class ValueSpecificationToStringConverter extends org.eclipse.uml2.uml.util.UMLSwitch<String> { private static final String EMPTY_VALUE = StringStatics.BLANK; @Override public String caseLiteralString(LiteralString object) { String value = object.getValue(); return value != null ? value : EMPTY_VALUE; } @Override public String caseLiteralInteger(LiteralInteger object) { String value = Integer.toString(object.getValue()); return value != null ? value : EMPTY_VALUE; } @Override public String caseExpression(Expression object) { String value = object.getSymbol(); return value != null ? value : EMPTY_VALUE; } @Override public String defaultCase(EObject object) { return EMPTY_VALUE; } }; public static class SetValueToSpecification extends org.eclipse.uml2.uml.util.UMLSwitch<ValueSpecification> { private final String myNewValue; public SetValueToSpecification(String value) { myNewValue = value; } @Override public ValueSpecification caseLiteralString(LiteralString object) { object.setValue(myNewValue); return object; } @Override public ValueSpecification caseLiteralInteger(LiteralInteger object) { Integer intValue = Integer.parseInt(myNewValue); object.setValue(intValue); return object; }; @Override public ValueSpecification caseExpression(Expression object) { object.setSymbol(myNewValue); return object; } @Override public ValueSpecification defaultCase(EObject object) { return null; } } }