/******************************************************************************* * Copyright (c) 2009 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ //------------------------------------------------------------------------------ // Copyright (c) 2005, 2007 IBM Corporation 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: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.richtext.dialogs; import org.eclipse.epf.richtext.RichTextResources; import org.eclipse.epf.richtext.actions.FindReplaceAction; import org.eclipse.jface.dialogs.IDialogConstants; 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.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; /** * Prompts the user to specify the search and replace strings and options. * * @author Kelvin Low * @since 1.0 */ public class FindReplaceDialog extends BaseDialog { private FindReplaceAction findReplaceAction; private boolean findOnly; private Text findText; private Text replaceText; private Button searchForwardRadioButton; private Button searchBackwardRadioButton; private Button caseSensitiveCheckbox; private Button wholeWordCheckbox; private Button findButton; private Button replaceButton; private Button replaceFindButton; private Button replaceAllButton; private Label statusLabel; /** * Creates a new instance. * * @param parent * the parent shell * @param findReplaceAction * the Find and Replace action * @param findOnly * if <code>true</code>, disable the replace and replace all * functionalities */ public FindReplaceDialog(Shell parent, FindReplaceAction findReplaceAction, boolean findOnly) { super(parent); setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS | getDefaultOrientation()); setBlockOnOpen(false); this.findReplaceAction = findReplaceAction; this.findOnly = findOnly; } @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); GridLayout layout = (GridLayout) composite.getLayout(); layout.numColumns = 1; Composite textComposite = new Composite(composite, SWT.NONE); textComposite.setLayout(new GridLayout(2, false)); textComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label findLabel = new Label(textComposite, SWT.NONE); findLabel.setText(RichTextResources.findLabel_text); findText = new Text(textComposite, SWT.BORDER); GridData gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.widthHint = 200; findText.setLayoutData(gridData); findText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (findButton != null) { findButton .setEnabled(findText.getText().trim().length() > 0); } if (replaceAllButton != null && !findOnly) { replaceAllButton.setEnabled(findText.getText().trim() .length() > 0); } } }); Label replaceLabel = new Label(textComposite, SWT.NONE); replaceLabel.setText(RichTextResources.replaceLabel_text); replaceText = new Text(textComposite, SWT.BORDER); replaceText.setLayoutData(gridData); if (findOnly) { replaceText.setEnabled(false); } else { replaceText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (replaceButton != null) { replaceButton.setEnabled(findReplaceAction .getFoundMatch()); } if (replaceFindButton != null) { replaceFindButton.setEnabled(findReplaceAction .getFoundMatch()); } } }); } Composite optionsComposite = new Composite(composite, SWT.NONE); optionsComposite.setLayout(new GridLayout(2, true)); optionsComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Group directionGroup = new Group(optionsComposite, SWT.NONE); directionGroup.setText(RichTextResources.directionGroup_text); directionGroup.setLayout(new GridLayout(1, false)); directionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); searchForwardRadioButton = new Button(directionGroup, SWT.RADIO); searchForwardRadioButton .setText(RichTextResources.forwardRadioButton_text); searchForwardRadioButton.setSelection(true); searchBackwardRadioButton = new Button(directionGroup, SWT.RADIO); searchBackwardRadioButton .setText(RichTextResources.backwardRadioButton_text); Group optionsGroup = new Group(optionsComposite, SWT.NONE); optionsGroup.setText(RichTextResources.optionsGroup_text); optionsGroup.setLayout(new GridLayout(1, false)); optionsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); caseSensitiveCheckbox = new Button(optionsGroup, SWT.CHECK); caseSensitiveCheckbox .setText(RichTextResources.caseSensitiveCheckbox_text); wholeWordCheckbox = new Button(optionsGroup, SWT.CHECK); wholeWordCheckbox.setText(RichTextResources.wholeWordCheckbox_text); statusLabel = new Label(composite, SWT.NONE); statusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); super.getShell().setText(RichTextResources.findReplaceDialog_title); return composite; } @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.CLIENT_ID + 1, RichTextResources.findButton_text, true); findButton = super.getButton(IDialogConstants.CLIENT_ID + 1); findButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent event) { findReplaceAction.run(FindReplaceAction.FIND_TEXT, getFindText(), getReplaceText(), getMatchDirection(), getMatchOptions()); if (!findOnly) { replaceButton.setEnabled(findReplaceAction.getFoundMatch()); replaceFindButton.setEnabled(findReplaceAction .getFoundMatch()); } if (findReplaceAction.getFoundMatch()) { statusLabel.setText(""); //$NON-NLS-1$ } else { statusLabel .setText(RichTextResources.FindReplace_Status_noMatch_label); } findButton.setFocus(); } public void widgetDefaultSelected(SelectionEvent e) { } }); createButton(parent, IDialogConstants.CLIENT_ID + 2, RichTextResources.replaceButton_text, false); replaceButton = super.getButton(IDialogConstants.CLIENT_ID + 2); if (!findOnly) { replaceButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent event) { findReplaceAction.run(FindReplaceAction.REPLACE_TEXT, getFindText(), getReplaceText(), getMatchDirection(), getMatchOptions()); replaceButton.setFocus(); } public void widgetDefaultSelected(SelectionEvent e) { } }); } createButton(parent, IDialogConstants.CLIENT_ID + 3, RichTextResources.replaceFindButton_text, false); replaceFindButton = super.getButton(IDialogConstants.CLIENT_ID + 3); if (!findOnly) { replaceFindButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent event) { findReplaceAction.run(FindReplaceAction.REPLACE_FIND_TEXT, getFindText(), getReplaceText(), getMatchDirection(), getMatchOptions()); replaceButton.setEnabled(findReplaceAction.getFoundMatch()); replaceFindButton.setEnabled(findReplaceAction .getFoundMatch()); replaceFindButton.setFocus(); } public void widgetDefaultSelected(SelectionEvent e) { } }); } createButton(parent, IDialogConstants.CLIENT_ID + 4, RichTextResources.replaceallButton_text, false); replaceAllButton = super.getButton(IDialogConstants.CLIENT_ID + 4); if (!findOnly) { replaceAllButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent event) { findReplaceAction.run(FindReplaceAction.REPLACE_ALL_TEXT, getFindText(), getReplaceText(), getMatchDirection(), getMatchOptions()); replaceButton.setEnabled(false); replaceFindButton.setEnabled(false); replaceAllButton.setFocus(); } public void widgetDefaultSelected(SelectionEvent e) { } }); } // Create the Cancel button. createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); cancelButton = super.getButton(IDialogConstants.CANCEL_ID); findButton.setEnabled(false); replaceButton.setEnabled(false); replaceFindButton.setEnabled(false); replaceAllButton.setEnabled(false); } /** * Gets the user specified find text. * * @return the find text */ public String getFindText() { return findText.getText(); } /** * Gets the user specified replace text. * * @return the replace text */ public String getReplaceText() { return replaceText.getText(); } /** * Gets the text match direction. * * @return <code>FIND_FORWARD</code> or <code>FIND_BACKWARD</code> */ public int getMatchDirection() { return searchForwardRadioButton.getSelection() ? FindReplaceAction.FORWARD_MATCH : FindReplaceAction.BACKWARD_MATCH; } /** * Gets the text match options. * * @return the text match options */ public int getMatchOptions() { int options = 0; if (wholeWordCheckbox.getSelection() == true) { options |= FindReplaceAction.WHOLE_WORD_MATCH; } if (caseSensitiveCheckbox.getSelection() == true) { options |= FindReplaceAction.CASE_SENSITIVE_MATCH; } return options; } /** * Checks the find only option. * * @return <code>true</code> if find only option is enabled */ public boolean isFindOnly() { return findOnly; } /** * Sets the find only option. * * @param findOnly, * if <code>true</code>, enable the find only option */ public void setFindOnly(boolean findOnly) { this.findOnly = findOnly; } }