// Copyright 2017 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 FPDFSDK_CPDFSDK_APPSTREAM_H_
#define FPDFSDK_CPDFSDK_APPSTREAM_H_

#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/unowned_ptr.h"
#include "third_party/base/optional.h"

class CPDFSDK_Widget;
class CPDF_Dictionary;
class CPDF_Stream;

class CPDFSDK_AppStream {
 public:
  CPDFSDK_AppStream(CPDFSDK_Widget* widget, CPDF_Dictionary* dict);
  ~CPDFSDK_AppStream();

  void SetAsPushButton();
  void SetAsCheckBox();
  void SetAsRadioButton();
  void SetAsComboBox(Optional<WideString> sValue);
  void SetAsListBox();
  void SetAsTextField(Optional<WideString> sValue);

 private:
  void AddImage(const ByteString& sAPType, CPDF_Stream* pImage);
  void Write(const ByteString& sAPType,
             const ByteString& sContents,
             const ByteString& sAPState);
  void Remove(const ByteString& sAPType);

  ByteString GetBackgroundAppStream() const;
  ByteString GetBorderAppStream() const;

  UnownedPtr<CPDFSDK_Widget> const widget_;
  RetainPtr<CPDF_Dictionary> const dict_;
};

#endif  // FPDFSDK_CPDFSDK_APPSTREAM_H_
