// Copyright 2016 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 XFA_FWL_CORE_CFWL_THEMEPART_H_
#define XFA_FWL_CORE_CFWL_THEMEPART_H_

#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/fx_system.h"

enum class CFWL_Part {
  None = 0,

  BackArrow,
  Background,
  Border,
  Caption,
  Check,
  CheckBox,
  CloseBox,
  CombTextLine,
  DateInBK,
  DateInCircle,
  DatesIn,
  DatesOut,
  DownButton,
  DropDownButton,
  Edge,
  ForeArrow,
  HSeparator,
  HeadText,
  Header,
  Icon,
  Image,
  LBtn,
  ListItem,
  LowerTrack,
  MinimizeBox,
  MaximizeBox,
  NarrowCaption,
  RBtn,
  StretchHandler,
  Thumb,
  ThumbBackArrow,
  ThumbForeArrow,
  ThumbLowerTrack,
  ThumbThumb,
  ThumbUpperTrack,
  Today,
  TodayCircle,
  UpButton,
  UpperTrack,
  VSeparator,
  Week,
  WeekNum,
  WeekNumSep
};

enum CFWL_PartState {
  CFWL_PartState_Normal = 0,

  CFWL_PartState_Checked = 1 << 1,
  CFWL_PartState_Default = 1 << 2,
  CFWL_PartState_Disabled = 1 << 3,
  CFWL_PartState_Flagged = 1 << 4,
  CFWL_PartState_Focused = 1 << 5,
  CFWL_PartState_HightLight = 1 << 6,
  CFWL_PartState_Hovered = 1 << 7,
  CFWL_PartState_Inactive = 1 << 8,
  CFWL_PartState_Neutral = 1 << 9,
  CFWL_PartState_Pressed = 1 << 10,
  CFWL_PartState_ReadOnly = 1 << 11,
  CFWL_PartState_LSelected = 1 << 12,
  CFWL_PartState_RSelected = 1 << 13,
  CFWL_PartState_Selected = 1 << 14
};

class IFWL_Widget;

class CFWL_ThemePart {
 public:
  CFWL_ThemePart();

  CFX_Matrix m_matrix;
  CFX_RectF m_rtPart;
  IFWL_Widget* m_pWidget;
  CFWL_Part m_iPart;
  uint32_t m_dwStates;
  bool m_bMaximize;
  bool m_bStaticBackground;
  void* m_pData;
};

inline CFWL_ThemePart::CFWL_ThemePart()
    : m_pWidget(nullptr),
      m_iPart(CFWL_Part::None),
      m_dwStates(CFWL_PartState_Normal),
      m_bMaximize(false),
      m_bStaticBackground(false),
      m_pData(nullptr) {
  m_rtPart.Reset();
  m_matrix.SetIdentity();
}

#endif  // XFA_FWL_CORE_CFWL_THEMEPART_H_
