Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Loading...
Searching...
No Matches
TGLabel.cxx
Go to the documentation of this file.
1// @(#)root/gui:$Id$
2// Author: Fons Rademakers 06/01/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 This source is based on Xclass95, a Win95-looking GUI toolkit.
14 Copyright (C) 1996, 1997 David Barth, Ricky Ralston, Hector Peraza.
15
16 Xclass95 is free software; you can redistribute it and/or
17 modify it under the terms of the GNU Library General Public
18 License as published by the Free Software Foundation; either
19 version 2 of the License, or (at your option) any later version.
20
21**************************************************************************/
22
23
24/** \class TGLabel
25 \ingroup guiwidgets
26
27This class handles GUI labels.
28
29*/
30
31
32#include "TGLabel.h"
33#include "TGString.h"
34#include "TGWidget.h"
35#include "TGResourcePool.h"
36#include "TColor.h"
37#include "TClass.h"
38#include "TVirtualX.h"
39
40#include <iostream>
41
42
43const TGFont *TGLabel::fgDefaultFont = nullptr;
44const TGGC *TGLabel::fgDefaultGC = nullptr;
45
47
48////////////////////////////////////////////////////////////////////////////////
49/// Create a label GUI object. TGLabel will become the owner of the
50/// text and will delete it in its dtor.
51
53 FontStruct_t font, UInt_t options, Pixel_t back) :
54 TGFrame(p, 1, 1, options, back)
55{
56 fText = text;
61 f3DStyle = 0;
62 fWrapLength = -1;
63 fTFlags = 0;
64 fMLeft = fMRight = fMTop = fMBottom = 0;
65
66 if (!norm) {
67 norm = GetDefaultGC().GetGC();
68 }
69 fNormGC = norm;
70
71 if (!font) {
72 font = fgDefaultFont->GetFontStruct();
73 }
74
75 fFont = fClient->GetFontPool()->GetFont(font);
78 &fTWidth, &fTHeight);
79
82 wattr.fBitGravity = 5; // center
83 wattr.fWinGravity = 1;
84 gVirtualX->ChangeWindowAttributes(fId, &wattr);
85
86 Resize();
88}
89
90////////////////////////////////////////////////////////////////////////////////
91/// Create a label GUI object.
92
94 FontStruct_t font, UInt_t options, Pixel_t back) :
95 TGFrame(p, 1, 1, options, back)
96{
97 fText = new TGString(!text && !p ? GetName() : text);
102 f3DStyle = 0;
103 fWrapLength = -1;
104 fTFlags = 0;
105 fMLeft = fMRight = fMTop = fMBottom = 0;
106
107 if (!norm) {
108 norm = GetDefaultGC().GetGC();
109 }
110 fNormGC = norm;
111
112 if (!font) {
113 font = fgDefaultFont->GetFontStruct();
114 }
115
116 fFont = fClient->GetFontPool()->GetFont(font);
119 &fTWidth, &fTHeight);
120
123 wattr.fBitGravity = 5; // center
124 wattr.fWinGravity = 1;
125 gVirtualX->ChangeWindowAttributes(fId, &wattr);
126
127 Resize();
129}
130
131////////////////////////////////////////////////////////////////////////////////
132/// Delete label.
133
135{
136 if (fText) {
137 delete fText;
138 }
139
140 if (fHasOwnFont) {
142 TGGC *gc = pool->FindGC(fNormGC);
143 if (gc) pool->FreeGC(gc);
144 }
145
146 if (fFont != fgDefaultFont) {
148 }
149
150 delete fTLayout;
151}
152
153////////////////////////////////////////////////////////////////////////////////
154/// Layout label.
155
164
165////////////////////////////////////////////////////////////////////////////////
166/// Return default size.
167
174
175////////////////////////////////////////////////////////////////////////////////
176/// Set new text in label. After calling this method one needs to call
177/// the parents frame's Layout() method to force updating of the label size.
178/// The new_text is adopted by the TGLabel and will be properly deleted.
179
181{
182 if (fText) delete fText;
183 fText = new_text;
185
186 Layout();
187}
188
189////////////////////////////////////////////////////////////////////////////////
190/// Draw text at position (x, y).
191
193{
194 fTLayout->DrawText(fId, gc, x, y, 0, -1);
195 //fTLayout->UnderlineChar(fId, gc, x, y, fText->GetHotPos());
196}
197
198////////////////////////////////////////////////////////////////////////////////
199/// Redraw label widget.
200
202{
203 int x, y;
204
207
208 if (fTMode & kTextLeft) {
209 x = fMLeft;
210 } else if (fTMode & kTextRight) {
211 x = fWidth - fTWidth - fMRight;
212 } else {
213 x = (fWidth - fTWidth + fMLeft - fMRight) >> 1;
214 }
215
216 if (fTMode & kTextTop) {
217 y = 0;
218 } else if (fTMode & kTextBottom) {
219 y = fHeight - fTHeight;
220 } else {
221 y = (fHeight - fTHeight) >> 1;
222 }
223
224
225 if (!fDisabled) {
226 TGGCPool *pool = fClient->GetResourcePool()->GetGCPool();
227 TGGC *gc = pool->FindGC(fNormGC);
228
229 if (!gc) {
230 fNormGC = GetDefaultGC().GetGC();
231 gc = pool->FindGC(fNormGC);
232 }
233 if (!gc) return;
234
235 switch (f3DStyle) {
236 case kRaisedFrame:
237 case kSunkenFrame:
238 {
239 Pixel_t forecolor = gc->GetForeground();
241 Pixel_t sh = forecolor;
242
243 if (f3DStyle == kRaisedFrame) {
244 Pixel_t t = hi;
245 hi = sh;
246 sh = t;
247 }
248
249 gc->SetForeground(hi);
250 DrawText(gc->GetGC(), x+1, y+1);
251 gc->SetForeground(sh);
252 DrawText(gc->GetGC(), x, y);
253 gc->SetForeground(forecolor);
254 }
255 break;
256
257 default:
258 DrawText(fNormGC, x, y);
259 break;
260 }
261 } else { // disabled
263
265 fontH = gVirtualX->GetFontHandle(fFont->GetFontStruct());
266 } else {
267 fontH = gVirtualX->GetFontHandle(GetDefaultFontStruct());
268 }
269 static TGGC *gc1 = 0;
270 static TGGC *gc2 = 0;
271
272 if (!gc1) {
273 gc1 = fClient->GetResourcePool()->GetGCPool()->FindGC(GetHilightGC()());
274 gc1 = new TGGC(*gc1); // copy
275 }
276 gc1->SetFont(fontH);
277 DrawText(gc1->GetGC(), x + 1, y + 1);
278
279 if (!gc2) {
280 gc2 = fClient->GetResourcePool()->GetGCPool()->FindGC(GetShadowGC()());
281 gc2 = new TGGC(*gc2); // copy
282 }
283 gc2->SetFont(fontH);
284 DrawText(gc2->GetGC(), x, y);
285 }
286}
287
288////////////////////////////////////////////////////////////////////////////////
289/// Changes text font.
290/// If global is true font is changed globally - otherwise locally.
291
293{
295
296 if (!font) {
297 //error
298 return;
299 }
300
301 SetTextFont(font, global);
302}
303
304////////////////////////////////////////////////////////////////////////////////
305/// Changes text font specified by name.
306/// If global is true font is changed globally - otherwise locally.
307
309{
310 TGFont *font = fClient->GetFont(fontName);
311
312 if (!font) {
313 // error
314 return;
315 }
316
317 SetTextFont(font, global);
318}
319
320////////////////////////////////////////////////////////////////////////////////
321/// Changes text font specified by pointer to TGFont object.
322/// If global is true font is changed globally - otherwise locally.
323
325{
326 if (!font) {
327 //error
328 return;
329 }
330
332 fFont = fClient->GetFont(font); // increase usage count
333 if (!fFont) {
334 fFont = oldfont;
335 return;
336 }
337
338 TGGCPool *pool = fClient->GetResourcePool()->GetGCPool();
339 TGGC *gc = pool->FindGC(fNormGC);
340
341 if (!global) {
342 if (gc == &GetDefaultGC() ) { // create new GC
343 gc = pool->GetGC((GCValues_t*)gc->GetAttributes(), kTRUE); // copy ctor.
344 }
346 }
347 if (oldfont != fgDefaultFont) {
349 }
350 if (gc) {
351 gc->SetFont(fFont->GetFontHandle());
352 fNormGC = gc->GetGC();
353 }
355 Layout();
356}
357
358////////////////////////////////////////////////////////////////////////////////
359/// Changes text color.
360/// If global is true color is changed globally - otherwise locally.
361
363{
364 TGGCPool *pool = fClient->GetResourcePool()->GetGCPool();
365 TGGC *gc = pool->FindGC(fNormGC);
366
367 if (!global) {
368 if (gc == &GetDefaultGC() ) {
369 gc = pool->GetGC((GCValues_t*)gc->GetAttributes(), kTRUE); // copy
370 }
372 }
373 if (gc) {
374 gc->SetForeground(color);
375 fNormGC = gc->GetGC();
376 }
377 fClient->NeedRedraw(this);
378}
379
380////////////////////////////////////////////////////////////////////////////////
381/// Changes text color.
382/// If global is true color is changed globally - otherwise locally.
383
385{
386 if (color) {
387 SetTextColor(color->GetPixel(), global);
388 }
389}
390
391////////////////////////////////////////////////////////////////////////////////
392/// Set text justification. Mode is an OR of the bits:
393/// kTextTop, kTextBottom, kTextLeft, kTextRight, kTextCenterX and
394/// kTextCenterY.
395
397{
399 fTMode = mode;
400
403 wattr.fWinGravity = 1;
404
405 switch (mode) {
406 case kTextTop | kTextLeft:
407 wattr.fBitGravity = 1; //NorthWestGravity
408 break;
409 case kTextTop | kTextCenterX:
410 case kTextTop:
411 wattr.fBitGravity = 2; //NorthGravity
412 break;
413 case kTextTop | kTextRight:
414 wattr.fBitGravity = 3; //NorthEastGravity
415 break;
416 case kTextLeft | kTextCenterY:
417 case kTextLeft:
418 wattr.fBitGravity = 4; //WestGravity
419 break;
421 wattr.fBitGravity = 5; //CenterGravity
422 break;
424 case kTextRight:
425 wattr.fBitGravity = 6; //EastGravity
426 break;
427 case kTextBottom | kTextLeft:
428 wattr.fBitGravity = 7; //SouthWestGravity
429 break;
431 case kTextBottom:
432 wattr.fBitGravity = 8; //SouthGravity
433 break;
434 case kTextBottom | kTextRight:
435 wattr.fBitGravity = 9; //SouthEastGravity
436 break;
437 default:
438 wattr.fBitGravity = 5; //CenterGravity
439 break;
440 }
441
442 gVirtualX->ChangeWindowAttributes(fId, &wattr);
443
444 Layout();
445}
446
447////////////////////////////////////////////////////////////////////////////////
448/// Returns kTRUE if text attributes are unique.
449/// Returns kFALSE if text attributes are shared (global).
450
452{
453 return fHasOwnFont;
454}
455
456////////////////////////////////////////////////////////////////////////////////
457/// Save a label widget as a C++ statement(s) on output stream out.
458
459void TGLabel::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
460{
461 // font + GC
462 option = GetName()+5; // unique digit id of the name
464 parFont.Form("%s::GetDefaultFontStruct()",IsA()->GetName());
465 parGC.Form("%s::GetDefaultGC()()",IsA()->GetName());
466
467 if ((GetDefaultFontStruct() != fFont->GetFontStruct()) || (GetDefaultGC()() != fNormGC)) {
468 TGFont *ufont = fClient->GetResourcePool()->GetFontPool()->FindFont(fFont->GetFontStruct());
469 if (ufont) {
470 ufont->SavePrimitive(out, option);
471 parFont.Form("ufont->GetFontStruct()");
472 }
473
474 TGGC *userGC = fClient->GetResourcePool()->GetGCPool()->FindGC(fNormGC);
475 if (userGC) {
476 userGC->SavePrimitive(out, option);
477 parGC.Form("uGC->GetGC()");
478 }
479 }
480
481 // save options and color if necessary
482 auto extra_args = SaveCtorArgs(out);
483
484 TString label = GetText()->GetString();
485
486 out << " TGLabel *" << GetName() << " = new TGLabel("<< fParent->GetName()
487 << ", \"" << label.ReplaceSpecialCppChars() << "\"";
488 if ((extra_args.Length() > 0) || (fFont->GetFontStruct() != GetDefaultFontStruct()))
489 out << "," << parGC << "," << parFont << extra_args;
490 else if (fNormGC != GetDefaultGC()())
491 out << ", " << parGC;
492 out << ");\n";
493
494 if (option && strstr(option, "keep_names"))
495 out << " " << GetName() << "->SetName(\"" << GetName() << "\");\n";
496
497 if (fDisabled)
498 out << " " << GetName() << "->Disable();\n";
499
500 out << " " << GetName() << "->SetTextJustify(" << GetTextJustify() << ");\n";
501 out << " " << GetName() << "->SetMargins(" << fMLeft << "," << fMRight << "," << fMTop << "," << fMBottom
502 << ");\n";
503 out << " " << GetName() << "->SetWrapLength(" << fWrapLength << ");\n";
504}
505
506////////////////////////////////////////////////////////////////////////////////
507/// Static returning label default font struct.
508
510{
511 if (!fgDefaultFont) {
512 fgDefaultFont = gClient->GetResourcePool()->GetDefaultFont();
513 }
514 return fgDefaultFont->GetFontStruct();
515}
516
517////////////////////////////////////////////////////////////////////////////////
518/// Static returning label default graphics context.
519
521{
522 if (!fgDefaultGC) {
523 fgDefaultGC = gClient->GetResourcePool()->GetFrameGC();
524 }
525 return *fgDefaultGC;
526}
const Mask_t kWABitGravity
Definition GuiTypes.h:144
Handle_t FontH_t
Font handle (as opposed to Font_t which is an index)
Definition GuiTypes.h:35
const Mask_t kWAWinGravity
Definition GuiTypes.h:145
Handle_t GContext_t
Graphics context handle.
Definition GuiTypes.h:38
@ kRaisedFrame
Definition GuiTypes.h:384
@ kSunkenFrame
Definition GuiTypes.h:383
@ kFixedWidth
Definition GuiTypes.h:387
@ kFixedHeight
Definition GuiTypes.h:389
ULong_t Pixel_t
Pixel value.
Definition GuiTypes.h:40
Handle_t FontStruct_t
Pointer to font structure.
Definition GuiTypes.h:39
#define h(i)
Definition RSha256.hxx:106
constexpr Bool_t kFALSE
Definition RtypesCore.h:94
constexpr Bool_t kTRUE
Definition RtypesCore.h:93
const char Option_t
Definition RtypesCore.h:66
#define ClassImp(name)
Definition Rtypes.h:374
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define gClient
Definition TGClient.h:157
@ kTextCenterX
Definition TGWidget.h:25
@ kTextLeft
Definition TGWidget.h:23
@ kTextBottom
Definition TGWidget.h:27
@ kTextTop
Definition TGWidget.h:26
@ kTextRight
Definition TGWidget.h:24
@ kTextCenterY
Definition TGWidget.h:28
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t option
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char forecolor
Option_t Option_t SetTextFont
Option_t Option_t TPoint TPoint const char mode
Option_t Option_t TPoint TPoint DrawText
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void gc
Option_t Option_t TPoint TPoint const char text
#define hi
#define gVirtualX
Definition TVirtualX.h:337
The color creation and management class.
Definition TColor.h:22
ULong_t GetPixel() const
Return pixel value corresponding to this color.
Definition TColor.cxx:1565
TGFont * GetFont(const char *font, Bool_t fixedDefault=kTRUE)
Get a font from the font pool.
Definition TGClient.cxx:357
const TGResourcePool * GetResourcePool() const
Definition TGClient.h:124
void FreeFont(const TGFont *font)
Free a font.
Definition TGClient.cxx:373
TGGCPool * GetGCPool() const
Definition TGClient.h:132
void NeedRedraw(TGWindow *w, Bool_t force=kFALSE)
Set redraw flags.
Definition TGClient.cxx:381
TGFontPool * GetFontPool() const
Definition TGClient.h:137
TGFont * GetFont(const char *font, Bool_t fixedDefault=kTRUE)
Get the specified font.
Definition TGFont.cxx:1558
void FreeFont(const TGFont *font)
Free font. If ref count is 0 delete font.
Definition TGFont.cxx:1718
Encapsulate fonts used in the GUI system.
Definition TGFont.h:140
FontStruct_t GetFontStruct() const
Definition TGFont.h:184
TGTextLayout * ComputeTextLayout(const char *string, Int_t numChars, Int_t wrapLength, Int_t justify, Int_t flags, UInt_t *width, UInt_t *height) const
Computes the amount of screen space needed to display a multi-line, justified string of text.
Definition TGFont.cxx:661
FontH_t GetFontHandle() const
Definition TGFont.h:183
A subclasses of TGWindow, and is used as base class for some simple widgets (buttons,...
Definition TGFrame.h:80
void Resize(UInt_t w=0, UInt_t h=0) override
Resize the frame.
Definition TGFrame.cxx:605
static Pixel_t GetWhitePixel()
Get white pixel value.
Definition TGFrame.cxx:709
UInt_t fHeight
frame height
Definition TGFrame.h:88
void DoRedraw() override
Redraw the frame.
Definition TGFrame.cxx:430
static const TGGC & GetHilightGC()
Get highlight color graphics context.
Definition TGFrame.cxx:755
virtual UInt_t GetOptions() const
Definition TGFrame.h:199
static const TGGC & GetShadowGC()
Get shadow color graphics context.
Definition TGFrame.cxx:765
UInt_t fWidth
frame width
Definition TGFrame.h:87
TString SaveCtorArgs(std::ostream &out, UInt_t dflt_options=kChildFrame, Bool_t check_white_pixel=kFALSE)
Return options and custom color as constructor args Used in the SavePrimitive methods,...
Definition TGFrame.cxx:2501
Encapsulate a graphics context used in the low level graphics.
Definition TGGC.h:22
This class handles GUI labels.
Definition TGLabel.h:24
Int_t fMLeft
margin left
Definition TGLabel.h:30
TClass * IsA() const override
Definition TGLabel.h:115
void SetTextJustify(Int_t tmode)
Set text justification.
Definition TGLabel.cxx:396
void Layout() override
Layout label.
Definition TGLabel.cxx:156
virtual void SetTextColor(Pixel_t color, Bool_t global=kFALSE)
Changes text color.
Definition TGLabel.cxx:362
Int_t f3DStyle
3D style (0 - normal, kRaisedFrame - raised, kSunkenFrame - sunken)
Definition TGLabel.h:35
TGLabel(const TGLabel &)=delete
Bool_t HasOwnFont() const
Returns kTRUE if text attributes are unique.
Definition TGLabel.cxx:451
virtual void DrawText(GContext_t gc, Int_t x, Int_t y)
Draw text at position (x, y).
Definition TGLabel.cxx:192
Bool_t fDisabled
if kTRUE label looks disabled (shaded text)
Definition TGLabel.h:43
~TGLabel() override
Delete label.
Definition TGLabel.cxx:134
static const TGGC * fgDefaultGC
Definition TGLabel.h:49
GContext_t fNormGC
graphics context used for drawing label
Definition TGLabel.h:39
Int_t GetTextJustify() const
Definition TGLabel.h:82
void DoRedraw() override
Redraw label widget.
Definition TGLabel.cxx:201
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save a label widget as a C++ statement(s) on output stream out.
Definition TGLabel.cxx:459
virtual void SetText(TGString *newText)
Set new text in label.
Definition TGLabel.cxx:180
static const TGGC & GetDefaultGC()
Static returning label default graphics context.
Definition TGLabel.cxx:520
Bool_t fHasOwnFont
kTRUE - font defined locally, kFALSE - globally
Definition TGLabel.h:42
UInt_t fTWidth
text width
Definition TGLabel.h:28
Int_t fMRight
margin right
Definition TGLabel.h:31
TGFont * fFont
font to draw label
Definition TGLabel.h:40
UInt_t fTHeight
text height
Definition TGLabel.h:29
Int_t fWrapLength
wrap length
Definition TGLabel.h:36
static FontStruct_t GetDefaultFontStruct()
Static returning label default font struct.
Definition TGLabel.cxx:509
Int_t fMTop
margin top
Definition TGLabel.h:32
TGDimension GetDefaultSize() const override
Return default size.
Definition TGLabel.cxx:168
Int_t fTMode
text alignment
Definition TGLabel.h:34
Bool_t fTextChanged
has text changed
Definition TGLabel.h:38
static const TGFont * fgDefaultFont
Definition TGLabel.h:48
Int_t fMBottom
margin bottom
Definition TGLabel.h:33
virtual void SetTextFont(TGFont *font, Bool_t global=kFALSE)
Changes text font specified by pointer to TGFont object.
Definition TGLabel.cxx:324
Int_t fTFlags
text flags (see TGFont.h ETextLayoutFlags)
Definition TGLabel.h:37
TGTextLayout * fTLayout
text layout
Definition TGLabel.h:41
const TGString * GetText() const
Definition TGLabel.h:74
TGString * fText
label text
Definition TGLabel.h:27
TGClient * fClient
Connection to display server.
Definition TGObject.h:25
Handle_t fId
X11/Win32 Window identifier.
Definition TGObject.h:24
TGString wraps a TString and adds some graphics routines like drawing, size of string on screen depen...
Definition TGString.h:20
Int_t GetLength() const
Definition TGString.h:29
const char * GetString() const
Definition TGString.h:30
void DrawText(Drawable_t dst, GContext_t gc, Int_t x, Int_t y, Int_t firstChar, Int_t lastChar) const
Use the information in the TGTextLayout object to display a multi-line, justified string of text.
Definition TGFont.cxx:923
ROOT GUI Window base class.
Definition TGWindow.h:23
const TGWindow * fParent
Parent window.
Definition TGWindow.h:28
virtual void SetWindowName(const char *name=nullptr)
Set window name.
Definition TGWindow.cxx:129
const char * GetName() const override
Return unique name, used in SavePrimitive methods.
Definition TGWindow.cxx:336
Basic string class.
Definition TString.h:139
TString & ReplaceSpecialCppChars()
Find special characters which are typically used in printf() calls and replace them by appropriate es...
Definition TString.cxx:1114
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
Graphics context structure.
Definition GuiTypes.h:224
Attributes that can be used when creating or changing a window.
Definition GuiTypes.h:93