/**
* Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* Created on Apr 8, 2006
*/
package com.python.pydev.refactoring.wizards.rename;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
import org.eclipse.swt.SWT;
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;
import org.python.pydev.core.docutils.PyStringUtils;
import org.python.pydev.editor.refactoring.IPyRefactoringRequest;
import org.python.pydev.editor.refactoring.MultiModuleMoveRefactoringRequest;
import org.python.pydev.plugin.preferences.PydevPrefs;
import org.python.pydev.shared_core.string.StringUtils;
import com.python.pydev.refactoring.wizards.TextInputWizardPage;
public class PyRenameRefactoringWizard extends RefactoringWizard {
private static final String UPDATE_REFERENCES = "UPDATE_REFERENCES";
private static final String SIMPLE_RESOURCE_RENAME = "SIMPLE_RESOURCE_RENAME";
private final String fInputPageDescription;
private IPyRefactoringRequest fRequest;
private TextInputWizardPage inputPage;
private String fInitialSetting;
public PyRenameRefactoringWizard(Refactoring refactoring, String defaultPageTitle, String inputPageDescription,
IPyRefactoringRequest request) {
super(refactoring, DIALOG_BASED_USER_INTERFACE);
setDefaultPageTitle(defaultPageTitle);
fInputPageDescription = inputPageDescription;
this.fRequest = request;
this.fInitialSetting = request.getInitialName();
Assert.isNotNull(this.fInitialSetting);
}
/* non java-doc
* @see RefactoringWizard#addUserInputPages
*/
@Override
protected void addUserInputPages() {
inputPage = createInputPage(fInputPageDescription, fInitialSetting);
addPage(inputPage);
}
protected TextInputWizardPage createInputPage(String message, final String initialSetting) {
return new TextInputWizardPage(message, true, initialSetting) {
private Text textField;
private IFile targetFile;
@Override
protected RefactoringStatus validateTextField(String text) {
RefactoringStatus status = new RefactoringStatus();
boolean acceptPoint = fRequest.isModuleRenameRefactoringRequest();
if (PyStringUtils.isValidIdentifier(text, acceptPoint)) {
fRequest.setInputName(text);
} else {
status.addFatalError("The name: " + text + " is not a valid identifier.");
}
return status;
}
@Override
protected Text createTextInputField(Composite parent, int style) {
Text ret = super.createTextInputField(parent, style);
this.textField = ret;
setTextToFullName();
return ret;
}
private void setTextToResourceName() {
if (targetFile != null) {
String curr = targetFile.getName();
textField.setText(curr);
int i = curr.lastIndexOf('.');
if (i >= 0) {
textField.setSelection(0, i);
} else {
textField.selectAll();
}
}
}
private void setTextToFullName() {
textField.setText(initialSetting);
String text = initialSetting;
int i = text.lastIndexOf('.');
if (i >= 0) {
textField.setSelection(i + 1, text.length());
} else {
textField.selectAll();
}
}
@Override
protected void textModified(String text) {
if (targetFile != null && fRequest.getSimpleResourceRename()) {
if (!isEmptyInputValid() && text.equals("")) { //$NON-NLS-1$
setPageComplete(false);
setErrorMessage(null);
restoreMessage();
return;
}
if ((!isInitialInputValid()) && text.equals(targetFile.getName())) {
setPageComplete(false);
setErrorMessage(null);
restoreMessage();
return;
}
setPageComplete(validateTextField(text));
}
if (fRequest instanceof MultiModuleMoveRefactoringRequest) {
RefactoringStatus status;
if (text.length() == 0) {
//Accept empty for move!
status = new RefactoringStatus();
status.addInfo("Empty text: move to source folder");
} else {
status = validateTextField(text);
}
if (!status.hasFatalError()) {
fRequest.setInputName(text);
}
setPageComplete(status);
} else {
super.textModified(text);
}
}
@Override
public void createControl(Composite parent) {
Composite superComposite = new Composite(parent, SWT.NONE);
setControl(superComposite);
initializeDialogUnits(superComposite);
superComposite.setLayout(new GridLayout());
Composite composite = new Composite(superComposite, SWT.NONE);
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridLayout layout = new GridLayout();
layout.numColumns = 4;
layout.verticalSpacing = 8;
composite.setLayout(layout);
Label label = new Label(composite, SWT.NONE);
label.setText("New &value:");
final Text text = createTextInputField(composite);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = convertWidthInCharsToPixels(25);
gd.horizontalSpan = 3;
text.setLayoutData(gd);
// layouter.perform(label, text, 1);
//
if (fRequest.isModuleRenameRefactoringRequest()) {
Button updateReferencesButton = addOptionalUpdateReferencesCheckbox(composite);
IFile targetFile = fRequest.getIFileResource();
if (targetFile != null) {
this.targetFile = targetFile;
addResourceRenameCheckbox(composite, updateReferencesButton);
}
}
//spacer
new Label(composite, SWT.NONE);
Button bt = new Button(composite, SWT.PUSH);
bt.setText("as_&lower_underscore");
bt.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
text.setText(StringUtils.asStyleLowercaseUnderscores(text.getText()));
}
});
Button bt2 = new Button(composite, SWT.PUSH);
bt2.setText("CamelCaseFirst&Upper");
bt2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
text.setText(StringUtils.asStyleCamelCaseFirstUpper(text.getText()));
}
});
Button bt3 = new Button(composite, SWT.PUSH);
bt3.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
text.setText(StringUtils.asStyleCamelCaseFirstLower(text.getText()));
}
});
bt3.setText("&camelCaseFirstLower");
// addOptionalUpdateTextualMatches(composite, layouter);
// addOptionalUpdateQualifiedNameComponent(composite, layouter, layout.marginWidth);
Dialog.applyDialogFont(superComposite);
}
protected Button addResourceRenameCheckbox(Composite result, final Button updateReferencesButton) {
final Button resourceRename = new Button(result, SWT.CHECK);
resourceRename.setText("&Simple Resource Rename / Change Extension?");
IPreferenceStore preferences = PydevPrefs.getPreferences();
preferences.setDefault(SIMPLE_RESOURCE_RENAME, false); //Default is always false to rename resources.
boolean simpleResourceRenameBool = preferences.getBoolean(SIMPLE_RESOURCE_RENAME);
resourceRename.setSelection(simpleResourceRenameBool);
fRequest.setSimpleResourceRename(simpleResourceRenameBool);
resourceRename.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IPreferenceStore preferences = PydevPrefs.getPreferences();
boolean simpleResourceRenameBool = resourceRename.getSelection();
updateReferencesButton.setVisible(!simpleResourceRenameBool);
preferences.setValue(SIMPLE_RESOURCE_RENAME, simpleResourceRenameBool);
fRequest.setSimpleResourceRename(simpleResourceRenameBool);
// Must be the last thing.
if (simpleResourceRenameBool) {
setTextToResourceName();
} else {
setTextToFullName();
}
}
});
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
resourceRename.setLayoutData(gridData);
updateReferencesButton.setVisible(!simpleResourceRenameBool);
if (simpleResourceRenameBool) {
setTextToResourceName();
}
return resourceRename;
}
protected Button addOptionalUpdateReferencesCheckbox(Composite result) {
final Button updateReferences = new Button(result, SWT.CHECK);
updateReferences.setText("&Update References?");
IPreferenceStore preferences = PydevPrefs.getPreferences();
preferences.setDefault(UPDATE_REFERENCES, true); //Default is always true to update references.
boolean updateRefs = preferences.getBoolean(UPDATE_REFERENCES);
updateReferences.setSelection(updateRefs);
fRequest.setUpdateReferences(updateRefs);
updateReferences.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IPreferenceStore preferences = PydevPrefs.getPreferences();
boolean updateRefs = updateReferences.getSelection();
preferences.setValue(UPDATE_REFERENCES, updateRefs);
fRequest.setUpdateReferences(updateRefs);
}
});
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
updateReferences.setLayoutData(gridData);
return updateReferences;
}
};
}
}