/*
* 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.ui.internal.refactoring;
import com.google.dart.tools.ui.internal.dialogs.TextFieldNavigationHandler;
import org.eclipse.core.runtime.Assert;
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.widgets.Composite;
import org.eclipse.swt.widgets.Text;
/**
* A TextInputWizardPage is a simple UserInputWizardPage with facilities to create a text input
* field and validate its contents. The text is assumed to be a Dart identifier, hence CamelCase
* word jumping is installed.
*
* @coverage dart.editor.ui.refactoring.ui
*/
public abstract class TextInputWizardPage extends UserInputWizardPage {
private final String fInitialValue;
private Text fTextField;
public static final String PAGE_NAME = "TextInputPage";//$NON-NLS-1$
/**
* Creates a new text input page.
*
* @param isLastUserPage <code>true</code> if this page is the wizard's last user input page.
* Otherwise <code>false</code>.
*/
public TextInputWizardPage(String description, boolean isLastUserPage) {
this(description, isLastUserPage, ""); //$NON-NLS-1$
}
/**
* Creates a new text input page.
*
* @param isLastUserPage <code>true</code> if this page is the wizard's last user input page.
* Otherwise <code>false</code>
* @param initialValue the initial value
*/
public TextInputWizardPage(String description, boolean isLastUserPage, String initialValue) {
super(PAGE_NAME);
Assert.isNotNull(initialValue);
setDescription(description);
fInitialValue = initialValue;
}
@Override
public void dispose() {
fTextField = null;
}
/**
* Returns the initial value.
*
* @return the initial value
*/
public String getInitialValue() {
return fInitialValue;
}
@Override
public void setVisible(boolean visible) {
if (visible) {
textModified(getText());
}
super.setVisible(visible);
if (visible && fTextField != null) {
fTextField.setFocus();
}
}
protected Text createTextInputField(Composite parent) {
return createTextInputField(parent, SWT.BORDER);
}
protected Text createTextInputField(Composite parent, int style) {
fTextField = new Text(parent, style);
fTextField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
textModified(getText());
}
});
fTextField.setText(fInitialValue);
TextFieldNavigationHandler.install(fTextField);
return fTextField;
}
/**
* Returns the content of the text input field.
*
* @return the content of the text input field. Returns <code>null</code> if not text input field
* has been created
*/
protected String getText() {
if (fTextField == null) {
return null;
}
return fTextField.getText();
}
/**
* Returns the text entry field
*
* @return the text entry field
*/
protected Text getTextField() {
return fTextField;
}
/**
* Returns whether an empty string is a valid input. Typically it is not, because the user is
* required to provide some information e.g. a new type name etc.
*
* @return <code>true</code> iff an empty string is valid
*/
protected boolean isEmptyInputValid() {
return false;
}
/**
* Returns whether the initial input is valid. Typically it is not, because the user is required
* to provide some information e.g. a new type name etc.
*
* @return <code>true</code> iff the input provided at initialization is valid
*/
protected boolean isInitialInputValid() {
return false;
}
/**
* Subclasses can override if they want to restore the message differently. This implementation
* calls <code>setMessage(null)</code>, which clears the message thus exposing the description.
*/
protected void restoreMessage() {
setMessage(null);
}
/**
* Sets the new text for the text field. Does nothing if the text field has not been created.
*
* @param text the new value
*/
protected void setText(String text) {
if (fTextField == null) {
return;
}
fTextField.setText(text);
}
/**
* Checks the page's state and issues a corresponding error message. The page validation is
* computed by calling <code>validatePage</code>.
*/
protected void textModified(String text) {
if (!isEmptyInputValid() && "".equals(text)) { //$NON-NLS-1$
setPageComplete(false);
setErrorMessage(null);
restoreMessage();
return;
}
if (!isInitialInputValid() && fInitialValue.equals(text)) {
setPageComplete(false);
setErrorMessage(null);
restoreMessage();
return;
}
RefactoringStatus status = validateTextField(text);
if (status == null) {
status = new RefactoringStatus();
}
setPageComplete(status);
}
/**
* Performs input validation. Returns a <code>RefactoringStatus</code> which describes the result
* of input validation. <code>Null<code> is interpreted
* as no error.
*/
protected RefactoringStatus validateTextField(String text) {
return null;
}
}