Hi there,
I have a class (see below), which creates a dialog box with 5 text entry boxes,
however, I was wondering if there is a way to allow the user to Tab between
these elements, and also allow them to simply hit return to answer OK. I know
that dialogs.C allows the user to simply hit return, but there is what I based
my code on!
Any ideas
Thanks in advance
Chris Milne
class MainDialog {
///////////////////////////////////////
// this class brings up the dialog that
// requests all the calculation params
///////////////////////////////////////
private:
TGTextEntry *fTE,*fTE2,*fTE3,*fTE4,*fTE5; // text entry widget
containing
TGTransientFrame *fDialog; // transient frame, main dialog window
TGCompositeFrame *f1, *f2, *f3, *f4, *f5;
TList *fWidgets; // keep track of widgets to be deleted in dtor
char *fRetStr,*fRetStr2,*fRetStr3,*fRetStr4,*fRetStr5; // address
to store return string
public:
MainDialog( const char *prompt, const char *defval, char &date[],
const char *prompt2, const char *defval2, Int_t
&reference,
const char *prompt3, const char *defval3, Float_t
&filter,
const char *prompt4, const char *defval4, Double_t
&roughLH,
const char *prompt5, const char *defval5, Double_t
&roughHH);
~MainDialog();
void ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
};
MainDialog::~MainDialog()
{
// Cleanup dialog.
fWidgets->Delete();
delete fWidgets;
delete fTE;
delete fTE2;
delete fTE3;
delete fTE4;
delete fTE5;
delete fDialog;
}
MainDialog::MainDialog(const char *prompt, const char *defval, char &date[],
const char *prompt2, const char *defval2, Int_t
&reference,
const char *prompt3, const char *defval3, Float_t
&filter,
const char *prompt4, const char *defval4, Double_t
&roughLH,
const char *prompt5, const char *defval5, Double_t
&roughHH)
{
char *retstr;
// Create simple input dialog.
fWidgets = new TList;
TGWindow *main = gClient->GetRoot();
fDialog = new TGTransientFrame(main, main, 10, 10);
// command to be executed by buttons and text entry widget
char cmd[128];
sprintf(cmd, "{long r__ptr=0x%lx;
((MainDialog*)r__ptr)->ProcessMessage($MSG,$PARM1,$PARM2);}", (Long_t)this);
f1 = new TGCompositeFrame(fDialog, 10, 20, kHorizontalFrame);
f2 = new TGCompositeFrame(fDialog, 10, 20, kHorizontalFrame);
f3 = new TGCompositeFrame(fDialog, 10, 20, kHorizontalFrame);
f4 = new TGCompositeFrame(fDialog, 10, 20, kHorizontalFrame);
f5 = new TGCompositeFrame(fDialog, 10, 20, kHorizontalFrame);
// create prompt label and textentry widget
TGLabel *label = new TGLabel(f1, prompt);
fWidgets->Add(label);
TGLabel *label2 = new TGLabel(f2, prompt2);
fWidgets->Add(label2);
TGLabel *label3 = new TGLabel(f3, prompt3);
fWidgets->Add(label3);
TGLabel *label4 = new TGLabel(f4, prompt4);
fWidgets->Add(label4);
TGLabel *label5 = new TGLabel(f5, prompt5);
fWidgets->Add(label5);
TGTextBuffer *tbuf = new TGTextBuffer(4); //will be deleted by TGtextEntry
tbuf->AddText(0, defval);
TGTextBuffer *tbuf2 = new TGTextBuffer(10); //will be deleted by TGtextEntry
tbuf2->AddText(0, defval2);
TGTextBuffer *tbuf3 = new TGTextBuffer(10); //will be deleted by TGtextEntry
tbuf3->AddText(0, defval3);
TGTextBuffer *tbuf4 = new TGTextBuffer(10); //will be deleted by TGtextEntry
tbuf4->AddText(0, defval4);
TGTextBuffer *tbuf5 = new TGTextBuffer(10); //will be deleted by TGtextEntry
tbuf5->AddText(0, defval5);
fTE = new TGTextEntry(f1, tbuf);
fTE->Resize(60, fTE->GetDefaultHeight());
fTE->SetCommand(cmd);
fTE2 = new TGTextEntry(f2, tbuf2);
fTE2->Resize(60, fTE2->GetDefaultHeight());
fTE2->SetCommand(cmd);
fTE3 = new TGTextEntry(f3, tbuf3);
fTE3->Resize(60, fTE3->GetDefaultHeight());
fTE3->SetCommand(cmd);
fTE4 = new TGTextEntry(f4, tbuf4);
fTE4->Resize(60, fTE4->GetDefaultHeight());
fTE4->SetCommand(cmd);
fTE5 = new TGTextEntry(f5, tbuf5);
fTE5->Resize(60, fTE5->GetDefaultHeight());
fTE5->SetCommand(cmd);
TGLayoutHints *l1 = new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0);
TGLayoutHints *l2 = new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5);
fWidgets->Add(l1);
fWidgets->Add(l2);
fDialog->AddFrame(f1, l1);
f1->AddFrame(label, l1);
f1->AddFrame(fTE, l2);
fDialog->AddFrame(f2, l1);
f2->AddFrame(label2, l1);
f2->AddFrame(fTE2, l2);
fDialog->AddFrame(f3, l1);
f3->AddFrame(label3, l1);
f3->AddFrame(fTE3, l2);
fDialog->AddFrame(f4, l1);
f4->AddFrame(label4, l1);
f4->AddFrame(fTE4, l2);
fDialog->AddFrame(f5, l1);
f5->AddFrame(label5, l1);
f5->AddFrame(fTE5, l2);
// create frame and layout hints for Ok and Cancel buttons
TGHorizontalFrame *hf = new TGHorizontalFrame(fDialog, 60, 20, kFixedWidth);
TGLayoutHints *l3 = new TGLayoutHints(kLHintsCenterY | kLHintsExpandX, 5,
5, 0, 0);
// put hf as last in list to be deleted
fWidgets->Add(l3);
// create OK and Cancel buttons in their own frame (hf)
UInt_t nb = 0, width = 0, height = 0;
TGTextButton *b;
b = new TGTextButton(hf, "Ok", cmd, 1);
fWidgets->Add(b);
b->Associate(fDialog);
hf->AddFrame(b, l3);
height = b->GetDefaultHeight();
width = TMath::Max(width, b->GetDefaultWidth()); ++nb;
b = new TGTextButton(hf, "Cancel", ".q", 2);
fWidgets->Add(b);
b->Associate(fDialog);
hf->AddFrame(b, l3);
height = b->GetDefaultHeight();
width = TMath::Max(width, b->GetDefaultWidth()); ++nb;
// place button frame (hf) at the bottom
TGLayoutHints *l4 = new TGLayoutHints(kLHintsBottom | kLHintsCenterX, 0, 0,
5, 5);
fWidgets->Add(l4);
fWidgets->Add(hf);
fDialog->AddFrame(hf, l4);
// keep buttons centered and with the same width
hf->Resize((width + 20) * nb, height);
// set dialog title
fDialog->SetWindowName("Please Enter The Following Parameters");
// map all widgets and calculate size of dialog
fDialog->MapSubwindows();
width = fDialog->GetDefaultWidth();
height = fDialog->GetDefaultHeight();
fDialog->Resize(width, height);
// position relative to the parent window (which is the root window)
Window_t wdum;
int ax, ay;
gVirtualX->TranslateCoordinates(main->GetId(), main->GetId(),
(((TGFrame *) main)->GetWidth() - width) >> 1,
(((TGFrame *) main)->GetHeight() - height) >> 1,
ax, ay, wdum);
fDialog->Move(ax, ay);
fDialog->SetWMPosition(ax, ay);
// make the message box non-resizable
fDialog->SetWMSize(width, height);
fDialog->SetWMSizeHints(width, height, width, height, 0, 0);
fDialog->SetMWMHints(kMWMDecorAll | kMWMDecorResizeH | kMWMDecorMaximize |
kMWMDecorMinimize | kMWMDecorMenu,
kMWMFuncAll | kMWMFuncResize | kMWMFuncMaximize |
kMWMFuncMinimize,
kMWMInputModeless);
// popup dialog and wait till user replies
fDialog->MapWindow();
gClient->WaitFor(fDialog);
}
void MainDialog::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
// Handle button and text enter events
switch (GET_MSG(msg)) {
case kC_COMMAND:
switch (GET_SUBMSG(msg)) {
case kCM_BUTTON:
switch (parm1) {
case 1:
// here copy the string from text buffer to return
variable
sprintf(date,"%s",fTE->GetBuffer()->GetString());
reference=atoi(fTE2->GetBuffer()->GetString());
filter=atof(fTE3->GetBuffer()->GetString());
roughLH=atof(fTE4->GetBuffer()->GetString());
roughHH=atof(fTE5->GetBuffer()->GetString());
delete this;
break;
case 2:
fRetStr[0] = 0;
delete this;
break;
}
default:
break;
}
break;
case kC_TEXTENTRY:
switch (GET_SUBMSG(msg)) {
case kTE_ENTER:
// here copy the string from text buffer to return variable
sprintf(date,"%s",fTE->GetBuffer()->GetString());
reference=atoi(fTE2->GetBuffer()->GetString());
filter=atof(fTE3->GetBuffer()->GetString());
roughLH=atof(fTE4->GetBuffer()->GetString());
roughHH=atof(fTE5->GetBuffer()->GetString());
delete this;
break;
default:
break;
}
break;
default:
break;
}
}
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:59 MET