package org.eclipselabs.spray.xtext.ui.wizard; import java.net.URL; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.PojoObservables; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; 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.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.WizardNewProjectCreationPage; import org.eclipse.wb.swt.ResourceManager; import org.eclipselabs.spray.xtext.ui.internal.SprayActivator; public class SprayWizardNewProjectCreationPage extends WizardNewProjectCreationPage { private DataBindingContext m_bindingContext; // constants; same as in super class private static final int SIZING_TEXT_FIELD_WIDTH = 250; // widgets Text diagramTypeNameField; Text projectNameField; MetamodelSelectionComposite metamodelSelectionComposite; private SprayProjectInfo projectInfo; public SprayWizardNewProjectCreationPage(String pageName) { super(pageName); setImageDescriptor(ResourceManager.getPluginImageDescriptor("org.eclipselabs.spray.xtext.ui", "icons/Spray-Logo-Project-Wizard.png")); } @Override public void createControl(Composite parent) { // Composite c = new Composite(parent, SWT.NULL); // c.setLayout(new GridLayout()); super.createControl(parent); Composite clientComposite = parent.getChildren().length > 0 ? (Composite) parent.getChildren()[parent.getChildren().length - 1] : parent; // if (clientComposite == null) // clientComposite = parent; projectNameField = getProjectNameField(clientComposite); clientComposite.setLayout(new GridLayout(1, true)); createSprayGroup(clientComposite); metamodelSelectionComposite = new MetamodelSelectionComposite(clientComposite, SWT.NONE, getProjectInfo()); GridData gd = new GridData(); gd.grabExcessHorizontalSpace = true; SprayActivator.getInstance().getInjector("org.eclipselabs.spray.xtext.Spray").injectMembers(metamodelSelectionComposite); // Composite verticalFiller = new Composite(clientComposite, SWT.NULL); // GridData gd_verticalFiller = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); // gd_verticalFiller.heightHint = 140; // verticalFiller.setLayoutData(gd_verticalFiller); setDeriveDiagramTypeFromProjectName(true); m_bindingContext = initDataBindings(); } private void createSprayGroup(Composite parent) { // project specification group Composite group = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; group.setLayout(layout); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); final Button btnTakeLastSegment = new Button(group, SWT.CHECK); btnTakeLastSegment.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); btnTakeLastSegment.setSelection(true); btnTakeLastSegment.setText("Take last segment from project name"); Label lblDiagramName = new Label(group, SWT.NONE); lblDiagramName.setText("Diagram type name:"); // new project name entry field diagramTypeNameField = new Text(group, SWT.BORDER); diagramTypeNameField.setEnabled(false); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.grabExcessHorizontalSpace = false; data.widthHint = 100; diagramTypeNameField.setLayoutData(data); diagramTypeNameField.setFont(parent.getFont()); btnTakeLastSegment.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setDeriveDiagramTypeFromProjectName(btnTakeLastSegment.getSelection()); } }); } /** * Returns the value of the diagram type field * with leading and trailing spaces removed. * * @return the project name in the field */ private String getProjectNameFieldValue() { if (diagramTypeNameField == null) { return ""; //$NON-NLS-1$ } return diagramTypeNameField.getText().trim(); } @Override public Image getImage() { URL url = null; url = SprayActivator.getInstance().getBundle().getEntry("/icons/Spray-Logo-Project-Wizard.png"); ImageDescriptor imgDesc = ImageDescriptor.createFromURL(url); Image img = imgDesc.createImage(true); return img; } public SprayProjectInfo getProjectInfo() { return projectInfo; } public void setProjectInfo(SprayProjectInfo projectInfo) { this.projectInfo = projectInfo; } private Text getProjectNameField(Composite parent) { Composite c = parent; while (c.getChildren().length > 0 && c.getChildren()[0] instanceof Composite) { c = (Composite) c.getChildren()[0]; } Text projectNameField = (Text) c.getChildren()[1]; return projectNameField; } final ModifyListener modifyListener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String lastSegment = getProjectName().indexOf('.') > 0 ? getProjectName().substring(getProjectName().lastIndexOf('.') + 1) : getProjectName(); diagramTypeNameField.setText(lastSegment); } }; protected void setDeriveDiagramTypeFromProjectName(boolean derive) { if (projectNameField == null || diagramTypeNameField == null) return; if (derive) { String lastSegment = getProjectName().indexOf('.') > 0 ? getProjectName().substring(getProjectName().lastIndexOf('.') + 1) : getProjectName(); diagramTypeNameField.setEnabled(false); diagramTypeNameField.setText(lastSegment); projectNameField.addModifyListener(modifyListener); } else { diagramTypeNameField.setEnabled(true); projectNameField.removeModifyListener(modifyListener); } } protected DataBindingContext initDataBindings() { DataBindingContext bindingContext = new DataBindingContext(); // IObservableValue diagramTypeNameFieldObserveTextObserveWidget = SWTObservables.observeText(diagramTypeNameField, SWT.Modify); IObservableValue projectInfoDiagramTypeNameObserveValue = PojoObservables.observeValue(projectInfo, "diagramTypeName"); bindingContext.bindValue(diagramTypeNameFieldObserveTextObserveWidget, projectInfoDiagramTypeNameObserveValue, null, null); // return bindingContext; } }