blob: 00ba0dd727acdfbccd4846c7d589175d38de1ae6 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*
*************************************************************/
#ifndef INCLUDED_PDFI_GENERICELEMENTS_HXX
#define INCLUDED_PDFI_GENERICELEMENTS_HXX
#include "pdfihelper.hxx"
#include "treevisiting.hxx"
#include <com/sun/star/task/XStatusIndicator.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <basegfx/polygon/b2dpolypolygon.hxx>
#include <basegfx/range/b2drange.hxx>
#include <rtl/ustring.hxx>
#include <rtl/ustrbuf.hxx>
#include <list>
namespace pdfi
{
class XmlEmitter;
class StyleContainer;
class ImageContainer;
class PDFIProcessor;
class ElementFactory;
struct EmitContext
{
EmitContext(
XmlEmitter& _rEmitter,
StyleContainer& _rStyles,
ImageContainer& _rImages,
PDFIProcessor& _rProcessor,
const com::sun::star::uno::Reference<
com::sun::star::task::XStatusIndicator>& _xStatusIndicator,
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > xContext)
:
rEmitter(_rEmitter),
rStyles(_rStyles),
rImages(_rImages),
rProcessor(_rProcessor),
xStatusIndicator(_xStatusIndicator),
m_xContext(xContext)
{}
XmlEmitter& rEmitter;
StyleContainer& rStyles;
ImageContainer& rImages;
PDFIProcessor& rProcessor;
com::sun::star::uno::Reference<
com::sun::star::task::XStatusIndicator> xStatusIndicator;
com::sun::star::uno::Reference<
com::sun::star::uno::XComponentContext > m_xContext;
};
struct Element : public ElementTreeVisitable
{
protected:
Element( Element* pParent )
: x( 0 ), y( 0 ), w( 0 ), h( 0 ), StyleId( -1 ), Parent( pParent )
{
if( pParent )
pParent->Children.push_back( this );
}
public:
virtual ~Element();
/// Apply visitor to all children
void applyToChildren( ElementTreeVisitor& );
/// Union element geometry with given element
void updateGeometryWith( const Element* pMergeFrom );
#if OSL_DEBUG_LEVEL > 1
// xxx refac TODO: move code to visitor
virtual void emitStructure( int nLevel );
#endif
/** el must be a valid dereferencable iterator of el->Parent->Children
pNewParent must not be NULL
*/
static void setParent( std::list<Element*>::iterator& el, Element* pNewParent );
double x, y, w, h;
sal_Int32 StyleId;
Element* Parent;
std::list<Element*> Children;
};
struct ListElement : public Element
{
ListElement() : Element( NULL ) {}
// ElementTreeVisitable
virtual void visitedBy( ElementTreeVisitor&, const std::list< Element* >::const_iterator& );
};
struct HyperlinkElement : public Element
{
friend class ElementFactory;
protected:
HyperlinkElement( Element* pParent, const rtl::OUString& rURI )
: Element( pParent ), URI( rURI ) {}
public:
// ElementTreeVisitable
virtual void visitedBy( ElementTreeVisitor&, const std::list< Element* >::const_iterator& );
rtl::OUString URI;
};
struct GraphicalElement : public Element
{
protected:
GraphicalElement( Element* pParent, sal_Int32 nGCId )
: Element( pParent ), GCId( nGCId ), MirrorVertical( false ) {}
public:
sal_Int32 GCId;
bool MirrorVertical;
};
struct DrawElement : public GraphicalElement
{
protected:
DrawElement( Element* pParent, sal_Int32 nGCId )
: GraphicalElement( pParent, nGCId ), isCharacter(false), ZOrder(0) {}
public:
bool isCharacter;
sal_Int32 ZOrder;
};
struct FrameElement : public DrawElement
{
friend class ElementFactory;
protected:
FrameElement( Element* pParent, sal_Int32 nGCId )
: DrawElement( pParent, nGCId ) {}
public:
// ElementTreeVisitable
virtual void visitedBy( ElementTreeVisitor&, const std::list< Element* >::const_iterator& );
};
struct TextElement : public GraphicalElement
{
friend class ElementFactory;
protected:
TextElement( Element* pParent, sal_Int32 nGCId, sal_Int32 nFontId )
: GraphicalElement( pParent, nGCId ), FontId( nFontId ) {}
public:
// ElementTreeVisitable
virtual void visitedBy( ElementTreeVisitor&, const std::list< Element* >::const_iterator& );
rtl::OUStringBuffer Text;
sal_Int32 FontId;
};
struct ParagraphElement : public Element
{
friend class ElementFactory;
protected:
ParagraphElement( Element* pParent ) : Element( pParent ), Type( Normal ), bRtl( false ) {}
public:
// ElementTreeVisitable
virtual void visitedBy( ElementTreeVisitor&, const std::list< Element* >::const_iterator& rParentIt );
// returns true only if only a single line is contained
bool isSingleLined( PDFIProcessor& rProc ) const;
// returns the highest line height of the contained textelements
// line height is font height if the text element is itself multilined
double getLineHeight( PDFIProcessor& rProc ) const;
// returns the first text element child; does not recurse through subparagraphs
TextElement* getFirstTextChild() const;
enum ParagraphType { Normal, Headline };
ParagraphType Type;
bool bRtl;
};
struct PolyPolyElement : public DrawElement
{
friend class ElementFactory;
protected:
PolyPolyElement( Element* pParent, sal_Int32 nGCId,
const basegfx::B2DPolyPolygon& rPolyPoly,
sal_Int8 nAction );
public:
// ElementTreeVisitable
virtual void visitedBy( ElementTreeVisitor&, const std::list< Element* >::const_iterator& rParentIt );
void updateGeometry();
#if OSL_DEBUG_LEVEL > 1
virtual void emitStructure( int nLevel );
#endif
basegfx::B2DPolyPolygon PolyPoly;
sal_Int8 Action;
};
struct ImageElement : public DrawElement
{
friend class ElementFactory;
protected:
ImageElement( Element* pParent, sal_Int32 nGCId, ImageId nImage )
: DrawElement( pParent, nGCId ), Image( nImage ) {}
public:
// ElementTreeVisitable
virtual void visitedBy( ElementTreeVisitor&, const std::list< Element* >::const_iterator& );
ImageId Image;
};
struct PageElement : public Element
{
friend class ElementFactory;
protected:
PageElement( Element* pParent, sal_Int32 nPageNr )
: Element( pParent ), PageNumber( nPageNr ), Hyperlinks(),
TopMargin( 0.0 ), BottomMargin( 0.0 ), LeftMargin( 0.0 ), RightMargin( 0.0 ),
HeaderElement( NULL ), FooterElement( NULL )
{}
private:
// helper method for resolveHyperlinks
bool resolveHyperlink( std::list<Element*>::iterator link_it, std::list<Element*>& rElements );
public:
virtual ~PageElement();
// ElementTreeVisitable
virtual void visitedBy( ElementTreeVisitor&, const std::list< Element* >::const_iterator& rParentIt );
void emitPageAnchoredElements( EmitContext& rEmitContext );
static void updateParagraphGeometry( Element* pEle );
void resolveHyperlinks();
void resolveFontStyles( PDFIProcessor& rProc );
void resolveUnderlines( PDFIProcessor& rProc );
sal_Int32 PageNumber;
ListElement Hyperlinks; // contains not yet realized links on this page
double TopMargin;
double BottomMargin;
double LeftMargin;
double RightMargin;
Element* HeaderElement;
Element* FooterElement;
};
struct DocumentElement : public Element
{
friend class ElementFactory;
protected:
DocumentElement() : Element( NULL ) {}
public:
virtual ~DocumentElement();
// ElementTreeVisitable
virtual void visitedBy( ElementTreeVisitor&, const std::list< Element* >::const_iterator& );
};
// this class is the differentiator of document types: it will create
// Element objects with an optimize() method suitable for the document type
class ElementFactory
{
public:
ElementFactory() {}
virtual ~ElementFactory();
virtual HyperlinkElement* createHyperlinkElement( Element* pParent, const rtl::OUString& rURI )
{ return new HyperlinkElement( pParent, rURI ); }
virtual TextElement* createTextElement( Element* pParent, sal_Int32 nGCId, sal_Int32 nFontId )
{ return new TextElement( pParent, nGCId, nFontId ); }
virtual ParagraphElement* createParagraphElement( Element* pParent )
{ return new ParagraphElement( pParent ); }
virtual FrameElement* createFrameElement( Element* pParent, sal_Int32 nGCId )
{ return new FrameElement( pParent, nGCId ); }
virtual PolyPolyElement*
createPolyPolyElement( Element* pParent,
sal_Int32 nGCId,
const basegfx::B2DPolyPolygon& rPolyPoly,
sal_Int8 nAction)
{ return new PolyPolyElement( pParent, nGCId, rPolyPoly, nAction ); }
virtual ImageElement* createImageElement( Element* pParent, sal_Int32 nGCId, ImageId nImage )
{ return new ImageElement( pParent, nGCId, nImage ); }
virtual PageElement* createPageElement( Element* pParent,
sal_Int32 nPageNr )
{ return new PageElement( pParent, nPageNr ); }
virtual DocumentElement* createDocumentElement()
{ return new DocumentElement(); }
};
}
#endif