package gr.uom.java.jdeodorant.refactoring.views; import gr.uom.java.jdeodorant.refactoring.manipulators.ExtractClassRefactoring; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.ltk.ui.refactoring.UserInputWizardPage; 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.Label; import org.eclipse.swt.widgets.Text; public class ExtractClassInputPage extends UserInputWizardPage { private ExtractClassRefactoring refactoring; private IPackageFragment parentPackage; private List<String> parentPackageClassNames; private List<String> javaLangClassNames; private Map<Text, String> textMap; private Map<Text, String> defaultNamingMap; public ExtractClassInputPage(ExtractClassRefactoring refactoring) { super("Extracted Class Name"); this.refactoring = refactoring; ICompilationUnit sourceCompilationUnit = (ICompilationUnit)refactoring.getSourceCompilationUnit().getJavaElement(); this.parentPackage = (IPackageFragment)sourceCompilationUnit.getParent(); this.parentPackageClassNames = new ArrayList<String>(); try { for(ICompilationUnit compilationUnit : parentPackage.getCompilationUnits()) { String className = compilationUnit.getElementName(); parentPackageClassNames.add(className.substring(0, className.indexOf(".java"))); } } catch (JavaModelException e) { e.printStackTrace(); } this.javaLangClassNames = new ArrayList<String>(); this.javaLangClassNames.add("Boolean"); this.javaLangClassNames.add("Byte"); this.javaLangClassNames.add("Character"); this.javaLangClassNames.add("Class"); this.javaLangClassNames.add("Double"); this.javaLangClassNames.add("Enum"); this.javaLangClassNames.add("Error"); this.javaLangClassNames.add("Exception"); this.javaLangClassNames.add("Float"); this.javaLangClassNames.add("Integer"); this.javaLangClassNames.add("Long"); this.javaLangClassNames.add("Math"); this.javaLangClassNames.add("Number"); this.javaLangClassNames.add("Object"); this.javaLangClassNames.add("Package"); this.javaLangClassNames.add("Process"); this.javaLangClassNames.add("Runtime"); this.javaLangClassNames.add("Short"); this.javaLangClassNames.add("String"); this.javaLangClassNames.add("StringBuffer"); this.javaLangClassNames.add("StringBuilder"); this.javaLangClassNames.add("System"); this.javaLangClassNames.add("Thread"); this.javaLangClassNames.add("Void"); this.textMap = new LinkedHashMap<Text, String>(); this.defaultNamingMap = new LinkedHashMap<Text, String>(); } public void createControl(Composite parent) { Composite result= new Composite(parent, SWT.NONE); setControl(result); GridLayout layout= new GridLayout(); layout.numColumns= 2; result.setLayout(layout); Label extractedClassNameLabel = new Label(result, SWT.NONE); extractedClassNameLabel.setText("Extracted Class Name"); extractedClassNameLabel.setFont(MyRefactoringWizard.INPUT_PAGE_FONT); Text extractedClassNameField = new Text(result, SWT.SINGLE | SWT.LEFT | SWT.BORDER); extractedClassNameField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); extractedClassNameField.setText(refactoring.getExtractedTypeName()); textMap.put(extractedClassNameField, refactoring.getExtractedTypeName()); defaultNamingMap.put(extractedClassNameField, refactoring.getExtractedTypeName()); final Button restoreButton = new Button(result, SWT.PUSH); restoreButton.setText("Restore Defaults"); final Button delegateButton = new Button(result, SWT.CHECK); delegateButton.setText("Keep original public methods as delegates to the extracted methods"); for(Text field : textMap.keySet()) { field.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { handleInputChanged(); } }); } restoreButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { for(Text field : defaultNamingMap.keySet()) { field.setText(defaultNamingMap.get(field)); } delegateButton.setSelection(false); refactoring.setLeaveDelegateForPublicMethods(false); } }); delegateButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { Button source = (Button)event.getSource(); if(source.getSelection()) refactoring.setLeaveDelegateForPublicMethods(true); else refactoring.setLeaveDelegateForPublicMethods(false); } }); handleInputChanged(); } private void handleInputChanged() { String classNamePattern = "[a-zA-Z_][a-zA-Z0-9_]*"; for(Text text : textMap.keySet()) { if(!Pattern.matches(classNamePattern, text.getText())) { setPageComplete(false); String message = "Type name \"" + text.getText() + "\" is not valid"; setMessage(message, ERROR); return; } else if(parentPackageClassNames.contains(text.getText())) { setPageComplete(false); String message = "A Type named \"" + text.getText() + "\" already exists in package " + parentPackage.getElementName(); setMessage(message, ERROR); return; } else if(javaLangClassNames.contains(text.getText())) { setPageComplete(false); String message = "Type \"" + text.getText() + "\" already exists in package java.lang"; setMessage(message, ERROR); return; } else { refactoring.setExtractedTypeName(text.getText()); } } setPageComplete(true); setMessage("", NONE); } }