/*******************************************************************************
* Copyright (c) 2004, 2009 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Emanuel Graf (Institute for Software, HSR Hochschule fuer Technik)
* Sergey Prigogin (Google)
******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.rename;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.window.Window;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.osgi.util.NLS;
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.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 org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
import org.eclipse.cdt.core.CConventions;
/**
* Input page added to the standard refactoring wizard.
*/
public class CRenameRefactoringInputPage extends UserInputWizardPage {
public static final String PAGE_NAME = "RenameRefactoringPage"; //$NON-NLS-1$
final CRenameRefactoringPreferences fPreferences;
private String fSearchString;
private int fOptions;
private int fForcePreviewOptions= 0;
private int fExhaustiveSearchEnablingOptions;
private Text fNewName;
private Button fDoVirtual;
private Button fWorkspace;
private Button fDependent;
private Button fInComment;
private Button fInString;
private Button fInInclude;
private Button fInInactiveCode;
private Button fReferences;
private Button fSingle;
private Button fWorkingSet;
private Text fWorkingSetSpec;
private Button fWorkingSetButton;
private Button fInMacro;
private Button fInPreprocessor;
private Button fExhausiveFileSearch;
public CRenameRefactoringInputPage() {
super(PAGE_NAME);
fPreferences = new CRenameRefactoringPreferences();
}
private boolean hasOption(int options) {
return (fOptions & options) == options;
}
// overrider
public void createControl(Composite parent) {
CRenameProcessor processor= getRenameProcessor();
fSearchString= processor.getArgument().getName();
fOptions= processor.getAvailableOptions();
fForcePreviewOptions= processor.getOptionsForcingPreview();
fExhaustiveSearchEnablingOptions= processor.getOptionsEnablingExhaustiveSearch();
Composite top= new Composite(parent, SWT.NONE);
initializeDialogUnits(top);
setControl(top);
top.setLayout(new GridLayout(2, false));
// New name
Composite group= top;
GridData gd;
GridLayout gl;
Label label= new Label(top, SWT.NONE);
label.setText(RenameMessages.CRenameRefactoringInputPage_label_newName);
fNewName= new Text(top, SWT.BORDER);
String name = processor.getReplacementText();
if (name == null) {
name = fSearchString;
}
fNewName.setText(name);
fNewName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fNewName.selectAll();
if (hasOption(CRefactory.OPTION_DO_VIRTUAL)) {
fDoVirtual= new Button(top, SWT.CHECK);
fDoVirtual.setText(RenameMessages.CRenameRefactoringInputPage_renameBaseAndDerivedMethods);
fDoVirtual.setLayoutData(gd= new GridData());
gd.horizontalSpan= 2;
}
boolean skippedLine= false;
group= null;
if (hasOption(CRefactory.OPTION_IN_CODE_REFERENCES)) {
group= createLabelAndGroup(group, skippedLine, top);
fReferences= new Button(group, SWT.CHECK);
fReferences.setText(RenameMessages.CRenameRefactoringInputPage_button_sourceCode);
}
if (hasOption(CRefactory.OPTION_IN_INACTIVE_CODE)) {
group= createLabelAndGroup(group, skippedLine, top);
fInInactiveCode= new Button(group, SWT.CHECK);
fInInactiveCode.setText(RenameMessages.CRenameRefactoringInputPage_button_inactiveCode);
}
if (hasOption(CRefactory.OPTION_IN_COMMENT)) {
group= createLabelAndGroup(group, skippedLine, top);
fInComment= new Button(group, SWT.CHECK);
fInComment.setText(RenameMessages.CRenameRefactoringInputPage_button_comments);
}
if (hasOption(CRefactory.OPTION_IN_STRING_LITERAL)) {
group= createLabelAndGroup(group, skippedLine, top);
fInString= new Button(group, SWT.CHECK);
fInString.setText(RenameMessages.CRenameRefactoringInputPage_button_strings);
}
if (hasOption(CRefactory.OPTION_IN_MACRO_DEFINITION)) {
group= createLabelAndGroup(group, skippedLine, top);
fInMacro= new Button(group, SWT.CHECK);
fInMacro.setText(RenameMessages.CRenameRefactoringInputPage_button_macroDefinitions);
}
if (hasOption(CRefactory.OPTION_IN_INCLUDE_DIRECTIVE)) {
group= createLabelAndGroup(group, skippedLine, top);
fInInclude= new Button(group, SWT.CHECK);
fInInclude.setText(RenameMessages.CRenameRefactoringInputPage_button_includes);
}
if (hasOption(CRefactory.OPTION_IN_PREPROCESSOR_DIRECTIVE)) {
group= createLabelAndGroup(group, skippedLine, top);
fInPreprocessor= new Button(group, SWT.CHECK);
fInPreprocessor.setText(RenameMessages.CRenameRefactoringInputPage_button_preprocessor);
}
if (hasOption(CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH)) {
skipLine(top);
fExhausiveFileSearch= new Button(top, SWT.CHECK);
fExhausiveFileSearch.setText(RenameMessages.CRenameRefactoringInputPage_button_exhaustiveFileSearch);
fExhausiveFileSearch.setLayoutData(gd= new GridData());
gd.horizontalIndent= 5;
gd.horizontalSpan= 2;
// Specify the scope.
group= new Composite(top, SWT.NONE);
group.setLayoutData(gd= new GridData(GridData.FILL_HORIZONTAL));
gd.horizontalSpan= 2;
gd.horizontalIndent= 16;
group.setLayout(gl= new GridLayout(4, false));
gl.marginHeight= 0;
gl.marginLeft = gl.marginWidth;
gl.marginWidth = 0;
fWorkspace= new Button(group, SWT.RADIO);
fWorkspace.setText(RenameMessages.CRenameRefactoringInputPage_button_workspace);
fWorkspace.setLayoutData(gd= new GridData());
fDependent= new Button(group, SWT.RADIO);
fDependent.setText(RenameMessages.CRenameRefactoringInputPage_button_relatedProjects);
fDependent.setLayoutData(gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
gd.horizontalIndent= 8;
fSingle= new Button(group, SWT.RADIO);
fSingle.setText(RenameMessages.CRenameRefactoringInputPage_button_singleProject);
fSingle.setLayoutData(gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
gd.horizontalIndent= 8;
gd.horizontalSpan= 2;
fWorkingSet= new Button(group, SWT.RADIO);
fWorkingSet.setText(RenameMessages.CRenameRefactoringInputPage_button_workingSet);
fWorkingSetSpec= new Text(group, SWT.SINGLE|SWT.BORDER|SWT.READ_ONLY);
fWorkingSetSpec.setLayoutData(gd= new GridData(GridData.FILL_HORIZONTAL));
gd.horizontalIndent= 8;
gd.horizontalSpan= 2;
fWorkingSetButton= new Button(group, SWT.PUSH);
fWorkingSetButton.setText(RenameMessages.CRenameRefactoringInputPage_button_chooseWorkingSet);
setButtonLayoutData(fWorkingSetButton);
}
Dialog.applyDialogFont(top);
hookSelectionListeners();
readPreferences();
onSelectOption(); // transfers the option to the refactoring / enablement
updatePageComplete();
}
private Composite createLabelAndGroup(Composite group, boolean skippedLine, Composite top) {
if (group != null) {
return group;
}
if (!skippedLine) {
skipLine(top);
}
GridData gd;
Label label = new Label(top, SWT.NONE);
label.setText(RenameMessages.CRenameRefactoringInputPage_label_updateWithin);
label.setLayoutData(gd= new GridData());
gd.horizontalSpan= 2;
group= new Composite(top, SWT.NONE);
group.setLayoutData(gd= new GridData());
gd.horizontalSpan= 2;
group.setLayout(new GridLayout(1, true));
return group;
}
private void skipLine(Composite top) {
new Label(top, SWT.NONE);
new Label(top, SWT.NONE);
}
private void hookSelectionListeners() {
fNewName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
onKeyReleaseInNameField();
}
});
registerScopeListener(fWorkspace, TextSearchWrapper.SCOPE_WORKSPACE);
registerScopeListener(fDependent, TextSearchWrapper.SCOPE_RELATED_PROJECTS);
registerScopeListener(fSingle, TextSearchWrapper.SCOPE_SINGLE_PROJECT);
registerScopeListener(fWorkingSet, TextSearchWrapper.SCOPE_WORKING_SET);
if (fWorkingSetButton != null) {
fWorkingSetButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onSelectWorkingSet();
}
});
}
SelectionListener listenOption= new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onSelectOption();
}
};
registerOptionListener(fDoVirtual, listenOption);
registerOptionListener(fReferences, listenOption);
registerOptionListener(fInComment, listenOption);
registerOptionListener(fInInactiveCode, listenOption);
registerOptionListener(fInInclude, listenOption);
registerOptionListener(fInMacro, listenOption);
registerOptionListener(fInString, listenOption);
registerOptionListener(fInPreprocessor, listenOption);
registerOptionListener(fExhausiveFileSearch, listenOption);
}
private void registerScopeListener(Button button, final int scope) {
if (button != null) {
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onSelectedScope(scope);
}
});
}
}
private void registerOptionListener(Button button, SelectionListener listenOption) {
if (button != null) {
button.addSelectionListener(listenOption);
}
}
protected void onSelectedScope(int scope) {
getRenameProcessor().setExhaustiveSearchScope(scope);
updateEnablement();
}
private void onSelectOption() {
int selectedOptions= computeSelectedOptions();
boolean forcePreview= fForcePreviewOptions == -1 ||
(selectedOptions & fForcePreviewOptions) != 0;
getRenameProcessor().setSelectedOptions(selectedOptions);
getRefactoringWizard().setForcePreviewReview(forcePreview);
updateEnablement();
}
protected void onKeyReleaseInNameField() {
getRenameProcessor().setReplacementText(fNewName.getText());
updatePageComplete();
}
@Override
public void dispose() {
storePreferences();
super.dispose();
}
private void readPreferences() {
CRenameProcessor processor= getRenameProcessor();
if (fWorkspace != null) {
int scope = fPreferences.getScope();
switch (scope) {
case TextSearchWrapper.SCOPE_WORKSPACE:
fWorkspace.setSelection(true);
break;
case TextSearchWrapper.SCOPE_SINGLE_PROJECT:
fSingle.setSelection(true);
break;
case TextSearchWrapper.SCOPE_WORKING_SET:
fWorkingSet.setSelection(true);
break;
default:
scope= TextSearchWrapper.SCOPE_RELATED_PROJECTS;
fDependent.setSelection(true);
break;
}
processor.setExhaustiveSearchScope(scope);
String workingSet= fPreferences.getWorkingSet();
processor.setWorkingSetName(workingSet); // CRenameProcessor validates the working set name.
fWorkingSetSpec.setText(processor.getWorkingSetName());
}
if (fDoVirtual != null) {
boolean val= !fPreferences.getBoolean(CRenameRefactoringPreferences.KEY_IGNORE_VIRTUAL);
fDoVirtual.setSelection(val);
}
if (fReferences != null) {
boolean val= !fPreferences.getBoolean(CRenameRefactoringPreferences.KEY_REFERENCES_INV);
fReferences.setSelection(val);
}
initOption(fInInactiveCode, CRenameRefactoringPreferences.KEY_INACTIVE);
initOption(fInComment, CRenameRefactoringPreferences.KEY_COMMENT);
initOption(fInString, CRenameRefactoringPreferences.KEY_STRING);
initOption(fInInclude, CRenameRefactoringPreferences.KEY_INCLUDE);
initOption(fInMacro, CRenameRefactoringPreferences.KEY_MACRO_DEFINITION);
initOption(fInPreprocessor, CRenameRefactoringPreferences.KEY_PREPROCESSOR);
initOption(fExhausiveFileSearch, CRenameRefactoringPreferences.KEY_EXHAUSTIVE_FILE_SEARCH);
}
private int computeSelectedOptions() {
int options= fPreferences.getOptions();
options = updateOptions(options, fDoVirtual, CRefactory.OPTION_DO_VIRTUAL);
options = updateOptions(options, fInInactiveCode, CRefactory.OPTION_IN_INACTIVE_CODE);
options = updateOptions(options, fInComment, CRefactory.OPTION_IN_COMMENT);
options = updateOptions(options, fInString, CRefactory.OPTION_IN_STRING_LITERAL);
options = updateOptions(options, fInInclude, CRefactory.OPTION_IN_INCLUDE_DIRECTIVE);
options = updateOptions(options, fInMacro, CRefactory.OPTION_IN_MACRO_DEFINITION);
options = updateOptions(options, fInPreprocessor, CRefactory.OPTION_IN_PREPROCESSOR_DIRECTIVE);
options = updateOptions(options, fReferences, CRefactory.OPTION_IN_CODE_REFERENCES);
options = updateOptions(options, fExhausiveFileSearch, CRefactory.OPTION_EXHAUSTIVE_FILE_SEARCH);
return options;
}
private int updateOptions(int options, Button button, int optionMask) {
if (button == null)
return options;
if (button.getSelection()) {
return options | optionMask;
} else {
return options & ~optionMask;
}
}
private void initOption(Button button, String key) {
initOption(button, key, false);
}
private void initOption(Button button, String key, boolean defaultValue) {
if (button != null) {
boolean val= fPreferences.getBoolean(key, defaultValue);
button.setSelection(val);
}
}
private void storePreferences() {
if (fWorkspace != null) {
int choice= TextSearchWrapper.SCOPE_RELATED_PROJECTS;
if (fWorkspace.getSelection()) {
choice= TextSearchWrapper.SCOPE_WORKSPACE;
} else if (fSingle.getSelection()) {
choice= TextSearchWrapper.SCOPE_SINGLE_PROJECT;
} else if (fWorkingSet.getSelection()) {
choice= TextSearchWrapper.SCOPE_WORKING_SET;
}
fPreferences.put(CRenameRefactoringPreferences.KEY_SCOPE, choice);
fPreferences.put(CRenameRefactoringPreferences.KEY_WORKING_SET_NAME, fWorkingSetSpec.getText());
}
if (fDoVirtual != null) {
fPreferences.put(CRenameRefactoringPreferences.KEY_IGNORE_VIRTUAL, !fDoVirtual.getSelection());
}
if (fReferences != null) {
fPreferences.put(CRenameRefactoringPreferences.KEY_REFERENCES_INV, !fReferences.getSelection());
}
if (fInComment != null) {
fPreferences.put(CRenameRefactoringPreferences.KEY_COMMENT, fInComment.getSelection());
}
if (fInString != null) {
fPreferences.put(CRenameRefactoringPreferences.KEY_STRING, fInString.getSelection());
}
if (fInInclude != null) {
fPreferences.put(CRenameRefactoringPreferences.KEY_INCLUDE, fInInclude.getSelection());
}
if (fInPreprocessor != null) {
fPreferences.put(CRenameRefactoringPreferences.KEY_PREPROCESSOR, fInPreprocessor.getSelection());
}
if (fInMacro != null) {
fPreferences.put(CRenameRefactoringPreferences.KEY_MACRO_DEFINITION, fInMacro.getSelection());
}
if (fInInactiveCode != null) {
fPreferences.put(CRenameRefactoringPreferences.KEY_INACTIVE, fInInactiveCode.getSelection());
}
if (fExhausiveFileSearch != null) {
fPreferences.put(CRenameRefactoringPreferences.KEY_EXHAUSTIVE_FILE_SEARCH, fExhausiveFileSearch.getSelection());
}
}
protected void onSelectWorkingSet() {
CRenameProcessor processor= getRenameProcessor();
String wsName= fWorkingSetSpec.getText();
IWorkingSetManager wsManager= PlatformUI.getWorkbench().getWorkingSetManager();
IWorkingSetSelectionDialog dlg=
wsManager.createWorkingSetSelectionDialog(getShell(), false);
IWorkingSet currentWorkingSet= wsManager.getWorkingSet(wsName);
if (currentWorkingSet != null) {
dlg.setSelection(new IWorkingSet[] { currentWorkingSet });
}
IWorkingSet ws= null;
if (dlg.open() == Window.OK) {
IWorkingSet wsa[]= dlg.getSelection();
if (wsa != null && wsa.length > 0) {
ws= wsa[0];
}
if (ws != null) {
fWorkspace.setSelection(false);
fDependent.setSelection(false);
fSingle.setSelection(false);
fWorkingSet.setSelection(true);
processor.setExhaustiveSearchScope(TextSearchWrapper.SCOPE_WORKING_SET);
wsName= ws.getName();
}
}
processor.setWorkingSetName(wsName); // CRenameProcessor validates the working set name.
fWorkingSetSpec.setText(processor.getWorkingSetName());
updateEnablement();
}
protected void updatePageComplete() {
String txt= fNewName.getText();
if (txt.length() == 0 || txt.equals(fSearchString)) {
setErrorMessage(null);
setPageComplete(false);
} else if (!CConventions.isValidIdentifier(txt)) {
setErrorMessage(NLS.bind(RenameMessages.CRenameRefactoringInputPage_errorInvalidIdentifier, txt));
setPageComplete(false);
} else {
setErrorMessage(null);
setPageComplete(true);
}
}
protected void updateEnablement() {
if (fExhausiveFileSearch != null) {
boolean enable= fExhaustiveSearchEnablingOptions == -1 ||
(computeSelectedOptions() & fExhaustiveSearchEnablingOptions) != 0;
fExhausiveFileSearch.setEnabled(enable);
enable = enable && fExhausiveFileSearch.getSelection();
if (fWorkspace != null) {
fWorkspace.setEnabled(enable);
fDependent.setEnabled(enable);
fSingle.setEnabled(enable);
boolean enableSpec= false;
fWorkingSet.setEnabled(enable);
if (enable && fWorkingSet.getSelection()) {
enableSpec= true;
}
fWorkingSetSpec.setEnabled(enableSpec);
fWorkingSetButton.setEnabled(enable);
}
}
}
private CRenameProcessor getRenameProcessor() {
return (CRenameProcessor) ((CRenameRefactoring) getRefactoring()).getProcessor();
}
}