blob: 9dda078f4a005b4c1ab7b288aee0c9bfbc35b9cf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012,2013 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.stem.model.ui.editor.controls;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.stem.model.metamodel.Compartment;
import org.eclipse.stem.model.metamodel.CompartmentGroup;
import org.eclipse.stem.model.metamodel.CompartmentType;
import org.eclipse.stem.model.ui.Constants;
import org.eclipse.stem.model.ui.editor.VisualModelUtils;
import org.eclipse.stem.model.ui.wizards.WizardHelper;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.Text;
public class ModelCompartmentEditorDialog extends Dialog {
protected Text nameText;
protected ComboViewer dataTypeComboViewer, compartmentTypeComboViewer;
protected Compartment compartment;
protected CompartmentGroup compartmentGroup;
protected String errorMessage = null;
public ModelCompartmentEditorDialog(Shell parentShell, int style,
CompartmentGroup compartmentGroup, Compartment compartment) {
super(parentShell);
this.compartment = compartment;
this.compartmentGroup = compartmentGroup;
}
public void create() {
super.create();
nameText.setText(VisualModelUtils.safeGet(compartment.getName()));
EDataType selectedDataType = compartment.getDataType();
if (selectedDataType == null) {
selectedDataType = VisualModelUtils
.getDefaultCompartmentDataTypes()[0];
}
dataTypeComboViewer.setSelection(new StructuredSelection(
selectedDataType));
CompartmentType selectedCompartmentType = compartment.getType();
if (selectedCompartmentType == null) {
selectedCompartmentType = CompartmentType.values()[0];
}
compartmentTypeComboViewer.setSelection(new StructuredSelection(
selectedCompartmentType));
}
protected Control createDialogArea(Composite parent) {
parent.setLayout(new GridLayout(2, false));
Composite container = new Composite(parent, SWT.NONE);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.grabExcessHorizontalSpace = true;
data.horizontalSpan = 2;
container.setLayoutData(data);
container.setLayout(new GridLayout(2, false));
Label nameLabel = new Label(container, SWT.NONE);
nameLabel.setText("Name");
nameText = new Text(container, SWT.BORDER);
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
nameText.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
formatTextFields();
}
@Override
public void focusGained(FocusEvent e) {
}
});
createCompartmentTypeList(container);
createDataTypeList(container);
return parent;
}
private void createCompartmentTypeList(Composite container) {
Label dataTypeLabel = new Label(container, SWT.NONE);
dataTypeLabel.setText("Compartment Type");
compartmentTypeComboViewer = new ComboViewer(container, SWT.READ_ONLY);
compartmentTypeComboViewer.setContentProvider(ArrayContentProvider
.getInstance());
compartmentTypeComboViewer
.setLabelProvider(new EMFDataTypeLabelProvider());
compartmentTypeComboViewer.setInput(CompartmentType.values());
}
private void createDataTypeList(Composite container) {
Label dataTypeLabel = new Label(container, SWT.NONE);
dataTypeLabel.setText("Data Type");
dataTypeComboViewer = new ComboViewer(container, SWT.READ_ONLY);
dataTypeComboViewer.setContentProvider(ArrayContentProvider
.getInstance());
dataTypeComboViewer.setLabelProvider(new EMFDataTypeLabelProvider());
dataTypeComboViewer.setInput(WizardHelper
.getDefaultCompartmentDataTypes());
dataTypeComboViewer.getCombo().setLayoutData(
new GridData(GridData.FILL_HORIZONTAL));
}
protected void formatTextFields() {
nameText.setText(WizardHelper.formatToCamelCase(nameText.getText()));
}
protected boolean validate() {
if (WizardHelper.isNullOrEmpty(nameText.getText())) {
errorMessage = "Please enter a name for this compartment";
return false;
}
if (hasNameConflict()) {
errorMessage = "A compartment named \"" + nameText.getText()
+ "\" already exists in this model.";
return false;
}
return true;
}
private boolean hasNameConflict() {
for (Compartment compartment : WizardHelper
.getAllCompartmentsForGroup(compartmentGroup)) {
if (this.compartment != compartment
&& compartment.getName().equals(nameText.getText())) {
return true;
}
}
return false;
}
@Override
protected void okPressed() {
formatTextFields();
if (validate()) {
compartment.setName(WizardHelper.safeGet(nameText.getText()));
compartment
.setType((CompartmentType) ((StructuredSelection) compartmentTypeComboViewer
.getSelection()).getFirstElement());
compartment
.setDataType((EDataType) ((StructuredSelection) dataTypeComboViewer
.getSelection()).getFirstElement());
super.okPressed();
} else {
MessageDialog.openError(getShell(), "Error", errorMessage);
}
}
@Override
protected boolean isResizable() {
return true;
}
private static class EMFDataTypeLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
if (element instanceof Enumerator) {
return ((Enumerator) element).getLiteral();
}
if (element instanceof EDataType) {
return ((EDataType) element).getInstanceClassName();
}
return Constants.EMPTY_STRING;
}
}
}