/*
* Copyright (C) Yutaka Matsuno 2010-2012 All rights reserved.
*/
package net.dependableos.dcase.diagram.editor.preferences;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import net.dependableos.dcase.diagram.common.constant.SystemDefinitionConst;
import net.dependableos.dcase.diagram.editor.message.Messages;
import net.dependableos.dcase.diagram.editor.parameter.ParameterDataItem;
import net.dependableos.dcase.diagram.editor.ui.ParameterDefinitionWizard;
import net.dependableos.dcase.diagram.editor.verifier.DataTypeVerifier;
import net.dependableos.dcase.diagram.part.DcaseDiagramEditorUtil;
import org.eclipse.jface.preference.PreferencePage;
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.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.xml.sax.SAXException;
/**
* A preference page class for the parameters.
*/
public class ParameterPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
/**
* 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.
* Spans 7 rows to display operation buttons at left side.
*/
private static final int VERTICAL_SPAN = 8;
/**
* the default export file name.
*/
private static final String EXPORT_PARAMETER_FILE_NAME = "parameters.xml"; //$NON-NLS-1$
/**
* a wildcard character.
*/
private static final String ASTERISK = "*"; //$NON-NLS-1$
/**
* The file extension of xml.
*/
public static final String XML_FILE_EXTENSION = ".xml"; //$NON-NLS-1$
/**
* a list control for parameters.
*/
private org.eclipse.swt.widgets.List parameterDataList;
/**
* parameters.
*/
private List<ParameterDataItem> prameterDataItems;
/**
* 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;
/**
* the import button.
*/
private Button importButton;
/**
* the export button.
*/
private Button exportButton;
/**
* Constructor.
*/
public ParameterPreferencePage() {
super();
prameterDataItems = ParameterDataItem.getParamDatatypeListFromPreferences();
}
/**
* Initializes this preference page for the given workbench.
*
* @param workbench the workbench
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {
// suppresses creation of the standard Default and Apply buttons
noDefaultAndApplyButton();
}
/**
* {@inheritDoc}
*/
@Override
protected Control createContents(Composite parent) {
GridLayout layout = new GridLayout();
layout.numColumns = COLUMN_NUMBER;
layout.marginHeight = 0;
layout.marginWidth = 0;
parent.setLayout(layout);
parent.setLayoutData(new GridData(GridData.FILL_BOTH));
parent.setFont(parent.getFont());
setParameterTypeListSelect(parent);
// creates buttons.
createOperationButton(parent);
return parent;
}
/**
* {@inheritDoc}
*/
@Override
public boolean performOk() {
List<ParameterDataItem> parameterDataItems = getParameterDatatypeList();
ParameterDataItem.savePreferences(parameterDataItems);
return super.performOk();
}
/**
* Initializes a list for parameters.
*
* @param panel parent composite.
*/
private void setParameterTypeListSelect(Composite panel) {
// creates the select list if it dose not exist.
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[prameterDataItems.size()];
for (int i = 0; i < prameterDataItems.size(); i++) {
items[i] = prameterDataItems.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 < prameterDataItems.size(); i++) {
if (selectedParameter.equals(prameterDataItems.get(i))) {
parameterDataList.select(i);
break;
}
}
}
validate();
}
/**
* Validates the list of parameter data.
*/
private void validate() {
try {
for (ParameterDataItem data : prameterDataItems) {
data.validate();
}
setErrorMessage(null);
setValid(true);
} catch (Exception e) {
setErrorMessage(e.getMessage());
setValid(false);
}
}
/**
* 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(prameterDataItems);
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, prameterDataItems);
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);
prameterDataItems.remove(index);
setParameterTypeListSelect(panel);
}
}
});
Label label1 = new Label(panel, SWT.NONE);
label1.setText(""); //$NON-NLS-1$
Label label2 = new Label(panel, SWT.NONE);
label2.setText(""); //$NON-NLS-1$
// creates the import button.
importButton = new Button(panel, SWT.PUSH | SWT.CENTER);
importButton.setText(Messages.ParameterDatatypePreferencePage_ImportButtonLabel);
GridData importGridData = new GridData(GridData.VERTICAL_ALIGN_END);
importGridData.widthHint = BUTTON_WIDTH;
importButton.setLayoutData(importGridData);
importButton.addSelectionListener(new SelectionAdapter() {
// // The event method executed when the deletion button is pushed.
public void widgetSelected(SelectionEvent e) {
try {
File importFile = selectImportFile(panel.getShell(),
Messages.ParameterDatatypePreferencePage_ImportFileDialogTitle);
if (importFile != null) {
FileInputStream fis = null;
try {
fis = new FileInputStream(importFile);
mergeParamItems(ParameterDataItem.getParamDatatypeListFromXml(fis));
} finally {
if (fis != null) {
fis.close();
}
}
setParameterTypeListSelect(panel);
showMessageBox(Messages.ParameterDatatypePreferencePage_ImportSuccessMessage, panel.getShell());
}
} catch (ParserConfigurationException pe) {
showErrorMessageBox(Messages.ParameterDatatypePreferencePage_ImportErrorMessage, panel.getShell());
} catch (SAXException se) {
showErrorMessageBox(Messages.ParameterDatatypePreferencePage_ImportErrorMessage, panel.getShell());
} catch (IOException ie) {
showErrorMessageBox(Messages.ParameterDatatypePreferencePage_ImportErrorMessage, panel.getShell());
}
}
});
// creates the export button.
exportButton = new Button(panel, SWT.PUSH | SWT.CENTER);
exportButton.setText(Messages.ParameterDatatypePreferencePage_ExportButtonLabel);
GridData exportGridData = new GridData(GridData.VERTICAL_ALIGN_END);
exportGridData.widthHint = BUTTON_WIDTH;
exportButton.setLayoutData(exportGridData);
exportButton.addSelectionListener(new SelectionAdapter() {
// // The event method executed when the deletion button is pushed.
public void widgetSelected(SelectionEvent e) {
File exportFile = selectExportFile(panel.getShell(),
Messages.ParameterDatatypePreferencePage_ExportFileDialogTitle);
if (exportFile != null) {
String xml = ""; //$NON-NLS-1$
try {
xml = ParameterDataItem.getXmlString(
ParameterPreferencePage.this.prameterDataItems);
} catch (ParserConfigurationException pce) {
showErrorMessageBox(
Messages.ParameterDatatypePreferencePage_ExportErrorMessage, panel.getShell());
} catch (TransformerException te) {
showErrorMessageBox(
Messages.ParameterDatatypePreferencePage_ExportErrorMessage, panel.getShell());
}
FileWriter writer = null;
try {
writer = new FileWriter(exportFile);
writer.write(xml);
writer.flush();
showMessageBox(
Messages.ParameterDatatypePreferencePage_ExportSuccessMessage,
panel.getShell());
} catch (IOException ioe) {
showErrorMessageBox(
Messages.ParameterDatatypePreferencePage_ExportErrorMessage, panel.getShell());
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException ioe) {
showErrorMessageBox(
Messages.ParameterDatatypePreferencePage_ExportErrorMessage, panel.getShell());
}
}
ParameterDataItem.refresh();
}
}
});
}
/**
* Merges the editing list and the imported list of parameter data.
* @param importItems the imported list of parameter data.
*/
private void mergeParamItems(List<ParameterDataItem> importItems) {
for (ParameterDataItem item : importItems) {
int i = 0;
try {
DataTypeVerifier.validString(false,
SystemDefinitionConst.DATA_ATTRIBUTE_NAME,
item.getName());
} catch (Exception e) {
continue;
}
for (i = 0; i < prameterDataItems.size(); i++) {
ParameterDataItem paramData = prameterDataItems.get(i);
if (item.getName().equals(paramData.getName())) {
break;
}
}
if (i < prameterDataItems.size()) {
prameterDataItems.remove(i);
prameterDataItems.add(i, item);
} else {
prameterDataItems.add(item);
}
}
}
/**
* Displays the message dialog.
* @param message message
* @param shell the parent shell
*/
public static void showMessageBox(String message, Shell shell) {
MessageBox box = new MessageBox(shell, SWT.OK | SWT.ICON_INFORMATION);
box.setMessage(message);
box.open();
}
/**
* Displays the message dialog.
* @param message message
* @param shell the parent shell
*/
public static void showErrorMessageBox(String message, Shell shell) {
MessageBox box = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
box.setText("ERROR"); //$NON-NLS-1$
box.setMessage(message);
box.open();
}
/**
* Returns the list of parameter data types contained in this dialog.
* @return the list of parameter data types.
*/
private List<ParameterDataItem> getParameterDatatypeList() {
return prameterDataItems;
}
/**
* Opens the dialog to select the export file path.
* @param parent the parent shell
* @param title the title
* @return the selected export file.
*/
private static File selectExportFile(Shell parent, String title) {
FileDialog dialog = new FileDialog(parent, SWT.SAVE);
dialog.setText(title);
dialog.setFileName(EXPORT_PARAMETER_FILE_NAME);
dialog.setFilterExtensions(new String[] { ASTERISK.concat(XML_FILE_EXTENSION) });
dialog.setOverwrite(true);
String parametersFilePath = dialog.open();
// terminates if canceled.
if (parametersFilePath == null) {
return null;
}
return new File(parametersFilePath);
}
/**
* Opens the dialog to select the import file path.
* @param parent the parent shell
* @param title the title
* @return the selected import file.
*/
private static File selectImportFile(Shell parent, String title) {
FileDialog dialog = new FileDialog(parent, SWT.OPEN);
dialog.setText(title);
dialog.setFilterExtensions(new String[] { ASTERISK.concat(XML_FILE_EXTENSION) });
String parametersFilePath = dialog.open();
if (parametersFilePath == null || parametersFilePath.trim().length() == 0) {
return null;
}
return new File(parametersFilePath);
}
}