/*
* 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.Dictionary;
import org.icepdf.core.pobjects.Name;
import org.icepdf.core.util.Library;
import java.util.HashMap;
/**
* <p>The <code>Action</code> class represents an <i>Action Dictionary</i> which defines
* characteristics and behavior of an action. A PDF action can be a wide
* variety of standard action types. This class is designed to help users
* get needed attributes from the Action Dictionary. The Dictionary classes
* getEntries method can be used to find other attributes associated with this action.</p>
* <br>
* <p>ICEpdf currently only uses the "GoTo" action when working with document
* outlines. If your application is interpreting a page's Annotations then you
* can query the Annotation object to get its Action. </p>
*
* @since 1.0
*/
public class Action extends Dictionary {
public static final Name ACTION_TYPE = new Name("Action");
public static final Name ACTION_TYPE_KEY = new Name("S");
public static final Name NEXT_KEY = new Name("Next");
public static final Name ACTION_TYPE_GOTO = new Name("GoTo");
public static final Name ACTION_TYPE_GOTO_REMOTE = new Name("GoToR");
public static final Name ACTION_TYPE_LAUNCH = new Name("Launch");
public static final Name ACTION_TYPE_URI = new Name("URI");
public static final Name ACTION_TYPE_RESET_SUBMIT = new Name("ResetForm");
public static final Name ACTION_TYPE_SUBMIT_SUBMIT = new Name("SubmitForm");
public static final Name ACTION_TYPE_NAMED = new Name("Named");
public static final Name ACTION_TYPE_JAVA_SCRIPT = new Name("JavaScript");
// type of annotation
private String type;
// todo implement next
// private Object Next
/**
* Creates a new instance of a Action.
*
* @param l document library.
* @param h Action dictionary entries.
*/
public Action(Library l, HashMap h) {
super(l, h);
type = getObject(ACTION_TYPE_KEY).toString();
}
public static Action buildAction(Library library, HashMap hashMap) {
Name actionType = (Name) hashMap.get(Action.ACTION_TYPE_KEY);
if (actionType != null) {
if (actionType.equals(Action.ACTION_TYPE_GOTO)) {
return new GoToAction(library, hashMap);
} else if (actionType.equals(Action.ACTION_TYPE_GOTO_REMOTE)) {
return new GoToRAction(library, hashMap);
} else if (actionType.equals(Action.ACTION_TYPE_LAUNCH)) {
return new LaunchAction(library, hashMap);
} else if (actionType.equals(Action.ACTION_TYPE_URI)) {
return new URIAction(library, hashMap);
} else if (actionType.equals(Action.ACTION_TYPE_RESET_SUBMIT)) {
return new ResetFormAction(library, hashMap);
} else if (actionType.equals(Action.ACTION_TYPE_SUBMIT_SUBMIT)) {
return new SubmitFormAction(library, hashMap);
} else if (actionType.equals(Action.ACTION_TYPE_NAMED)) {
return new NamedAction(library, hashMap);
} else if (actionType.equals(Action.ACTION_TYPE_JAVA_SCRIPT)) {
return new JavaScriptAction(library, hashMap);
}
}
return new Action(library, hashMap);
}
/**
* <p>Gets the type of action that this dictionary describes. The most
* common actions can be found in the PDF Reference 1.6 in section
* 8.5.3. ICEpdf currently only takes advantage of the "GoTo" action
* when a user clicks on a document outline. </p>
*
* @return The action type.
*/
public String getType() {
return type;
}
public boolean similar(Action obj) {
// check if object references can be compared
if (this.getPObjectReference() != null &&
obj.getPObjectReference() != null) {
return getPObjectReference().equals(obj.getPObjectReference());
} else {
// compare type
return getType().equals(obj.getType());
}
}
}