/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (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.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: IBM Corporation
 *
 *  Copyright: 2008 by IBM Corporation
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/*************************************************************************
 * @file
 *  For LWP filter architecture prototype
 ************************************************************************/
/*************************************************************************
 * Change History
 Jan 2005			Created
 ************************************************************************/

#ifndef _LWPLAYOUT_HXX
#define _LWPLAYOUT_HXX

#include "lwpheader.hxx"
#include "lwpobj.hxx"
#include "lwpobjhdr.hxx"
#include "lwpobjstrm.hxx"
#include "lwpobjid.hxx"
#include "lwpdlvlist.hxx"
#include "lwpfilehdr.hxx"

#include "lwplayoutdef.hxx"
#include "xfilter/xfdefs.hxx"
#include "xfilter/xfpagemaster.hxx"
#include "xfilter/xfcolumns.hxx"
#include "xfilter/xfborders.hxx"
#include "xfilter/xfframestyle.hxx"
#include "xfilter/xfframe.hxx"
#include "xfilter/xfbgimage.hxx"
#include "lwpusewhen.hxx"

#define ANCHOR_HEIGHT 		0x120000
#define FIRST_LAYOUTPAGENO	0x0001
#define LAST_LAYOUTPAGENO		0xffff

#define LAY_BUOYFLOAT 		0x01
#define LAY_BUOYNEUTRAL		0x02
#define	LAY_BUOYSINK 		0x03
#define	LAY_BUOYLAYER 		0x80

class LwpPara;
class LwpVirtualLayout : public LwpDLNFPVList
{
public:
    LwpVirtualLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm);
    virtual ~LwpVirtualLayout(){};
    virtual sal_Bool MarginsSameAsParent();
    inline virtual sal_uInt16 GetNumCols(){return 1;}
    virtual double GetColWidth(sal_uInt16 nIndex);
    virtual double GetColGap(sal_uInt16 nIndex);
    virtual double GetMarginsValue(const sal_uInt8& /*nWhichSide*/){return 0;}
    virtual double GetExtMarginsValue(const sal_uInt8& /*nWhichSide*/){return 0;}
    virtual sal_Bool IsAutoGrow(){ return sal_False;}
    virtual sal_Bool IsAutoGrowUp(){ return sal_False;}
    virtual sal_Bool IsAutoGrowDown(){ return sal_False;}
    virtual sal_Bool IsAutoGrowLeft(){ return sal_False;};
    virtual sal_Bool IsAutoGrowRight(){ return sal_False;};
    virtual sal_Bool IsFitGraphic();
    virtual sal_Bool IsAutoGrowWidth();
    virtual sal_Bool IsInlineToMargin();
    virtual sal_uInt8 GetContentOrientation(){ return TEXT_ORIENT_LRTB;}
    virtual sal_Bool HonorProtection();
    virtual sal_Bool IsProtected();
    virtual sal_Bool HasProtection();
    virtual OUString GetStyleName(){ return m_StyleName;}
    virtual sal_Bool IsComplex();
    virtual sal_Bool IsAnchorPage(){ return sal_False;}
    virtual sal_Bool IsAnchorFrame(){ return sal_False;}
    virtual sal_Bool IsAnchorCell(){ return sal_False;}
    virtual sal_Bool IsPage();
    virtual sal_Bool IsHeader();
    virtual sal_Bool IsFooter();
    virtual sal_Bool IsFrame();
    virtual sal_Bool IsCell();
    virtual sal_Bool IsSuperTable();
    virtual sal_Bool IsGroupHead();
    virtual sal_uInt8 GetRelativeType();
    virtual sal_Bool IsRelativeAnchored();
    virtual LwpUseWhen* GetUseWhen();
    virtual LwpUseWhen* VirtualGetUseWhen(){ return NULL;}
    virtual sal_Bool IsUseOnAllPages(){ return sal_False;}
    virtual sal_Bool IsUseOnAllEvenPages(){ return sal_False;}
    virtual sal_Bool IsUseOnAllOddPages(){ return sal_False;}
    virtual sal_Bool IsUseOnPage(){ return sal_False;}
    virtual sal_Int32 GetPageNumber(sal_uInt16 /*nLayoutNumber*/ = 0){ return -1;}
    virtual sal_Bool IsMinimumHeight();
    virtual sal_Bool IsForWaterMark(){ return sal_False;}
    virtual LwpPara* GetLastParaOfPreviousStory() { return NULL; }
    virtual LwpVirtualLayout* GetParentLayout();
    virtual LwpVirtualLayout* GetContainerLayout(){ return NULL;}
    virtual void RegisterChildStyle();
    virtual sal_Bool NoContentReference();
    virtual sal_Bool IsStyleLayout();
    virtual enumXFAlignType GetVerticalAlignmentType()
    {
        if (m_nAttributes & STYLE_CENTEREDVERTICALLY)
        {
            return enumXFAlignMiddle;
        }
        else if (m_nAttributes & STYLE_BOTTOMALIGNED)
        {
            return enumXFAlignBottom;
        }
        return enumXFAlignTop;
    };
    virtual void SetStyleName(const OUString & str){ m_StyleName = str;};
    virtual double GetWidth(){return -1;};

    //Check whether there are contents in the layout
    virtual sal_Bool HasContent(){return sal_False;}
    //End by
protected:
    void Read();
protected:
    sal_uInt32 m_nAttributes;
    sal_uInt32 m_nAttributes2;
    sal_uInt32 m_nAttributes3;
    sal_uInt32 m_nOverrideFlag;
    sal_uInt16 m_nDirection;
    sal_uInt16 m_nEditorID;
    LwpObjectID m_NextEnumerated;
    LwpObjectID m_PreviousEnumerated;
    OUString m_StyleName;
    enum LWP_LAYOUT_TYPE
    {
        LWP_VIRTUAL_LAYOUT,
        LWP_HEAD_LAYOUT,
        LWP_PAGE_LAYOUT,
        LWP_HEADER_LAYOUT,
        LWP_FOOTER_LAYOUT,
        LWP_FRAME_LAYOUT,
        LWP_SUPERTABLE_LAYOUT,
        LWP_TABLE_LAYOUT,
        LWP_ROW_LAYOUT,
        LWP_COLUMN_LAYOUT,
        LWP_CELL_LAYOUT,
        LWP_CONNECTED_CELL_LAYOUT,
        LWP_HIDDEN_CELL_LAYOUT,
        LWP_TABLE_HEADING_LAYOUT,
        LWP_ROW_HEADING_LAYOUT,
        LWP_DROPCAP_LAYOUT,
        LWP_GROUP_LAYOUT,
        LWP_TOC_SUPERTABLE_LAYOUT,
        LWP_FOOTNOTE_LAYOUT,
        LWP_FOOTNOTE_ROW_LAYOUT,
        LWP_FOOTNOTE_CELL_LAYOUT,
        LWP_ENDNOTE_LAYOUT,
        LWP_ENDNOTE_SUPERTABLE_LAYOUT,
        LWP_FOOTNOTE_SUPERTABLE_LAYOUT,
        LWP_NOTE_LAYOUT,
        LWP_NOTEHEADER_LAYOUT,
        LWP_NOTETEXT_LAYOUT,
        LWP_VIEWPORT_LAYOUT
    };
    enum LayoutDirection
    {
        LAY_USEDIRECTION	= 0x01,
        LAY_AUTOGROW		= 0x02,
        LAY_AUTOSIZE		= 0x04,
        LAY_TOCONTAINER		= 0x08,
        LAY_DIRALLBITS		= 0x0f
    };
    enum	{SHIFT_UP = 0, SHIFT_DOWN = 4, SHIFT_LEFT = 8, SHIFT_RIGHT =12};
public:
    virtual LWP_LAYOUT_TYPE GetLayoutType () { return LWP_VIRTUAL_LAYOUT;}
    virtual LwpVirtualLayout* FindChildByType(LWP_LAYOUT_TYPE eType);
};

class LwpAssociatedLayouts
{
public:
    LwpAssociatedLayouts(){};
    //LwpAssociatedLayouts(LwpObjectStream* pStrm){Read(pStrm);};
public:
    void Read(LwpObjectStream* pStrm);
    LwpObjectID* GetOnlyLayout(){return &m_OnlyLayout;}
    LwpDLVListHeadTail* GetLayouts(){return &m_Layouts;}
    LwpVirtualLayout* GetLayout(LwpVirtualLayout* pStartLayout);
protected:
    LwpObjectID m_OnlyLayout; //LwpVirtualLayout
    LwpDLVListHeadTail m_Layouts;
};

class LwpHeadLayout : public LwpVirtualLayout
{
public:
    LwpHeadLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm);
    virtual ~LwpHeadLayout(){};
    void RegisterStyle();
    LwpVirtualLayout* FindEnSuperTableLayout();
protected:
    void Read();
    virtual LWP_LAYOUT_TYPE GetLayoutType () { return LWP_HEAD_LAYOUT;}
};

//add by , 01/20/2005
class LwpLayoutStyle
{
public:
    LwpLayoutStyle();
    virtual ~LwpLayoutStyle();
    void Read(LwpObjectStream* pStrm);
private:
    sal_uInt32		m_nStyleDefinition;
    LwpAtomHolder*	m_pDescription;
    sal_uInt16		m_nKey;
};

class LwpLayoutMisc
{
public:
    LwpLayoutMisc();
    virtual ~LwpLayoutMisc();
    void Read(LwpObjectStream* pStrm);
private:
    sal_Int32	m_nGridDistance;
    sal_uInt16 m_nGridType;
    LwpAtomHolder* m_pContentStyle;
};
//end add

#include "lwplaypiece.hxx"

class LwpMiddleLayout : public LwpVirtualLayout
{
public:
    LwpMiddleLayout( LwpObjectHeader &objHdr, LwpSvStream* pStrm );
    virtual ~LwpMiddleLayout();
    virtual BOOL MarginsSameAsParent();
    virtual double GetMarginsValue(const sal_uInt8& nWhichSide);
    virtual double GetExtMarginsValue(const sal_uInt8& nWhichSide);
    LwpLayoutGeometry* GetGeometry();
    double GetGeometryHeight();
    double GetGeometryWidth();
    LwpBorderStuff* GetBorderStuff();
    LwpBackgroundStuff* GetBackgroundStuff();
    enumXFTextDir GetTextDirection();
    XFBorders* GetXFBorders();
    LwpColor* GetBackColor();
    virtual sal_Bool IsAutoGrow();
    virtual sal_Bool IsAutoGrowUp();
    virtual sal_Bool IsAutoGrowDown();
    virtual sal_Bool IsAutoGrowLeft();
    virtual sal_Bool IsAutoGrowRight();
    virtual sal_uInt8 GetContentOrientation();
    virtual sal_Bool HonorProtection();
    virtual sal_Bool IsProtected();
    virtual LwpVirtualLayout* GetWaterMarkLayout();
    XFBGImage* GetXFBGImage();
    virtual sal_Bool GetUsePrinterSettings();

    LwpLayoutScale* GetLayoutScale(){return static_cast<LwpLayoutScale*>(m_LayScale.obj());}
        sal_uInt16 GetScaleMode(void);
    void SetScaleMode(sal_uInt16 nVal);
    sal_uInt16 GetScaleTile(void);
    void SetScaleTile(sal_uInt16 nVal);
    sal_uInt16 GetScaleCenter(void);
    void SetScaleCenter(sal_uInt16 nVal);
    sal_uInt32 GetScalePercentage(void);
    void SetScalePercentage(sal_uInt32 nVal);
    double GetScaleWidth(void);
    void SetScaleWidth(double fVal);
    double GetScaleHeight(void);
    void SetScaleHeight(double fVal);

    sal_Bool CanSizeRight(void);
    virtual double GetWidth();
    virtual sal_Int32 GetMinimumWidth();
    sal_Bool IsSizeRightToContent(void);
    sal_Bool IsSizeRightToContainer(void);
    sal_Int32 DetermineWidth();
    virtual double GetHeight();
    virtual LwpPoint GetOrigin();

    // added by , 06/01/2004
    sal_Bool IsPatternFill();
    XFBGImage* GetFillPattern();
    // end add


    //Check whether there are contents in the layout
    virtual sal_Bool HasContent();
    //End by

protected:
    void Read();
protected:
    enum
    {
        DISK_GOT_STYLE_STUFF		= 0x01,
        DISK_GOT_MISC_STUFF			= 0x02
    };

    LwpObjectID m_Content;
    LwpObjectID m_BasedOnStyle;

    // 01/20/2005
    LwpObjectID		m_TabPiece;
    LwpLayoutStyle*	m_pStyleStuff;
    LwpLayoutMisc*	m_pMiscStuff;
    LwpObjectID		m_LayGeometry;
    LwpObjectID		m_LayScale;
    LwpObjectID		m_LayMargins;
    LwpObjectID		m_LayBorderStuff;
    LwpObjectID		m_LayBackgroundStuff;
    LwpObjectID		m_LayExtBorderStuff;
    //end
public:
    LwpObjectID* GetContent(){return &m_Content;}
    LwpTabOverride* GetTabOverride();
};

class LwpLayout : public LwpMiddleLayout
{
public:
    LwpLayout( LwpObjectHeader &objHdr, LwpSvStream* pStrm );
    virtual ~LwpLayout();
    XFColumns* GetXFColumns();
    XFColumnSep* GetColumnSep();
    LwpShadow* GetShadow();
    XFShadow* GetXFShadow();
protected:
    void Read();
protected:
    // 01/20/2005
    LwpUseWhen*	m_pUseWhen;
    LwpObjectID	m_Positon;
    LwpObjectID	m_LayColumns;
    LwpObjectID	m_LayGutterStuff;
    LwpObjectID	m_LayJoinStuff;
    LwpObjectID	m_LayShadow;
    LwpObjectID	m_LayExtJoinStuff;
    //end

public:
    LwpUseWhen* VirtualGetUseWhen();
    virtual sal_uInt16 GetNumCols();
    virtual double GetColWidth(sal_uInt16 nIndex);
    virtual double GetColGap(sal_uInt16 nIndex);
    virtual sal_uInt16 GetUsePage();
public:
    enum UseWhenType
    {
        StartWithinColume,
        StartWithinPage,
        StartOnNextPage,
        StartOnOddPage,
        StartOnEvenPage
    };
public:
    virtual UseWhenType GetUseWhenType();
    virtual sal_Bool IsUseOnAllPages();
    virtual sal_Bool IsUseOnAllEvenPages();
    virtual sal_Bool IsUseOnAllOddPages();
    virtual sal_Bool IsUseOnPage();
    LwpObjectID* GetPosition(){ return &m_Positon;}
    virtual LwpVirtualLayout* GetContainerLayout();
};

class XFFont;
class LwpPlacableLayout : public LwpLayout
{
public:
    LwpPlacableLayout( LwpObjectHeader &objHdr, LwpSvStream* pStrm );
    virtual ~LwpPlacableLayout();
    virtual sal_uInt8 GetWrapType();
    virtual LwpLayoutRelativity* GetRelativityPiece();
    virtual sal_uInt8 GetRelativeType();
    sal_uInt8 GetRelativeFromWhere();
    LwpPoint GetRelativeDistance();
    sal_uInt8 GetTetherType();
    sal_uInt8 GetTetherWhere();
    virtual sal_Int32 GetBaseLineOffset();
    virtual sal_Bool IsAnchorPage();
    virtual sal_Bool IsAnchorFrame();
    virtual sal_Bool IsAnchorCell();
    virtual void XFConvertFrame(XFContentContainer* /*pCont*/, sal_Int32 /*nStart*/ = 0, sal_Int32 /*nEnd*/ = 0, sal_Bool /*bAll*/ = sal_False) {}
    XFFont* GetFont();
    void SetFont(XFFont* pFont);
    enum WrapType
    {
        LAY_WRAP_AROUND = 1,
        LAY_NO_WRAP_BESIDE,
        LAY_NO_WRAP_AROUND,
        LAY_WRAP_LEFT,
        LAY_WRAP_RIGHT,
        //OLD_LAY_WRAP_RIGHT,
        LAY_WRAP_BOTH,
        LAY_WRAP_IRREG_BOTH,
        LAY_WRAP_IRREG_LEFT,
        LAY_WRAP_IRREG_RIGHT,
        LAY_WRAP_IRREG_BIGGEST
    };
protected:
    void Read();
protected:
    sal_uInt8 m_nWrapType;
    sal_uInt8 m_nBuoyancy;
    sal_Int32 m_nBaseLineOffset;
    LwpAtomHolder m_Script;
    LwpObjectID m_LayRelativity;
    sal_uInt16 m_nPageNumber;//for frame anchored to page
    XFFont* m_pFont;//for frame position
};
#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
