/*
* 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.annotations;
import org.icepdf.core.pobjects.Dictionary;
import org.icepdf.core.pobjects.Name;
import org.icepdf.core.pobjects.PRectangle;
import org.icepdf.core.pobjects.StateManager;
import org.icepdf.core.util.Library;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.util.HashMap;
import java.util.logging.Logger;
/**
* A pop-up annotation (PDF 1.3) displays text in a pop-up window for entry and
* editing. It shall not appear alone but is associated with a markup annotation,
* its parent annotation, and shall be used for editing the parent’s text. It
* shall have no appearance stream or associated actions of its own and shall be
* identified by the Popup entry in the parent’s annotation dictionary
* (see Table 174). Table 183 shows the annotation dictionary entries specific to
* this type of annotation.A pop-up annotation (PDF 1.3) displays text in a pop-up
* window for entry and editing. It shall not appear alone but is associated
* with a markup annotation, its parent annotation, and shall be used for editing
* the parent’s text. It shall have no appearance stream or associated actions
* of its own and shall be identified by the Popup entry in the parent’s annotation
* dictionary (see Table 174). Table 183 shows the annotation dictionary entries
* specific to this type of annotation.
*
* @since 5.0
*/
public class PopupAnnotation extends Annotation {
private static final Logger logger =
Logger.getLogger(PopupAnnotation.class.toString());
/**
* (Optional; shall be an indirect reference) The parent annotation with
* which this pop-up annotation shall be associated.
* <br>
* If this entry is present, the parent annotation’s Contents, M, C, and T
* entries (see Table 168) shall override those of the pop-up annotation
* itself.
*/
public static final Name PARENT_KEY = new Name("Parent");
/**
* (Optional) A flag specifying whether the pop-up annotation shall
* initially be displayed open. Default value: false (closed).
*/
public static final Name OPEN_KEY = new Name("Open");
protected boolean open;
protected MarkupAnnotation parent;
public PopupAnnotation(Library l, HashMap h) {
super(l, h);
}
public void init() throws InterruptedException{
super.init();
open = library.getBoolean(entries, OPEN_KEY);
}
/**
* Gets an instance of a PopupAnnotation that has valid Object Reference.
*
* @param library document library
* @param rect bounding rectangle in user space
* @return new PopupAnnotation Instance.
*/
public static PopupAnnotation getInstance(Library library,
Rectangle rect) {
// state manager
StateManager stateManager = library.getStateManager();
// create a new entries to hold the annotation properties
HashMap<Name, Object> entries = new HashMap<Name, Object>();
// set default link annotation values.
entries.put(Dictionary.TYPE_KEY, Annotation.TYPE_VALUE);
entries.put(Dictionary.SUBTYPE_KEY, Annotation.SUBTYPE_POPUP);
// coordinates
if (rect != null) {
entries.put(Annotation.RECTANGLE_KEY,
PRectangle.getPRectangleVector(rect));
} else {
entries.put(Annotation.RECTANGLE_KEY, new Rectangle(10, 10, 50, 100));
}
// create the new instance
PopupAnnotation popupAnnotation = null;
try {
popupAnnotation = new PopupAnnotation(library, entries);
popupAnnotation.init();
popupAnnotation.setPObjectReference(stateManager.getNewReferencNumber());
popupAnnotation.setNew(true);
// set default flags.
popupAnnotation.setFlag(Annotation.FLAG_READ_ONLY, false);
popupAnnotation.setFlag(Annotation.FLAG_NO_ROTATE, false);
popupAnnotation.setFlag(Annotation.FLAG_NO_ZOOM, false);
popupAnnotation.setFlag(Annotation.FLAG_PRINT, false);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
logger.finer("Popup Annotation initialization was interrupted");
}
return popupAnnotation;
}
@Override
public void resetAppearanceStream(double dx, double dy, AffineTransform pageTransform) {
}
public boolean isOpen() {
return open;
}
public void setOpen(boolean open) {
this.open = open;
entries.put(OPEN_KEY, open);
}
public MarkupAnnotation getParent() {
Object tmp = library.getObject(entries, PARENT_KEY);
// should normally be a text annotation type.
if (tmp != null && tmp instanceof MarkupAnnotation) {
parent = (MarkupAnnotation) tmp;
}
return parent;
}
public void setParent(MarkupAnnotation parent) {
this.parent = parent;
entries.put(PARENT_KEY, parent.getPObjectReference());
}
}