📄 formcontrol.java
字号:
public final void clearValues() {
setValue(null);
}
/**
* Sets the control's <a href="#SubmissionValue">submission value</a> *.
* <p>
* * NOTE: The {@link FormFields} and {@link FormField} classes provide a more appropriate abstraction level for the modification of form control submission values.
* Consider using the {@link FormFields#setValue(String fieldName, String value)} method instead.
* <p>
* The specified value replaces any existing <a href="#SubmissionValue">submission values</a> of the control.
* <p>
* The return value indicates whether the control has "accepted" the value.
* For <a href="#UserValueControl">user value controls</a>, the return value is always <code>true</code>.
* <p>
* For <a href="#PredefinedValueControl">predefined value controls</a>,
* calling this method does not affect the control's
* {@linkplain #getPredefinedValues() predefined values}, but instead determines whether the control (or its options) become
* <code><a target="_blank" href="http://www.w3.org/TR/html401/interact/forms.html#adef-checked">checked</a></code> or
* <code><a target="_blank" href="http://www.w3.org/TR/html401/interact/forms.html#adef-selected">selected</a></code>
* as detailed below:
* <p>
* {@link FormControlType#CHECKBOX CHECKBOX} and {@link FormControlType#RADIO RADIO} controls become {@link #isChecked() checked}
* and the method returns <code>true</code> if the specified value matches the control's predefined value (case sensitive),
* otherwise the control becomes unchecked and the method returns <code>false</code>.
* Note that any other controls with the same {@linkplain #getName() name} are not unchecked if this control becomes checked,
* possibly resulting in an invalid state where multiple <code>RADIO</code> controls are checked at the same time.
* The {@link FormField#setValue(String)} method avoids such problems and its use is recommended over this method.
* <p>
* {@link FormControlType#SELECT_SINGLE SELECT_SINGLE} and {@link FormControlType#SELECT_MULTIPLE SELECT_MULTIPLE}
* controls receive the specified value by selecting the option with the matching value and deselecting all others.
* If none of the options match, all are deselected.
* The return value of this method indicates whether one of the options matched.
* <p>
* {@link FormControlType#SUBMIT SUBMIT}, {@link FormControlType#BUTTON BUTTON}, and {@link FormControlType#IMAGE IMAGE}
* controls never have a <a href="#SubmissionValue">submission value</a>, so calling this method has no effect and
* always returns <code>false</code>.
*
* @param value the new <a href="#SubmissionValue">submission value</a> of this control, or <code>null</code> to clear the control of all submission values.
* @return <code>true</code> if the control accepts the value, otherwise <code>false</code>.
* @see FormFields#setValue(String fieldName, String value)
*/
public abstract boolean setValue(String value);
/**
* Adds the specified value to this control's <a href="#SubmissionValue">submission values</a> *.
* <p>
* * NOTE: The {@link FormFields} and {@link FormField} classes provide a more appropriate abstraction level for the modification of form control submission values.
* Consider using the {@link FormFields#addValue(String fieldName, String value)} method instead.
* <p>
* This is almost equivalent to {@link #setValue(String)}, with only the following differences:
* <p>
* {@link FormControlType#CHECKBOX CHECKBOX} controls retain their existing <a href="#SubmissionValue">submission value</a>
* instead of becoming unchecked if the specified value does not match the control's {@linkplain #getPredefinedValue() predefined value}.
* <p>
* {@link FormControlType#SELECT_MULTIPLE SELECT_MULTIPLE} controls retain their existing
* <a href="#SubmissionValue">submission values</a>, meaning that the control's
* <code><a target="_blank" href="http://www.w3.org/TR/html401/interact/forms.html#edef-OPTION">OPTION</a></code>
* elements whose {@linkplain #getPredefinedValues() predefined values} do not match the specified value are not deselected.
* This is the only type of control that can have multiple submission values within the one control.
*
* @param value the value to add to this control's <a href="#SubmissionValue">submission values</a>, must not be <code>null</code>.
* @return <code>true</code> if the control accepts the value, otherwise <code>false</code>.
* @see FormFields#addValue(String fieldName, String value)
*/
public boolean addValue(final String value) {
return setValue(value);
}
abstract void addValuesTo(Collection<String> collection); // should not add null values
abstract void addToFormFields(FormFields formFields);
abstract void replaceInOutputDocument(OutputDocument outputDocument);
public String getDebugInfo() {
final StringBuilder sb=new StringBuilder();
sb.append(formControlType).append(" name=\"").append(name).append('"');
if (elementContainer.predefinedValue!=null) sb.append(" PredefinedValue=\"").append(elementContainer.predefinedValue).append('"');
sb.append(" - ").append(getElement().getDebugInfo());
return sb.toString();
}
static final class InputFormControl extends FormControl {
// TEXT, HIDDEN, PASSORD or FILE
public InputFormControl(final Element element, final FormControlType formControlType) {
super(element,formControlType,false);
}
public boolean setValue(final String value) {
elementContainer.setAttributeValue(Attribute.VALUE,value);
return true;
}
void addValuesTo(final Collection<String> collection) {
addValueTo(collection,elementContainer.getAttributeValue(Attribute.VALUE));
}
void addToFormFields(final FormFields formFields) {
formFields.add(this);
}
void replaceInOutputDocument(final OutputDocument outputDocument) {
if (outputStyle==FormControlOutputStyle.REMOVE) {
outputDocument.remove(getElement());
} else if (outputStyle==FormControlOutputStyle.DISPLAY_VALUE) {
String output=null;
if (formControlType!=FormControlType.HIDDEN) {
String value=elementContainer.getAttributeValue(Attribute.VALUE);
if (formControlType==FormControlType.PASSWORD && value!=null) value=getString(FormControlOutputStyle.ConfigDisplayValue.PasswordChar,value.length());
output=getDisplayValueHTML(value,false);
}
outputDocument.replace(getElement(),output);
} else {
replaceAttributesInOutputDocumentIfModified(outputDocument);
}
}
}
static final class TextAreaFormControl extends FormControl {
// TEXTAREA
public String value=UNCHANGED;
private static final String UNCHANGED=new String();
public TextAreaFormControl(final Element element) {
super(element,FormControlType.TEXTAREA,false);
}
public boolean setValue(final String value) {
this.value=value;
return true;
}
void addValuesTo(final Collection<String> collection) {
addValueTo(collection,getValue());
}
void addToFormFields(final FormFields formFields) {
formFields.add(this);
}
void replaceInOutputDocument(final OutputDocument outputDocument) {
if (outputStyle==FormControlOutputStyle.REMOVE) {
outputDocument.remove(getElement());
} else if (outputStyle==FormControlOutputStyle.DISPLAY_VALUE) {
outputDocument.replace(getElement(),getDisplayValueHTML(getValue(),true));
} else {
replaceAttributesInOutputDocumentIfModified(outputDocument);
if (value!=UNCHANGED)
outputDocument.replace(getElement().getContent(),CharacterReference.encode(value));
}
}
private String getValue() {
return (value==UNCHANGED) ? CharacterReference.decode(getElement().getContent()) : value;
}
}
static final class RadioCheckboxFormControl extends FormControl {
// RADIO or CHECKBOX
public RadioCheckboxFormControl(final Element element, final FormControlType formControlType) {
super(element,formControlType,true);
if (elementContainer.predefinedValue==null) {
elementContainer.predefinedValue=CHECKBOX_NULL_DEFAULT_VALUE;
if (element.source.logger.isInfoEnabled()) element.source.logger.info(element.source.getRowColumnVector(element.begin).appendTo(new StringBuilder(200)).append(": compulsory \"value\" attribute of ").append(formControlType).append(" control \"").append(name).append("\" is missing, assuming the value \"").append(CHECKBOX_NULL_DEFAULT_VALUE).append('"').toString());
}
}
public boolean setValue(final String value) {
return elementContainer.setSelected(value,Attribute.CHECKED,false);
}
public boolean addValue(final String value) {
return elementContainer.setSelected(value,Attribute.CHECKED,formControlType==FormControlType.CHECKBOX);
}
void addValuesTo(final Collection<String> collection) {
if (isChecked()) addValueTo(collection,getPredefinedValue());
}
public boolean isChecked() {
return elementContainer.getBooleanAttribute(Attribute.CHECKED);
}
void addToFormFields(final FormFields formFields) {
formFields.add(this);
}
void replaceInOutputDocument(final OutputDocument outputDocument) {
if (outputStyle==FormControlOutputStyle.REMOVE) {
outputDocument.remove(getElement());
} else {
if (outputStyle==FormControlOutputStyle.DISPLAY_VALUE) {
final String html=isChecked() ? FormControlOutputStyle.ConfigDisplayValue.CheckedHTML : FormControlOutputStyle.ConfigDisplayValue.UncheckedHTML;
if (html!=null) {
outputDocument.replace(getElement(),html);
return;
}
setDisabled(true);
}
replaceAttributesInOutputDocumentIfModified(outputDocument);
}
}
}
static class SubmitFormControl extends FormControl {
// BUTTON, SUBMIT or (in subclass) IMAGE
public SubmitFormControl(final Element element, final FormControlType formControlType) {
super(element,formControlType,true);
}
public boolean setValue(final String value) {
return false;
}
void addValuesTo(final Collection<String> collection) {}
void addToFormFields(final FormFields formFields) {
if (getPredefinedValue()!=null) formFields.add(this);
}
void replaceInOutputDocument(final OutputDocument outputDocument) {
if (outputStyle==FormControlOutputStyle.REMOVE) {
outputDocument.remove(getElement());
} else {
if (outputStyle==FormControlOutputStyle.DISPLAY_VALUE) setDisabled(true);
replaceAttributesInOutputDocumentIfModified(outputDocument);
}
}
}
static final class ImageSubmitFormControl extends SubmitFormControl {
// IMAGE
public ImageSubmitFormControl(final Element element) {
super(element,FormControlType.IMAGE);
}
void addToFormFields(final FormFields formFields) {
super.addToFormFields(formFields);
formFields.addName(this,name+".x");
formFields.addName(this,name+".y");
}
}
static final class SelectFormControl extends FormControl {
// SELECT_MULTIPLE or SELECT_SINGLE
public ElementContainer[] optionElementContainers;
public SelectFormControl(final Element element) {
super(element,element.getAttributes().get(Attribute.MULTIPLE)!=null ? FormControlType.SELECT_MULTIPLE : FormControlType.SELECT_SINGLE,false);
final List<Element> optionElements=element.getAllElements(HTMLElementName.OPTION);
optionElementContainers=new ElementContainer[optionElements.size()];
int x=0;
for (Element optionElement : optionElements) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -