/*
* 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.acroform;
import org.icepdf.core.pobjects.Dictionary;
import org.icepdf.core.pobjects.Name;
import org.icepdf.core.pobjects.actions.Action;
import org.icepdf.core.util.Library;
import java.util.HashMap;
/**
* An annotation, page object, or (beginning with PDF 1.3) interactive form field may include an entry named AA that
* specifies an additional-actions dictionary (PDF 1.2) that extends the set of events that can trigger the execution
* of an action. In PDF 1.4, the document catalogue dictionary (see 7.7.2, "Document Catalog") may also contain an AA
* entry for trigger events affecting the document as a whole. Tables 194 to 197 show the contents of this type of
* dictionary.
* <br>
* PDF 1.5 introduces four trigger events in annotation’s additional-actions dictionary to support multimedia
* presentations:
* <ul>
* <li>The PO and PC entries have a similar function to the O and C entries in the page object’s additional-actions
* dictionary (see Table 194). However, associating these triggers with annotations allows annotation objects to be
* self-contained.</li>
* <li>The PV and PI entries allow a distinction between pages that are open and pages that are visible. At any one
* time, while more than one page may be visible, depending on the page layout.</li>
* </ul>
*
* @since 5.2
*/
public class AdditionalActionsDictionary extends Dictionary {
// Table 194 – Entries in an annotation’s additional-actions dictionary
/**
* (Optional; PDF 1.2) An action that shall be performed when the cursor enters the annotation’s active area.
* An E (enter) event may occur only when the mouse button is up.
*/
public static final Name ANNOTATION_E_KEY = new Name("E");
/**
* (Optional; PDF 1.2) An action that shall be performed when the cursor exits the annotation’s active area.
* An X (exit) event may not occur without a preceding E event.
*/
public static final Name ANNOTATION_X_KEY = new Name("X");
/**
* Optional; PDF 1.2) An action that shall be performed when the mouse button is pressed inside the annotation’s
* active area.
*/
public static final Name ANNOTATION_D_KEY = new Name("D");
/**
* (Optional; PDF 1.2) An action that shall be performed when the mouse button is released inside the annotation’s
* active area.
* <br>
* For backward compatibility, the A entry in an annotation dictionary, if present, takes precedence over this
* entry (see Table 168).
* A U (up) event may not occur without a preceding E and D event.
*/
public static final Name ANNOTATION_U_KEY = new Name("U");
/**
* (Optional; PDF 1.2; widget annotations only) An action that shall be performed when the annotation receives
* the input focus.
*/
public static final Name ANNOTATION_FO_KEY = new Name("Fo");
/**
* (Optional; PDF 1.2; widget annotations only) (Uppercase B, lowercase L) An action that shall be performed when
* the annotation loses the input focus.
*/
public static final Name ANNOTATION_Bl_KEY = new Name("Bl");
/**
* (Optional; PDF 1.5) An action that shall be performed when the page containing the annotation is opened.
* <br>
* EXAMPLE 1<br>
* When the user navigates to it from the next or previous page or by means of a link annotation or outline item.
* <br>
* The action shall be executed after the O action in the page’s additional-actions dictionary (see Table 195) and
* the OpenAction entry in the document Catalog(see Table 28), if such actions are present.
*/
public static final Name ANNOTATION_PO_KEY = new Name("Bl");
/**
* (Optional; PDF 1.5) An action that shall be performed when the page containing the annotation is closed.
* <br>
* EXAMPLE 2<br>
* When the user navigates to the next or previous page, or follows a link annotation or outline item.
* <br>
* The action shall be executed before the C action in the page’s additional-actions dictionary (see Table 195),
* if present.
*/
public static final Name ANNOTATION_PC_KEY = new Name("PC");
/**
* (Optional; PDF 1.5) An action that shall be performed when the page containing the annotation becomes visible.
*/
public static final Name ANNOTATION_PV_KEY = new Name("PV");
/**
* (Optional; PDF 1.5) An action that shall be performed when the page containing the annotation is no longer
* visible in the conforming reader’s user interface.
*/
public static final Name ANNOTATION_PI_KEY = new Name("PI");
// Table 195 – Entries in a page object’s additional-actions dictionary
/**
* Optional; PDF 1.2) An action that shall be performed when the page is opened (for example, when the user
* navigates to it from the next or previous page or by means of a link annotation or outline item). This action is
* independent of any that may be defined by the OpenAction entry in the document Catalog (see 7.7.2, "Document Catalog")
* and shall be executed after such an action.
*/
public static final Name PAGE_0_KEY = new Name("O");
/**
* (Optional; PDF 1.2) An action that shall be performed when the page is closed (for example, when the user
* navigates to the next or previous page or follows a link annotation or an outline item). This action applies to
* the page being closed and shall be executed before any other page is opened.
*/
public static final Name PAGE_C_KEY = new Name("C");
// Table 196 – Entries in a form field’s additional-actions dictionary
/**
* (Optional; PDF 1.3) A JavaScript action that shall be performed when the user modifies a character in a text
* field or combo box or modifies the selection in a scrollable list box. This action may check the added text for
* validity and reject or modify it.
*/
public static final Name FORM_K_KEY = new Name("K");
/**
* (Optional; PDF 1.3) A JavaScript action that shall be performed before the field is formatted to display its
* value. This action may modify the field’s value before formatting.
*/
public static final Name FORM_F_KEY = new Name("F");
/**
* (Optional; PDF 1.3) A JavaScript action that shall be performed when the field’s value is changed. This action
* may check the new value for validity. (The name V stands for "validate.")
*/
public static final Name FORM_V_KEY = new Name("V");
/**
* (Optional; PDF 1.3) A JavaScript action that shall be performed to recalculate the value of this field when that
* of another field changes. (The name C stands for "calculate.") The order in which the document’s fields are
* recalculated shall be defined by the CO entry in the interactive form dictionary
* (see 12.7.2, "Interactive Form Dictionary").
*/
public static final Name FORM_C_KEY = new Name("C");
// Table 197 – Entries in the document catalog’s additional-actions dictionary
/**
* (Optional; PDF 1.4) A JavaScript action that shall be performed before closing a document.
* (The name WC stands for "will close.")
*/
public static final Name CATALOG_WC_KEY = new Name("WC");
/**
* (Optional; PDF 1.4) A JavaScript action that shall be performed before saving a document.
* (The name WS stands for "will save.")
*/
public static final Name CATALOG_WS_KEY = new Name("WS");
/**
* (Optional; PDF 1.4) A JavaScript action that shall be performed after saving a document.
* (The name DS stands for "did save.")
*/
public static final Name CATALOG_DS_KEY = new Name("DS");
/**
* (Optional; PDF 1.4) A JavaScript action that shall be performed before printing a document.
* (The name WP stands for "will print.")
*/
public static final Name CATALOG_WP_KEY = new Name("WP");
/**
* (Optional; PDF 1.4) A JavaScript action that shall be performed after printing a document.
* (The name DP stands for "did print.")
*/
public static final Name CATALOG_DP_KEY = new Name("DP");
public AdditionalActionsDictionary(Library library, HashMap entries) {
super(library, entries);
}
public Action getAction(Name actionNameKey) {
Object tmp = library.getObject(entries, actionNameKey);
if (tmp != null && tmp instanceof HashMap) {
return Action.buildAction(library, (HashMap) tmp);
}
return null;
}
public boolean isAnnotationValue(Name actionKey) {
return library.isValidEntry(entries, actionKey);
// return library.getObject(entries, actionKey) != null;
}
/**
* @see #ANNOTATION_Bl_KEY
*/
public boolean isAnnotationBIValue() {
return library.getObject(entries, ANNOTATION_Bl_KEY) != null;
}
/**
* @see #ANNOTATION_D_KEY
*/
public boolean isAnnotationDValue() {
return library.getObject(entries, ANNOTATION_D_KEY) != null;
}
/**
* @see #ANNOTATION_E_KEY
*/
public boolean isAnnotationEValue() {
return library.getObject(entries, ANNOTATION_E_KEY) != null;
}
/**
* @see #ANNOTATION_FO_KEY
*/
public boolean isAnnotationFOValue() {
return library.getObject(entries, ANNOTATION_FO_KEY) != null;
}
/**
* @see #ANNOTATION_PC_KEY
*/
public boolean isAnnotationPCValue() {
return library.getObject(entries, ANNOTATION_PC_KEY) != null;
}
/**
* @see #ANNOTATION_PI_KEY
*/
public boolean isAnnotationPIValue() {
return library.getObject(entries, ANNOTATION_PI_KEY) != null;
}
/**
* @see #ANNOTATION_PO_KEY
*/
public boolean isAnnotationPOValue() {
return library.getObject(entries, ANNOTATION_PO_KEY) != null;
}
/**
* @see #ANNOTATION_PV_KEY
*/
public boolean isAnnotationPVValue() {
return library.getObject(entries, ANNOTATION_PV_KEY) != null;
}
/**
* @see #ANNOTATION_U_KEY
*/
public boolean isAnnotationUValue() {
return library.getObject(entries, ANNOTATION_U_KEY) != null;
}
/**
* @see #ANNOTATION_X_KEY
*/
public boolean isAnnotationXValue() {
return library.getObject(entries, ANNOTATION_X_KEY) != null;
}
/**
* @see #CATALOG_DP_KEY
*/
public boolean isCatalogDPValue() {
return library.getObject(entries, CATALOG_DP_KEY) != null;
}
/**
* @see #CATALOG_DS_KEY
*/
public boolean isCatalogDSValue() {
return library.getObject(entries, CATALOG_DS_KEY) != null;
}
/**
* @see #CATALOG_WC_KEY
*/
public boolean isCatalogWCValue() {
return library.getObject(entries, CATALOG_WC_KEY) != null;
}
/**
* @see #CATALOG_WP_KEY
*/
public boolean isCatalogWPValue() {
return library.getObject(entries, CATALOG_WP_KEY) != null;
}
/**
* @see #CATALOG_WS_KEY
*/
public boolean isCatalogWSValue() {
return library.getObject(entries, CATALOG_WS_KEY) != null;
}
/**
* @see #FORM_C_KEY
*/
public boolean isFormCValue() {
return library.getObject(entries, FORM_C_KEY) != null;
}
/**
* @see #FORM_F_KEY
*/
public boolean isFormFValue() {
return library.getObject(entries, FORM_F_KEY) != null;
}
/**
* @see #FORM_K_KEY
*/
public boolean isFormKValue() {
return library.getObject(entries, FORM_K_KEY) != null;
}
/**
* @see #FORM_V_KEY
*/
public boolean isFormVValue() {
return library.getObject(entries, FORM_V_KEY) != null;
}
/**
* @see #PAGE_0_KEY
*/
public boolean isPageOValue() {
return library.getObject(entries, PAGE_0_KEY) != null;
}
/**
* @see #PAGE_C_KEY
*/
public boolean isPageCValue() {
return library.getObject(entries, PAGE_C_KEY) != null;
}
}