//======================================================================== // // OptionalContent.h // // Copyright 2007 Brad Hards // Copyright 2008 Carlos Garcia Campos // Copyright 2013 Albert Astals Cid // // Released under the GPL (version 2, or later, at your option) // //======================================================================== #ifndef OPTIONALCONTENT_H #define OPTIONALCONTENT_H #ifdef USE_GCC_PRAGMAS #pragma interface #endif #include "Object.h" #include "CharTypes.h" class GooString; class GooList; class XRef; class OptionalContentGroup; class OCDisplayNode; //------------------------------------------------------------------------ class OCGs { public: OCGs(Object *ocgObject, XRef *xref); ~OCGs(); // Is OCGS valid? GBool isOk() { return ok; } bool hasOCGs(); GooList *getOCGs() const { return optionalContentGroups; } OptionalContentGroup* findOcgByRef( const Ref &ref); // Get the root node of the optional content group display tree // (which does not necessarily include all of the OCGs). OCDisplayNode *getDisplayRoot(); Array* getOrderArray() { return (order.isArray() && order.arrayGetLength() > 0) ? order.getArray() : NULL; } Array* getRBGroupsArray() { return (rbgroups.isArray() && rbgroups.arrayGetLength()) ? rbgroups.getArray() : NULL; } bool optContentIsVisible( Object *dictRef ); private: GBool ok; GBool evalOCVisibilityExpr(Object *expr, int recursion); bool allOn( Array *ocgArray ); bool allOff( Array *ocgArray ); bool anyOn( Array *ocgArray ); bool anyOff( Array *ocgArray ); GooList *optionalContentGroups; Object order; Object rbgroups; XRef *m_xref; OCDisplayNode *display; // root node of display tree }; //------------------------------------------------------------------------ class OptionalContentGroup { public: enum State { On, Off }; // Values from the optional content usage dictionary. enum UsageState { ocUsageOn, ocUsageOff, ocUsageUnset }; OptionalContentGroup(Dict *dict); OptionalContentGroup(GooString *label); ~OptionalContentGroup(); GooString* getName() const; Ref getRef() const; void setRef(const Ref ref); State getState() { return m_state; }; void setState(State state) { m_state = state; }; UsageState getViewState() { return viewState; } UsageState getPrintState() { return printState; } private: GooString *m_name; Ref m_ref; State m_state; UsageState viewState; // suggested state when viewing UsageState printState; // suggested state when printing }; //------------------------------------------------------------------------ class OCDisplayNode { public: static OCDisplayNode *parse(Object *obj, OCGs *oc, XRef *xref, int recursion = 0); OCDisplayNode(); ~OCDisplayNode(); GooString *getName() { return name; } OptionalContentGroup *getOCG() { return ocg; } int getNumChildren(); OCDisplayNode *getChild(int idx); private: OCDisplayNode(GooString *nameA); OCDisplayNode(OptionalContentGroup *ocgA); void addChild(OCDisplayNode *child); void addChildren(GooList *childrenA); GooList *takeChildren(); GooString *name; // display name (may be NULL) OptionalContentGroup *ocg; // NULL for display labels GooList *children; // NULL if there are no children // [OCDisplayNode] }; #endif