text: // Copyright (c) 2011-2020 The Bitcoin Core developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #ifndef SYSCOIN_QT_SENDCOINSDIALOG_H
  #define SYSCOIN_QT_SENDCOINSDIALOG_H
  
  #include <qt/walletmodel.h>
  
  #include <QDialog>
  #include <QMessageBox>
  #include <QString>
  #include <QTimer>
  
  class CCoinControl;
  class ClientModel;
  class PlatformStyle;
  class SendCoinsEntry;
  class SendCoinsRecipient;
  enum class SynchronizationState;
  
  namespace Ui {
      class SendCoinsDialog;
  }
  
  QT_BEGIN_NAMESPACE
  class QUrl;
  QT_END_NAMESPACE
  
  /** Dialog for sending syscoins */
  class SendCoinsDialog : public QDialog
  {
      Q_OBJECT
  
  public:
      explicit SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent = nullptr);
      ~SendCoinsDialog();
  
      void setClientModel(ClientModel *clientModel);
      void setModel(WalletModel *model);
  
      /** Set up the tab chain manually, as Qt messes up the tab chain by default in some cases (issue https://bugreports.qt-project.org/browse/QTBUG-10907).
       */
      QWidget *setupTabChain(QWidget *prev);
  
      void setAddress(const QString &address);
      void pasteEntry(const SendCoinsRecipient &rv);
      bool handlePaymentRequest(const SendCoinsRecipient &recipient);
  
  public Q_SLOTS:
      void clear();
      void reject() override;
      void accept() override;
      SendCoinsEntry *addEntry();
      void updateTabsAndLabels();
      void setBalance(const interfaces::WalletBalances& balances);
  
  Q_SIGNALS:
      void coinsSent(const uint256& txid);
  
  private:
      Ui::SendCoinsDialog *ui;
      ClientModel *clientModel;
      WalletModel *model;
      std::unique_ptr<CCoinControl> m_coin_control;
      std::unique_ptr<WalletModelTransaction> m_current_transaction;
      bool fNewRecipientAllowed;
      bool fFeeMinimized;
      const PlatformStyle *platformStyle;
  
      // Process WalletModel::SendCoinsReturn and generate a pair consisting
      // of a message and message flags for use in Q_EMIT message().
      // Additional parameter msgArg can be used via .arg(msgArg).
      void processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg = QString());
      void minimizeFeeSection(bool fMinimize);
      // Format confirmation message
      bool PrepareSendText(QString& question_string, QString& informative_text, QString& detailed_text);
      void updateFeeMinimizedLabel();
      void updateCoinControlState();
  
  private Q_SLOTS:
      void sendButtonClicked(bool checked);
      void on_buttonChooseFee_clicked();
      void on_buttonMinimizeFee_clicked();
      void removeEntry(SendCoinsEntry* entry);
      void useAvailableBalance(SendCoinsEntry* entry);
      void updateDisplayUnit();
      void coinControlFeatureChanged(bool);
      void coinControlButtonClicked();
      void coinControlChangeChecked(int);
      void coinControlChangeEdited(const QString &);
      void coinControlUpdateLabels();
      void coinControlClipboardQuantity();
      void coinControlClipboardAmount();
      void coinControlClipboardFee();
      void coinControlClipboardAfterFee();
      void coinControlClipboardBytes();
      void coinControlClipboardLowOutput();
      void coinControlClipboardChange();
      void updateFeeSectionControls();
      void updateNumberOfBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool headers, SynchronizationState sync_state);
      void updateSmartFeeLabel();
  
  Q_SIGNALS:
      // Fired when a message should be reported to the user
      void message(const QString &title, const QString &message, unsigned int style);
  };
  
  
  #define SEND_CONFIRM_DELAY   3
  
  class SendConfirmationDialog : public QMessageBox
  {
      Q_OBJECT
  
  public:
      SendConfirmationDialog(const QString& title, const QString& text, const QString& informative_text = "", const QString& detailed_text = "", int secDelay = SEND_CONFIRM_DELAY, const QString& confirmText = "Send", QWidget* parent = nullptr);
      int exec() override;
  
  private Q_SLOTS:
      void countDown();
      void updateYesButton();
  
  private:
      QAbstractButton *yesButton;
      QTimer countDownTimer;
      int secDelay;
      QString confirmButtonText;
  };
  
  #endif // SYSCOIN_QT_SENDCOINSDIALOG_H
  