Home | History | Annotate | Download | only in include
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef _FWL_GRID_IMP_H
      8 #define _FWL_GRID_IMP_H
      9 class CFWL_Content;
     10 class IFWL_Widget;
     11 class CFWL_GridLength;
     12 class CFWL_GridColRow;
     13 class CFWL_GridWidgetInfo;
     14 class CFWL_GridImp;
     15 class CFWL_GridLength {
     16  public:
     17   CFWL_GridLength() : fLength(0), eUnit(FWL_GRIDUNIT_Fixed) {}
     18   CFWL_GridLength(FX_FLOAT fValue, FWL_GRIDUNIT e)
     19       : fLength(fValue), eUnit(e) {}
     20   FX_FLOAT fLength;
     21   FWL_GRIDUNIT eUnit;
     22 };
     23 class CFWL_GridColRow {
     24  public:
     25   CFWL_GridColRow()
     26       : m_Size(1, FWL_GRIDUNIT_Scaled),
     27         m_MinSize(0, FWL_GRIDUNIT_Fixed),
     28         m_MaxSize(0, FWL_GRIDUNIT_Infinity),
     29         m_fActualSize(0),
     30         m_fActualPos(0) {}
     31   CFWL_GridLength m_Size;
     32   CFWL_GridLength m_MinSize;
     33   CFWL_GridLength m_MaxSize;
     34   FX_FLOAT m_fActualSize;
     35   FX_FLOAT m_fActualPos;
     36 };
     37 class CFWL_GridWidgetInfo {
     38  public:
     39   CFWL_GridWidgetInfo()
     40       : m_iColumn(0),
     41         m_iColumnSpan(1),
     42         m_iRow(0),
     43         m_iRowSpan(1),
     44         m_dwMarginFlag(0),
     45         m_fActualWidth(0),
     46         m_fActualHeight(0) {
     47     m_Size[FWL_GRIDSIZE_Width].eUnit = FWL_GRIDUNIT_Auto;
     48     m_Size[FWL_GRIDSIZE_Width].fLength = 0;
     49     m_Size[FWL_GRIDSIZE_Height].eUnit = FWL_GRIDUNIT_Auto;
     50     m_Size[FWL_GRIDSIZE_Height].fLength = 0;
     51     m_Size[FWL_GRIDSIZE_MinWidth].eUnit = FWL_GRIDUNIT_Fixed;
     52     m_Size[FWL_GRIDSIZE_MinWidth].fLength = 0;
     53     m_Size[FWL_GRIDSIZE_MaxWidth].eUnit = FWL_GRIDUNIT_Infinity;
     54     m_Size[FWL_GRIDSIZE_MaxWidth].fLength = 0;
     55     m_Size[FWL_GRIDSIZE_MinHeight].eUnit = FWL_GRIDUNIT_Fixed;
     56     m_Size[FWL_GRIDSIZE_MinHeight].fLength = 0;
     57     m_Size[FWL_GRIDSIZE_MaxHeight].eUnit = FWL_GRIDUNIT_Infinity;
     58     m_Size[FWL_GRIDSIZE_MaxHeight].fLength = 0;
     59     m_Margin[0] = m_Margin[1] = m_Margin[2] = m_Margin[3] = 0;
     60   }
     61   int32_t m_iColumn;
     62   int32_t m_iColumnSpan;
     63   int32_t m_iRow;
     64   int32_t m_iRowSpan;
     65   CFWL_GridLength m_Size[6];
     66   FX_DWORD m_dwMarginFlag;
     67   FX_FLOAT m_Margin[4];
     68   FX_FLOAT m_fActualWidth;
     69   FX_FLOAT m_fActualHeight;
     70 };
     71 class CFWL_GridImp : public CFWL_ContentImp {
     72  public:
     73   CFWL_GridImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter);
     74   virtual ~CFWL_GridImp();
     75   virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
     76   virtual FX_DWORD GetClassID() const;
     77   virtual FWL_ERR Initialize();
     78   virtual FWL_ERR Finalize();
     79   virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
     80   virtual FWL_ERR SetWidgetRect(const CFX_RectF& rect);
     81   virtual FWL_ERR Update();
     82   virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
     83                              const CFX_Matrix* pMatrix = NULL);
     84 
     85   virtual FWL_ERR InsertWidget(IFWL_Widget* pChild, int32_t nIndex = -1);
     86   virtual FWL_ERR RemoveWidget(IFWL_Widget* pWidget);
     87   virtual FWL_HGRIDCOLROW InsertColRow(FX_BOOL bColumn, int32_t nIndex = -1);
     88   virtual int32_t CountColRows(FX_BOOL bColumn);
     89   virtual FWL_HGRIDCOLROW GetColRow(FX_BOOL bColumn, int32_t nIndex);
     90   virtual int32_t GetIndex(FWL_HGRIDCOLROW hColRow);
     91   virtual FX_FLOAT GetSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
     92   virtual FWL_ERR SetSize(FWL_HGRIDCOLROW hColRow,
     93                           FX_FLOAT fSize,
     94                           FWL_GRIDUNIT eUnit);
     95   FX_FLOAT GetMinSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
     96   FWL_ERR SetMinSize(FWL_HGRIDCOLROW hColRow,
     97                      FX_FLOAT fSize,
     98                      FWL_GRIDUNIT eUnit);
     99   FX_FLOAT GetMaxSize(FWL_HGRIDCOLROW hColRow, FWL_GRIDUNIT& eUnit);
    100   FWL_ERR SetMaxSize(FWL_HGRIDCOLROW hColRow,
    101                      FX_FLOAT fSize,
    102                      FWL_GRIDUNIT eUnit);
    103   virtual FX_BOOL DeleteColRow(FWL_HGRIDCOLROW hColRow);
    104   virtual FX_BOOL IsColumn(FWL_HGRIDCOLROW hColRow);
    105   virtual int32_t GetWidgetPos(IFWL_Widget* pWidget, FX_BOOL bColumn);
    106   virtual FWL_ERR SetWidgetPos(IFWL_Widget* pWidget,
    107                                int32_t iPos,
    108                                FX_BOOL bColumn);
    109   virtual int32_t GetWidgetSpan(IFWL_Widget* pWidget, FX_BOOL bColumn);
    110   virtual FWL_ERR SetWidgetSpan(IFWL_Widget* pWidget,
    111                                 int32_t iSpan,
    112                                 FX_BOOL bColumn);
    113   virtual FX_FLOAT GetWidgetSize(IFWL_Widget* pWidget,
    114                                  FWL_GRIDSIZE eSize,
    115                                  FWL_GRIDUNIT& eUnit);
    116   virtual FWL_ERR SetWidgetSize(IFWL_Widget* pWidget,
    117                                 FWL_GRIDSIZE eSize,
    118                                 FX_FLOAT fSize,
    119                                 FWL_GRIDUNIT eUit);
    120   virtual FX_BOOL GetWidgetMargin(IFWL_Widget* pWidget,
    121                                   FWL_GRIDMARGIN eMargin,
    122                                   FX_FLOAT& fMargin);
    123   virtual FWL_ERR SetWidgetMargin(IFWL_Widget* pWidget,
    124                                   FWL_GRIDMARGIN eMargin,
    125                                   FX_FLOAT fMargin);
    126   virtual FWL_ERR RemoveWidgetMargin(IFWL_Widget* pWidget,
    127                                      FWL_GRIDMARGIN eMargin);
    128   virtual FX_FLOAT GetGridSize(FWL_GRIDSIZE eSize, FWL_GRIDUNIT& eUnit);
    129   virtual FWL_ERR SetGridSize(FWL_GRIDSIZE eSize,
    130                               FX_FLOAT fSize,
    131                               FWL_GRIDUNIT eUit);
    132 
    133  protected:
    134   CFWL_GridWidgetInfo* GetWidgetInfo(IFWL_Widget* pWidget);
    135   void ProcFixedColRow(CFWL_GridColRow* pColRow,
    136                        int32_t nIndex,
    137                        FX_FLOAT fColRowSize,
    138                        FX_BOOL bColumn);
    139   void ProcAutoColRow(CFWL_GridColRow* pColRow,
    140                       int32_t nIndex,
    141                       FX_BOOL bColumn);
    142   void ProcScaledColRow(CFWL_GridColRow* pColRow,
    143                         int32_t nIndex,
    144                         FX_FLOAT fColRowSize,
    145                         FX_BOOL bColumn);
    146   void CalcWidgetWidth(IFWL_Widget* pWidget,
    147                        CFWL_GridWidgetInfo* pInfo,
    148                        FX_FLOAT fColunmWidth);
    149   void CalcWidgetHeigt(IFWL_Widget* pWidget,
    150                        CFWL_GridWidgetInfo* pInfo,
    151                        FX_FLOAT fRowHeigt);
    152   FX_FLOAT CalcAutoColumnWidgetWidth(IFWL_Widget* pWidget,
    153                                      CFWL_GridWidgetInfo* pInfo);
    154   FX_FLOAT CalcAutoColumnWidgetHeight(IFWL_Widget* pWidget,
    155                                       CFWL_GridWidgetInfo* pInfo);
    156   FX_FLOAT ProcessColumns(FX_FLOAT fWidth);
    157   FX_FLOAT ProcessRows(FX_FLOAT fHeight);
    158   FX_FLOAT ProcessUnCertainColumns();
    159   FX_FLOAT ProcessUnCertainRows();
    160   FX_BOOL SetColRowActualSize(CFWL_GridColRow* pColRow,
    161                               FX_FLOAT fSize,
    162                               FX_BOOL bSetBeyond = FALSE);
    163   FX_FLOAT SetWidgetActualWidth(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fWidth);
    164   FX_FLOAT SetWidgetActualHeight(CFWL_GridWidgetInfo* pInfo, FX_FLOAT fHeight);
    165   void SetAllWidgetsRect();
    166   FX_BOOL IsGrid(IFWL_Widget* pWidget);
    167   void SetSpanAutoColRowSize(const CFX_PtrArray& spanAutos,
    168                              FX_FLOAT fTotalSize);
    169   void SetSpanScaledColRowSize(const CFX_PtrArray& spanScaleds,
    170                                FX_FLOAT fTotalSize,
    171                                FX_FLOAT fTotalScaledNum);
    172   void SetScaledColRowsSize(const CFX_PtrArray& spanScaleds,
    173                             FX_FLOAT fTotalSize,
    174                             FX_FLOAT fTotalScaledNum);
    175   CFX_PtrArray m_Rows;
    176   CFX_PtrArray m_Columns;
    177   CFX_PtrArray m_Widgets;
    178   CFX_MapPtrToPtr m_mapWidgetInfo;
    179   CFWL_GridLength m_Size[6];
    180   friend class CFWL_GridImpDelegate;
    181 };
    182 class CFWL_GridImpDelegate : public CFWL_WidgetImpDelegate {
    183  public:
    184   CFWL_GridImpDelegate(CFWL_GridImp* pOwner);
    185   int32_t OnProcessMessage(CFWL_Message* pMessage) override;
    186   FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
    187                        const CFX_Matrix* pMatrix = NULL) override;
    188 
    189  protected:
    190   CFWL_GridImp* m_pOwner;
    191 };
    192 #endif
    193