// @(#)root/gui:$Id$
// Author: Fons Rademakers   09/01/98

/*************************************************************************
 * Copyright (C) 1995-2021, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TGMsgBox
#define ROOT_TGMsgBox


#include "TGFrame.h"
#include "TGWidget.h"

//--- Icon types

enum EMsgBoxIcon {
   kMBIconStop,
   kMBIconQuestion,
   kMBIconExclamation,
   kMBIconAsterisk
};

//--- Button types and return codes

enum EMsgBoxButton {
   kMBYes     = BIT(0),
   kMBNo      = BIT(1),
   kMBOk      = BIT(2),
   kMBApply   = BIT(3),
   kMBRetry   = BIT(4),
   kMBIgnore  = BIT(5),
   kMBCancel  = BIT(6),
   kMBClose   = BIT(7),
   kMBDismiss = BIT(8),
   kMBYesAll  = BIT(9),
   kMBNoAll   = BIT(10),
   kMBAppend  = BIT(11),
   kMBNewer   = BIT(12)
};


class TGButton;
class TGIcon;
class TGLabel;


class TGMsgBox : public TGTransientFrame {

protected:
   TGButton            *fYes, *fNo, *fOK, *fApply;   ///< buttons in dialog box
   TGButton            *fRetry, *fIgnore, *fCancel;  ///< buttons in dialog box
   TGButton            *fClose, *fYesAll, *fNoAll;   ///< buttons in dialog box
   TGButton            *fNewer, *fAppend, *fDismiss; ///< buttons in dialog box
   TGIcon              *fIcon;                       ///< icon
   TGHorizontalFrame   *fButtonFrame;                ///< frame containing buttons
   TGHorizontalFrame   *fIconFrame;                  ///< frame containing icon and text
   TGVerticalFrame     *fLabelFrame;                 ///< frame containing text
   TGLayoutHints       *fL1, *fL2, *fL3, *fL4, *fL5; ///< layout hints
   TList               *fMsgList;                    ///< text (list of TGLabels)
   Int_t               *fRetCode;                    ///< address to store return code

   void PMsgBox(const char *title, const char *msg, const TGPicture *icon,
                Int_t buttons, Int_t *ret_code, Int_t text_align);

private:
   TGMsgBox(const TGMsgBox&) = delete;
   TGMsgBox& operator=(const TGMsgBox&) = delete;

public:
   TGMsgBox(const TGWindow *p = nullptr, const TGWindow *main = nullptr,
            const char *title = nullptr, const char *msg = nullptr, const TGPicture *icon = nullptr,
            Int_t buttons = kMBDismiss, Int_t *ret_code = nullptr,
            UInt_t options = kVerticalFrame,
            Int_t text_align = kTextCenterX | kTextCenterY);
   TGMsgBox(const TGWindow *p, const TGWindow *main,
            const char *title, const char *msg, EMsgBoxIcon icon,
            Int_t buttons = kMBDismiss, Int_t *ret_code = nullptr,
            UInt_t options = kVerticalFrame,
            Int_t text_align = kTextCenterX | kTextCenterY);
   ~TGMsgBox() override;

   void CloseWindow() override;
   Bool_t ProcessMessage(Longptr_t msg, Longptr_t parm1, Longptr_t parm2) override;
   Bool_t HandleKey(Event_t* event) override;

   ClassDefOverride(TGMsgBox,0)  // A message dialog box
};

#endif
