// @(#)root/graf:$Id$
// Author: Rene Brun   17/10/95

/*************************************************************************
 * 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_TArrow
#define ROOT_TArrow


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TArrow                                                               //
//                                                                      //
// One arrow --->.                                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TString.h"
#include "TLine.h"
#include "TAttFill.h"


class TArrow : public TLine, public TAttFill {
protected:
   Float_t      fAngle;        ///< Arrow opening angle (degrees)
   Float_t      fArrowSize;    ///< Arrow Size
   TString      fOption;       ///< Arrow shapes

   static Float_t      fgDefaultAngle;        ///< Default Arrow opening angle (degrees)
   static Float_t      fgDefaultArrowSize;    ///< Default Arrow Size
   static TString      fgDefaultOption;       ///< Default Arrow shapes

public:
   TArrow();
   TArrow(Double_t x1, Double_t y1, Double_t x2 ,Double_t y2,
          Float_t arrowsize=0.05, Option_t *option=">");
   TArrow(const TArrow &arrow);
   ~TArrow() override;

   void Copy(TObject &arrow) const override;

   void            Draw(Option_t *option="") override;
   virtual TArrow *DrawArrow(Double_t x1, Double_t y1,Double_t x2 ,Double_t y2,
                             Float_t arrowsize=0 ,Option_t *option="");
   Float_t         GetAngle() const {return fAngle;}
   Float_t         GetArrowSize() const {return fArrowSize;}
   Option_t       *GetOption() const override { return fOption.Data();}
   void            Paint(Option_t *option="") override;
   virtual void    PaintArrow(Double_t x1, Double_t y1,Double_t x2 ,Double_t y2
                             ,Float_t arrowsize=0.05 ,Option_t *option=">");
   virtual void    PaintArrowNDC(Double_t u1, Double_t v1,Double_t u2 ,Double_t v2
                             ,Float_t arrowsize=0.05 ,Option_t *option=">");
   void            SavePrimitive(std::ostream &out, Option_t *option = "") override;
   virtual void    SetAngle(Float_t angle=60) {fAngle=angle;} // *MENU*
   virtual void    SetArrowSize(Float_t arrowsize=0.05) {fArrowSize=arrowsize;} // *MENU*
   virtual void    SetOption(Option_t *option=">"){ fOption = option;}

   static void SetDefaultAngle(Float_t  Angle    );
   static void SetDefaultArrowSize(Float_t  ArrowSize);
   static void SetDefaultOption(Option_t *Option  );
   static Float_t GetDefaultAngle();
   static Float_t GetDefaultArrowSize();
   static Option_t *GetDefaultOption();

   ClassDefOverride(TArrow,1)  // An arrow (line with a arrowhead)
};

#endif
