// @(#)root/eve:$Id$
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/*************************************************************************
 * Copyright (C) 1995-2007, 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_TEveDigitSet
#define ROOT_TEveDigitSet

#include "TNamed.h"
#include "TQObject.h"
#include "TAtt3D.h"
#include "TAttBBox.h"

#include "TEveUtil.h"
#include "TEveElement.h"
#include "TEveFrameBox.h"
#include "TEveRGBAPalette.h"
#include "TEveChunkManager.h"
#include "TEveSecondarySelectable.h"

class TRefArray;

class TEveDigitSet : public TEveElement,
                     public TNamed, public TQObject,
                     public TAtt3D,
                     public TAttBBox,
                     public TEveSecondarySelectable
{
   friend class TEveDigitSetEditor;
   friend class TEveDigitSetGL;

   TEveDigitSet(const TEveDigitSet&);            // Not implemented
   TEveDigitSet& operator=(const TEveDigitSet&); // Not implemented

public:
   enum ERenderMode_e { kRM_AsIs, kRM_Line, kRM_Fill };

   typedef void (*Callback_foo)(TEveDigitSet*, Int_t, TObject*);
   typedef TString (*TooltipCB_foo)(TEveDigitSet*, Int_t);

   struct DigitBase_t
   {
      // Base-class for digit representation classes.

      Int_t  fValue;    // signal value of a digit (can be direct RGBA color)
      void  *fUserData; // user-data for given digit

      DigitBase_t(Int_t v=0) : fValue(v), fUserData(0) {}
   };

protected:
   TRefArray        *fDigitIds;       //  Array holding references to external objects.

   Int_t             fDefaultValue;   //  Default signal value.
   Bool_t            fValueIsColor;   //  Interpret signal value as RGBA color.
   Bool_t            fSingleColor;    //  Use the same color for all digits.
   Bool_t            fAntiFlick;      // Make extra render pass to avoid flickering when quads are too small.
   Bool_t            fOwnIds;         //  Flag specifying if id-objects are owned by the TEveDigitSet.
   TEveChunkManager  fPlex;           //  Container of digit data.
   DigitBase_t*      fLastDigit;      //! The last / current digit added to collection.
   Int_t             fLastIdx;        //! The last / current idx added to collection.

   Color_t           fColor;          //  Color used for frame (or all digis with single-color).
   TEveFrameBox*     fFrame;          //  Pointer to frame structure.
   TEveRGBAPalette*  fPalette;        //  Pointer to signal-color palette.
   ERenderMode_e     fRenderMode;     //  Render mode: as-is / line / filled.
   Bool_t            fSelectViaFrame; //  Allow selection via frame.
   Bool_t            fHighlightFrame; //  Highlight frame when object is selected.
   Bool_t            fDisableLighting;//  Disable lighting for rendering.
   Bool_t            fHistoButtons;   //  Show histogram buttons in object editor.

   Bool_t            fEmitSignals;    //  Emit signals on secondary-select.
   Callback_foo      fCallbackFoo;    //! Additional function to call on secondary-select.
   TooltipCB_foo     fTooltipCBFoo;   //! Function providing highlight tooltips when always-sec-select is active.

   DigitBase_t* NewDigit();
   void         ReleaseIds();

public:
   TEveDigitSet(const char* n="TEveDigitSet", const char* t="");
   virtual ~TEveDigitSet();

   virtual TObject* GetObject(const TEveException&) const
   { const TObject* obj = this; return const_cast<TObject*>(obj); }

   void   UseSingleColor();

   Bool_t GetAntiFlick() const   { return fAntiFlick; }
   void   SetAntiFlick(Bool_t f) { fAntiFlick = f; }

   virtual void SetMainColor(Color_t color);

   virtual void UnSelected();
   virtual void UnHighlighted();

   virtual TString GetHighlightTooltip();

   // Implemented in sub-classes:
   // virtual void Reset(EQuadType_e quadType, Bool_t valIsCol, Int_t chunkSize);

   void RefitPlex();
   void ScanMinMaxValues(Int_t& min, Int_t& max);

   // --------------------------------

   void SetCurrentDigit(Int_t idx);

   void DigitValue(Int_t value);
   void DigitColor(Color_t ci);
   void DigitColor(Color_t ci, Char_t transparency);
   void DigitColor(UChar_t r, UChar_t g, UChar_t b, UChar_t a=255);
   void DigitColor(UChar_t* rgba);

   Bool_t GetOwnIds() const     { return fOwnIds; }
   void   SetOwnIds(Bool_t o)   { fOwnIds = o; }

   void   DigitId(TObject* id);
   void   DigitUserData(void* ud);

   void   DigitId(Int_t n, TObject* id);
   void   DigitUserData(Int_t n, void* ud);

   DigitBase_t* GetDigit(Int_t n) const { return (DigitBase_t*) fPlex.Atom(n); }
   TObject*     GetId(Int_t n) const;
   void*        GetUserData(Int_t n) const;
   using TEveElement::GetUserData;

   // --------------------------------

   // Implemented in subclasses:
   // virtual void ComputeBBox();

   virtual void Paint(Option_t* option="");

   virtual void DigitSelected(Int_t idx);
   virtual void SecSelected(TEveDigitSet* qs, Int_t idx); // *SIGNAL*

   // --------------------------------

   TEveChunkManager* GetPlex() { return &fPlex; }

   TEveFrameBox* GetFrame() const { return fFrame; }
   void          SetFrame(TEveFrameBox* b);

   Bool_t GetSelectViaFrame() const    { return fSelectViaFrame; }
   void   SetSelectViaFrame(Bool_t sf) { fSelectViaFrame = sf; }

   Bool_t GetHighlightFrame() const    { return fHighlightFrame; }
   void   SetHighlightFrame(Bool_t hf) { fHighlightFrame = hf; }

   Bool_t GetValueIsColor()  const { return fValueIsColor; }

   TEveRGBAPalette* GetPalette() const { return fPalette; }
   void             SetPalette(TEveRGBAPalette* p);
   TEveRGBAPalette* AssertPalette();

   ERenderMode_e  GetRenderMode()           const { return fRenderMode; }
   void           SetRenderMode(ERenderMode_e rm) { fRenderMode = rm; }

   Bool_t GetDisableLighting() const   { return fDisableLighting; }
   void   SetDisableLighting(Bool_t l) { fDisableLighting = l; }

   Bool_t GetHistoButtons() const   { return fHistoButtons; }
   void   SetHistoButtons(Bool_t f) { fHistoButtons = f; }

   Bool_t GetEmitSignals() const   { return fEmitSignals; }
   void   SetEmitSignals(Bool_t f) { fEmitSignals = f; }

   Callback_foo GetCallbackFoo()         const { return fCallbackFoo; }
   void         SetCallbackFoo(Callback_foo f) { fCallbackFoo = f; }

   TooltipCB_foo GetTooltipCBFoo()          const { return fTooltipCBFoo; }
   void          SetTooltipCBFoo(TooltipCB_foo f) { fTooltipCBFoo = f; }

   ClassDef(TEveDigitSet, 0); // Base-class for storage of digit collections; provides transformation matrix (TEveTrans), signal to color mapping (TEveRGBAPalette) and visual grouping (TEveFrameBox).
};

#endif
 TEveDigitSet.h:1
 TEveDigitSet.h:2
 TEveDigitSet.h:3
 TEveDigitSet.h:4
 TEveDigitSet.h:5
 TEveDigitSet.h:6
 TEveDigitSet.h:7
 TEveDigitSet.h:8
 TEveDigitSet.h:9
 TEveDigitSet.h:10
 TEveDigitSet.h:11
 TEveDigitSet.h:12
 TEveDigitSet.h:13
 TEveDigitSet.h:14
 TEveDigitSet.h:15
 TEveDigitSet.h:16
 TEveDigitSet.h:17
 TEveDigitSet.h:18
 TEveDigitSet.h:19
 TEveDigitSet.h:20
 TEveDigitSet.h:21
 TEveDigitSet.h:22
 TEveDigitSet.h:23
 TEveDigitSet.h:24
 TEveDigitSet.h:25
 TEveDigitSet.h:26
 TEveDigitSet.h:27
 TEveDigitSet.h:28
 TEveDigitSet.h:29
 TEveDigitSet.h:30
 TEveDigitSet.h:31
 TEveDigitSet.h:32
 TEveDigitSet.h:33
 TEveDigitSet.h:34
 TEveDigitSet.h:35
 TEveDigitSet.h:36
 TEveDigitSet.h:37
 TEveDigitSet.h:38
 TEveDigitSet.h:39
 TEveDigitSet.h:40
 TEveDigitSet.h:41
 TEveDigitSet.h:42
 TEveDigitSet.h:43
 TEveDigitSet.h:44
 TEveDigitSet.h:45
 TEveDigitSet.h:46
 TEveDigitSet.h:47
 TEveDigitSet.h:48
 TEveDigitSet.h:49
 TEveDigitSet.h:50
 TEveDigitSet.h:51
 TEveDigitSet.h:52
 TEveDigitSet.h:53
 TEveDigitSet.h:54
 TEveDigitSet.h:55
 TEveDigitSet.h:56
 TEveDigitSet.h:57
 TEveDigitSet.h:58
 TEveDigitSet.h:59
 TEveDigitSet.h:60
 TEveDigitSet.h:61
 TEveDigitSet.h:62
 TEveDigitSet.h:63
 TEveDigitSet.h:64
 TEveDigitSet.h:65
 TEveDigitSet.h:66
 TEveDigitSet.h:67
 TEveDigitSet.h:68
 TEveDigitSet.h:69
 TEveDigitSet.h:70
 TEveDigitSet.h:71
 TEveDigitSet.h:72
 TEveDigitSet.h:73
 TEveDigitSet.h:74
 TEveDigitSet.h:75
 TEveDigitSet.h:76
 TEveDigitSet.h:77
 TEveDigitSet.h:78
 TEveDigitSet.h:79
 TEveDigitSet.h:80
 TEveDigitSet.h:81
 TEveDigitSet.h:82
 TEveDigitSet.h:83
 TEveDigitSet.h:84
 TEveDigitSet.h:85
 TEveDigitSet.h:86
 TEveDigitSet.h:87
 TEveDigitSet.h:88
 TEveDigitSet.h:89
 TEveDigitSet.h:90
 TEveDigitSet.h:91
 TEveDigitSet.h:92
 TEveDigitSet.h:93
 TEveDigitSet.h:94
 TEveDigitSet.h:95
 TEveDigitSet.h:96
 TEveDigitSet.h:97
 TEveDigitSet.h:98
 TEveDigitSet.h:99
 TEveDigitSet.h:100
 TEveDigitSet.h:101
 TEveDigitSet.h:102
 TEveDigitSet.h:103
 TEveDigitSet.h:104
 TEveDigitSet.h:105
 TEveDigitSet.h:106
 TEveDigitSet.h:107
 TEveDigitSet.h:108
 TEveDigitSet.h:109
 TEveDigitSet.h:110
 TEveDigitSet.h:111
 TEveDigitSet.h:112
 TEveDigitSet.h:113
 TEveDigitSet.h:114
 TEveDigitSet.h:115
 TEveDigitSet.h:116
 TEveDigitSet.h:117
 TEveDigitSet.h:118
 TEveDigitSet.h:119
 TEveDigitSet.h:120
 TEveDigitSet.h:121
 TEveDigitSet.h:122
 TEveDigitSet.h:123
 TEveDigitSet.h:124
 TEveDigitSet.h:125
 TEveDigitSet.h:126
 TEveDigitSet.h:127
 TEveDigitSet.h:128
 TEveDigitSet.h:129
 TEveDigitSet.h:130
 TEveDigitSet.h:131
 TEveDigitSet.h:132
 TEveDigitSet.h:133
 TEveDigitSet.h:134
 TEveDigitSet.h:135
 TEveDigitSet.h:136
 TEveDigitSet.h:137
 TEveDigitSet.h:138
 TEveDigitSet.h:139
 TEveDigitSet.h:140
 TEveDigitSet.h:141
 TEveDigitSet.h:142
 TEveDigitSet.h:143
 TEveDigitSet.h:144
 TEveDigitSet.h:145
 TEveDigitSet.h:146
 TEveDigitSet.h:147
 TEveDigitSet.h:148
 TEveDigitSet.h:149
 TEveDigitSet.h:150
 TEveDigitSet.h:151
 TEveDigitSet.h:152
 TEveDigitSet.h:153
 TEveDigitSet.h:154
 TEveDigitSet.h:155
 TEveDigitSet.h:156
 TEveDigitSet.h:157
 TEveDigitSet.h:158
 TEveDigitSet.h:159
 TEveDigitSet.h:160
 TEveDigitSet.h:161
 TEveDigitSet.h:162
 TEveDigitSet.h:163
 TEveDigitSet.h:164
 TEveDigitSet.h:165
 TEveDigitSet.h:166
 TEveDigitSet.h:167
 TEveDigitSet.h:168
 TEveDigitSet.h:169
 TEveDigitSet.h:170
 TEveDigitSet.h:171
 TEveDigitSet.h:172
 TEveDigitSet.h:173
 TEveDigitSet.h:174
 TEveDigitSet.h:175
 TEveDigitSet.h:176
 TEveDigitSet.h:177
 TEveDigitSet.h:178
 TEveDigitSet.h:179
 TEveDigitSet.h:180
 TEveDigitSet.h:181
 TEveDigitSet.h:182
 TEveDigitSet.h:183
 TEveDigitSet.h:184