Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TRootControlBar.cxx
Go to the documentation of this file.
1 // @(#)root/gui:$Id$
2 // Author: Fons Rademakers 22/02/98
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 //////////////////////////////////////////////////////////////////////////
13 // //
14 // TRootControlBar //
15 // //
16 // This class provides an interface to the GUI dependent functions of //
17 // the TControlBar class. A control bar is a horizontal or vertical bar //
18 // with a number of buttons (text or picture buttons). //
19 // //
20 //////////////////////////////////////////////////////////////////////////
21 
22 #include "TRootControlBar.h"
23 #include "TControlBar.h"
24 #include "TList.h"
25 #include "TGButton.h"
26 
27 
28 ClassImp(TRootControlBar);
29 
30 ////////////////////////////////////////////////////////////////////////////////
31 /// Create a ROOT native GUI controlbar.
32 
33 TRootControlBar::TRootControlBar(TControlBar *c, const char *title, Int_t x, Int_t y)
34  : TGMainFrame(gClient->GetRoot(), 10, 10), TControlBarImp(c)
35 {
36  fWidgets = 0;
37  fXpos = x;
38  fYpos = y;
39  fBwidth = 0;
40  fClicked = 0;
41  SetCleanup(kDeepCleanup);
42 
43  // if controlbar orientation is horizontal change layout manager
44  if (c && c->GetOrientation() == TControlBar::kHorizontal) {
45  ChangeOptions(kHorizontalFrame);
46  fL1 = new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1);
47  } else
48  fL1 = new TGLayoutHints(kLHintsCenterY | kLHintsExpandX, 1, 1, 1, 1);
49 
50  SetWindowName(title);
51  SetIconName(title);
52 }
53 
54 ////////////////////////////////////////////////////////////////////////////////
55 /// Delete the control bar implementation.
56 
57 TRootControlBar::~TRootControlBar()
58 {
59  delete fWidgets;
60  fWidgets = 0;
61 }
62 
63 ////////////////////////////////////////////////////////////////////////////////
64 /// Create the control bar. Loop over all buttons defined in the
65 /// TControlBar and create the buttons.
66 
67 void TRootControlBar::Create()
68 {
69  fWidgets = new TList;
70  TGButton *b = 0;
71 
72  TControlBarButton *button;
73  TIter next(fControlBar->GetListOfButtons());
74 
75  while ((button = (TControlBarButton *) next())) {
76 
77  switch (button->GetType()) {
78 
79  case TControlBarButton::kSeparator:
80  Warning("Create", "separators not yet supported");
81  break;
82 
83  case TControlBarButton::kDrawnButton:
84  Warning("Create", "picture buttons not yet supported");
85  break;
86 
87  case TControlBarButton::kButton:
88  {
89  b = new TGTextButton(this, button->GetName());
90  b->SetToolTipText(button->GetTitle());
91  b->SetUserData(button);
92  AddFrame(b, fL1);
93  fWidgets->Add(b);
94  if (fBwidth < b->GetDefaultWidth())
95  fBwidth = b->GetDefaultWidth(); //do not cut the label
96  }
97  break;
98  }
99  }
100 
101  MapSubwindows();
102  Resize(GetDefaultSize());
103 
104  SetMWMHints(kMWMDecorAll | kMWMDecorResizeH,
105  kMWMFuncAll | kMWMFuncResize | kMWMFuncMaximize,
106  kMWMInputModeless);
107 
108  if (fXpos != -999) {
109  Move(fXpos, fYpos);
110  SetWMPosition(fXpos, fYpos);
111  }
112  if (GetOptions() & kHorizontalFrame)
113  SetWMSize(fBwidth*fWidgets->GetSize(), GetHeight());
114  else
115  SetWMSize(fBwidth, GetHeight());
116 }
117 
118 ////////////////////////////////////////////////////////////////////////////////
119 /// Show controlbar. If not yet created create it first.
120 
121 void TRootControlBar::Show()
122 {
123  if (!fWidgets) Create();
124 
125  MapRaised();
126 }
127 
128 ////////////////////////////////////////////////////////////////////////////////
129 /// Hide controlbar.
130 
131 void TRootControlBar::Hide()
132 {
133  UnmapWindow();
134 }
135 
136 ////////////////////////////////////////////////////////////////////////////////
137 /// Handle controlbar button messages.
138 
139 Bool_t TRootControlBar::ProcessMessage(Long_t, Long_t, Long_t parm2)
140 {
141  TControlBarButton *button = (TControlBarButton *) parm2;
142 
143  if (button) {
144  fClicked = button;
145  button->Action();
146  }
147  return kTRUE;
148 }
149 
150 ////////////////////////////////////////////////////////////////////////////////
151 /// Really delete the control bar and the this GUI.
152 
153 void TRootControlBar::ReallyDelete()
154 {
155  delete fControlBar; // will in turn delete this object
156 }
157 
158 ////////////////////////////////////////////////////////////////////////////////
159 /// Called when closed via window manager action.
160 
161 void TRootControlBar::CloseWindow()
162 {
163  DeleteWindow(); // but do it slightly delayed here
164 }
165 
166 ////////////////////////////////////////////////////////////////////////////////
167 /// sets new font for control bar buttons
168 
169 void TRootControlBar::SetFont(const char *fontName)
170 {
171  TIter next(fWidgets);
172 
173  TObject *obj;
174 
175  while ((obj=next())) {
176  if (!obj->InheritsFrom(TGTextButton::Class())) continue;
177 
178  ((TGTextButton *)obj)->SetFont(fontName);
179  }
180  Resize();
181 }
182 
183 ////////////////////////////////////////////////////////////////////////////////
184 /// sets new font for control bar buttons
185 
186 void TRootControlBar::SetButtonState(const char *label, Int_t state)
187 {
188  TIter next(fWidgets);
189 
190  TObject *obj;
191 
192  while ((obj=next())) {
193  if (!obj->InheritsFrom(TGTextButton::Class())) continue;
194 
195  if (!strcmp(((TGTextButton *)obj)->GetTitle(), label)) {
196  switch (state) {
197  case 0: {
198  ((TGTextButton *)obj)->SetState(kButtonUp);
199  break;
200  }
201  case 1: {
202  ((TGTextButton *)obj)->SetState(kButtonDown);
203  break;
204  }
205  case 2: {
206  ((TGTextButton *)obj)->SetState(kButtonEngaged);
207  break;
208  }
209  case 3: {
210  ((TGTextButton *)obj)->SetState(kButtonDisabled);
211  break;
212  }
213  default: {
214  Error("SetButtonState", "not valid button state (expecting 0, 1, 2 or 3)");
215  break;
216  }
217  }
218  }
219  }
220  Resize();
221 }
222 
223 ////////////////////////////////////////////////////////////////////////////////
224 /// sets text color for control bar buttons, e.g.:
225 /// root > .x tutorials/demos.C
226 /// root > bar->SetTextColor("red")
227 
228 void TRootControlBar::SetTextColor(const char *colorName)
229 {
230  Pixel_t color;
231  gClient->GetColorByName(colorName, color);
232 
233  if (!fWidgets) Create();
234 
235  TIter next(fWidgets);
236 
237  TObject *obj;
238 
239  while ((obj=next())) {
240  if (!obj->InheritsFrom(TGTextButton::Class())) continue;
241 
242  ((TGTextButton *)obj)->SetTextColor(color);
243  }
244  Resize();
245 }
246 
247 ////////////////////////////////////////////////////////////////////////////////
248 /// Set button width in pixels.
249 
250 void TRootControlBar::SetButtonWidth(UInt_t width)
251 {
252  fBwidth = width;
253 }