blob: ef0022eb4a73c4d874bb938b905e3dfcb55fdfa7 [file] [log] [blame]
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#ifndef _FWL_GRID_IMP_H
#define _FWL_GRID_IMP_H
class CFWL_Content;
class IFWL_Widget;
class CFWL_GridLength;
class CFWL_GridColRow;
class CFWL_GridWidgetInfo;
class CFWL_GridImp;
class CFWL_GridLength {
public:
CFWL_GridLength() : fLength(0), eUnit(FWL_GRIDUNIT_Fixed) {}
CFWL_GridLength(FX_FLOAT fValue, FWL_GRIDUNIT e)
: fLength(fValue), eUnit(e) {}
FX_FLOAT fLength;
FWL_GRIDUNIT eUnit;
};
class CFWL_GridColRow {
public:
CFWL_GridColRow()
: m_Size(1, FWL_GRIDUNIT_Scaled),
m_MinSize(0, FWL_GRIDUNIT_Fixed),
m_MaxSize(0, FWL_GRIDUNIT_Infinity),
m_fActualSize(0),
m_fActualPos(0) {}
CFWL_GridLength m_Size;
CFWL_GridLength m_MinSize;
CFWL_GridLength m_MaxSize;
FX_FLOAT m_fActualSize;
FX_FLOAT m_fActualPos;
};
class CFWL_GridWidgetInfo {
public:
CFWL_GridWidgetInfo()
: m_iColumn(0),
m_iColumnSpan(1),
m_iRow(0),
m_iRowSpan(1),
m_dwMarginFlag(0),
m_fActualWidth(0),
m_fActualHeight(0) {
m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto;
m_Size[FWL_GRIDSIZE_Width].fLength = 0;
m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto;
m_Size[FWL_GRIDSIZE_Height].fLength = 0;
m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed;
m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0;
m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity;
m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0;
m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed;
m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0;
m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity;
m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0;
m_Margin[0] = m_Margin[1] = m_Margin[2] = m_Margin[3] = 0;
}
int32_t m_iColumn;
int32_t m_iColumnSpan;
int32_t m_iRow;
int32_t m_iRowSpan;
CFWL_GridLength m_Size[6];
FX_DWORD m_dwMarginFlag;
FX_FLOAT m_Margin[4];
FX_FLOAT m_fActualWidth;
FX_FLOAT m_fActualHeight;
};
class CFWL_GridImp : public CFWL_ContentImp {
public:
CFWL_GridImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter);
virtual ~CFWL_GridImp();
virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
virtual FX_DWORD GetClassID() const;
virtual FWL_ERR Initialize();
virtual FWL_ERR Finalize();
virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
virtual FWL_ERR SetWidgetRect(const CFX_RectF& rect);
virtual FWL_ERR Update();
virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
const CFX_Matrix* pMatrix = NULL);
virtual FWL_ERR InsertWidget(IFWL_Widget* pChild, int32_t nIndex = -1);
virtual FWL_ERR RemoveWidget(IFWL_Widget* pWidget);
virtual FWL_HGRIDCOLROW InsertColRow(FX_BOOL bColumn, int32_t nIndex = -1);
virtual int32_t CountColRows(FX_BOOL bColumn);
virtual FWL_HGRIDCOLROW GetColRow(FX_BOOL bColumn, int32_t nIndex);
virtual int32_t GetIndex(FWL_HGRIDCOLROW hColRow);
virtual FX_FLOAT GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
virtual FWL_ERR SetSize(FWL_HGRIDCOLROW hColRow,
FX_FLOAT fSize,
FWL_GRIDUNIT eUnit);
FX_FLOAT GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
FWL_ERR SetMinSize(FWL_HGRIDCOLROW hColRow,
FX_FLOAT fSize,
FWL_GRIDUNIT eUnit);
FX_FLOAT GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
FWL_ERR SetMaxSize(FWL_HGRIDCOLROW hColRow,
FX_FLOAT fSize,
FWL_GRIDUNIT eUnit);
virtual FX_BOOL DeleteColRow(FWL_HGRIDCOLROW hColRow);
virtual FX_BOOL IsColumn(FWL_HGRIDCOLROW hColRow);
virtual int32_t GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn);
virtual FWL_ERR SetWidgetPos(IFWL_Widget* pWidget,
int32_t iPos,
FX_BOOL bColumn);
virtual int32_t GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn);
virtual FWL_ERR SetWidgetSpan(IFWL_Widget* pWidget,
int32_t iSpan,
FX_BOOL bColumn);
virtual FX_FLOAT GetWidgetSize(IFWL_Widget* pWidget,
FWL_GRIDSIZE eSize,
FWL_GRIDUNIT& eUnit);
virtual FWL_ERR SetWidgetSize(IFWL_Widget* pWidget,
FWL_GRIDSIZE eSize,
FX_FLOAT fSize,
FWL_GRIDUNIT eUit);
virtual FX_BOOL GetWidgetMargin(IFWL_Widget* pWidget,
FWL_GRIDMARGIN eMargin,
FX_FLOAT& fMargin);
virtual FWL_ERR SetWidgetMargin(IFWL_Widget* pWidget,
FWL_GRIDMARGIN eMargin,
FX_FLOAT fMargin);
virtual FWL_ERR RemoveWidgetMargin(IFWL_Widget* pWidget,
FWL_GRIDMARGIN eMargin);
virtual FX_FLOAT GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit);
virtual FWL_ERR SetGridSize(FWL_GRIDSIZE eSize,
FX_FLOAT fSize,
FWL_GRIDUNIT eUit);
protected:
CFWL_GridWidgetInfo* GetWidgetInfo(IFWL_Widget* pWidget);
void ProcFixedColRow(CFWL_GridColRow* pColRow,
int32_t nIndex,
FX_FLOAT fColRowSize,
FX_BOOL bColumn);
void ProcAutoColRow(CFWL_GridColRow* pColRow,
int32_t nIndex,
FX_BOOL bColumn);
void ProcScaledColRow(CFWL_GridColRow* pColRow,
int32_t nIndex,
FX_FLOAT fColRowSize,
FX_BOOL bColumn);
void CalcWidgetWidth(IFWL_Widget* pWidget,
CFWL_GridWidgetInfo* pInfo,
FX_FLOAT fColunmWidth);
void CalcWidgetHeigt(IFWL_Widget* pWidget,
CFWL_GridWidgetInfo* pInfo,
FX_FLOAT fRowHeigt);
FX_FLOAT CalcAutoColumnWidgetWidth(IFWL_Widget* pWidget,
CFWL_GridWidgetInfo* pInfo);
FX_FLOAT CalcAutoColumnWidgetHeight(IFWL_Widget* pWidget,
CFWL_GridWidgetInfo* pInfo);
FX_FLOAT ProcessColumns(FX_FLOAT fWidth);
FX_FLOAT ProcessRows(FX_FLOAT fHeight);
FX_FLOAT ProcessUnCertainColumns();
FX_FLOAT ProcessUnCertainRows();
FX_BOOL SetColRowActualSize(CFWL_GridColRow* pColRow,
FX_FLOAT fSize,
FX_BOOL bSetBeyond = FALSE);
FX_FLOAT SetWidgetActualWidth(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fWidth);
FX_FLOAT SetWidgetActualHeight(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fHeight);
void SetAllWidgetsRect();
FX_BOOL IsGrid(IFWL_Widget* pWidget);
void SetSpanAutoColRowSize(const CFX_PtrArray& spanAutos,
FX_FLOAT fTotalSize);
void SetSpanScaledColRowSize(const CFX_PtrArray& spanScaleds,
FX_FLOAT fTotalSize,
FX_FLOAT fTotalScaledNum);
void SetScaledColRowsSize(const CFX_PtrArray& spanScaleds,
FX_FLOAT fTotalSize,
FX_FLOAT fTotalScaledNum);
CFX_PtrArray m_Rows;
CFX_PtrArray m_Columns;
CFX_PtrArray m_Widgets;
CFX_MapPtrToPtr m_mapWidgetInfo;
CFWL_GridLength m_Size[6];
friend class CFWL_GridImpDelegate;
};
class CFWL_GridImpDelegate : public CFWL_WidgetImpDelegate {
public:
CFWL_GridImpDelegate(CFWL_GridImp* pOwner);
int32_t OnProcessMessage(CFWL_Message* pMessage) override;
FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
const CFX_Matrix* pMatrix = NULL) override;
protected:
CFWL_GridImp* m_pOwner;
};
#endif