// 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 XFA_FXFA_CXFA_FFBARCODE_H_
#define XFA_FXFA_CXFA_FFBARCODE_H_

#include "fxbarcode/BC_Library.h"
#include "v8/include/cppgc/member.h"
#include "v8/include/cppgc/visitor.h"
#include "xfa/fxfa/cxfa_ffpageview.h"
#include "xfa/fxfa/cxfa_fftextedit.h"

enum class BarcodeType {
  aztec,
  codabar,
  code11,
  code128,
  code128A,
  code128B,
  code128C,
  code128SSCC,
  code2Of5Industrial,
  code2Of5Interleaved,
  code2Of5Matrix,
  code2Of5Standard,
  code3Of9,
  code3Of9extended,
  code49,
  code93,
  dataMatrix,
  ean13,
  ean13add2,
  ean13add5,
  ean13pwcd,
  ean8,
  ean8add2,
  ean8add5,
  fim,
  logmars,
  maxicode,
  msi,
  pdf417,
  pdf417macro,
  plessey,
  postAUSCust2,
  postAUSCust3,
  postAUSReplyPaid,
  postAUSStandard,
  postUKRM4SCC,
  postUS5Zip,
  postUSDPBC,
  postUSIMB,
  postUSStandard,
  QRCode,
  rfid,
  rss14,
  rss14Expanded,
  rss14Limited,
  rss14Stacked,
  rss14StackedOmni,
  rss14Truncated,
  telepen,
  ucc128,
  ucc128random,
  ucc128sscc,
  upcA,
  upcAadd2,
  upcAadd5,
  upcApwcd,
  upcE,
  upcEadd2,
  upcEadd5,
  upcean2,
  upcean5,
  upsMaxicode
};

struct BarCodeInfo {
  // |pName| hashed as if wide string.
  uint32_t uHash;
  // Inline string data reduces size for small strings.
  const char pName[20];
  BarcodeType eName;
  BC_TYPE eBCType;
};

class CXFA_Barcode;

class CXFA_FFBarcode final : public CXFA_FFTextEdit {
 public:
  static const BarCodeInfo* GetBarcodeTypeByName(const WideString& wsName);

  CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
  ~CXFA_FFBarcode() override;

  void Trace(cppgc::Visitor* visitor) const override;

  // CXFA_FFTextEdit
  bool LoadWidget() override;
  void RenderWidget(CFGAS_GEGraphics* pGS,
                    const CFX_Matrix& matrix,
                    HighlightOption highlight) override;
  void UpdateWidgetProperty() override;
  bool AcceptsFocusOnButtonDown(uint32_t dwFlags,
                                const CFX_PointF& point,
                                FWL_MouseCommand command) override;

 private:
  CXFA_FFBarcode(CXFA_Node* pNode, CXFA_Barcode* barcode);

  cppgc::Member<CXFA_Barcode> const barcode_;
};

#endif  // XFA_FXFA_CXFA_FFBARCODE_H_
