// @(#)root/gui:$Id$
// Author: Bertrand Bellenot 23/01/2008

/*************************************************************************
 * Copyright (C) 1995-2008, 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_TGSplitFrame
#define ROOT_TGSplitFrame

#ifndef ROOT_TGFrame
#include "TGFrame.h"
#endif

#ifndef ROOT_TMap
#include "TMap.h"
#endif

class TGSplitter;
class TContextMenu;

class TGRectMap : public TObject {

private:
   TGRectMap(const TGRectMap&);             // not implemented
   TGRectMap& operator=(const TGRectMap&);  // not implemented

public:
   Int_t         fX;    // x position
   Int_t         fY;    // y position
   UInt_t        fW;    // width
   UInt_t        fH;    // height

   // constructors
   TGRectMap(Int_t rx, Int_t ry, UInt_t rw, UInt_t rh):
             fX(rx), fY(ry), fW(rw), fH(rh) { }
   virtual ~TGRectMap() { }

   // methods
   Bool_t Contains(Int_t px, Int_t py) const
                { return ((px >= fX) && (px < fX + (Int_t) fW) &&
                          (py >= fY) && (py < fY + (Int_t) fH)); }

   ClassDef(TGRectMap, 0)  // Rectangle used in TMap
};

class TGSplitTool : public TGCompositeFrame {

private:
   const TGFrame     *fWindow;      // frame to which tool tip is associated
   TGGC               fRectGC;      // rectangles drawing context
   TMap               fMap;         // map of rectangles/subframes
   TContextMenu      *fContextMenu; // Context menu for the splitter
   Int_t              fX;           // X position in fWindow where to popup
   Int_t              fY;           // Y position in fWindow where to popup

   TGSplitTool(const TGSplitTool&);             // not implemented
   TGSplitTool& operator=(const TGSplitTool&);  // not implemented

public:
   TGSplitTool(const TGWindow *p = 0, const TGFrame *f = 0);
   virtual ~TGSplitTool();

   void   AddRectangle(TGFrame *frm, Int_t x, Int_t y, Int_t w, Int_t h);
   void   DoRedraw();
   void   DrawBorder();
   Bool_t HandleButton(Event_t *event);
   Bool_t HandleMotion(Event_t *event);
   void   Show(Int_t x, Int_t y);
   void   Hide();
   void   Reset();
   void   SetPosition(Int_t x, Int_t y);

   ClassDef(TGSplitTool, 0)  // Split frame tool utility
};

class TGSplitFrame : public TGCompositeFrame {

private:
   TGSplitFrame(const TGSplitFrame&); // Not implemented
   TGSplitFrame& operator=(const TGSplitFrame&); // Not implemented

protected:
   TGFrame          *fFrame;       // Pointer to the embedded frame (if any)
   TGTransientFrame *fUndocked;    // Main frame used when "undocking" frame
   TGSplitter       *fSplitter;    // Pointer to the (H/V) Splitter (if any)
   TGSplitFrame     *fFirst;       // Pointer to the first child (if any)
   TGSplitFrame     *fSecond;      // Pointer to the second child (if any)
   TGSplitTool      *fSplitTool;   // SplitFrame Tool
   Float_t           fWRatio;      // Width ratio between the first child and this
   Float_t           fHRatio;      // Height ratio between the first child and this

public:
   TGSplitFrame(const TGWindow *p = 0, UInt_t w = 1, UInt_t h = 1,
                UInt_t options = 0);
   virtual ~TGSplitFrame();

   virtual void   AddFrame(TGFrame *f, TGLayoutHints *l = 0);
   virtual void   Cleanup();
   virtual Bool_t HandleConfigureNotify(Event_t *);
   virtual void   HSplit(UInt_t h = 0);
   virtual void   VSplit(UInt_t w = 0);
   virtual void   RemoveFrame(TGFrame *f);

   TGSplitFrame  *GetFirst() const { return fFirst; }
   TGFrame       *GetFrame() const { return fFrame; }
   TGSplitFrame  *GetSecond() const { return fSecond; }
   TGSplitter    *GetSplitter() const { return fSplitter; }
   TGSplitTool   *GetSplitTool() const { return fSplitTool; }
   TGSplitFrame  *GetTopFrame();
   TGFrame       *GetUndocked() const { return fUndocked; }
   Float_t        GetHRatio() const { return fHRatio; }
   Float_t        GetWRatio() const { return fWRatio; }
   void           MapToSPlitTool(TGSplitFrame *top);
   void           OnSplitterClicked(Event_t *event);
   void           SetHRatio(Float_t r) { fHRatio = r; }
   void           SetWRatio(Float_t r) { fWRatio = r; }
   void           SplitHorizontal(const char *side = "top");
   void           SplitVertical(const char *side = "left");
   void           UnSplit(const char *which);

   // methods accessible via context menu

   void           Close();             // *MENU*
   void           CloseAndCollapse();  // *MENU*
   void           ExtractFrame();      // *MENU*
   void           SwallowBack();       // *MENU*
   void           SwitchToMain();      // *MENU*
   void           SplitHor();          // *MENU*
   void           SplitVer();          // *MENU*

   void           Docked(TGFrame* frame);    //*SIGNAL*
   void           Undocked(TGFrame* frame);  //*SIGNAL*

   static  void   SwitchFrames(TGFrame *frame, TGCompositeFrame *dest,
                               TGFrame *prev);
   virtual void   SavePrimitive(std::ostream &out, Option_t *option = "");

   ClassDef(TGSplitFrame, 0) // Splittable composite frame
};

#endif
 TGSplitFrame.h:1
 TGSplitFrame.h:2
 TGSplitFrame.h:3
 TGSplitFrame.h:4
 TGSplitFrame.h:5
 TGSplitFrame.h:6
 TGSplitFrame.h:7
 TGSplitFrame.h:8
 TGSplitFrame.h:9
 TGSplitFrame.h:10
 TGSplitFrame.h:11
 TGSplitFrame.h:12
 TGSplitFrame.h:13
 TGSplitFrame.h:14
 TGSplitFrame.h:15
 TGSplitFrame.h:16
 TGSplitFrame.h:17
 TGSplitFrame.h:18
 TGSplitFrame.h:19
 TGSplitFrame.h:20
 TGSplitFrame.h:21
 TGSplitFrame.h:22
 TGSplitFrame.h:23
 TGSplitFrame.h:24
 TGSplitFrame.h:25
 TGSplitFrame.h:26
 TGSplitFrame.h:27
 TGSplitFrame.h:28
 TGSplitFrame.h:29
 TGSplitFrame.h:30
 TGSplitFrame.h:31
 TGSplitFrame.h:32
 TGSplitFrame.h:33
 TGSplitFrame.h:34
 TGSplitFrame.h:35
 TGSplitFrame.h:36
 TGSplitFrame.h:37
 TGSplitFrame.h:38
 TGSplitFrame.h:39
 TGSplitFrame.h:40
 TGSplitFrame.h:41
 TGSplitFrame.h:42
 TGSplitFrame.h:43
 TGSplitFrame.h:44
 TGSplitFrame.h:45
 TGSplitFrame.h:46
 TGSplitFrame.h:47
 TGSplitFrame.h:48
 TGSplitFrame.h:49
 TGSplitFrame.h:50
 TGSplitFrame.h:51
 TGSplitFrame.h:52
 TGSplitFrame.h:53
 TGSplitFrame.h:54
 TGSplitFrame.h:55
 TGSplitFrame.h:56
 TGSplitFrame.h:57
 TGSplitFrame.h:58
 TGSplitFrame.h:59
 TGSplitFrame.h:60
 TGSplitFrame.h:61
 TGSplitFrame.h:62
 TGSplitFrame.h:63
 TGSplitFrame.h:64
 TGSplitFrame.h:65
 TGSplitFrame.h:66
 TGSplitFrame.h:67
 TGSplitFrame.h:68
 TGSplitFrame.h:69
 TGSplitFrame.h:70
 TGSplitFrame.h:71
 TGSplitFrame.h:72
 TGSplitFrame.h:73
 TGSplitFrame.h:74
 TGSplitFrame.h:75
 TGSplitFrame.h:76
 TGSplitFrame.h:77
 TGSplitFrame.h:78
 TGSplitFrame.h:79
 TGSplitFrame.h:80
 TGSplitFrame.h:81
 TGSplitFrame.h:82
 TGSplitFrame.h:83
 TGSplitFrame.h:84
 TGSplitFrame.h:85
 TGSplitFrame.h:86
 TGSplitFrame.h:87
 TGSplitFrame.h:88
 TGSplitFrame.h:89
 TGSplitFrame.h:90
 TGSplitFrame.h:91
 TGSplitFrame.h:92
 TGSplitFrame.h:93
 TGSplitFrame.h:94
 TGSplitFrame.h:95
 TGSplitFrame.h:96
 TGSplitFrame.h:97
 TGSplitFrame.h:98
 TGSplitFrame.h:99
 TGSplitFrame.h:100
 TGSplitFrame.h:101
 TGSplitFrame.h:102
 TGSplitFrame.h:103
 TGSplitFrame.h:104
 TGSplitFrame.h:105
 TGSplitFrame.h:106
 TGSplitFrame.h:107
 TGSplitFrame.h:108
 TGSplitFrame.h:109
 TGSplitFrame.h:110
 TGSplitFrame.h:111
 TGSplitFrame.h:112
 TGSplitFrame.h:113
 TGSplitFrame.h:114
 TGSplitFrame.h:115
 TGSplitFrame.h:116
 TGSplitFrame.h:117
 TGSplitFrame.h:118
 TGSplitFrame.h:119
 TGSplitFrame.h:120
 TGSplitFrame.h:121
 TGSplitFrame.h:122
 TGSplitFrame.h:123
 TGSplitFrame.h:124
 TGSplitFrame.h:125
 TGSplitFrame.h:126
 TGSplitFrame.h:127
 TGSplitFrame.h:128
 TGSplitFrame.h:129
 TGSplitFrame.h:130
 TGSplitFrame.h:131
 TGSplitFrame.h:132
 TGSplitFrame.h:133
 TGSplitFrame.h:134
 TGSplitFrame.h:135
 TGSplitFrame.h:136
 TGSplitFrame.h:137
 TGSplitFrame.h:138
 TGSplitFrame.h:139
 TGSplitFrame.h:140
 TGSplitFrame.h:141
 TGSplitFrame.h:142
 TGSplitFrame.h:143
 TGSplitFrame.h:144
 TGSplitFrame.h:145
 TGSplitFrame.h:146