// @(#)root/gui:$Id$
// Author: Abdelhalim Ssadik   07/07/04

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

    This source is based on Xclass95, a Win95-looking GUI toolkit.
    Copyright (C) 1996, 1997 David Barth, Ricky Ralston, Hector Peraza.

    Xclass95 is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

**************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// A TGDockableFrame is a frame with handles that allow it to be        //
// undocked (i.e. put in a transient frame of its own) and to be docked //
// again or hidden and shown again. It uses the TGDockButton, which is  //
// a button with two vertical bars (||) and TGDockHideButton, which is  //
// a button with a small triangle. The TGUndockedFrame is a transient   //
// frame that on closure will put the frame back in the dock.           //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TColor.h"
#include "TGFrame.h"
#include "TMessage.h"
#include "TGWidget.h"
#include "TGButton.h"
#include "TGDockableFrame.h"
#include "TGWindow.h"
#include "TList.h"
#include "TVirtualX.h"
#include "Riostream.h"


ClassImp(TGDockButton)
ClassImp(TGDockHideButton)
ClassImp(TGUndockedFrame)
ClassImp(TGDockableFrame)

//______________________________________________________________________________
TGDockButton::TGDockButton(const TGCompositeFrame *p, int id) :
   TGButton (p, id, GetDefaultGC()(), kChildFrame)
{
   // Create a dock button (i.e. button with two vertical bars).

   fWidgetFlags = kWidgetIsEnabled;
   fMouseOn = kFALSE;
   Resize(10, GetDefaultHeight());

   fNormBg = fBackground;

   Float_t r, g, b, h, l, s;
   TColor::Pixel2RGB(fNormBg, r, g, b);
   TColor::RGB2HLS(r, g, b, h, l, s);
   l = l + (1. - l) * 45. / 100.;
   TColor::HLS2RGB(h, l, s, r, g, b);
   fHiBg = TColor::RGB2Pixel(r, g, b);

   AddInput(kEnterWindowMask | kLeaveWindowMask);
   SetWindowName();
}

//______________________________________________________________________________
TGDockButton::~TGDockButton()
{
   // Delete dock button.
}

//______________________________________________________________________________
Bool_t TGDockButton::HandleCrossing(Event_t *event)
{
   // Handle dock button crossing events.

   TGButton::HandleCrossing(event);
   if (event->fType == kLeaveNotify) {
      fMouseOn = kFALSE;
   } else if (event->fType == kEnterNotify) {
      fMouseOn = kTRUE;
   }
   if (IsEnabled())
      fClient->NeedRedraw(this);

   return kTRUE;
}

//______________________________________________________________________________
void TGDockButton::DrawBorder()
{
   // Draw borders of dock button.

   int options = GetOptions();

   if (fState == kButtonDown || fState == kButtonEngaged)
      ;
   else if (fMouseOn == kTRUE && IsEnabled()) {
      SetBackgroundColor(fHiBg);
      ChangeOptions(kChildFrame);
   } else {
      SetBackgroundColor(fNormBg);
      ChangeOptions(kChildFrame);
   }
   gVirtualX->ClearWindow(fId);
   TGFrame::DrawBorder();

   ChangeOptions(options);
}

//______________________________________________________________________________
void TGDockButton::DoRedraw()
{
   // Draw the dock button, i.e. two vertical lines.

   int x = 1, y = 0;

   DrawBorder();
   if (fState == kButtonDown || fState == kButtonEngaged) { ++x; ++y; }

   for (int i = 0; i < 5; i +=4) {
      gVirtualX->DrawLine(fId, GetHilightGC()(), i+x,   y+1, i+x,   fHeight-y-3);
      gVirtualX->DrawLine(fId, GetShadowGC()(),  i+x+1, y+1, i+x+1, fHeight-y-3);
   }
}


//______________________________________________________________________________
TGDockHideButton::TGDockHideButton(const TGCompositeFrame *p) :
   TGDockButton (p, 2)
{
   // Create a dock hide button (i.e. button with small triangle).

   Resize(10, 8);
   fAspectRatio = 0;
   SetWindowName();
}

//______________________________________________________________________________
void TGDockHideButton::DoRedraw()
{
   // Draw dock hide button.

   int x = 1, y = 0;

   DrawBorder();
   if (fState == kButtonDown || fState == kButtonEngaged) { ++x; ++y; }

   if (fAspectRatio) {
      gVirtualX->DrawLine(fId, GetBlackGC()(), x+1, y+1, x+5, y+3);
      gVirtualX->DrawLine(fId, GetBlackGC()(), x+1, y+5, x+5, y+3);
      gVirtualX->DrawLine(fId, GetHilightGC()(), x, y+1, x, y+5);
   } else {
      gVirtualX->DrawLine(fId, GetHilightGC()(), x+5, y+1, x+1, y+3);
      gVirtualX->DrawLine(fId, GetHilightGC()(), x+5, y+5, x+1, y+3);
      gVirtualX->DrawLine(fId, GetBlackGC()(), x+6, y+1, x+6, y+5);
   }
}


//______________________________________________________________________________
TGUndockedFrame::TGUndockedFrame(const TGWindow *p, TGDockableFrame *dockable) :
   TGTransientFrame(p, dockable ? dockable->GetMainFrame() : 0, 10, 10)
{
   // Create the undocked (transient) frame.

   SetWindowName("");
   fDockable = dockable;

   SetMWMHints(kMWMDecorAll | kMWMDecorResizeH  | kMWMDecorMaximize |
                              kMWMDecorMinimize | kMWMDecorMenu,
               kMWMFuncAll  | kMWMFuncResize    | kMWMFuncMaximize |
                              kMWMFuncMinimize,
               kMWMInputModeless);
   SetWindowName();
}

//______________________________________________________________________________
TGUndockedFrame::~TGUndockedFrame()
{
   // Delete undocked frame. Puts back dockable frame in its original container.

   if (fDockable && !fDockable->fDeleted) {
      fDockable->DockContainer(kFALSE);
   }
}

//______________________________________________________________________________
void TGUndockedFrame::FixSize()
{
   // Fix the size of the undocked frame so it cannot be changed via the WM.

   ChangeOptions(GetOptions() | kFixedSize);
   SetWMSize(fWidth, fHeight);
   SetWMSizeHints(fWidth, fHeight, fWidth, fHeight, 0, 0);
}

//______________________________________________________________________________
void TGUndockedFrame::CloseWindow()
{
   // Close undocked frame (called via WM close button).

   DeleteWindow();
}


//______________________________________________________________________________
TGDockableFrame::TGDockableFrame(const TGWindow *p, int id, UInt_t /*options*/)
   : TGCompositeFrame(p, 10, 10, kHorizontalFrame), TGWidget(id)
{
   // Create a dockable frame widget.

   fMsgWindow = fParent;

   fCl = new TGLayoutHints(kLHintsExpandY | kLHintsExpandX);

   TGLayoutHints *l1 = new TGLayoutHints(kLHintsTop | kLHintsLeft);
   TGLayoutHints *l2 = new TGLayoutHints(kLHintsExpandY | kLHintsLeft);
   fLb = new TGLayoutHints(kLHintsExpandY | kLHintsLeft, 0, 2, 0, 0);
   fLc = new TGLayoutHints(kLHintsExpandY | kLHintsExpandX);

   fButtons = new TGCompositeFrame(this, 10, 10, kVerticalFrame);
   fButtons->SetCleanup();
   fHideButton = new TGDockHideButton(fButtons);
   fButtons->AddFrame(fHideButton, l1);
   fDockButton = new TGDockButton(fButtons);
   fButtons->AddFrame(fDockButton, l2);

   TGCompositeFrame::AddFrame(fButtons, fLb);

   fContainer = new TGCompositeFrame(this, 10, 10);

   TGCompositeFrame::AddFrame(fContainer, fLc);

   fEnableHide   = kTRUE;
   fEnableUndock = kTRUE;
   fHidden       = kFALSE;
   fFrame        = 0;
   fDeleted      = kFALSE;
   fFixedSize    = kTRUE;

   fDockButton->Associate(this);
   fHideButton->Associate(this);

   MapSubwindows();
   Resize(GetDefaultSize());
   TGFrame::SetWindowName();
}

//______________________________________________________________________________
TGDockableFrame::~TGDockableFrame()
{
   // Cleanup dockable frame.

   // Just set the flag and delete fFrame. The other components
   // are deleted in TGCompositeFrame destructor.
   if (fFrame) {
      fDeleted = kTRUE;
      delete fFrame;
   }
}

//______________________________________________________________________________
void TGDockableFrame::AddFrame(TGFrame *f, TGLayoutHints *hints)
{
   // Add frame to dockable frame container. Frame and hints are NOT adopted.

   f->ReparentWindow(fContainer);
   fContainer->AddFrame(f, fHints = hints);
   fContainer->Layout();
}

//______________________________________________________________________________
void TGDockableFrame::UndockContainer()
{
   // Undock container.

   int ax, ay;
   Window_t wdummy;

   if (fFrame || !fEnableUndock) return;

   fFrame = new TGUndockedFrame(fClient->GetDefaultRoot(), this);
   fFrame->SetEditDisabled();

   TGDimension size = fContainer->GetSize();
   RemoveFrame(fContainer);
   fContainer->ReparentWindow(fFrame);
   fFrame->AddFrame(fContainer, fCl);  // fHints

   gVirtualX->TranslateCoordinates(GetId(), fClient->GetDefaultRoot()->GetId(), fX,
                                   fY + fFrame->GetHeight(), ax, ay, wdummy);

   if (fDockName) fFrame->SetWindowName(fDockName);

   fFrame->MapSubwindows();
   fFrame->Resize(size);
   if (fFixedSize)
      fFrame->FixSize();
   fFrame->MapWindow();
   fFrame->Move(ax, ay);

   if (((TGFrame *)fParent)->IsComposite())           // paranoia check
      ((TGCompositeFrame *)fParent)->HideFrame(this);

   Layout();

   SendMessage(fMsgWindow, MK_MSG(kC_DOCK, kDOCK_UNDOCK), fWidgetId, 0);
   Undocked();
}

//______________________________________________________________________________
void TGDockableFrame::DockContainer(Int_t del)
{
   // Dock container back to TGDockableFrame.

   if (!fFrame) return;
   if (del) {
      delete fFrame;  // this will call DockContainer again with del = kFALSE
      return;
   }

   fFrame->RemoveFrame(fContainer);
   fContainer->ReparentWindow(this);
   TGCompositeFrame::AddFrame(fContainer, fCl);  // fHints

   // kludge! (for special case)
   fDockButton->Resize(fDockButton->GetDefaultWidth(), 1);

   Layout();
   if (((TGFrame *)fParent)->IsComposite())           // paranoia check
      ((TGCompositeFrame *)fParent)->ShowFrame(this);

   // fFrame is just being deleted (we're here called by TGUndockedFrame's
   // destructor) so just set it NULL below to avoid eventual problems in
   // TGDockableFrame's destructor.

   fFrame = 0;

   SendMessage(fMsgWindow, MK_MSG(kC_DOCK, kDOCK_DOCK), fWidgetId, 0);
   Docked();
}

//______________________________________________________________________________
void TGDockableFrame::ShowContainer()
{
   // Show dock container.

   if (!fHidden) return;

   ShowFrame(fContainer);
   if (fEnableUndock) fButtons->ShowFrame(fDockButton);
   fHideButton->SetAspectRatio(0);
   if (((TGFrame *)fParent)->IsComposite())           // paranoia check
      ((TGCompositeFrame *)fParent)->Layout();
   fHidden = kFALSE;

   SendMessage(fMsgWindow, MK_MSG(kC_DOCK, kDOCK_SHOW), fWidgetId, 0);
}

//______________________________________________________________________________
void TGDockableFrame::HideContainer()
{
   // Hide dock container.

   if (fHidden || !fEnableHide) return;

   HideFrame(fContainer);
   fButtons->HideFrame(fDockButton);
   fHideButton->SetAspectRatio(1);
   if (((TGFrame *)fParent)->IsComposite())           // paranoia check
      ((TGCompositeFrame *)fParent)->Layout();
   fHidden = kTRUE;

   SendMessage(fMsgWindow, MK_MSG(kC_DOCK, kDOCK_HIDE),fWidgetId, 0);
}

//______________________________________________________________________________
Bool_t TGDockableFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t)
{
   // Process dockable frame messages.

   switch (GET_MSG(msg)) {
      case kC_COMMAND:
         switch (GET_SUBMSG(msg)) {
            case kCM_BUTTON:
               switch (parm1) {
                  case 1:
                     if (!fHidden) UndockContainer();
                     break;
                  case 2:
                     if (!fHidden)
                        HideContainer();
                     else
                        ShowContainer();
                     break;
               }
               break;
         }
         break;
   }

   return kTRUE;
}

//______________________________________________________________________________
void TGDockableFrame::EnableUndock(Bool_t onoff)
{
   // Enable undocking.

   fEnableUndock = onoff;
   if (onoff)
      fButtons->ShowFrame(fDockButton);
   else
      fButtons->HideFrame(fDockButton);
   Layout();
}

//______________________________________________________________________________
void TGDockableFrame::EnableHide(Bool_t onoff)
{
   // Enable hiding.

   fEnableHide = onoff;
   if (onoff)
      fButtons->ShowFrame(fHideButton);
   else
      fButtons->HideFrame(fHideButton);
   Layout();
}

//______________________________________________________________________________
void TGDockableFrame::SetWindowName(const char *name)
{
   // Set window name so it appear as title of the undock window.

   fDockName = "";
   if (name) {
      fDockName = name;
      if (fFrame) fFrame->SetWindowName(fDockName);
   }
}

//______________________________________________________________________________
void TGDockableFrame::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
{
   // Save a dockable frame widget as a C++ statement(s) on output stream out.

   char quote = '"';

   out << std::endl << "   // dockable frame" << std::endl;
   out << "   TGDockableFrame *";
   out << GetName()<<" = new TGDockableFrame(" << fParent->GetName();

   if (GetOptions() == kHorizontalFrame) {
      if (fWidgetId == -1) {
         out << ");" << std::endl;
      } else {
         out << "," << fWidgetId << ");" << std::endl;
      }
   } else {
      out << "," << fWidgetId << "," << GetOptionString() << ");" << std::endl;
   }
   if (option && strstr(option, "keep_names"))
      out << "   " << GetName() << "->SetName(\"" << GetName() << "\");" << std::endl;

   if (GetContainer()->GetList()->First()) {
      out << "   TGCompositeFrame *" << GetContainer()->GetName() << " = "
          << GetName() << "->GetContainer();" << std::endl;

      TGFrameElement *el;
      TIter next(GetContainer()->GetList());

      while ((el = (TGFrameElement *) next())) {
         el->fFrame->SavePrimitive(out, option);
         out << "   " << GetName() << "->AddFrame(" << el->fFrame->GetName();
         el->fLayout->SavePrimitive(out, option);
         out << ");"<< std::endl;
      }
   }
   out << std::endl << "   // next lines belong to the dockable frame widget" << std::endl;
   if (EnableUndock())
      out << "   " << GetName() << "->EnableUndock(kTRUE);" << std::endl;
   else
      out << "   " << GetName() << "->EnableUndock(kFALSE);" << std::endl;

   if (EnableHide())
      out << "   " << GetName() << "->EnableHide(kTRUE);" << std::endl;
   else
      out << "   " << GetName() << "->EnableHide(kFALSE);" << std::endl;

   if (fDockName != "")
      out << "   " << GetName() << "->SetWindowName(" << quote << fDockName
          << quote << ");" << std::endl;

   if (IsUndocked())
      out << "   " << GetName() << "->UndockContainer();" << std::endl;
   else
      out << "   " << GetName() << "->DockContainer();" << std::endl;

   if (IsHidden())
      out << "   " << GetName() << "->HideContainer();" << std::endl;

   out << std::endl;
}
 TGDockableFrame.cxx:1
 TGDockableFrame.cxx:2
 TGDockableFrame.cxx:3
 TGDockableFrame.cxx:4
 TGDockableFrame.cxx:5
 TGDockableFrame.cxx:6
 TGDockableFrame.cxx:7
 TGDockableFrame.cxx:8
 TGDockableFrame.cxx:9
 TGDockableFrame.cxx:10
 TGDockableFrame.cxx:11
 TGDockableFrame.cxx:12
 TGDockableFrame.cxx:13
 TGDockableFrame.cxx:14
 TGDockableFrame.cxx:15
 TGDockableFrame.cxx:16
 TGDockableFrame.cxx:17
 TGDockableFrame.cxx:18
 TGDockableFrame.cxx:19
 TGDockableFrame.cxx:20
 TGDockableFrame.cxx:21
 TGDockableFrame.cxx:22
 TGDockableFrame.cxx:23
 TGDockableFrame.cxx:24
 TGDockableFrame.cxx:25
 TGDockableFrame.cxx:26
 TGDockableFrame.cxx:27
 TGDockableFrame.cxx:28
 TGDockableFrame.cxx:29
 TGDockableFrame.cxx:30
 TGDockableFrame.cxx:31
 TGDockableFrame.cxx:32
 TGDockableFrame.cxx:33
 TGDockableFrame.cxx:34
 TGDockableFrame.cxx:35
 TGDockableFrame.cxx:36
 TGDockableFrame.cxx:37
 TGDockableFrame.cxx:38
 TGDockableFrame.cxx:39
 TGDockableFrame.cxx:40
 TGDockableFrame.cxx:41
 TGDockableFrame.cxx:42
 TGDockableFrame.cxx:43
 TGDockableFrame.cxx:44
 TGDockableFrame.cxx:45
 TGDockableFrame.cxx:46
 TGDockableFrame.cxx:47
 TGDockableFrame.cxx:48
 TGDockableFrame.cxx:49
 TGDockableFrame.cxx:50
 TGDockableFrame.cxx:51
 TGDockableFrame.cxx:52
 TGDockableFrame.cxx:53
 TGDockableFrame.cxx:54
 TGDockableFrame.cxx:55
 TGDockableFrame.cxx:56
 TGDockableFrame.cxx:57
 TGDockableFrame.cxx:58
 TGDockableFrame.cxx:59
 TGDockableFrame.cxx:60
 TGDockableFrame.cxx:61
 TGDockableFrame.cxx:62
 TGDockableFrame.cxx:63
 TGDockableFrame.cxx:64
 TGDockableFrame.cxx:65
 TGDockableFrame.cxx:66
 TGDockableFrame.cxx:67
 TGDockableFrame.cxx:68
 TGDockableFrame.cxx:69
 TGDockableFrame.cxx:70
 TGDockableFrame.cxx:71
 TGDockableFrame.cxx:72
 TGDockableFrame.cxx:73
 TGDockableFrame.cxx:74
 TGDockableFrame.cxx:75
 TGDockableFrame.cxx:76
 TGDockableFrame.cxx:77
 TGDockableFrame.cxx:78
 TGDockableFrame.cxx:79
 TGDockableFrame.cxx:80
 TGDockableFrame.cxx:81
 TGDockableFrame.cxx:82
 TGDockableFrame.cxx:83
 TGDockableFrame.cxx:84
 TGDockableFrame.cxx:85
 TGDockableFrame.cxx:86
 TGDockableFrame.cxx:87
 TGDockableFrame.cxx:88
 TGDockableFrame.cxx:89
 TGDockableFrame.cxx:90
 TGDockableFrame.cxx:91
 TGDockableFrame.cxx:92
 TGDockableFrame.cxx:93
 TGDockableFrame.cxx:94
 TGDockableFrame.cxx:95
 TGDockableFrame.cxx:96
 TGDockableFrame.cxx:97
 TGDockableFrame.cxx:98
 TGDockableFrame.cxx:99
 TGDockableFrame.cxx:100
 TGDockableFrame.cxx:101
 TGDockableFrame.cxx:102
 TGDockableFrame.cxx:103
 TGDockableFrame.cxx:104
 TGDockableFrame.cxx:105
 TGDockableFrame.cxx:106
 TGDockableFrame.cxx:107
 TGDockableFrame.cxx:108
 TGDockableFrame.cxx:109
 TGDockableFrame.cxx:110
 TGDockableFrame.cxx:111
 TGDockableFrame.cxx:112
 TGDockableFrame.cxx:113
 TGDockableFrame.cxx:114
 TGDockableFrame.cxx:115
 TGDockableFrame.cxx:116
 TGDockableFrame.cxx:117
 TGDockableFrame.cxx:118
 TGDockableFrame.cxx:119
 TGDockableFrame.cxx:120
 TGDockableFrame.cxx:121
 TGDockableFrame.cxx:122
 TGDockableFrame.cxx:123
 TGDockableFrame.cxx:124
 TGDockableFrame.cxx:125
 TGDockableFrame.cxx:126
 TGDockableFrame.cxx:127
 TGDockableFrame.cxx:128
 TGDockableFrame.cxx:129
 TGDockableFrame.cxx:130
 TGDockableFrame.cxx:131
 TGDockableFrame.cxx:132
 TGDockableFrame.cxx:133
 TGDockableFrame.cxx:134
 TGDockableFrame.cxx:135
 TGDockableFrame.cxx:136
 TGDockableFrame.cxx:137
 TGDockableFrame.cxx:138
 TGDockableFrame.cxx:139
 TGDockableFrame.cxx:140
 TGDockableFrame.cxx:141
 TGDockableFrame.cxx:142
 TGDockableFrame.cxx:143
 TGDockableFrame.cxx:144
 TGDockableFrame.cxx:145
 TGDockableFrame.cxx:146
 TGDockableFrame.cxx:147
 TGDockableFrame.cxx:148
 TGDockableFrame.cxx:149
 TGDockableFrame.cxx:150
 TGDockableFrame.cxx:151
 TGDockableFrame.cxx:152
 TGDockableFrame.cxx:153
 TGDockableFrame.cxx:154
 TGDockableFrame.cxx:155
 TGDockableFrame.cxx:156
 TGDockableFrame.cxx:157
 TGDockableFrame.cxx:158
 TGDockableFrame.cxx:159
 TGDockableFrame.cxx:160
 TGDockableFrame.cxx:161
 TGDockableFrame.cxx:162
 TGDockableFrame.cxx:163
 TGDockableFrame.cxx:164
 TGDockableFrame.cxx:165
 TGDockableFrame.cxx:166
 TGDockableFrame.cxx:167
 TGDockableFrame.cxx:168
 TGDockableFrame.cxx:169
 TGDockableFrame.cxx:170
 TGDockableFrame.cxx:171
 TGDockableFrame.cxx:172
 TGDockableFrame.cxx:173
 TGDockableFrame.cxx:174
 TGDockableFrame.cxx:175
 TGDockableFrame.cxx:176
 TGDockableFrame.cxx:177
 TGDockableFrame.cxx:178
 TGDockableFrame.cxx:179
 TGDockableFrame.cxx:180
 TGDockableFrame.cxx:181
 TGDockableFrame.cxx:182
 TGDockableFrame.cxx:183
 TGDockableFrame.cxx:184
 TGDockableFrame.cxx:185
 TGDockableFrame.cxx:186
 TGDockableFrame.cxx:187
 TGDockableFrame.cxx:188
 TGDockableFrame.cxx:189
 TGDockableFrame.cxx:190
 TGDockableFrame.cxx:191
 TGDockableFrame.cxx:192
 TGDockableFrame.cxx:193
 TGDockableFrame.cxx:194
 TGDockableFrame.cxx:195
 TGDockableFrame.cxx:196
 TGDockableFrame.cxx:197
 TGDockableFrame.cxx:198
 TGDockableFrame.cxx:199
 TGDockableFrame.cxx:200
 TGDockableFrame.cxx:201
 TGDockableFrame.cxx:202
 TGDockableFrame.cxx:203
 TGDockableFrame.cxx:204
 TGDockableFrame.cxx:205
 TGDockableFrame.cxx:206
 TGDockableFrame.cxx:207
 TGDockableFrame.cxx:208
 TGDockableFrame.cxx:209
 TGDockableFrame.cxx:210
 TGDockableFrame.cxx:211
 TGDockableFrame.cxx:212
 TGDockableFrame.cxx:213
 TGDockableFrame.cxx:214
 TGDockableFrame.cxx:215
 TGDockableFrame.cxx:216
 TGDockableFrame.cxx:217
 TGDockableFrame.cxx:218
 TGDockableFrame.cxx:219
 TGDockableFrame.cxx:220
 TGDockableFrame.cxx:221
 TGDockableFrame.cxx:222
 TGDockableFrame.cxx:223
 TGDockableFrame.cxx:224
 TGDockableFrame.cxx:225
 TGDockableFrame.cxx:226
 TGDockableFrame.cxx:227
 TGDockableFrame.cxx:228
 TGDockableFrame.cxx:229
 TGDockableFrame.cxx:230
 TGDockableFrame.cxx:231
 TGDockableFrame.cxx:232
 TGDockableFrame.cxx:233
 TGDockableFrame.cxx:234
 TGDockableFrame.cxx:235
 TGDockableFrame.cxx:236
 TGDockableFrame.cxx:237
 TGDockableFrame.cxx:238
 TGDockableFrame.cxx:239
 TGDockableFrame.cxx:240
 TGDockableFrame.cxx:241
 TGDockableFrame.cxx:242
 TGDockableFrame.cxx:243
 TGDockableFrame.cxx:244
 TGDockableFrame.cxx:245
 TGDockableFrame.cxx:246
 TGDockableFrame.cxx:247
 TGDockableFrame.cxx:248
 TGDockableFrame.cxx:249
 TGDockableFrame.cxx:250
 TGDockableFrame.cxx:251
 TGDockableFrame.cxx:252
 TGDockableFrame.cxx:253
 TGDockableFrame.cxx:254
 TGDockableFrame.cxx:255
 TGDockableFrame.cxx:256
 TGDockableFrame.cxx:257
 TGDockableFrame.cxx:258
 TGDockableFrame.cxx:259
 TGDockableFrame.cxx:260
 TGDockableFrame.cxx:261
 TGDockableFrame.cxx:262
 TGDockableFrame.cxx:263
 TGDockableFrame.cxx:264
 TGDockableFrame.cxx:265
 TGDockableFrame.cxx:266
 TGDockableFrame.cxx:267
 TGDockableFrame.cxx:268
 TGDockableFrame.cxx:269
 TGDockableFrame.cxx:270
 TGDockableFrame.cxx:271
 TGDockableFrame.cxx:272
 TGDockableFrame.cxx:273
 TGDockableFrame.cxx:274
 TGDockableFrame.cxx:275
 TGDockableFrame.cxx:276
 TGDockableFrame.cxx:277
 TGDockableFrame.cxx:278
 TGDockableFrame.cxx:279
 TGDockableFrame.cxx:280
 TGDockableFrame.cxx:281
 TGDockableFrame.cxx:282
 TGDockableFrame.cxx:283
 TGDockableFrame.cxx:284
 TGDockableFrame.cxx:285
 TGDockableFrame.cxx:286
 TGDockableFrame.cxx:287
 TGDockableFrame.cxx:288
 TGDockableFrame.cxx:289
 TGDockableFrame.cxx:290
 TGDockableFrame.cxx:291
 TGDockableFrame.cxx:292
 TGDockableFrame.cxx:293
 TGDockableFrame.cxx:294
 TGDockableFrame.cxx:295
 TGDockableFrame.cxx:296
 TGDockableFrame.cxx:297
 TGDockableFrame.cxx:298
 TGDockableFrame.cxx:299
 TGDockableFrame.cxx:300
 TGDockableFrame.cxx:301
 TGDockableFrame.cxx:302
 TGDockableFrame.cxx:303
 TGDockableFrame.cxx:304
 TGDockableFrame.cxx:305
 TGDockableFrame.cxx:306
 TGDockableFrame.cxx:307
 TGDockableFrame.cxx:308
 TGDockableFrame.cxx:309
 TGDockableFrame.cxx:310
 TGDockableFrame.cxx:311
 TGDockableFrame.cxx:312
 TGDockableFrame.cxx:313
 TGDockableFrame.cxx:314
 TGDockableFrame.cxx:315
 TGDockableFrame.cxx:316
 TGDockableFrame.cxx:317
 TGDockableFrame.cxx:318
 TGDockableFrame.cxx:319
 TGDockableFrame.cxx:320
 TGDockableFrame.cxx:321
 TGDockableFrame.cxx:322
 TGDockableFrame.cxx:323
 TGDockableFrame.cxx:324
 TGDockableFrame.cxx:325
 TGDockableFrame.cxx:326
 TGDockableFrame.cxx:327
 TGDockableFrame.cxx:328
 TGDockableFrame.cxx:329
 TGDockableFrame.cxx:330
 TGDockableFrame.cxx:331
 TGDockableFrame.cxx:332
 TGDockableFrame.cxx:333
 TGDockableFrame.cxx:334
 TGDockableFrame.cxx:335
 TGDockableFrame.cxx:336
 TGDockableFrame.cxx:337
 TGDockableFrame.cxx:338
 TGDockableFrame.cxx:339
 TGDockableFrame.cxx:340
 TGDockableFrame.cxx:341
 TGDockableFrame.cxx:342
 TGDockableFrame.cxx:343
 TGDockableFrame.cxx:344
 TGDockableFrame.cxx:345
 TGDockableFrame.cxx:346
 TGDockableFrame.cxx:347
 TGDockableFrame.cxx:348
 TGDockableFrame.cxx:349
 TGDockableFrame.cxx:350
 TGDockableFrame.cxx:351
 TGDockableFrame.cxx:352
 TGDockableFrame.cxx:353
 TGDockableFrame.cxx:354
 TGDockableFrame.cxx:355
 TGDockableFrame.cxx:356
 TGDockableFrame.cxx:357
 TGDockableFrame.cxx:358
 TGDockableFrame.cxx:359
 TGDockableFrame.cxx:360
 TGDockableFrame.cxx:361
 TGDockableFrame.cxx:362
 TGDockableFrame.cxx:363
 TGDockableFrame.cxx:364
 TGDockableFrame.cxx:365
 TGDockableFrame.cxx:366
 TGDockableFrame.cxx:367
 TGDockableFrame.cxx:368
 TGDockableFrame.cxx:369
 TGDockableFrame.cxx:370
 TGDockableFrame.cxx:371
 TGDockableFrame.cxx:372
 TGDockableFrame.cxx:373
 TGDockableFrame.cxx:374
 TGDockableFrame.cxx:375
 TGDockableFrame.cxx:376
 TGDockableFrame.cxx:377
 TGDockableFrame.cxx:378
 TGDockableFrame.cxx:379
 TGDockableFrame.cxx:380
 TGDockableFrame.cxx:381
 TGDockableFrame.cxx:382
 TGDockableFrame.cxx:383
 TGDockableFrame.cxx:384
 TGDockableFrame.cxx:385
 TGDockableFrame.cxx:386
 TGDockableFrame.cxx:387
 TGDockableFrame.cxx:388
 TGDockableFrame.cxx:389
 TGDockableFrame.cxx:390
 TGDockableFrame.cxx:391
 TGDockableFrame.cxx:392
 TGDockableFrame.cxx:393
 TGDockableFrame.cxx:394
 TGDockableFrame.cxx:395
 TGDockableFrame.cxx:396
 TGDockableFrame.cxx:397
 TGDockableFrame.cxx:398
 TGDockableFrame.cxx:399
 TGDockableFrame.cxx:400
 TGDockableFrame.cxx:401
 TGDockableFrame.cxx:402
 TGDockableFrame.cxx:403
 TGDockableFrame.cxx:404
 TGDockableFrame.cxx:405
 TGDockableFrame.cxx:406
 TGDockableFrame.cxx:407
 TGDockableFrame.cxx:408
 TGDockableFrame.cxx:409
 TGDockableFrame.cxx:410
 TGDockableFrame.cxx:411
 TGDockableFrame.cxx:412
 TGDockableFrame.cxx:413
 TGDockableFrame.cxx:414
 TGDockableFrame.cxx:415
 TGDockableFrame.cxx:416
 TGDockableFrame.cxx:417
 TGDockableFrame.cxx:418
 TGDockableFrame.cxx:419
 TGDockableFrame.cxx:420
 TGDockableFrame.cxx:421
 TGDockableFrame.cxx:422
 TGDockableFrame.cxx:423
 TGDockableFrame.cxx:424
 TGDockableFrame.cxx:425
 TGDockableFrame.cxx:426
 TGDockableFrame.cxx:427
 TGDockableFrame.cxx:428
 TGDockableFrame.cxx:429
 TGDockableFrame.cxx:430
 TGDockableFrame.cxx:431
 TGDockableFrame.cxx:432
 TGDockableFrame.cxx:433
 TGDockableFrame.cxx:434
 TGDockableFrame.cxx:435
 TGDockableFrame.cxx:436
 TGDockableFrame.cxx:437
 TGDockableFrame.cxx:438
 TGDockableFrame.cxx:439
 TGDockableFrame.cxx:440
 TGDockableFrame.cxx:441
 TGDockableFrame.cxx:442
 TGDockableFrame.cxx:443
 TGDockableFrame.cxx:444
 TGDockableFrame.cxx:445
 TGDockableFrame.cxx:446
 TGDockableFrame.cxx:447
 TGDockableFrame.cxx:448
 TGDockableFrame.cxx:449
 TGDockableFrame.cxx:450
 TGDockableFrame.cxx:451
 TGDockableFrame.cxx:452
 TGDockableFrame.cxx:453
 TGDockableFrame.cxx:454
 TGDockableFrame.cxx:455
 TGDockableFrame.cxx:456
 TGDockableFrame.cxx:457
 TGDockableFrame.cxx:458
 TGDockableFrame.cxx:459
 TGDockableFrame.cxx:460
 TGDockableFrame.cxx:461
 TGDockableFrame.cxx:462
 TGDockableFrame.cxx:463
 TGDockableFrame.cxx:464
 TGDockableFrame.cxx:465
 TGDockableFrame.cxx:466
 TGDockableFrame.cxx:467
 TGDockableFrame.cxx:468
 TGDockableFrame.cxx:469
 TGDockableFrame.cxx:470
 TGDockableFrame.cxx:471
 TGDockableFrame.cxx:472
 TGDockableFrame.cxx:473
 TGDockableFrame.cxx:474
 TGDockableFrame.cxx:475
 TGDockableFrame.cxx:476
 TGDockableFrame.cxx:477
 TGDockableFrame.cxx:478
 TGDockableFrame.cxx:479
 TGDockableFrame.cxx:480
 TGDockableFrame.cxx:481
 TGDockableFrame.cxx:482
 TGDockableFrame.cxx:483
 TGDockableFrame.cxx:484
 TGDockableFrame.cxx:485
 TGDockableFrame.cxx:486
 TGDockableFrame.cxx:487
 TGDockableFrame.cxx:488
 TGDockableFrame.cxx:489
 TGDockableFrame.cxx:490
 TGDockableFrame.cxx:491
 TGDockableFrame.cxx:492
 TGDockableFrame.cxx:493
 TGDockableFrame.cxx:494
 TGDockableFrame.cxx:495
 TGDockableFrame.cxx:496
 TGDockableFrame.cxx:497
 TGDockableFrame.cxx:498
 TGDockableFrame.cxx:499
 TGDockableFrame.cxx:500
 TGDockableFrame.cxx:501
 TGDockableFrame.cxx:502
 TGDockableFrame.cxx:503
 TGDockableFrame.cxx:504
 TGDockableFrame.cxx:505
 TGDockableFrame.cxx:506
 TGDockableFrame.cxx:507
 TGDockableFrame.cxx:508
 TGDockableFrame.cxx:509
 TGDockableFrame.cxx:510
 TGDockableFrame.cxx:511
 TGDockableFrame.cxx:512
 TGDockableFrame.cxx:513