/*
* Copyright (C) 2012 Nagoya University All rights reserved.
*/
package net.dependableos.dcase.diagram.editor.ui;
import net.dependableos.dcase.diagram.common.model.AttributeType;
import net.dependableos.dcase.diagram.common.model.NodeInfo;
import net.dependableos.dcase.diagram.editor.message.Messages;
import net.dependableos.dcase.diagram.editor.parameter.ParameterDataItem;
import net.dependableos.dcase.diagram.part.DcaseDiagramEditorUtil;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.IStructuredContentProvider;
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.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;
/**
* A dialog to configure parameters.
*/
public class ParameterDefineDialog extends Dialog implements
IStructuredContentProvider {
/**
* 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 number of columns.
*/
private static final int COLUMN_NUMBER = 2;
/**
* the height of dialog.
*/
private static final int HEIGHT_HINT = 200;
/**
* the vertical span. (Buttons x 3 + Label)
*/
private static final int VERTICAL_SPAN = 4;
/**
* the title of the dialog.
*/
private static final String DIALOG_TITLE = "Define Parameters"; //$NON-NLS-1$
/**
* the node.
*/
private NodeInfo nodeInfo = null;
/**
* a list control for parameters.
*/
private org.eclipse.swt.widgets.List parameterDataList;
/**
* parameters.
*/
private List<ParameterDataItem> parameterDataItems;
/**
* the selected parameter.
*/
private ParameterDataItem selectedParameter = null;
/**
* the add button.
*/
private Button addButton;
/**
* the edit button.
*/
private Button editButton;
/**
* the delete button.
*/
private Button delButton;
/**
* Creates an instance and initializes it.
*
* @param parentShell
* the parent shell.
*/
public ParameterDefineDialog(Shell parentShell) {
super(parentShell);
}
/**
* Sets the node.
*
* @param nodeInfo
* the node.
*/
public void setNodeInfo(NodeInfo nodeInfo) {
this.nodeInfo = nodeInfo;
String userdef009 = (String) nodeInfo
.getAttribute(AttributeType.PARAMETERDEFS);
parameterDataItems = ParameterDataItem
.getParamDatatypeListFromString(userdef009);
}
/**
* {@inheritDoc}
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite panel = (Composite) super.createDialogArea(parent);
GridLayout layout = new GridLayout();
layout.numColumns = COLUMN_NUMBER;
layout.marginHeight = 0;
layout.marginWidth = 0;
panel.setLayout(layout);
panel.setLayoutData(new GridData(GridData.FILL_BOTH));
panel.setFont(panel.getFont());
getShell().setText(DIALOG_TITLE);
if (nodeInfo != null) {
setParameterTypeListSelect(panel);
createOperationButton(panel);
}
return panel;
}
/**
* Initializes a list for parameters.
*
* @param panel
* parent composite.
*/
private void setParameterTypeListSelect(Composite panel) {
if (parameterDataList == null) {
parameterDataList = new org.eclipse.swt.widgets.List(panel,
SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessVerticalSpace = true;
gridData.verticalSpan = VERTICAL_SPAN;
gridData.heightHint = HEIGHT_HINT;
parameterDataList.setLayoutData(gridData);
}
parameterDataList.removeAll();
String[] items = new String[parameterDataItems.size()];
for (int i = 0; i < parameterDataItems.size(); i++) {
items[i] = parameterDataItems.get(i).getName();
}
parameterDataList.setItems(items);
// If a parameter type is selected, sets it selected status in the
// select list.
if (selectedParameter != null) {
for (int i = 0; i < parameterDataItems.size(); i++) {
if (selectedParameter.equals(parameterDataItems.get(i))) {
parameterDataList.select(i);
break;
}
}
}
for (ParameterDataItem data : parameterDataItems) {
data.validate();
}
}
/**
* Creates buttons.
*
* @param panel
* parent composite.
*/
private void createOperationButton(final Composite panel) {
// creates the add button.
addButton = new Button(panel, SWT.PUSH | SWT.CENTER);
addButton.setText(Messages.ParameterDatatypePreferencePage_1);
GridData createGridData = new GridData(
GridData.HORIZONTAL_ALIGN_BEGINNING);
createGridData.widthHint = BUTTON_WIDTH;
addButton.setLayoutData(createGridData);
addButton.addSelectionListener(new SelectionAdapter() {
// The event method executed when the creation button is pushed.
public void widgetSelected(SelectionEvent e) {
ParameterDefinitionWizard wizard = new ParameterDefinitionWizard(
parameterDataItems);
wizard.setWindowTitle(Messages.ParameterDatatypeDialog_CreationWizardTile);
DcaseDiagramEditorUtil.runWizard(getShell(), wizard,
"CreateParameterDatatype"); //$NON-NLS-1$
selectedParameter = wizard.getResultedParameterdata();
setParameterTypeListSelect(panel);
}
});
// creates the edit button.
editButton = new Button(panel, SWT.PUSH | SWT.CENTER);
editButton.setText(Messages.ParameterDatatypePreferencePage_2);
GridData editGridData = new GridData(
GridData.HORIZONTAL_ALIGN_BEGINNING);
editGridData.widthHint = BUTTON_WIDTH;
editButton.setLayoutData(editGridData);
editButton.addSelectionListener(new SelectionAdapter() {
// The event method executed when the edit button is pushed.
public void widgetSelected(SelectionEvent e) {
int index = parameterDataList.getSelectionIndex();
if (index >= 0) {
ParameterDefinitionWizard wizard = new ParameterDefinitionWizard(
index, parameterDataItems);
wizard.setWindowTitle(Messages.ParameterDatatypeDialog_EditWizardTitle);
DcaseDiagramEditorUtil.runWizard(getShell(), wizard,
"EditParameterDatatype"); //$NON-NLS-1$
selectedParameter = wizard.getResultedParameterdata();
setParameterTypeListSelect(panel);
}
}
});
// creates the deletion button.
delButton = new Button(panel, SWT.PUSH | SWT.CENTER);
delButton.setText(Messages.ParameterDatatypePreferencePage_3);
GridData delGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
delGridData.widthHint = BUTTON_WIDTH;
delButton.setLayoutData(delGridData);
delButton.addSelectionListener(new SelectionAdapter() {
// // The event method executed when the deletion button is pushed.
public void widgetSelected(SelectionEvent e) {
int index = parameterDataList.getSelectionIndex();
if (index >= 0) {
parameterDataList.remove(index);
parameterDataItems.remove(index);
setParameterTypeListSelect(panel);
}
}
});
// sets layout data.
Label scriptStrLabel = new Label(panel, SWT.WRAP);
GridData spaceGridData = new GridData(
GridData.HORIZONTAL_ALIGN_BEGINNING);
spaceGridData.widthHint = BUTTON_WIDTH;
scriptStrLabel.setLayoutData(spaceGridData);
}
/**
* {@inheritDoc}
*/
@Override
protected Point getInitialSize() {
Point size = super.getInitialSize();
if (size.x < INIT_WIDTH) {
size.x = INIT_WIDTH;
}
return size;
}
/**
* {@inheritDoc}
*/
@Override
protected void okPressed() {
String dataStr = ParameterDataItem.getSavedString(parameterDataItems);
nodeInfo.setAttribute(AttributeType.PARAMETERDEFS, dataStr);
super.okPressed();
parameterDataList = null;
}
/**
* {@inheritDoc}
*/
@Override
protected void cancelPressed() {
super.cancelPressed();
parameterDataList = null;
}
/**
* Returns the elements to display in the viewer when its input is set to
* the given element. These elements can be presented as rows in a table,
* items in a list, etc. The result is not modified by the viewer.
*
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*
* @param inputElement
* the input element.
* @return the array of elements to display in the viewer.
*/
public Object[] getElements(Object inputElement) {
return (Object[]) inputElement;
}
/**
* Disposes of this content provider.
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
parameterDataItems = null;
parameterDataList = null;
}
/**
* Notifies this content provider that the given viewer's input has been
* switched to a different element.
*
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
*
* @param viewer
* the viewer
* @param oldInput
* the old input element, or null if the viewer did not
* previously have an input.
* @param newInput
* the new input element, or null if the viewer does not have an
* input.
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}