package org.eclipse.uml2.diagram.common.part;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.uml2.diagram.common.Messages;
import org.eclipse.uml2.uml.UMLPackage;
/**
* This is a copy of standard <code>ModelWizardInitialObjectCreationPage</code>
* class generated by EMF. The difference is the following:
* <li>BaseClass is given in the constructor</li>
* <li>Initial Object Names list became Initial Object Types, EClass, not name, of the type is returned now</li>
* <li>Initial Object Names list is not hardcoded, it is calculated as all subtypes of the BaseClass.</li>
* <li>There always a default Intial Object which is the BaseClass.</li>
* </br>
* <code>createInitialObjectTypes()</code> is supposed to be overriden in subclasses
*/
public class UMLModelWizardInitialObjectCreationPage extends WizardPage {
protected List<EClass> initialObjectNames;
protected UMLPackage umlPackage = UMLPackage.eINSTANCE;
protected Combo initialObjectField;
protected List<String> encodings;
protected Combo encodingField;
private final EClass baseClass;
public UMLModelWizardInitialObjectCreationPage(String pageId, EClass bc) {
super(pageId);
baseClass = bc;
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
{
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.verticalSpacing = 12;
composite.setLayout(layout);
GridData data = new GridData();
data.verticalAlignment = GridData.FILL;
data.grabExcessVerticalSpace = true;
data.horizontalAlignment = GridData.FILL;
composite.setLayoutData(data);
}
Label containerLabel = new Label(composite, SWT.LEFT);
{
containerLabel.setText(Messages.UMLModelWizardInitialObjectCreationPage_label_model_object);
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
containerLabel.setLayoutData(data);
}
initialObjectField = new Combo(composite, SWT.BORDER);
{
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
initialObjectField.setLayoutData(data);
}
for (EClass object : getInitialObjectTypes()) {
initialObjectField.add(getLabel(object));
}
// tfesenko always set default value for initial object
if (initialObjectField.getItemCount() > 0) {
initialObjectField.select(0);
}
initialObjectField.addModifyListener(validator);
Label encodingLabel = new Label(composite, SWT.LEFT);
{
encodingLabel.setText(Messages.UMLModelWizardInitialObjectCreationPage_label_xml_encoding);
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
encodingLabel.setLayoutData(data);
}
encodingField = new Combo(composite, SWT.BORDER);
{
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
encodingField.setLayoutData(data);
}
for (String encoding : getEncodings()) {
encodingField.add(encoding);
}
encodingField.select(0);
encodingField.addModifyListener(validator);
setPageComplete(validatePage());
setControl(composite);
}
protected ModifyListener validator = new ModifyListener() {
public void modifyText(ModifyEvent e) {
setPageComplete(validatePage());
}
};
protected boolean validatePage() {
return getInitialObject() != null && getEncodings().contains(encodingField.getText());
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
if (initialObjectField.getItemCount() == 1) {
initialObjectField.clearSelection();
encodingField.setFocus();
} else {
encodingField.clearSelection();
initialObjectField.setFocus();
}
}
}
public EClass getInitialObject() {
String label = initialObjectField.getText();
for (EClass next : getInitialObjectTypes()) {
if (getLabel(next).equals(label)) {
return next;
}
}
return null;
}
public String getEncoding() {
return encodingField.getText();
}
protected String getLabel(EClass type) {
// TODO
// try {
// return UMLDiagramEditorPlugin.getInstance()
// .getString("_UI_" + typeName + "_type"); //$NON-NLS-1$ //$NON-NLS-2$
// } catch (MissingResourceException mre) {
// UMLEditorPlugin.INSTANCE.log(mre);
// }
return type.getName();
}
protected Collection<String> getEncodings() {
if (encodings == null) {
encodings = new ArrayList<String>();
for (StringTokenizer stringTokenizer = new StringTokenizer(" UTF-8 ASCII UTF-16 UTF-16BE UTF-16LE ISO-8859-1"); stringTokenizer.hasMoreTokens();) { //$NON-NLS-1$
encodings.add(stringTokenizer.nextToken());
}
}
return encodings;
}
private Collection<EClass> getInitialObjectTypes() {
if (initialObjectNames == null) {
initialObjectNames = createInitialObjectTypes();
}
return initialObjectNames;
}
/*
* This method is supposed to be overriden in subclasses
*/
protected List<EClass> createInitialObjectTypes() {
return Collections.unmodifiableList(getAllSubTypes(baseClass));
}
private List<EClass> getAllSubTypes(EClass baseClass) {
List<EClass> result = new ArrayList<EClass>();
TreeIterator<EObject> contents = umlPackage.eAllContents();
// add original class first
result.add(baseClass);
while (contents.hasNext()) {
EObject next = contents.next();
if (next instanceof EClass) {
EClass eclass = (EClass) next;
if (!eclass.isAbstract() && baseClass.isSuperTypeOf(eclass) && !eclass.equals(baseClass)) {
result.add(eclass);
}
}
}
return result;
}
}