package bndtools.wizards.project; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; 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.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import bndtools.Plugin; import bndtools.utils.JavaLangUtils; public class ProjectNameGroup { private static final String PROP_PROJECT_NAME = "projectName"; private static final String PROP_PACKAGE_NAME = "packageName"; private static final String PROP_STATUS = "status"; private final PropertyChangeSupport propSupport = new PropertyChangeSupport(this); private String projectName = ""; private String packageName = ""; private IStatus status = Status.OK_STATUS; private Text txtProjectName; private Text txtBasePackageName; private Button btnInferBasePackageName; /** * @wbp.parser.entryPoint */ public Control createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(2, false)); Label lblProjectName = new Label(composite, SWT.NONE); lblProjectName.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); lblProjectName.setText("Project Name:"); txtProjectName = new Text(composite, SWT.BORDER); txtProjectName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); txtProjectName.setText(projectName); txtProjectName.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String old = projectName; projectName = txtProjectName.getText().trim(); propSupport.firePropertyChange(PROP_PROJECT_NAME, old, projectName); if (btnInferBasePackageName.getSelection()) { txtBasePackageName.setText(toLegalPackageName(projectName)); } } }); Label lblBasePackageName = new Label(composite, SWT.NONE); lblBasePackageName.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); lblBasePackageName.setText("Java Package:"); txtBasePackageName = new Text(composite, SWT.BORDER); txtBasePackageName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); txtBasePackageName.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent ev) { String old = packageName; packageName = txtBasePackageName.getText().trim(); propSupport.firePropertyChange(PROP_PACKAGE_NAME, old, packageName); updateStatus(); } }); @SuppressWarnings("unused") Label lblSpacer1 = new Label(composite, SWT.NONE); btnInferBasePackageName = new Button(composite, SWT.CHECK); btnInferBasePackageName.setText("Derive from project name"); btnInferBasePackageName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); btnInferBasePackageName.setSelection(true); txtBasePackageName.setEnabled(false); btnInferBasePackageName.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean infer = btnInferBasePackageName.getSelection(); txtBasePackageName.setEnabled(!infer); if (infer) { txtBasePackageName.setText(toLegalPackageName(projectName)); } else { txtBasePackageName.setFocus(); } } }); return composite; } private void updateStatus() { String error = validatePackageName(packageName); IStatus oldStatus = status; status = error != null ? new Status(IStatus.ERROR, Plugin.PLUGIN_ID, 0, error, null) : Status.OK_STATUS; if (oldStatus != status) propSupport.firePropertyChange(PROP_STATUS, oldStatus, status); } /** * Validate a Java package name. * * @return null if the package name is legal; an error message if illegal */ static String validatePackageName(String packageName) { if (packageName.isEmpty()) return "Package name may not be empty"; String[] parts = packageName.split("\\.", -1); for (String part : parts) { if (part.isEmpty()) return "Package name part may not be empty"; char firstChar = part.charAt(0); if (!Character.isJavaIdentifierStart(firstChar)) return "Illegal character at start of package name part: " + firstChar; for (int i = 1; i < part.length(); i++) { char ch = part.charAt(i); if (!Character.isJavaIdentifierPart(ch)) return "Illegal character in package name part: " + ch; } if (JavaLangUtils.isKeyword(part) || JavaLangUtils.isReserved(part)) return "Invalid package name. '" + part + "' is not a valid Java identifier"; } // Orl Korrect return null; } /** * Convert a string to a legal package name */ static String toLegalPackageName(String input) throws IllegalArgumentException { if (input.isEmpty()) return ""; String[] parts = input.split("\\.", -1); List<String> newParts = new ArrayList<>(parts.length); for (String part : parts) { StringBuilder builder = new StringBuilder(); if (!part.isEmpty()) { char firstChar = part.charAt(0); if (Character.isJavaIdentifierStart(firstChar)) builder.append(firstChar); else if (Character.isJavaIdentifierPart(firstChar)) builder.append('_').append(firstChar); else if ('-' == firstChar) builder.append('-'); for (int i = 1; i < part.length(); i++) { char ch = part.charAt(i); if (Character.isJavaIdentifierPart(ch)) { builder.append(ch); } else if ('-' == ch) { builder.append('_'); } } } String newPart = builder.toString(); if (!newPart.isEmpty()) newParts.add(newPart); } StringBuilder builder = new StringBuilder(); for (int i = 0; i < newParts.size(); i++) { if (i > 0) builder.append('.'); builder.append(newParts.get(i)); } return builder.toString(); } public String getProjectName() { return projectName; } public String getPackageName() { return packageName; } public IStatus getStatus() { return status; } public void addPropertyChangeListener(PropertyChangeListener var0) { propSupport.addPropertyChangeListener(var0); } public void removePropertyChangeListener(PropertyChangeListener var0) { propSupport.removePropertyChangeListener(var0); } }