ROOT logo
// @(#)root/ged:$Id: TStylePreview.cxx,v 1.0 2005/09/08
// Author: Denis Favre-Miville   08/09/05

/*************************************************************************
 * 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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
//  TStylePreview                                                       //
//                                                                      //
//  This class may be used to preview the result of applying a style    //
//       to a canvas. The result is shown on a clone of the object,     //
//       in a different shown over the initial canvas.                  //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TStylePreview.h"
#include "TStyleManager.h"

#include <TCanvas.h>
#include <TRootEmbeddedCanvas.h>
#include <TStyle.h>
#include <TROOT.h>

ClassImp(TStylePreview)

//______________________________________________________________________________
TStylePreview::TStylePreview(const TGWindow *p, TStyle *style,
                              TVirtualPad *currentPad)
                     : TGTransientFrame(0, p)
{
   //  Constructor. Create a new window and draw a clone of
   // currentPad->GetCanvas() in it, using the style 'style'.
   //  Thanks to that method, one can have a preview of any
   // style with any object.

   fPad = 0;

   // Create the main window.
   SetWindowName("Style Manager's Preview");
   SetCleanup(kNoCleanup);
   DontCallClose();

   // Create the trash lists to have an effective deletion of every object.
   fTrashListLayout = new TList();

   // Create the layouts and add them to the layout trash list.
   TGLayoutHints *layoutXY = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY);
   fTrashListLayout->Add(layoutXY);

   // Create a canvas for the preview.
   fEcan = new TRootEmbeddedCanvas("TSMPreviewCanvas", this, 10, 10);
   AddFrame(fEcan, layoutXY);

   // Draw the preview.
   Update(style, currentPad);

   // Map main frame.
   MapTheWindow();

   // No modifications allowed in the preview.
   fEcan->GetCanvas()->SetEditable(kFALSE);
   fEcan->GetCanvas()->SetBit(kNoContextMenu);
}

//______________________________________________________________________________
TStylePreview::~TStylePreview()
{
   // Destructor.

   // Delete all the widgets created in this class.
   delete fEcan;

   // Delete all the layouts.
   TObject *obj1;
   TObject *obj2;
   obj1 = fTrashListLayout->First();
   while (obj1) {
      obj2 = fTrashListLayout->After(obj1);
      fTrashListLayout->Remove(obj1);
      delete obj1;
      obj1 = obj2;
   }
   delete fTrashListLayout;
}

//______________________________________________________________________________
void TStylePreview::Update(TStyle *style, TVirtualPad *pad)
{
   // Update the preview with possibly another style and 
   // another object than previously.

   TCanvas *c;
   if (pad != fPad) {
      delete fEcan->GetCanvas();
      fEcan->AdoptCanvas(new TCanvas("TSMPreviewCanvas", 10, 10,
                                       fEcan->GetCanvasWindowId()));
      c = fEcan->GetCanvas();
      gROOT->SetSelectedPad(c);
      pad->GetCanvas()->DrawClonePad();
      gROOT->SetSelectedPad(pad);
      fPad = pad;
   }

   // Apply the 'style' to the clone of 'pad'.
   c = fEcan->GetCanvas();
   TStyle *tmpStyle = gStyle;
   gStyle = style;
   c->UseCurrentStyle();
   gStyle = tmpStyle;
   c->Modified();
   c->Update();
}

//______________________________________________________________________________
void TStylePreview::MapTheWindow()
{
   // Initialize the layout algorithm.
   
   MapSubwindows();
   TCanvas *c = fPad->GetCanvas();
   UInt_t w = c->GetWw() + 4; //4 pixels of borders
   UInt_t h = c->GetWh() + 4; //4 pixels of borders
   UInt_t x = (UInt_t) c->GetWindowTopX() + 60;
   UInt_t y = (UInt_t) c->GetWindowTopY() + 100;

   MoveResize(x, y, w, h);
   SetWMPosition(x, y);

   MapWindow();
}

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