Logo ROOT  
Reference Guide
TGMsgBox.cxx
Go to the documentation of this file.
1// @(#)root/gui:$Id: d25b6f3b0b2546fe028288bd22c21588bdd1b8c1 $
2// Author: Fons Rademakers 09/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 TMsgBox
25 \ingroup guiwidgets
26
27A message dialog box.
28
29*/
30
31
32#include "TGMsgBox.h"
33#include "TGButton.h"
34#include "TGIcon.h"
35#include "TGLabel.h"
36#include "TGPicture.h"
37#include "TList.h"
38#include "KeySymbols.h"
39#include "TVirtualX.h"
40#include "strlcpy.h"
41
43
44
45////////////////////////////////////////////////////////////////////////////////
46/// Create a message dialog box.
47
49 const char *title, const char *msg, const TGPicture *icon,
50 Int_t buttons, Int_t *ret_code, UInt_t options,
51 Int_t text_align) :
52 TGTransientFrame(p, main, 10, 10, options)
53{
54 if (p)
55 PMsgBox(title, msg, icon, buttons, ret_code, text_align);
56 else
57 MakeZombie();
58}
59
60////////////////////////////////////////////////////////////////////////////////
61/// Create a message dialog box with the following parameters:.
62/// title: Window title
63/// msg: Message to be shown ('\n' may be used to split it in lines)
64/// icon: Picture to be shown at the left on the dialog window.
65/// It might take any of the following values:
66/// kMBIconStop, kMBIconQuestion,
67/// kMBIconExclamation, kMBIconAsterisk
68/// buttons: Buttons to be shown at the botton of the dialog window.
69/// Look at EMsgBoxButton for the different possible values.
70/// ret_code: It will hold the value of the button pressed when the
71/// dialog is closed
72/// options: Frame options of this dialog window.
73/// text_align: Align options for 'msg'. See ETextJustification for the values.
74
76 const char *title, const char *msg, EMsgBoxIcon icon,
77 Int_t buttons, Int_t *ret_code, UInt_t options,
78 Int_t text_align) :
79 TGTransientFrame(p, main, 10, 10, options)
80{
81 const TGPicture *icon_pic;
82
83 switch (icon) {
84 case kMBIconStop:
85 icon_pic = fClient->GetPicture("mb_stop_s.xpm");
86 if (!icon_pic) Error("TGMsgBox", "mb_stop_s.xpm not found");
87 break;
88
89 case kMBIconQuestion:
90 icon_pic = fClient->GetPicture("mb_question_s.xpm");
91 if (!icon_pic) Error("TGMsgBox", "mb_question_s.xpm not found");
92 break;
93
95 icon_pic = fClient->GetPicture("mb_exclamation_s.xpm");
96 if (!icon_pic) Error("TGMsgBox", "mb_exclamation_s.xpm not found");
97 break;
98
99 case kMBIconAsterisk:
100 icon_pic = fClient->GetPicture("mb_asterisk_s.xpm");
101 if (!icon_pic) Error("TGMsgBox", "mb_asterisk_s.xpm not found");
102 break;
103
104 default:
105 icon_pic = 0;
106 break;
107 }
108
109 if (p)
110 PMsgBox(title, msg, icon_pic, buttons, ret_code, text_align);
111 else
112 MakeZombie();
113}
114
115////////////////////////////////////////////////////////////////////////////////
116/// Protected, common message dialog box initialization.
117
118void TGMsgBox::PMsgBox(const char *title, const char *msg,
119 const TGPicture *icon, Int_t buttons, Int_t *ret_code,
120 Int_t text_align)
121{
122 UInt_t nb, width, height;
123
124 fYes = fNo = fOK = fApply = fRetry = fIgnore = fCancel = fClose =
126 fIcon = 0;
127 fMsgList = new TList;
128 fRetCode = ret_code;
129 nb = width = 0;
130
131 // create the buttons
132
133 fButtonFrame = new TGHorizontalFrame(this, 60, 20, kFixedWidth);
134 fL1 = new TGLayoutHints(kLHintsCenterY | kLHintsExpandX, 3, 3, 0, 0);
135
136 buttons &= (kMBYes | kMBNo | kMBOk | kMBApply |
139 if (buttons == 0) buttons = kMBDismiss;
140
141 if (buttons & kMBYes) {
142 fYes = new TGTextButton(fButtonFrame, new TGHotString("&Yes"), kMBYes);
143 fYes->Associate(this);
146 }
147
148 if (buttons & kMBNo) {
149 fNo = new TGTextButton(fButtonFrame, new TGHotString("&No"), kMBNo);
150 fNo->Associate(this);
153 }
154
155 if (buttons & kMBOk) {
156 fOK = new TGTextButton(fButtonFrame, new TGHotString("&OK"), kMBOk);
157 fOK->Associate(this);
160 }
161
162 if (buttons & kMBApply) {
163 fApply = new TGTextButton(fButtonFrame, new TGHotString("&Apply"), kMBApply);
164 fApply->Associate(this);
167 }
168
169 if (buttons & kMBRetry) {
170 fRetry = new TGTextButton(fButtonFrame, new TGHotString("&Retry"), kMBRetry);
171 fRetry->Associate(this);
174 }
175
176 if (buttons & kMBIgnore) {
177 fIgnore = new TGTextButton(fButtonFrame, new TGHotString("&Ignore"), kMBIgnore);
178 fIgnore->Associate(this);
181 }
182
183 if (buttons & kMBCancel) {
184 fCancel = new TGTextButton(fButtonFrame, new TGHotString("&Cancel"), kMBCancel);
185 fCancel->Associate(this);
188 }
189
190 if (buttons & kMBClose) {
191 fClose = new TGTextButton(fButtonFrame, new TGHotString("C&lose"), kMBClose);
192 fClose->Associate(this);
195 }
196
197 if (buttons & kMBYesAll) {
198 fYesAll = new TGTextButton(fButtonFrame, new TGHotString("Y&es to All"), kMBYesAll);
199 fYesAll->Associate(this);
202 }
203
204 if (buttons & kMBNoAll) {
205 fNoAll = new TGTextButton(fButtonFrame, new TGHotString("No &to All"), kMBNoAll);
206 fNoAll->Associate(this);
209 }
210
211 if (buttons & kMBNewer) {
212 fNewer = new TGTextButton(fButtonFrame, new TGHotString("Ne&wer Only"), kMBNewer);
213 fNewer->Associate(this);
216 }
217
218 if (buttons & kMBAppend) {
219 fAppend = new TGTextButton(fButtonFrame, new TGHotString("A&ppend"), kMBAppend);
220 fAppend->Associate(this);
223 }
224
225 if (buttons & kMBDismiss) {
227 fDismiss->Associate(this);
230 }
231
232 // place buttons at the bottom
233
234 fL2 = new TGLayoutHints(kLHintsBottom | kLHintsCenterX, 0, 0, 5, 5);
236
237 // keep the buttons centered and with the same width
238
239 fButtonFrame->Resize((width + 20) * nb, GetDefaultHeight());
240
241 fIconFrame = new TGHorizontalFrame(this, 60, 20);
242
243 fL3 = new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 2, 2, 2, 2);
244
245 if (icon) {
246 fIcon = new TGIcon(fIconFrame, icon, icon->GetWidth(), icon->GetHeight());
248 }
249
251
253 4, 2, 2, 2);
254 fL5 = new TGLayoutHints(kLHintsTop | kLHintsExpandX, 10, 10, 7, 2);
255
256 // make one label per line of the message
257 TGLabel *label;
258
259 char *line;
260 char *tmpMsg, *nextLine;
261
262 int len = strlen(msg) + 1;
263 tmpMsg = new char[len];
264 nextLine = tmpMsg;
265
266 line = tmpMsg;
267 strlcpy(nextLine, msg, len);
268 while ((nextLine = strchr(line, '\n'))) {
269 *nextLine = 0;
270 label = new TGLabel(fLabelFrame, line);
271 label->SetTextJustify(text_align);
272 fMsgList->Add(label);
273 fLabelFrame->AddFrame(label, fL4);
274 line = nextLine + 1;
275 }
276
277 label = new TGLabel(fLabelFrame, line);
278 label->SetTextJustify(text_align);
279 fMsgList->Add(label);
280 fLabelFrame->AddFrame(label, fL4);
281 delete [] tmpMsg;
282
285
287
289 height = GetDefaultHeight();
290
291 Resize(width, height);
293
294 // position relative to the parent's window
295
297
298 // make the message box non-resizable
299
300 SetWMSize(width, height);
301 SetWMSizeHints(width, height, width, height, 0, 0);
302
303 // set names
304
305 SetWindowName(title);
306 SetIconName(title);
307 SetClassHints("ROOT", "MsgBox");
308
314
315 MapRaised();
316 fClient->WaitFor(this);
317}
318
319////////////////////////////////////////////////////////////////////////////////
320/// Destroy message dialog box.
321
323{
324 if (IsZombie()) return;
325 if (fYes) delete fYes;
326 if (fNo) delete fNo;
327 if (fOK) delete fOK;
328 if (fApply) delete fApply;
329 if (fRetry) delete fRetry;
330 if (fIgnore) delete fIgnore;
331 if (fCancel) delete fCancel;
332 if (fClose) delete fClose;
333 if (fDismiss) delete fDismiss;
334 if (fYesAll) delete fYesAll;
335 if (fNoAll) delete fNoAll;
336 if (fNewer) delete fNewer;
337 if (fAppend) delete fAppend;
338
339 if (fIcon) delete fIcon;
340 delete fButtonFrame;
341 delete fIconFrame;
342 delete fLabelFrame;
343 fMsgList->Delete();
344 delete fMsgList;
345 delete fL1; delete fL2; delete fL3; delete fL4; delete fL5;
346}
347
348////////////////////////////////////////////////////////////////////////////////
349/// Close dialog box. Before deleting itself it sets the return code
350/// to kMBClose.
351
353{
354 if (fRetCode) *fRetCode = kMBClose;
355 DeleteWindow();
356}
357
358////////////////////////////////////////////////////////////////////////////////
359/// Process message dialog box event.
360
362{
363 switch (GET_MSG(msg)) {
364 case kC_COMMAND:
365 switch (GET_SUBMSG(msg)) {
366 case kCM_BUTTON:
367 if (fRetCode) *fRetCode = (Int_t) parm1;
368 DeleteWindow();
369 break;
370
371 default:
372 break;
373 }
374 break;
375 default:
376 break;
377 }
378 return kTRUE;
379}
380
381////////////////////////////////////////////////////////////////////////////////
382/// Handle enter and escape keys (used as Ok and Cancel for now).
383
385{
386 if (event->fType == kGKeyPress) {
387 UInt_t keysym;
388 char input[10];
389 gVirtualX->LookupString(event, input, sizeof(input), keysym);
390
391 if ((EKeySym)keysym == kKey_Escape) {
392 if (fCancel) {
394 DeleteWindow();
395 }
396 return kTRUE;
397 }
398 else if ((EKeySym)keysym == kKey_Enter || (EKeySym)keysym == kKey_Return) {
399 if (fOK) {
400 if (fRetCode) *fRetCode = (Int_t) kMBOk;
401 DeleteWindow();
402 }
403 return kTRUE;
404 }
405 }
407}
408
int Int_t
Definition: CPyCppyy.h:43
unsigned int UInt_t
Definition: CPyCppyy.h:44
long Long_t
Definition: CPyCppyy.h:50
@ kGKeyPress
Definition: GuiTypes.h:60
const Mask_t kKeyPressMask
Definition: GuiTypes.h:159
@ kFixedWidth
Definition: GuiTypes.h:387
EKeySym
Definition: KeySymbols.h:25
@ kKey_Return
Definition: KeySymbols.h:30
@ kKey_Escape
Definition: KeySymbols.h:26
@ kKey_Enter
Definition: KeySymbols.h:31
bool Bool_t
Definition: RtypesCore.h:63
const Bool_t kTRUE
Definition: RtypesCore.h:100
#define ClassImp(name)
Definition: Rtypes.h:364
include TDocParser_001 C image html pict1_TDocParser_001 png width
Definition: TDocParser.cxx:121
@ kMWMDecorResizeH
Definition: TGFrame.h:65
@ kMWMFuncAll
Definition: TGFrame.h:49
@ kMWMFuncResize
Definition: TGFrame.h:50
@ kMWMDecorMaximize
Definition: TGFrame.h:69
@ kMWMDecorMinimize
Definition: TGFrame.h:68
@ kMWMDecorMenu
Definition: TGFrame.h:67
@ kMWMDecorAll
Definition: TGFrame.h:63
@ kMWMFuncMaximize
Definition: TGFrame.h:53
@ kMWMInputModeless
Definition: TGFrame.h:57
@ kMWMFuncMinimize
Definition: TGFrame.h:52
@ kLHintsLeft
Definition: TGLayout.h:24
@ kLHintsCenterY
Definition: TGLayout.h:28
@ kLHintsCenterX
Definition: TGLayout.h:25
@ kLHintsBottom
Definition: TGLayout.h:29
@ kLHintsTop
Definition: TGLayout.h:27
@ kLHintsExpandX
Definition: TGLayout.h:30
@ kMBNo
Definition: TGMsgBox.h:32
@ kMBIgnore
Definition: TGMsgBox.h:36
@ kMBApply
Definition: TGMsgBox.h:34
@ kMBNoAll
Definition: TGMsgBox.h:41
@ kMBClose
Definition: TGMsgBox.h:38
@ kMBYes
Definition: TGMsgBox.h:31
@ kMBAppend
Definition: TGMsgBox.h:42
@ kMBRetry
Definition: TGMsgBox.h:35
@ kMBCancel
Definition: TGMsgBox.h:37
@ kMBOk
Definition: TGMsgBox.h:33
@ kMBYesAll
Definition: TGMsgBox.h:40
@ kMBNewer
Definition: TGMsgBox.h:43
@ kMBDismiss
Definition: TGMsgBox.h:39
EMsgBoxIcon
Definition: TGMsgBox.h:21
@ kMBIconExclamation
Definition: TGMsgBox.h:24
@ kMBIconAsterisk
Definition: TGMsgBox.h:25
@ kMBIconStop
Definition: TGMsgBox.h:22
@ kMBIconQuestion
Definition: TGMsgBox.h:23
#define gVirtualX
Definition: TVirtualX.h:338
Int_t GET_MSG(Long_t val)
@ kC_COMMAND
@ kCM_BUTTON
Int_t GET_SUBMSG(Long_t val)
void WaitFor(TGWindow *w)
Wait for window to be destroyed.
Definition: TGClient.cxx:711
const TGPicture * GetPicture(const char *name)
Get picture from the picture pool.
Definition: TGClient.cxx:291
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=0)
Add frame to the composite frame using the specified layout hints.
Definition: TGFrame.cxx:1117
virtual UInt_t GetDefaultWidth() const
Definition: TGFrame.h:312
virtual void MapSubwindows()
Map all sub windows that are part of the composite frame.
Definition: TGFrame.cxx:1164
virtual UInt_t GetDefaultHeight() const
Definition: TGFrame.h:314
void AddInput(UInt_t emask)
Add events specified in the emask to the events the frame should handle.
Definition: TGFrame.cxx:339
virtual void MapRaised()
map raised
Definition: TGFrame.h:205
virtual UInt_t GetDefaultWidth() const
Definition: TGFrame.h:190
virtual void DeleteWindow()
Delete window.
Definition: TGFrame.cxx:276
virtual void Resize(UInt_t w=0, UInt_t h=0)
Resize the frame.
Definition: TGFrame.cxx:605
A composite frame that layout their children in horizontal way.
Definition: TGFrame.h:386
TGHotString is a string with a "hot" character underlined.
Definition: TGString.h:42
This class handles GUI icons.
Definition: TGIcon.h:22
This class handles GUI labels.
Definition: TGLabel.h:24
void SetTextJustify(Int_t tmode)
Set text justification.
Definition: TGLabel.cxx:396
This class describes layout hints used by the layout classes.
Definition: TGLayout.h:50
void SetClassHints(const char *className, const char *resourceName)
Set the windows class and resource name.
Definition: TGFrame.cxx:1838
void SetIconName(const char *name)
Set window icon name. This is typically done via the window manager.
Definition: TGFrame.cxx:1783
virtual Bool_t HandleKey(Event_t *event)
Handle keyboard events.
Definition: TGFrame.cxx:1588
void SetWMSize(UInt_t w, UInt_t h)
Give the window manager a window size hint.
Definition: TGFrame.cxx:1873
void SetMWMHints(UInt_t value, UInt_t funcs, UInt_t input)
Set decoration style for MWM-compatible wm (mwm, ncdwm, fvwm?).
Definition: TGFrame.cxx:1848
void SetWMSizeHints(UInt_t wmin, UInt_t hmin, UInt_t wmax, UInt_t hmax, UInt_t winc, UInt_t hinc)
Give the window manager minimum and maximum size hints.
Definition: TGFrame.cxx:1886
void SetWindowName(const char *name=0)
Set window name. This is typically done via the window manager.
Definition: TGFrame.cxx:1770
TGButton * fNoAll
buttons in dialog box
Definition: TGMsgBox.h:57
TGButton * fYes
Definition: TGMsgBox.h:55
TGButton * fOK
Definition: TGMsgBox.h:55
TGLayoutHints * fL5
layout hints
Definition: TGMsgBox.h:63
TGLayoutHints * fL2
Definition: TGMsgBox.h:63
TGLayoutHints * fL1
Definition: TGMsgBox.h:63
virtual Bool_t HandleKey(Event_t *event)
Handle enter and escape keys (used as Ok and Cancel for now).
Definition: TGMsgBox.cxx:384
TList * fMsgList
text (list of TGLabels)
Definition: TGMsgBox.h:64
TGButton * fYesAll
Definition: TGMsgBox.h:57
TGHorizontalFrame * fIconFrame
frame containing icon and text
Definition: TGMsgBox.h:61
virtual ~TGMsgBox()
Destroy message dialog box.
Definition: TGMsgBox.cxx:322
void PMsgBox(const char *title, const char *msg, const TGPicture *icon, Int_t buttons, Int_t *ret_code, Int_t text_align)
Protected, common message dialog box initialization.
Definition: TGMsgBox.cxx:118
TGVerticalFrame * fLabelFrame
frame containing text
Definition: TGMsgBox.h:62
TGMsgBox(const TGMsgBox &)=delete
TGButton * fNo
Definition: TGMsgBox.h:55
TGLayoutHints * fL3
Definition: TGMsgBox.h:63
virtual void CloseWindow()
Close dialog box.
Definition: TGMsgBox.cxx:352
TGButton * fAppend
Definition: TGMsgBox.h:58
TGButton * fRetry
Definition: TGMsgBox.h:56
TGHorizontalFrame * fButtonFrame
frame containing buttons
Definition: TGMsgBox.h:60
TGButton * fIgnore
Definition: TGMsgBox.h:56
TGButton * fDismiss
buttons in dialog box
Definition: TGMsgBox.h:58
TGButton * fCancel
buttons in dialog box
Definition: TGMsgBox.h:56
virtual Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
Process message dialog box event.
Definition: TGMsgBox.cxx:361
TGIcon * fIcon
icon
Definition: TGMsgBox.h:59
TGLayoutHints * fL4
Definition: TGMsgBox.h:63
TGButton * fClose
Definition: TGMsgBox.h:57
TGButton * fNewer
Definition: TGMsgBox.h:58
Int_t * fRetCode
address to store return code
Definition: TGMsgBox.h:65
TGButton * fApply
buttons in dialog box
Definition: TGMsgBox.h:55
TGClient * fClient
Connection to display server.
Definition: TGObject.h:27
The TGPicture class implements pictures and icons used in the different GUI elements and widgets.
Definition: TGPicture.h:25
UInt_t GetHeight() const
Definition: TGPicture.h:53
UInt_t GetWidth() const
Definition: TGPicture.h:52
Yield an action as soon as it is clicked.
Definition: TGButton.h:142
Defines transient windows that typically are used for dialogs windows.
Definition: TGFrame.h:498
virtual void CenterOnParent(Bool_t croot=kTRUE, EPlacement pos=kCenter)
Position transient frame centered relative to the parent frame.
Definition: TGFrame.cxx:1937
A composite frame that layout their children in vertical way.
Definition: TGFrame.h:375
virtual void Associate(const TGWindow *w)
Definition: TGWidget.h:72
ROOT GUI Window base class.
Definition: TGWindow.h:23
A doubly linked list.
Definition: TList.h:44
virtual void Add(TObject *obj)
Definition: TList.h:87
virtual void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
Definition: TList.cxx:470
R__ALWAYS_INLINE Bool_t IsZombie() const
Definition: TObject.h:149
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:893
void MakeZombie()
Definition: TObject.h:49
TLine * line
int main()
Short_t Max(Short_t a, Short_t b)
Definition: TMathBase.h:212
Event structure.
Definition: GuiTypes.h:174