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.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.ide.common.util.escaping_;
import com.redhat.ceylon.model.typechecker.model.Declaration;
public class MoveOutInputPage extends UserInputWizardPage {
public MoveOutInputPage(String name) {
super(name);
}
public void createControl(Composite parent) {
Composite result = new Composite(parent, SWT.NONE);
setControl(result);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
result.setLayout(layout);
Declaration dm = ((Tree.Declaration) getMoveOutRefactoring().node)
.getDeclarationModel();
Label desc = new Label(result, SWT.RIGHT);
GridData gd = new GridData();
gd.horizontalSpan=2;
desc.setLayoutData(gd);
desc.setText("Move '" +
dm.getName() +
"()' out of the type '" +
((Declaration) dm.getContainer()).getName() +
"', and add a parameter.");
GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
gd2.horizontalSpan=2;
new Label(result, SWT.SEPARATOR|SWT.HORIZONTAL).setLayoutData(gd2);
Label label = new Label(result, SWT.RIGHT);
label.setText("Parameter name: ");
final Text text = new Text(result, SWT.SINGLE|SWT.BORDER);
text.setText(getMoveOutRefactoring().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);
getMoveOutRefactoring().setNewName(name);
}
});
final Button checkbox = new Button(result, SWT.CHECK);
checkbox.setText("Make referenced locals shared");
checkbox.setSelection(true);
checkbox.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent event) {
getMoveOutRefactoring().setMakeShared();
}
@Override
public void widgetDefaultSelected(SelectionEvent event) {}
});
final Button delegate = new Button(result, SWT.CHECK);
delegate.setText("Leave original as delegate");
delegate.setSelection(false);
delegate.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent event) {
getMoveOutRefactoring().setLeaveDelegate();
}
@Override
public void widgetDefaultSelected(SelectionEvent event) {}
});
delegate.setEnabled(getMoveOutRefactoring().isMethod());
text.addKeyListener(new SubwordIterator(text));
text.selectAll();
text.setFocus();
}
private MoveOutRefactoring getMoveOutRefactoring() {
return (MoveOutRefactoring) getRefactoring();
}
void validateIdentifier(String name) {
if (!name.matches("^[a-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 {
setErrorMessage(null);
setPageComplete(true);
}
}
}