/******************************************************************************* * Copyright (c) 2007, 2009 Borland Software 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: * Borland Software Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.m2m.internal.qvt.oml.ui.wizards.project; import java.util.StringTokenizer; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.wizard.IWizardPage; 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.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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.osgi.framework.Version; public class NewQVTProjectContentPage extends WizardPage { protected final static int PROPERTIES_GROUP = 1; protected final static int CLASS_GROUP = 2; protected int myChangedGroups = 0; private NewQVTProjectCreationPage myMainPage; private NewProjectData myData; private Text myIdText; private Text myVersionText; private Text myNameText; private Text myProviderText; private Combo myExecEnvCombo; private Label myExecEnvLabel; private Button myGenerateClass; private Label myClassLabel; private Text myClassText; private boolean myInitialized; public NewQVTProjectContentPage(String pageName, NewQVTProjectCreationPage page, NewProjectData data) { super(pageName); myMainPage = page; myData = data; setTitle(Messages.ContentPage_title); setDescription(Messages.ContentPage_desc); } public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); container.setLayout(new GridLayout()); createPluginPropertiesGroup(container); createPluginClassGroup(container); setControl(container); PlatformUI.getWorkbench().getHelpSystem().setHelp(container, "org.eclipse.m2m.qvt.oml.transformation_project"); //$NON-NLS-1$ } protected Text createText(Composite parent, ModifyListener listener) { Text text = new Text(parent, SWT.BORDER | SWT.SINGLE); text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); text.addModifyListener(listener); return text; } protected Combo createCombo(Composite parent, int style, int hspan) { Combo c = new Combo(parent, style); c.setFont(parent.getFont()); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = hspan; c.setLayoutData(gd); // Some platforms open up combos in bad sizes without this, see bug 245569 c.setVisibleItemCount(30); return c; } private void createPluginPropertiesGroup(Composite container) { ModifyListener propertiesListener = new ModifyListener() { public void modifyText(ModifyEvent e) { if (myInitialized) { myChangedGroups |= PROPERTIES_GROUP; } validatePage(); } }; Group propertiesGroup = new Group(container, SWT.NONE); propertiesGroup.setLayout(new GridLayout(2, false)); propertiesGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); propertiesGroup.setText(Messages.ContentPage_pGroup); Label label = new Label(propertiesGroup, SWT.NONE); label.setText(Messages.ContentPage_pid); myIdText = createText(propertiesGroup, propertiesListener); label = new Label(propertiesGroup, SWT.NONE); label.setText(Messages.ContentPage_pversion); myVersionText = createText(propertiesGroup, propertiesListener); label = new Label(propertiesGroup, SWT.NONE); label.setText(Messages.ContentPage_pname); myNameText = createText(propertiesGroup, propertiesListener); label = new Label(propertiesGroup, SWT.NONE); label.setText(Messages.ContentPage_pprovider); myProviderText = createText(propertiesGroup, propertiesListener); myExecEnvLabel = new Label(propertiesGroup, SWT.NONE); myExecEnvLabel.setText(Messages.ContentPage_executionenv); myExecEnvCombo = createCombo(propertiesGroup, SWT.READ_ONLY | SWT.BORDER, 1); myExecEnvLabel.setEnabled(JdtProjectIntegrationHelper.isJdtIntegration()); myExecEnvCombo.setEnabled(JdtProjectIntegrationHelper.isJdtIntegration()); JdtProjectIntegrationHelper.fillExecutionEnvironments(myExecEnvCombo); } private void createPluginClassGroup(Composite container) { ModifyListener classListener = new ModifyListener() { public void modifyText(ModifyEvent e) { if (myInitialized) { myChangedGroups |= CLASS_GROUP; } validatePage(); } }; Group classGroup = new Group(container, SWT.NONE); classGroup.setLayout(new GridLayout(2, false)); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; classGroup.setLayoutData(gd); classGroup.setText(Messages.ContentPage_pClassGroup); myGenerateClass = new Button(classGroup, SWT.CHECK); myGenerateClass.setText(Messages.ContentPage_generate); myGenerateClass.setSelection(myData.isDoGenerateClass()); gd = new GridData(); gd.horizontalSpan = 2; myGenerateClass.setLayoutData(gd); myGenerateClass.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { myClassLabel.setEnabled(myGenerateClass.getSelection()); myClassText.setEnabled(myGenerateClass.getSelection()); updateData(); validatePage(); } }); myClassLabel = new Label(classGroup, SWT.NONE); myClassLabel.setText(Messages.ContentPage_classname); myClassLabel.setEnabled(myGenerateClass.getSelection()); gd = new GridData(); gd.horizontalIndent = 20; myClassLabel.setLayoutData(gd); myClassText = createText(classGroup, classListener); myClassText.setEnabled(myGenerateClass.getSelection()); } protected String computeId() { return myMainPage.getProjectName().replaceAll("[^a-zA-Z0-9\\._]", "_"); //$NON-NLS-1$ //$NON-NLS-2$ } private void presetNameField(String id) { StringTokenizer tok = new StringTokenizer(id, "."); //$NON-NLS-1$ while (tok.hasMoreTokens()) { String token = tok.nextToken(); if (!tok.hasMoreTokens()) { myNameText.setText(Character.toUpperCase(token.charAt(0)) + ((token.length() > 1) ? token.substring(1) : "") //$NON-NLS-1$ + " " + getNameFieldQualifier()); //$NON-NLS-1$ } } } private void presetProviderField(String id) { StringTokenizer tok = new StringTokenizer(id, "."); //$NON-NLS-1$ int count = tok.countTokens(); if (count > 2 && tok.nextToken().equals("com")) {//$NON-NLS-1$ myProviderText.setText(tok.nextToken().toUpperCase()); } } private String getNameFieldQualifier() { return Messages.ContentPage_plugin; } @Override public IWizardPage getNextPage() { updateData(); return super.getNextPage(); } public void updateData() { myData.setID(myIdText.getText().trim()); myData.setVersion(myVersionText.getText().trim()); myData.setName(myNameText.getText().trim()); myData.setProviderName(myProviderText.getText().trim()); myData.setfExecutionEnv(myExecEnvCombo.getText().trim()); myData.setClassName(myClassText.getText().trim()); myData.setDoGenerateClass(myGenerateClass.isEnabled() && myGenerateClass.getSelection()); } protected void validatePage() { setMessage(null); String errorMessage = validateProperties(); if (errorMessage == null && myGenerateClass.isEnabled() && myGenerateClass.getSelection()) { IStatus status = JdtProjectIntegrationHelper.validateJavaTypeName(myClassText.getText()); if (status.getSeverity() == IStatus.ERROR) { errorMessage = status.getMessage(); } else if (status.getSeverity() == IStatus.WARNING) { setMessage(status.getMessage(), IMessageProvider.WARNING); } } setErrorMessage(errorMessage); setPageComplete(errorMessage == null); } protected String validateProperties() { String errorMessage = validateId(); if (errorMessage != null) return errorMessage; if (myVersionText.getText().trim().length() == 0) { errorMessage = Messages.ContentPage_noversion; } else if (!isVersionValid(myVersionText.getText().trim())) { errorMessage = Messages.ContentPage_badversion; } else if (myNameText.getText().trim().length() == 0) { errorMessage = Messages.ContentPage_noname; } if (errorMessage != null) return errorMessage; return errorMessage; } private String validateId() { String id = myIdText.getText().trim(); if (id.length() == 0) return Messages.ContentPage_noid; if (!isValidPluginId(id)) { return Messages.ContentPage_invalidId; } return null; } protected boolean isVersionValid(String version) { try { new Version(version); } catch (Exception e) { return false; } return true; } @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { myMainPage.updateData(); String id = computeId(); if ((myChangedGroups & PROPERTIES_GROUP) == 0) { int oldChanged = myChangedGroups; myIdText.setText(id); myVersionText.setText("0.1.0.qualifier"); //$NON-NLS-1$ presetNameField(id); presetProviderField(id); myChangedGroups = oldChanged; } if ((myChangedGroups & CLASS_GROUP) == 0) { int oldChanged = myChangedGroups; String clsField = JdtProjectIntegrationHelper.getClassField(computeId(), "Activator"); //$NON-NLS-1$ myClassText.setText(clsField); myChangedGroups = oldChanged; } if (myInitialized) { validatePage(); } else { myInitialized = true; } boolean isGenerateClassAllowed = myData.isCreateJava(); if(!isGenerateClassAllowed) { myGenerateClass.setSelection(false); } myGenerateClass.setEnabled(isGenerateClassAllowed); myClassText.setEnabled(isGenerateClassAllowed && myGenerateClass.getSelection()); myClassLabel.setEnabled(isGenerateClassAllowed && myGenerateClass.getSelection()); myExecEnvCombo.setEnabled(isGenerateClassAllowed); myExecEnvLabel.setEnabled(isGenerateClassAllowed); myIdText.setFocus(); } } private static boolean isValidPluginId(String name) { if (name.length() <= 0) { return false; } for (int i = 0; i < name.length(); i++) { char c = name.charAt(i); if ((c < 'A' || 'Z' < c) && (c < 'a' || 'z' < c) && (c < '0' || '9' < c) && c != '_') { if (i == 0 || i == name.length() - 1 || c != '.') { return false; } } } return true; } }