/** * Copyright (C) Yutaka Matsuno 2010-2012 All rights reserved. */ package net.dependableos.dcase.diagram.editor.requirement; import java.util.ArrayList; import java.util.List; import net.dependableos.dcase.Context; import net.dependableos.dcase.impl.ParameterItem; import net.dependableos.dcase.impl.RequirementItem; import net.dependableos.dcase.diagram.editor.common.util.DcaseEditorUtil; import net.dependableos.dcase.diagram.editor.message.Messages; import net.dependableos.dcase.diagram.edit.parts.ContextEditPart; import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.TableViewer; 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.graphics.Point; 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.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; /** * A dialog to edit requirements. */ public class RequirementDialog extends Dialog implements IStructuredContentProvider { /** * the dialog tile. */ private static final String DIALOG_TITLE = Messages.RequirementDialog_DialogTitle; /** * the width of the dialog. */ private static final int INIT_WIDTH = 500; /** * the width of the button. */ private static final int BUTTON_WIDTH = 80; /** * the width of the first row of table. */ private static final int COLUMN_WIDTH_SELECT = 60; /** * the width of the second row of table. */ private static final int COLUMN_WIDTH_PARAMETER = 300; /** * the number of columns. */ private static final int COLUMN_NUMBER = 3; /** * the height of dialog. */ private static final int HEIGHT_HINT = 200; /** * the vertical span. */ private static final int VERTICAL_SPAN = 4; /** * the table represented in dialog. */ private Table table; /** * the table viewer for representing table. */ private TableViewer tableViewer; /** * the requirements. */ private List<RequirementItem> requirements; /** * the parameters. */ private String parameters; /** * the context id. */ private String contextId; /** * Constructor. * * @param parentShell parent shell. * @param context target node. */ public RequirementDialog(Shell parentShell, ContextEditPart editPart) { super(parentShell); Context context = (Context) DcaseEditorUtil.getElement(editPart); requirements = context.getRequirements(); try { parameters = editPart.getParameters(context.getParameterVals()); } catch (Exception e) { parameters = ""; //$NON-NLS-1$ } contextId = ((XMLResource) context.eResource()).getID(context); } /** * Returns the initial dialog size. * * @see org.eclipse.jface.dialogs.Dialog#getInitialSize() * @return Dialog size. */ @Override protected Point getInitialSize() { Point size = super.getInitialSize(); if (size.x < INIT_WIDTH) { size.x = INIT_WIDTH; } return size; } /** * Creates dialog area. * * @param parent parent composite. * @return the parent composite. */ @Override protected Control createDialogArea(Composite parent) { // set GridLayout data. Composite panel = (Composite) super.createDialogArea(parent); panel.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout layout = new GridLayout(); layout.numColumns = COLUMN_NUMBER; panel.setLayout(layout); // set the dialog title. getShell().setText(DIALOG_TITLE); // create a table createTable(panel); // create the operation button. createOperationButton(panel); return panel; } /** * Creates a table. * * @param panel parent composite. */ private void createTable(Composite panel) { GridData gridData = new GridData(GridData.FILL_BOTH); gridData.grabExcessVerticalSpace = true; gridData.verticalSpan = VERTICAL_SPAN; gridData.heightHint = HEIGHT_HINT; gridData.horizontalSpan = 2; table = new Table(panel, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); table.setLayoutData(gridData); table.setHeaderVisible(true); TableColumn column = new TableColumn(table, SWT.CENTER, 0); column.setText(Messages.RequirementDialog_NameLabelText); column.setWidth(COLUMN_WIDTH_SELECT); column = new TableColumn(table, SWT.LEFT, 1); column.setText(Messages.RequirementDialog_DescriptionLabelText); column.setWidth(COLUMN_WIDTH_PARAMETER); //create a table viewer. tableViewer = new TableViewer(table); tableViewer.setUseHashlookup(true); tableViewer.setColumnProperties(new String[]{ Messages.RequirementDialog_NameLabelText, Messages.RequirementDialog_DescriptionLabelText }); tableViewer.setContentProvider(this); tableViewer.setLabelProvider(new RequirementLabeProvider()); tableViewer.setInput(requirements); } /** * Returns the existing ids. * * @param avoid the id to avoid. * @return the existing ids. */ private List<String> getExistingIds(String avoid) { List<String> existingIds = new ArrayList<String>(); for (RequirementItem requirement : requirements) { String id = requirement.getRequirementId(); if (!id.equals(avoid)) { existingIds.add(id); } } return existingIds; } /** * Creates buttons. * * @param panel parent composite. */ private void createOperationButton(Composite panel) { // creates a button to add a new requirement. Button addButton = new Button(panel, SWT.PUSH | SWT.CENTER); addButton.setText(Messages.RequirementDialog_CreateButtonLabelText); GridData editGridData = new GridData( GridData.HORIZONTAL_ALIGN_FILL); editGridData.minimumWidth = BUTTON_WIDTH; addButton.setLayoutData(editGridData); // registers the selection listener. addButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { RequirementEditDialog editDialog = new RequirementEditDialog( getActiveWindowShell(), "", "", getExistingIds(null), //$NON-NLS-1$ //$NON-NLS-2$ RequirementEditDialog.CREATE); if (Dialog.OK == editDialog.open()) { RequirementItem requirementItem = new RequirementItem( contextId, editDialog.getId(), editDialog .getRequirement(), parameters); requirements.add(requirementItem); tableViewer.setInput(requirements); } } }); // creates a button to edit the selected requirement. Button editButton = new Button(panel, SWT.PUSH | SWT.CENTER); editButton.setText(Messages.RequirementDialog_EditButtonlabelText); GridData upGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); upGridData.minimumWidth = BUTTON_WIDTH; editButton.setLayoutData(upGridData); // registers the selection listener. editButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { int selectedIndex = table.getSelectionIndex(); if (selectedIndex >= 0) { RequirementItem requirement = requirements .get(selectedIndex); String id = requirement.getRequirementId(); RequirementEditDialog editDialog = new RequirementEditDialog( getActiveWindowShell(), id, requirement .getRequirement(), getExistingIds(id), RequirementEditDialog.EDIT); if (Dialog.OK == editDialog.open()) { RequirementItem requirementItem = new RequirementItem( contextId, editDialog.getId(), editDialog .getRequirement(), parameters); requirements.remove(selectedIndex); requirements.add(selectedIndex, requirementItem); tableViewer.setInput(requirements); } } } }); // creates a button to delete the selected requirement. Button deleteButton = new Button(panel, SWT.PUSH | SWT.CENTER); deleteButton.setText(Messages.RequirementDialog_DeleteButtonLabelText); GridData downGridData = new GridData( GridData.HORIZONTAL_ALIGN_FILL); downGridData.minimumWidth = BUTTON_WIDTH; deleteButton.setLayoutData(downGridData); // registers the selection listener. deleteButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { int selectedIndex = table.getSelectionIndex(); if (selectedIndex >= 0) { RequirementItem selectedRequirement = requirements.get(selectedIndex); requirements.remove(selectedRequirement); tableViewer.setInput(requirements); } } }); Label scriptStrLabel = new Label(panel, SWT.WRAP); GridData spaceGridData = new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING); spaceGridData.widthHint = BUTTON_WIDTH; scriptStrLabel.setLayoutData(spaceGridData); } /** * @return the requirements */ public List<RequirementItem> getRequirements() { return requirements; } /** * Returns the active window shell. * * @return the active window shell. */ private Shell getActiveWindowShell() { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow activeWindow = workbench.getActiveWorkbenchWindow(); return activeWindow.getShell(); } /** * The label provider class for the requirement view part. */ private class RequirementLabeProvider implements ITableLabelProvider { /** * Does nothing. * @param element the element * @param columnIndex the column index * @return null * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage(Object element, int columnIndex) { return null; } /** * Returns the requirement id or the replaced requirement as the column text. * @param element the element * @param columnIndex the column index * @return the column text * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText(Object element, int columnIndex) { if (columnIndex == 0) { return ((RequirementItem) element).getRequirementId(); } else if (columnIndex == 1) { return ParameterItem.getFormattedDesc(parameters, ((RequirementItem) element).getDescription()); } return ""; //$NON-NLS-1$ } /** * Does nothing. * @param listener a label provider listener * @see org.eclipse.jface.viewers.IBaseLabelProvider * #addListener(org.eclipse.jface.viewers.ILabelProviderListener) */ public void addListener(ILabelProviderListener listener) { } /** * Does nothing. * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose() */ public void dispose() { } /** * Does nothing. * @param element the element * @param property the property * @return false * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String) */ public boolean isLabelProperty(Object element, String property) { return false; } /** * Does nothing. * @param listener a label provider listener * @see org.eclipse.jface.viewers.IBaseLabelProvider * #removeListener(org.eclipse.jface.viewers.ILabelProviderListener) */ public void removeListener(ILabelProviderListener listener) { } } /** * Returns the input elements casted into RequirementItem[]. * * @param inputElement the input element * @return the array of RequirementItem to display in the viewer * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object inputElement) { return ((List<?>) inputElement).toArray(); } /** * Disposes. * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /** * Does nothing. * * @param viewer the viewer * @param oldInput the old input element * @param newInput the new input element * @see org.eclipse.jface.viewers.IContentProvider * #inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }