/*
* 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.ri.common.views.annotations;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Name;
import org.icepdf.core.pobjects.acroform.FieldDictionaryFactory;
import org.icepdf.core.pobjects.annotations.AbstractWidgetAnnotation;
import org.icepdf.core.pobjects.annotations.Annotation;
import org.icepdf.core.pobjects.annotations.TextMarkupAnnotation;
import org.icepdf.ri.common.views.AbstractPageViewComponent;
import org.icepdf.ri.common.views.DocumentViewController;
import org.icepdf.ri.common.views.DocumentViewModel;
import java.awt.*;
import java.lang.reflect.Constructor;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* AnnotationComponentFactory is responsible for building an annotation component
* for given Annotation object. Generally this factor is only used by the annotation
* handlers during the creation of new annotations. When a PageComponent is
* initialized a pages Annotation list is iterated over and this class is used
* to generate the annotations components.
*
* @since 5.0
*/
public class AnnotationComponentFactory {
protected static final Logger logger =
Logger.getLogger(AnnotationComponentFactory.class.toString());
private static final String BUTTON_FIELD_CLASS =
"org.icepdf.core.pro.acroform.ButtonFieldComponent";
private static final String CHOICE_FIELD_CLASS =
"org.icepdf.core.pro.acroform.ChoiceFieldComponent";
private static final String TEXT_FIELD_CLASS =
"org.icepdf.core.pro.acroform.TextFieldComponent";
private static final String SIGNATURE_FIELD_CLASS =
"org.icepdf.ri.common.views.annotations.SignatureFieldComponent";
private static final String SIGNATURE_PRO_FIELD_CLASS =
"org.icepdf.core.pro.acroform.SignatureFieldComponent";
private AnnotationComponentFactory() {
}
/**
* Creates an annotation component for the given annotation object subtype.
*
* @param annotation annotation to encapsulate with a component instance
* @param documentViewController document view controller
* @param pageViewComponent parent pageViewComponent
* @param documentViewModel document view model.
* @return annotation component of the type specified by annotation subtype
*/
public synchronized static AbstractAnnotationComponent buildAnnotationComponent(
Annotation annotation,
DocumentViewController documentViewController,
AbstractPageViewComponent pageViewComponent,
DocumentViewModel documentViewModel) {
Name subtype = annotation.getSubType();
if (subtype != null) {
if (Annotation.SUBTYPE_LINK.equals(subtype)) {
return new LinkAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (TextMarkupAnnotation.isTextMarkupAnnotation(subtype)) {
return new TextMarkupAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_LINE.equals(subtype)) {
return new LineAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_CIRCLE.equals(subtype)) {
return new CircleAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_POLYGON.equals(subtype)) {
return new PolygonAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_POLYLINE.equals(subtype)) {
return new PolyLineAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_SQUARE.equals(subtype)) {
return new SquareAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_POPUP.equals(subtype)) {
return new PopupAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_TEXT.equals(subtype)) {
return new TextAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_INK.equals(subtype)) {
return new InkAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_FREE_TEXT.equals(subtype)) {
return new FreeTextAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
} else if (Annotation.SUBTYPE_WIDGET.equals(subtype)) {
AbstractWidgetAnnotation widgetAnnotation = (AbstractWidgetAnnotation) annotation;
Name fieldType = widgetAnnotation.getFieldDictionary().getFieldType();
// load pro interactive annotation support.
if (Document.foundIncrementalUpdater) {
if (FieldDictionaryFactory.TYPE_BUTTON.equals(fieldType)) {
return generatedWidgetField(BUTTON_FIELD_CLASS, annotation,
documentViewController, pageViewComponent,
documentViewModel);
} else if (FieldDictionaryFactory.TYPE_CHOICE.equals(fieldType)) {
return generatedWidgetField(CHOICE_FIELD_CLASS, annotation,
documentViewController, pageViewComponent,
documentViewModel);
} else if (FieldDictionaryFactory.TYPE_TEXT.equals(fieldType)) {
return generatedWidgetField(TEXT_FIELD_CLASS, annotation,
documentViewController, pageViewComponent,
documentViewModel);
} else if (FieldDictionaryFactory.TYPE_SIGNATURE.equals(fieldType)) {
return generatedWidgetField(SIGNATURE_PRO_FIELD_CLASS, annotation,
documentViewController, pageViewComponent,
documentViewModel);
}
}
// load basic widget support, selection, rendering.
else {
if (FieldDictionaryFactory.TYPE_SIGNATURE.equals(fieldType)) {
return generatedWidgetField(SIGNATURE_FIELD_CLASS, annotation,
documentViewController, pageViewComponent,
documentViewModel);
} else {
return new WidgetAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel);
}
}
} else {
return new AbstractAnnotationComponent(annotation, documentViewController,
pageViewComponent, documentViewModel) {
private static final long serialVersionUID = 409696785049691125L;
@Override
public void resetAppearanceShapes() {
}
@Override
public void paintComponent(Graphics g) {
}
public boolean isActive() {
return false;
}
};
}
}
return null;
}
private static AbstractAnnotationComponent generatedWidgetField(
final String widgetFieldClassName,
Annotation annotation, DocumentViewController documentViewController,
AbstractPageViewComponent pageViewComponent, DocumentViewModel documentViewModel) {
try {
Class<?> widgetFieldClass = Class.forName(widgetFieldClassName);
Class[] widgetArgs = {Annotation.class, DocumentViewController.class,
AbstractPageViewComponent.class, DocumentViewModel.class};
Constructor widgetFieldClassConstructor =
widgetFieldClass.getDeclaredConstructor(widgetArgs);
Object[] widgetParams = {annotation, documentViewController,
pageViewComponent, documentViewModel};
return (AbstractAnnotationComponent) widgetFieldClassConstructor.newInstance(widgetParams);
} catch (Throwable e) {
logger.log(Level.WARNING, "Error generating widget field", e);
}
return null;
}
}