package com.redhat.ceylon.eclipse.code.refactor; 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.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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 com.redhat.ceylon.ide.common.util.escaping_; import com.redhat.ceylon.model.typechecker.model.Declaration; import com.redhat.ceylon.model.typechecker.model.TypeDeclaration; import com.redhat.ceylon.model.typechecker.model.TypedDeclaration; public class RenameInputPage extends UserInputWizardPage { public RenameInputPage(String name) { super(name); } public void createControl(Composite parent) { Composite result = new Composite(parent, SWT.NONE); setControl(result); GridLayout layout = new GridLayout(); layout.numColumns = 3; result.setLayout(layout); Label title = new Label(result, SWT.LEFT); Declaration declaration = getRenameRefactoring().getDeclaration(); String name = declaration.getName(); title.setText("Rename " + getRenameRefactoring().getCount() + " occurrences of declaration '" + name + "'."); GridData gd = new GridData(); gd.horizontalSpan=3; title.setLayoutData(gd); GridData gd2 = new GridData(GridData.FILL_HORIZONTAL); gd2.horizontalSpan=3; new Label(result, SWT.SEPARATOR|SWT.HORIZONTAL).setLayoutData(gd2); Label label = new Label(result, SWT.RIGHT); label.setText("Rename to: "); final Text text = new Text(result, SWT.SINGLE|SWT.BORDER); GridData gd3 = new GridData(); gd3.horizontalSpan=2; text.setLayoutData(gd3); text.setText(getRenameRefactoring().getNewName()); text.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { String name = text.getText(); validateIdentifier(name); getRenameRefactoring().setNewName(name); } }); text.addKeyListener(new SubwordIterator(text)); text.selectAll(); text.setFocus(); final Button renameSourceFile = new Button(result, SWT.CHECK); GridData gd4 = new GridData(GridData.FILL_HORIZONTAL); gd4.horizontalSpan=3; gd4.grabExcessHorizontalSpace=true; renameSourceFile.setLayoutData(gd4); String filename = declaration.getUnit().getFilename(); renameSourceFile.setText("Also rename source file '" + filename + "'"); renameSourceFile.setSelection(getRenameRefactoring().isRenameFile()); renameSourceFile.setEnabled(filename.endsWith(".ceylon")); renameSourceFile.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { getRenameRefactoring().setRenameFile(renameSourceFile.getSelection()); } @Override public void widgetDefaultSelected(SelectionEvent e) {} }); final Button renameLocals = new Button(result, SWT.CHECK); renameLocals.setLayoutData(gd4); boolean typeDec = declaration instanceof TypeDeclaration; String txt = "Rename similarly-named values and functions"; if (typeDec) txt += " of type '" + declaration.getName() + "'"; renameLocals.setText(txt); renameLocals.setSelection(getRenameRefactoring().isRenameValuesAndFunctions()); renameLocals.setEnabled(typeDec); renameLocals.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { getRenameRefactoring().setRenameValuesAndFunctions(renameLocals.getSelection()); } @Override public void widgetDefaultSelected(SelectionEvent e) {} }); } private RenameRefactoring getRenameRefactoring() { return (RenameRefactoring) getRefactoring(); } void validateIdentifier(String name) { if (!name.matches("^[a-zA-Z_]\\w*$")) { setErrorMessage("Not a legal Ceylon identifier"); setPageComplete(false); } else if (escaping_.get_().isKeyword(name)) { setErrorMessage("'" + name + "' is a Ceylon keyword"); setPageComplete(false); } else { int ch = name.codePointAt(0); Declaration declaration = getRenameRefactoring().getDeclaration(); if (declaration instanceof TypedDeclaration) { if (!Character.isLowerCase(ch) && ch!='_') { setErrorMessage("Not an initial lowercase identifier"); setPageComplete(false); } else { setErrorMessage(null); setPageComplete(true); } } else if (declaration instanceof TypeDeclaration) { if (!Character.isUpperCase(ch)) { setErrorMessage("Not an initial uppercase identifier"); setPageComplete(false); } else { setErrorMessage(null); setPageComplete(true); } } } } }