/*
* Copyright 2006-2017 ICEsoft Technologies Canada Corp.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 org.icepdf.core.pobjects.actions;
import org.icepdf.core.pobjects.Reference;
import org.icepdf.core.pobjects.acroform.FieldDictionary;
import org.icepdf.core.pobjects.acroform.InteractiveForm;
import org.icepdf.core.pobjects.annotations.AbstractWidgetAnnotation;
import org.icepdf.core.util.Library;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Upon invocation of a reset-form action, a conforming processor shall reset
* selected interactive form fields to their default values; that is, it shall
* set the value of the V entry in the field dictionary to that of the DV entry.
* If no default value is defined for a field, its V entry shall be removed.
* For fields that can have no value (such as pushButtons), the action has no
* effect. Table 238 shows the action dictionary entries specific to this type
* of action.
* <br>
* The value of the action dictionary’s Flags entry is a non-negative containing
*
* flags specifying various characteristics of the action. Bit positions within
* the flag word shall be numbered starting from 1 (low-order). Only one flag is
* defined for this type of action. All undefined flag bits shall be reserved
* and shall be set to 0.
*
* @since 5.1
*/
public class ResetFormAction extends FormAction {
/**
* If clear, the Fields array specifies which fields to reset.
* (All descendants of the specified fields in the field hierarchy are
* reset as well.) If set, the Fields array indicates which fields to
* exclude from resetting; that is, all fields in the document’s interactive
* form shall be reset except those listed in the Fields array.
*/
public int INCLUDE_EXCLUDE_BIT = 0X0000001;
public ResetFormAction(Library l, HashMap h) {
super(l, h);
}
/**
* Upon invocation of a reset-form action, a conforming processor shall reset
* selected interactive form fields to their default values; that is, it shall
* set the value of the V entry in the field dictionary to that of the DV entry.
* If no default value is defined for a field, its V entry shall be removed.
* For fields that can have no value (such as pushButtons), the action has no
* effect. Table 238 shows the action dictionary entries specific to this type
* of action.
*
* @param x x-coordinate of the mouse event that actuated the submit.
* @param y y-coordinate of the mouse event that actuated the submit.
* @return value of one if reset was successful, zero if not.
*/
public int executeFormAction(int x, int y) {
// get a reference to the form data
InteractiveForm interactiveForm = library.getCatalog().getInteractiveForm();
ArrayList<Object> fields = interactiveForm.getFields();
for (Object tmp : fields) {
descendFormTree(tmp);
}
// update the annotation an component values.
return 0;
}
/**
* Recursively reset all the form fields.
*
* @param formNode root form node.
*/
protected void descendFormTree(Object formNode) {
if (formNode instanceof AbstractWidgetAnnotation) {
((AbstractWidgetAnnotation) formNode).reset();
} else if (formNode instanceof FieldDictionary) {
// iterate over the kid's array.
FieldDictionary child = (FieldDictionary) formNode;
formNode = child.getKids();
if (formNode != null) {
ArrayList kidsArray = (ArrayList) formNode;
for (Object kid : kidsArray) {
if (kid instanceof Reference) {
kid = library.getObject((Reference) kid);
}
if (kid instanceof AbstractWidgetAnnotation) {
((AbstractWidgetAnnotation) kid).reset();
} else if (kid instanceof FieldDictionary) {
descendFormTree(kid);
}
}
}
}
}
/**
* @see #INCLUDE_EXCLUDE_BIT
*/
public boolean isIncludeExclude() {
return (getFlags() & INCLUDE_EXCLUDE_BIT) == INCLUDE_EXCLUDE_BIT;
}
}