/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.search.internal.ui.text; import com.google.dart.tools.search.internal.core.text.PatternConstructor; import com.google.dart.tools.search.internal.ui.ISearchHelpContextIds; import com.google.dart.tools.search.internal.ui.Messages; import com.google.dart.tools.search.internal.ui.SearchMessages; import com.google.dart.tools.search.internal.ui.SearchPlugin; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.fieldassist.ComboContentAdapter; import org.eclipse.jface.text.FindReplaceDocumentAdapterContentProposalProvider; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.ltk.core.refactoring.RefactoringStatus; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter; import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; import java.util.ArrayList; import java.util.regex.PatternSyntaxException; public class ReplaceConfigurationPage extends UserInputWizardPage { private static final String SETTINGS_GROUP = "ReplaceDialog2"; //$NON-NLS-1$ private static final String SETTINGS_REPLACE_WITH = "replace_with"; //$NON-NLS-1$ private final ReplaceRefactoring fReplaceRefactoring; private Combo fTextField; private Button fReplaceWithRegex; private Label fStatusLabel; private ContentAssistCommandAdapter fTextFieldContentAssist; public ReplaceConfigurationPage(ReplaceRefactoring refactoring) { super("ReplaceConfigurationPage"); //$NON-NLS-1$ fReplaceRefactoring = refactoring; } @Override public void createControl(Composite parent) { Composite result = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); result.setLayout(layout); Label description = new Label(result, SWT.NONE); int numberOfMatches = fReplaceRefactoring.getNumberOfMatches(); int numberOfFiles = fReplaceRefactoring.getNumberOfFiles(); String[] arguments = {String.valueOf(numberOfMatches), String.valueOf(numberOfFiles)}; if (numberOfMatches > 1 && numberOfFiles > 1) { description.setText(Messages.format( SearchMessages.ReplaceConfigurationPage_description_many_in_many, arguments)); } else if (numberOfMatches == 1) { description.setText(SearchMessages.ReplaceConfigurationPage_description_one_in_one); } else { description.setText(Messages.format( SearchMessages.ReplaceConfigurationPage_description_many_in_one, arguments)); } description.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, false, 2, 1)); FileSearchQuery query = fReplaceRefactoring.getQuery(); Label label1 = new Label(result, SWT.NONE); label1.setText(SearchMessages.ReplaceConfigurationPage_replace_label); Text clabel = new Text(result, SWT.BORDER | SWT.READ_ONLY); clabel.setText(query.getSearchString()); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.widthHint = convertWidthInCharsToPixels(50); clabel.setLayoutData(gd); Label label2 = new Label(result, SWT.NONE); label2.setText(SearchMessages.ReplaceConfigurationPage_with_label); fTextField = new Combo(result, SWT.DROP_DOWN); gd = new GridData(GridData.FILL_HORIZONTAL); gd.widthHint = convertWidthInCharsToPixels(50); fTextField.setLayoutData(gd); fTextField.setFocus(); fTextField.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { updateOKStatus(); } }); IDialogSettings settings = SearchPlugin.getDefault().getDialogSettings().getSection( SETTINGS_GROUP); if (settings != null) { String[] previousReplaceWith = settings.getArray(SETTINGS_REPLACE_WITH); if (previousReplaceWith != null) { fTextField.setItems(previousReplaceWith); fTextField.select(0); } } ComboContentAdapter contentAdapter = new ComboContentAdapter(); FindReplaceDocumentAdapterContentProposalProvider replaceProposer = new FindReplaceDocumentAdapterContentProposalProvider( false); fTextFieldContentAssist = new ContentAssistCommandAdapter( fTextField, contentAdapter, replaceProposer, ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, new char[0], true); new Label(result, SWT.NONE); fReplaceWithRegex = new Button(result, SWT.CHECK); fReplaceWithRegex.setText(SearchMessages.ReplaceConfigurationPage_isRegex_label); fReplaceWithRegex.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setContentAssistsEnablement(fReplaceWithRegex.getSelection()); } }); if (query.isRegexSearch()) { fReplaceWithRegex.setSelection(true); } else { fReplaceWithRegex.setSelection(false); fReplaceWithRegex.setEnabled(false); } fStatusLabel = new Label(result, SWT.NULL); gd = new GridData(GridData.FILL_HORIZONTAL); gd.verticalAlignment = SWT.BOTTOM; gd.horizontalSpan = 2; fStatusLabel.setLayoutData(gd); setContentAssistsEnablement(fReplaceWithRegex.getSelection()); setControl(result); Dialog.applyDialogFont(result); PlatformUI.getWorkbench().getHelpSystem().setHelp( getControl(), ISearchHelpContextIds.REPLACE_DIALOG); } @Override public IWizardPage getNextPage() { initializeRefactoring(); storeSettings(); return super.getNextPage(); } @Override protected boolean performFinish() { initializeRefactoring(); storeSettings(); return super.performFinish(); } final void updateOKStatus() { RefactoringStatus status = new RefactoringStatus(); if (fReplaceWithRegex != null && fReplaceWithRegex.getSelection()) { try { PatternConstructor.interpretReplaceEscapes( fReplaceWithRegex.getText(), fReplaceRefactoring.getQuery().getSearchString(), "\n"); //$NON-NLS-1$ } catch (PatternSyntaxException e) { String locMessage = e.getLocalizedMessage(); int i = 0; while (i < locMessage.length() && "\n\r".indexOf(locMessage.charAt(i)) == -1) { //$NON-NLS-1$ i++; } status.addError(locMessage.substring(0, i)); // only take first line } } setPageComplete(status); } private void initializeRefactoring() { fReplaceRefactoring.setReplaceString(fTextField.getText()); } private void setContentAssistsEnablement(boolean enable) { fTextFieldContentAssist.setEnabled(enable); } private void storeSettings() { String[] items = fTextField.getItems(); ArrayList<String> history = new ArrayList<String>(); history.add(fTextField.getText()); int historySize = Math.min(items.length, 6); for (int i = 0; i < historySize; i++) { String curr = items[i]; if (!history.contains(curr)) { history.add(curr); } } IDialogSettings settings = SearchPlugin.getDefault().getDialogSettings().addNewSection( SETTINGS_GROUP); settings.put(SETTINGS_REPLACE_WITH, history.toArray(new String[history.size()])); } }