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

/*************************************************************************
 * Copyright (C) 1995-2000, 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_TGLabel
#define ROOT_TGLabel


#include "TGFrame.h"
#include "TGDimension.h"
#include "TGString.h"

class TColor;
class TGTextLayout;
class TGFont;

class TGLabel : public TGFrame {

protected:
   TGString      *fText;         ///< label text
   UInt_t         fTWidth;       ///< text width
   UInt_t         fTHeight;      ///< text height
   Int_t          fMLeft;        ///< margin left
   Int_t          fMRight;       ///< margin right
   Int_t          fMTop;         ///< margin top
   Int_t          fMBottom;      ///< margin bottom
   Int_t          fTMode;        ///< text alignment
   Int_t          f3DStyle;      ///< 3D style (0 - normal, kRaisedFrame - raised, kSunkenFrame - sunken)
   Int_t          fWrapLength;   ///< wrap length
   Int_t          fTFlags;       ///< text flags (see TGFont.h  ETextLayoutFlags)
   Bool_t         fTextChanged;  ///< has text changed
   GContext_t     fNormGC;       ///< graphics context used for drawing label
   TGFont        *fFont;         ///< font to draw label
   TGTextLayout  *fTLayout;      ///< text layout
   Bool_t         fHasOwnFont;   ///< kTRUE - font defined locally,  kFALSE - globally
   Bool_t         fDisabled;     ///< if kTRUE label looks disabled (shaded text)

   void DoRedraw() override;
   virtual void DrawText(GContext_t gc, Int_t x, Int_t y);

   static const TGFont  *fgDefaultFont;
   static const TGGC    *fgDefaultGC;

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

public:
   static FontStruct_t  GetDefaultFontStruct();
   static const TGGC   &GetDefaultGC();

   TGLabel(const TGWindow *p, TGString *text,
           GContext_t norm = GetDefaultGC()(),
           FontStruct_t font = GetDefaultFontStruct(),
           UInt_t options = kChildFrame,
           Pixel_t back = GetDefaultFrameBackground());
   TGLabel(const TGWindow *p = nullptr, const char *text = nullptr,
           GContext_t norm = GetDefaultGC()(),
           FontStruct_t font = GetDefaultFontStruct(),
           UInt_t options = kChildFrame,
           Pixel_t back = GetDefaultFrameBackground());

   ~TGLabel() override;

   TGDimension GetDefaultSize() const override;

   const TGString *GetText() const { return fText; }
   const char *GetTitle() const override { return fText->Data(); }
   virtual void SetText(TGString *newText);
   void SetText(const char *newText) { SetText(new TGString(newText)); }
   virtual void ChangeText(const char *newText) { SetText(newText); } //*MENU*icon=bld_rename.png*
   virtual void SetTitle(const char *label) { SetText(label); }
   void  SetText(Int_t number) { SetText(new TGString(number)); }
   void  SetTextJustify(Int_t tmode);
   Int_t GetTextJustify() const { return fTMode; }
   virtual void SetTextFont(TGFont *font, Bool_t global = kFALSE);
   virtual void SetTextFont(FontStruct_t font, Bool_t global = kFALSE);
   virtual void SetTextFont(const char *fontName, Bool_t global = kFALSE);
   virtual void SetTextColor(Pixel_t color, Bool_t global = kFALSE);
   virtual void SetTextColor(TColor *color, Bool_t global = kFALSE);
   void SetForegroundColor(Pixel_t fore) override { SetTextColor(fore); }
   virtual void Disable(Bool_t on = kTRUE)
               { fDisabled = on; fClient->NeedRedraw(this); } //*TOGGLE* *GETTER=IsDisabled
   virtual void Enable() { fDisabled = kFALSE; fClient->NeedRedraw(this); }
   Bool_t IsDisabled() const { return fDisabled; }
   Bool_t HasOwnFont() const;

   void  SetWrapLength(Int_t wl) { fWrapLength = wl; Layout(); }
   Int_t GetWrapLength() const { return fWrapLength; }

   void  Set3DStyle(Int_t style) { f3DStyle = style; fClient->NeedRedraw(this); }
   Int_t Get3DStyle() const { return f3DStyle; }

   void SetMargins(Int_t left=0, Int_t right=0, Int_t top=0, Int_t bottom=0)
      { fMLeft = left; fMRight = right; fMTop = top; fMBottom = bottom; }
   Int_t GetLeftMargin() const { return fMLeft; }
   Int_t GetRightMargin() const { return fMRight; }
   Int_t GetTopMargin() const { return fMTop; }
   Int_t GetBottomMargin() const { return fMBottom; }

   GContext_t GetNormGC() const { return fNormGC; }
   FontStruct_t GetFontStruct() const { return fFont->GetFontStruct(); }
   TGFont      *GetFont() const  { return fFont; }

   void Layout() override;
   void SavePrimitive(std::ostream &out, Option_t *option = "") override;

   ClassDefOverride(TGLabel,0)  // A label GUI element
};

#endif
