XGpref

//*-- Author :   Joel Snow  2001/01/31
// Extracted from XGwdgt.cxx 2001/01/31 jms 
// latest Modification: 2002/08/06 - jms

// $Author: snow $
// $Date: 2002/08/25 17:16:48 $
// $Id: XGpref.cpp.html,v 1.11 2002/08/25 17:16:48 snow Exp $

#include <iostream>
#include <TSystem.h>
#ifdef NO_SRT
#include "XGpref.hpp"
#else
#include "root_gui/XGpref.hpp"
#endif

static char *rcsid = "@(#) $Id: XGpref.cpp.html,v 1.11 2002/08/25 17:16:48 snow Exp $";

enum E_TABS {ETAB, DTAB, TTAB};
static const int nrshells = 3;
static const char *rshell[nrshells] = {"rsh", "ssh", "d0ssh"};
enum E_WIDS {OK, CAN, RSS, RSH, EXAM, SADR, SPORT, RCP,
	     HGX, HGY, CSX, CSY, PER, FBUT, AWRN, CMB,
	     STO, KTO, GTO, CTO};

ClassImpQ(PrefDialog)

//____________________________________________________________________________
//
// PrefDialog
//
// Preferences Dialog Window
//____________________________________________________________________________

PrefDialog::PrefDialog(const TGWindow *p, const TGWindow *main, prefs *prefs,
		       std::vector<Examine*> **exlist, UInt_t w, UInt_t h,
		       UInt_t options)
          : TGTransientFrame(p, main, w, h, options)
{
   // Create a dialog window. A dialog window pops up with respect to its
   // "main" window.

  parent = (XgooeyMainFrame *)main;
  lprefs = *prefs;
  Xprefs = prefs;
  int nexamine = (*exlist)->size() - 1; //last examine is registry entry
  lexlist = new std::vector<Examine*>(nexamine);
  for (int i=0; i<nexamine; i++) {
    (*lexlist)[i] = new Examine(*((**exlist)[i]));
//      cout << (*lexlist)[i]->GetName() << endl;
  }
  tabWidgets = new TList();
  Exlist = exlist;
  focus = 0;
  GCValues_t gval;
  GContext_t bold, norm;
  FontStruct_t boldfs, normfs;
  gval.fMask = kGCFont;
  boldfs = gClient->GetFontByName(xgClient->getBoldFont());
  normfs = gClient->GetFontByName(xgClient->getNormFont());
  gval.fFont = gVirtualX->GetFontHandle(boldfs);
  bold = gVirtualX->CreateGC(GetId(), &gval);
  gval.fMask = kGCFont;
  gval.fFont = gVirtualX->GetFontHandle(normfs);
  norm = gVirtualX->CreateGC(GetId(), &gval);

  ULong_t fbkgnd, fbkgnd1, fbkgnd2, fbkgnd3;
  if (!gClient->GetColorByName("#ff88ff", fbkgnd)) {
    gClient->GetColorByName("grey", fbkgnd);
  }
  if (!gClient->GetColorByName("light blue", fbkgnd1)) {
    gClient->GetColorByName("grey", fbkgnd1);
  }
  if (!gClient->GetColorByName("#ccffff", fbkgnd2)) {
    gClient->GetColorByName("grey", fbkgnd2);
  }
  if (!gClient->GetColorByName("#ccccff", fbkgnd3)) {
    gClient->GetColorByName("grey", fbkgnd3);
  }
  SetBackgroundColor(fbkgnd);
  fFrame1 = new TGHorizontalFrame(this, 60, 20, kFixedWidth);

//    fOkButton = new TGTextButton(fFrame1, "&Ok", 1);
  fOkButton = new LiveButton(fFrame1, "&Ok","light green", OK, 0, kTRUE);
  fOkButton->Associate(this);
//    fCancelButton = new TGTextButton(fFrame1, "&Cancel", 2);
  fCancelButton = new LiveButton(fFrame1, "&Cancel", "#ff6666", CAN, 0, kTRUE);
  fCancelButton->Associate(this);

  fL1 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
			  2, 2, 2, 2);
  fL2 = new TGLayoutHints(kLHintsBottom | kLHintsRight, 2, 2, 2, 1);

  fFrame1->AddFrame(fOkButton, fL1);
  fFrame1->AddFrame(fCancelButton, fL1);
  fFrame1->SetBackgroundColor(fbkgnd);

  fFrame1->Resize(150, fOkButton->GetDefaultHeight());
  AddFrame(fFrame1, fL2);

  //--------- create Tab widget and some composite frames

  fTab = new TGTab(this, 300, 300, norm, normfs);
  fTab->SetBackgroundColor(fbkgnd);
  fL3 = new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5);
  fL4 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5,5, 5,0);
  fL5 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5,5, 0,5);
  fLgrp = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0,0, 0,2);
  fLgrpx = new TGLayoutHints(kLHintsTop | kLHintsLeft |
					    kLHintsExpandX, 0,0, 0,2);
  fLlf = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0,5, 5,5);
  fLto = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0,2,3,0);
  fL6 = new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0);
  fL7 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5,5, 5,5);
  fL8 = new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 0, 5);

  char tmp[64];
  strncpy(tmp,rcsid,63);

  EtabList = new TList();
  //--- tab Examine
  tf = fTab->AddTab(new TGHotString("&Examine"));
  tf->SetBackgroundColor(fbkgnd2);
  TGTabElement *tabex = fTab->GetTabTab(0);
  tabex->ChangeBackground(fbkgnd2);
  rsLabel = new TGLabel(tf, new TGHotString("&Remote Start Script:"), norm, normfs);
  rsLabel->SetBackgroundColor(fbkgnd2);
  tf->AddFrame(rsLabel, fL6);
  TGTextBuffer *tbuf5 = new TGTextBuffer(128);
  tbuf5->AddText(0, lprefs.exstart.Data());
  tentrs = new XGTextEntry(tf, tbuf5, RSS, norm, normfs);
  tentrs->Resize(175, tentrs->GetDefaultHeight());
  tf->AddFrame(tentrs, fL5);
  EtabList->Add(tentrs);
  rcmdLabel = new TGLabel(tf, new TGHotString("Re&mote Shell:"), norm, normfs);
  rcmdLabel->SetBackgroundColor(fbkgnd2);
  tf->AddFrame(rcmdLabel, fL6);
  frcmdComboBox = new XGComboBox(tf, RSH);
  frcmdComboBox->Associate(this);
  EtabList->Add(frcmdComboBox);
  for (int i = 0; i<nrshells; i++) {
    frcmdComboBox->AddEntry(rshell[i], i);
    if (lprefs.Rcmd.CompareTo(rshell[i]) == 0)
      frcmdComboBox->Select(i);
  }
  frcmdComboBox->Resize(60, 20);
  tf->AddFrame(frcmdComboBox, fL8);

  fF6 = new TGGroupFrame(tf, new TGHotString("E&xamine"),
			 kVerticalFrame, norm, normfs);
  fF6->SetBackgroundColor(fbkgnd2);

  exSelected = 0;
  fexComboBox = new XGComboBox(fF6, EXAM);
  fexComboBox->Associate(this);
  EtabList->Add(fexComboBox);
  for (unsigned int i = 0; i < lexlist->size(); i++) {
    fexComboBox->AddEntry(((*lexlist)[i])->GetFName().Data(), i);
    if ((*lexlist)[i]->GetName() == lprefs.currEx->GetName()) exSelected = i;
  }
  fexComboBox->AddEntry("Registry", lexlist->size());
  fexComboBox->Select(exSelected);
  fexComboBox->Resize(100, 20);

  fF6->AddFrame(fexComboBox, fLgrp);

  saLabel = new TGLabel(fF6, new TGHotString("&Server Address:"), norm, normfs);
  saLabel->SetBackgroundColor(fbkgnd2);
  fF6->AddFrame(saLabel, fLgrp);
  TGTextBuffer *tbuf2 = new TGTextBuffer(64);
  tbuf2->AddText(0, lprefs.currEx->GetHost());
  tentsa = new XGTextEntry(fF6, tbuf2, SADR, norm, normfs);
  tentsa->Resize(150, tentsa->GetDefaultHeight());
  fF6->AddFrame(tentsa, fLgrp);
  EtabList->Add(tentsa);

  spLabel = new TGLabel(fF6, new TGHotString("Server &Port:"), norm, normfs);
  spLabel->SetBackgroundColor(fbkgnd2);
  fF6->AddFrame(spLabel, fLgrp);
  TGTextBuffer *tbuf3 = new TGTextBuffer(10);
  sprintf(tmp, "%d", lprefs.currEx->GetPort());
  tbuf3->AddText(0, tmp);
  tentsp = new XGTextEntry(fF6, tbuf3, SPORT, norm, normfs);
  tentsp->Resize(60, tentsp->GetDefaultHeight());
  fF6->AddFrame(tentsp, fLgrp);
  EtabList->Add(tentsp);

  rcpLabel = new TGLabel(fF6, new TGHotString("RCP &File:"), norm, normfs);
  rcpLabel->SetBackgroundColor(fbkgnd2);
  fF6->AddFrame(rcpLabel, fLgrp);
  TGTextBuffer *tbuf4 = new TGTextBuffer(64);
  tbuf4->AddText(0, lprefs.currEx->GetRCP());
  tentrcp = new XGTextEntry(fF6, tbuf4, RCP, norm, normfs);
  tentrcp->Resize(175, tentrcp->GetDefaultHeight());
  fF6->AddFrame(tentrcp, fLgrpx);
  EtabList->Add(tentrcp);

  fF6->Resize(fF6->GetDefaultSize());
//    tf->AddFrame(fF6, fL3);
  tf->AddFrame(fF6, fL7);
  tabWidgets->Add(EtabList);

  DtabList = new TList();
  //--- tab Display
  tf = fTab->AddTab(new TGHotString("&Display"));
  tf->SetBackgroundColor(fbkgnd1);
  TGTabElement *tabdi = fTab->GetTabTab(1);
  tabdi->ChangeBackground(fbkgnd1);
  fF4 = new TGCompositeFrame(tf, 60, 20, kVerticalFrame);
  fF4->SetBackgroundColor(fbkgnd1);
  fgridFrame = new TGGroupFrame(fF4, "Histogram Grid", kVerticalFrame,
				norm, normfs);
  fgridFrame->SetLayoutManager(new TGHorizontalLayout(fgridFrame));
  fgridFrame->SetBackgroundColor(fbkgnd1);
  fxLabel = new TGLabel(fgridFrame, new TGHotString("&X:"), norm, normfs);
  fyLabel = new TGLabel(fgridFrame, new TGHotString("&Y:"), norm, normfs);
  fxLabel->SetBackgroundColor(fbkgnd1);
  fyLabel->SetBackgroundColor(fbkgnd1);
  fgridFrame->AddFrame(fxLabel, fL6);
  fxCombo = new XGComboBox(fgridFrame, HGX);
  fxCombo->Associate(this);
  fgridFrame->AddFrame(fxCombo, fL6);
  fgridFrame->AddFrame(fyLabel, fL6);
  fyCombo = new XGComboBox(fgridFrame, HGY);
  fyCombo->Associate(this);
  fgridFrame->AddFrame(fyCombo, fL6);
  DtabList->Add(fxCombo);
  DtabList->Add(fyCombo);
  fF4->AddFrame(fgridFrame, fL4);

  fsizeFrame = new TGGroupFrame(fF4, "Canvas Size", kHorizontalFrame,
				norm, normfs);
  fsizeFrame->SetLayoutManager(new TGHorizontalLayout(fsizeFrame));
  fsizeFrame->SetBackgroundColor(fbkgnd1);
  TGTextBuffer *tbuf0 = new TGTextBuffer(10);
  sprintf(tmp, "%d", lprefs.hcx);
  tbuf0->AddText(0, tmp);
  tsizex = new XGTextEntry(fsizeFrame, tbuf0, CSX, norm, normfs);
  tsizex->Resize(60, tsizex->GetDefaultHeight());
  fsizeFrame->AddFrame(tsizex, fLto);
  DtabList->Add(tsizex);
  fsizeLabel = new TGLabel(fsizeFrame, new TGHotString("&by"), norm, normfs);
  fsizeLabel->SetBackgroundColor(fbkgnd1);
  fsizeFrame->AddFrame(fsizeLabel, fLto);
  TGTextBuffer *tbuf9 = new TGTextBuffer(10);
  sprintf(tmp, "%d", lprefs.hcy);
  tbuf9->AddText(0, tmp);
  tsizey = new XGTextEntry(fsizeFrame, tbuf9, CSY, norm, normfs);
  tsizey->Resize(60, tsizey->GetDefaultHeight());
  fsizeFrame->AddFrame(tsizey, fLto);
  DtabList->Add(tsizey);
  fpixLabel = new TGLabel(fsizeFrame, new TGHotString("pixe&ls"), norm, normfs);
  fpixLabel->SetBackgroundColor(fbkgnd1);
  fsizeFrame->AddFrame(fpixLabel, fLto);
  fF4->AddFrame(fsizeFrame, fL4);

  fdelayFrame = new TGCompositeFrame(fF4, 0, 0);
  fdelayFrame->SetLayoutManager(new TGHorizontalLayout(fdelayFrame));
  fdelayFrame->SetBackgroundColor(fbkgnd1);
  fdelayLabel = new TGLabel(fdelayFrame,
			    new TGHotString("Cycle/Update &Period (s):"),
			    norm, normfs);
  fdelayLabel->SetBackgroundColor(fbkgnd1);
  fdelayFrame->AddFrame(fdelayLabel, fLlf);
  TGTextBuffer *tbuf = new TGTextBuffer(10);
  sprintf(tmp, "%4.1f", (float)(lprefs.Delay)/1000.);
  tbuf->AddText(0, tmp);
  tent = new XGTextEntry(fdelayFrame, tbuf, PER, norm, normfs);
  tent->Resize(40, tent->GetDefaultHeight());
  fdelayFrame->AddFrame(tent, fLlf);
  DtabList->Add(tent);
  fF4->AddFrame(fdelayFrame, fL3);
  fChk1 = new TGCheckButton(fF4, "&Flashable Buttons", FBUT, norm, normfs);
  fChk1->SetBackgroundColor(fbkgnd1);
  fChk1->Associate(this);
  if (lprefs.Flashable) {
    fChk1->SetState(kButtonDown);
  } else {
    fChk1->SetState(kButtonUp);
  }
  fChk1in = fChk1->GetState();
  fF4->AddFrame(fChk1, fL1);
  DtabList->Add(fChk1);
  fChk2 = new TGCheckButton(fF4, "&Audible Warnings", AWRN, norm, normfs);
  fChk2->Associate(this);
  fChk2->SetBackgroundColor(fbkgnd1);
  if (lprefs.bellEnabled) {
    fChk2->SetState(kButtonDown);
  } else {
    fChk2->SetState(kButtonUp);
  }
  fChk2in = fChk2->GetState();
  fF4->AddFrame(fChk2, fL1);
  DtabList->Add(fChk2);
  fChk3 = new TGCheckButton(fF4, "Canvas &Menu Bar", CMB, norm, normfs);
  fChk3->Associate(this);
  fChk3->SetBackgroundColor(fbkgnd1);
  if (lprefs.mbflag > 0) {
    fChk3->SetState(kButtonDown);
  } else {
    fChk3->SetState(kButtonUp);
  }
  fChk3in = fChk3->GetState();
  fF4->AddFrame(fChk3, fL1);
  DtabList->Add(fChk3);
  tf->AddFrame(fF4, fL3);
  tabWidgets->Add(DtabList);

  fFirstEntry = 0;
  fLastEntry  = 6;
  for (int i = fFirstEntry; i < fLastEntry; ++i) {
    sprintf(tmp, "%i", i+1);
    fxCombo->AddEntry(tmp, i);
    fyCombo->AddEntry(tmp, i);
  }
  fxCombo->Select(lprefs.nXh-1);
  fxCombo->Resize(40, 20);
  fyCombo->Select(lprefs.nYh-1);
  fyCombo->Resize(40, 20);

  TtabList = new TList();
  //--- tab Time Outs
  tf = fTab->AddTab(new TGHotString("&Time Outs"));
  tf->SetBackgroundColor(fbkgnd3);
  TGTabElement *tabto = fTab->GetTabTab(2);
  tabto->ChangeBackground(fbkgnd3);
  fF2 = new TGCompositeFrame(tf, 60, 20, kVerticalFrame);
  fF2->SetBackgroundColor(fbkgnd3);
  ftoFrame = new TGGroupFrame(fF2, "Time Outs In Seconds",
			      kVerticalFrame, norm, normfs);
  ftoFrame->SetLayoutManager(new TGHorizontalLayout(ftoFrame));
  ftoFrame->SetBackgroundColor(fbkgnd3);
  ftoFrame1 = new TGCompositeFrame(fF2, 0, 0);
  ftoFrame1->SetLayoutManager(new TGVerticalLayout(ftoFrame1));
  ftoFrame1->SetBackgroundColor(fbkgnd3);
  ftoLabel1 = new TGLabel(ftoFrame1, new TGHotString("&Start Up Wait:"), norm, normfs);
  ftoLabel1->SetBackgroundColor(fbkgnd3);
  ftoFrame1->AddFrame(ftoLabel1, fLlf);
  ftoLabel2 = new TGLabel(ftoFrame1, new TGHotString("&Key Wait:"), norm, normfs);
  ftoLabel2->SetBackgroundColor(fbkgnd3);
  ftoFrame1->AddFrame(ftoLabel2, fLlf);
  ftoLabel3 = new TGLabel(ftoFrame1, new TGHotString("&Go Wait:"), norm, normfs);
  ftoLabel3->SetBackgroundColor(fbkgnd3);
  ftoFrame1->AddFrame(ftoLabel3, fLlf);
  ftoLabel4 = new TGLabel(ftoFrame1, new TGHotString("C&ategory Wait:"), norm, normfs);
  ftoLabel4->SetBackgroundColor(fbkgnd3);
  ftoFrame1->AddFrame(ftoLabel4, fLlf);
  ftoFrame->AddFrame(ftoFrame1, fL3);

  ftoFrame2 = new TGCompositeFrame(fF2, 0, 0);
  ftoFrame2->SetLayoutManager(new TGVerticalLayout(ftoFrame2));
  ftoFrame2->SetBackgroundColor(fbkgnd3);
  TGTextBuffer *tbuf1 = new TGTextBuffer(10);
  sprintf(tmp, "%3.1f", (float)(lprefs.WSstart)/1000.);
  tbuf1->AddText(0, tmp);
  tentto1 = new XGTextEntry(ftoFrame2, tbuf1, STO, norm, normfs);
  tentto1->Resize(40, tentto1->GetDefaultHeight());
  ftoFrame2->AddFrame(tentto1, fLto);
  TtabList->Add(tentto1);
  TGTextBuffer *tbuf6 = new TGTextBuffer(10);
  sprintf(tmp, "%3.1f", (float)(lprefs.WSkey)/1000.);
  tbuf6->AddText(0, tmp);
  tentto2 = new XGTextEntry(ftoFrame2, tbuf6, KTO, norm, normfs);
  tentto2->Resize(40, tentto2->GetDefaultHeight());
  ftoFrame2->AddFrame(tentto2, fLto);
  TtabList->Add(tentto2);
  TGTextBuffer *tbuf7 = new TGTextBuffer(10);
  sprintf(tmp, "%3.1f", (float)(lprefs.WSgomsg)/1000.);
  tbuf7->AddText(0, tmp);
  tentto3 = new XGTextEntry(ftoFrame2, tbuf7, GTO, norm, normfs);
  tentto3->Resize(40, tentto3->GetDefaultHeight());
  ftoFrame2->AddFrame(tentto3, fLto);
  TtabList->Add(tentto3);
  TGTextBuffer *tbuf8 = new TGTextBuffer(10);
  sprintf(tmp, "%3.1f", (float)(lprefs.WShists)/1000.);
  tbuf8->AddText(0, tmp);
  tentto4 = new XGTextEntry(ftoFrame2, tbuf8, CTO, norm, normfs);
  tentto4->Resize(40, tentto4->GetDefaultHeight());
  ftoFrame2->AddFrame(tentto4, fLto);
  TtabList->Add(tentto4);
  ftoFrame->AddFrame(ftoFrame2, fL7);
  tabWidgets->Add(TtabList);

  fF2->AddFrame(ftoFrame, fL5);
  tf->AddFrame(fF2, fL7);

  //--- end of last tab

  fL9 = new TGLayoutHints(kLHintsBottom | kLHintsExpandX |
                                          kLHintsExpandY, 2, 2, 5, 1);
  AddFrame(fTab, fL9);

  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('a'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('b'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('d'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('e'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('f'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('g'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('k'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('l'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('p'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('r'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('s'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('t'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('x'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('y'), kKeyMod1Mask);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode('i'), kKeyControlMask);  
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode(kKey_Escape), 0);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode(kKey_Enter), 0);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode(kKey_Return), 0);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode(kKey_Tab), 0);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode(kKey_Up), 0);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode(kKey_Down), 0);
  BindKey(gClient->GetRoot(), gVirtualX->KeysymToKeycode(kKey_Space), 0);

  TQObject::Connect("XGTextEntry", "Clicked(Long_t)", "PrefDialog", this,
		  "setFocus(Long_t)");
  MapSubwindows();
  Resize(GetDefaultSize());

  // position relative to the parent's window
  Window_t wdum;
  int ax, ay;
  gVirtualX->TranslateCoordinates(main->GetId(), GetParent()->GetId(),
			     (((TGFrame *) main)->GetWidth() - fWidth) >> 1,
			     (((TGFrame *) main)->GetHeight() - fHeight) >> 1,
			     ax, ay, wdum);
  Move(ax, ay);

  SetWindowName("ECP Preferences");

  MapWindow();
}

PrefDialog::~PrefDialog()
{
//  cout << "PrefDialog::~PrefDialog" << endl;
  // Delete Pref dialog widgets etc.

  EtabList->Clear();
  DtabList->Clear();
  TtabList->Clear();
  tabWidgets->Clear();

  delete fL9; delete tentto4; delete tentto3; delete tentto2; delete tentto1;
  delete ftoFrame2; delete ftoLabel4; delete ftoLabel3; delete ftoLabel2;
  delete ftoLabel1; delete ftoFrame1; delete ftoFrame; delete fF2;
  delete TtabList; delete fChk3; delete fChk2; delete fChk1; delete tent;
  delete fdelayLabel;
  delete fdelayFrame; delete fpixLabel; delete tsizey; delete fsizeLabel;
  delete tsizex; delete fsizeFrame; delete fyCombo; delete fxCombo;
  delete fyLabel; delete fxLabel; delete fgridFrame; delete fF4;
  delete DtabList; delete tentrcp; delete rcpLabel; delete tentsp;
  delete spLabel; delete fexComboBox; delete fF6; delete frcmdComboBox;
  delete rcmdLabel; delete tentrs; delete rsLabel; delete tentsa;
  delete saLabel; delete EtabList; delete fL8; delete fL7; delete fL6;
  delete fLto; delete fLlf; delete fLgrpx; delete fLgrp; delete fL5;
  delete fL4; delete fL3; delete fTab; delete fL2; delete fL1;
  delete fCancelButton; delete fOkButton; delete fFrame1; delete tabWidgets;
  delete lexlist;

}

void PrefDialog::CloseWindow()
{
  // Called when window is closed via the window manager.
  TQObject::Disconnect("XGTextEntry", "Clicked(Long_t)", this,
		       "setFocus(Long_t)");
  parent->pdiaDestroy();
  delete this;
}

Bool_t PrefDialog::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
  // Process messages coming from widgets associated with the dialog.

//    cout << "prefDialog::ProcessMessage: " << GET_MSG(msg) << ","
//         << GET_SUBMSG(msg) << endl;
//    cout << "parm1 = " << parm1 << "," << "parm2 = " << parm2 << endl;

  switch (GET_MSG(msg)) {
  case kC_COMMAND:

    switch (GET_SUBMSG(msg)) {
    case kCM_BUTTON:
      switch(parm1) {
      case OK: {  //OK
//  	printf("x: %d y: %d delay: %sn", fxCombo->GetSelected(), fyCombo->GetSelected(), tent->GetBuffer()->GetString());
	Bool_t good = kTRUE;
	Int_t ax,ay;
	UInt_t root_w,root_h;
	gVirtualX->GetWindowSize(gClient->GetRoot()->GetId(), ax, ay,
				 root_w, root_h);
	int w = atoi(tsizex->GetBuffer()->GetString());
	int h = atoi(tsizey->GetBuffer()->GetString());
	if (w > 0 && h > 0) {
	  if (w > (int)root_w) w = (int)root_w;
	  if (h > (int)root_h) h = (int)root_h;
	  lprefs.hcx = w;
	  lprefs.hcy = h;
	} else
	  good = kFALSE;
	float p = 1000.*atof(tent->GetBuffer()->GetString());
	if (p > 0) lprefs.Delay = int(p);
	else good = kFALSE;

	lprefs.nXh = fxCombo->GetSelected()+1;
	lprefs.nYh = fyCombo->GetSelected()+1;
	p = 1000.*atof(tentto1->GetBuffer()->GetString());
	if (p > 0) lprefs.WSstart = int(p);
	else good = kFALSE;
	p = 1000.*atof(tentto2->GetBuffer()->GetString());
	if (p > 0) lprefs.WSkey = int(p);
	else good = kFALSE;
	p = 1000.*atof(tentto3->GetBuffer()->GetString());
	if (p > 0) lprefs.WSgomsg = int(p);
	else good = kFALSE;
	p = 1000.*atof(tentto4->GetBuffer()->GetString());
	if (p > 0) lprefs.WShists = int(p);
	else good = kFALSE;

	w = atoi(tentsp->GetBuffer()->GetString());
	if (w <= 0) good = kFALSE;
	if (!good) {
	  parent->MsgOut("Bad data in numerical input field!",
			 MO_STDOUT | MO_POPUP, kTRUE);
	  break;
	}
  // change localhost to hostname
	TString sastring = TString(tentsa->GetBuffer()->GetString());
	if (sastring.CompareTo("localhost", TString::kIgnoreCase) == 0)
	  sastring = gSystem->HostName();
	if ((unsigned int)exSelected != lexlist->size()) {
	  Examine* ex = (*lexlist)[exSelected];
	  ex->SetPort(w);
	  ex->SetRCP(tentrcp->GetBuffer()->GetString());
	  ex->SetHost(sastring.Data());
        } else {
	  lprefs.Registrar = sastring;
	  lprefs.RegPort = w;
	}
	lprefs.Rcmd = rshell[frcmdComboBox->GetSelected()];
	lprefs.exstart = tentrs->GetBuffer()->GetString();
	Bool_t oldFlashState = lprefs.Flashable;
	if (fChk1->GetState() != fChk1in) {
	  oldFlashState = lprefs.Flashable;
	  if (fChk1->GetState() == kButtonUp)
	    lprefs.Flashable = kFALSE;
	  else
	    lprefs.Flashable = kTRUE;
	}
	if (fChk2->GetState() != fChk2in) {
	  if (fChk2->GetState() == kButtonUp)
	    lprefs.bellEnabled = kFALSE;
	  else
	    lprefs.bellEnabled = kTRUE;
	}
	if (fChk3->GetState() != fChk3in) {
	  if (fChk3->GetState() == kButtonUp)
	    lprefs.mbflag = -1;
	  else
	    lprefs.mbflag = 1;
	}
	*Xprefs = lprefs;
	int nexamine = lexlist->size();
	for (int i=0; i<nexamine; i++) {
	  *((**Exlist)[i]) = *((*lexlist)[i]);
	}
	parent->SetPrefs(oldFlashState);
	CloseWindow();
	break;
      }
      case CAN:  // Cancel
	printf("nTerminating dialog: %s pressedn",
	       (parm1 == 1) ? "OK" : "Cancel");
	CloseWindow();
	break;
      default:
	break;
      }
      break;
    case kCM_CHECKBUTTON: {
//        cout << " checkbutton "<< parm1 << endl;
      switch(parm1) {
      case FBUT: {
	setFocus(fChk1);
	break;
      }
      case AWRN: {
	setFocus(fChk2);
	break;
      }
      case CMB: {
	setFocus(fChk3);
	break;
      }
      default:
	break;
      }
      break;
    }
    case kCM_COMBOBOX: {
//        cout << " combobox "<< parm1 << endl;
      switch(parm1) {
      case EXAM: {
//  	printf("ComboBox item %ld activatedn", parm2);
	if (parm2 >= 0) {
	  int nexam = lexlist->size();
	  int port = atoi(tentsp->GetBuffer()->GetString());
	  TString host = tentsa->GetBuffer()->GetString();
	  TString rcp = tentrcp->GetBuffer()->GetString();
	  if (parm2 == nexam) {
	    if (exSelected != nexam) {
	      Examine* ex = (*lexlist)[exSelected];
	      ex->SetPort(port);
	      ex->SetRCP(rcp);
	      ex->SetHost(host);
	    }
	    host = lprefs.Registrar;
	    port = lprefs.RegPort;
	    rcp = "";
	    tentrcp->SetState(kFALSE);
	  } else {
	    Examine* ex = 0;
	    tentrcp->SetState(kTRUE);
	    if (exSelected == nexam) {
	      lprefs.Registrar = host;
	      lprefs.RegPort = port;
	    } else {
	      ex = (*lexlist)[exSelected];
	      ex->SetPort(port);
	      ex->SetRCP(rcp);
	      ex->SetHost(host);
	    }
	    ex = (*lexlist)[parm2];
	    port = ex->GetPort();
	    host = ex->GetHost();
	    rcp = ex->GetRCP();
	  }
	  char tmp[16];
	  sprintf(tmp,"%d",port);
	  tentsp->SetText(tmp);
	  tentsa->SetText(host);
	  tentrcp->SetText(rcp);
	  exSelected = parm2;
	}
	focus = fexComboBox; 
	gVirtualX->SetInputFocus(focus->GetId());
	break;
      }
      case RSH: {
	focus = frcmdComboBox;
	gVirtualX->SetInputFocus(focus->GetId());
	break;
      }
      case HGX: {
	focus = fxCombo;
	gVirtualX->SetInputFocus(focus->GetId());
	break;
      }
      case HGY: {
	focus = fyCombo;
	gVirtualX->SetInputFocus(focus->GetId());
	break;
      }
      default:
	break;
      }
    }
    case kCM_TAB:
//        printf("Tab item %ld activatedn", parm1);
      break;
    default:
      break;
    }
    break;

  default:
    break;
  }
  return kTRUE;
}

Bool_t PrefDialog::HandleKey(Event_t *event)
{
   // Handle keyboard events.
//    cout << "PrefDialog::HandleKey: " << event->fCode << " " << event->fState << endl;
  if (event->fType == kGKeyPress) {
    int tab = fTab->GetCurrent();
    TList* tabList = (TList*)(tabWidgets->At(tab));
    if (!tabList) {
      parent->MsgOut("PrefDialog::HandleKey: No tabList!");
      return kTRUE;
    }
    XGComboBox *openBox = 0;
    XGComboBox *wasOpen = 0;
    TGObject *el;
    if (focus && (focus->IsA() == XGComboBox::Class())) {
      openBox = (XGComboBox*)focus;
    }

    if ((int)event->fCode == gVirtualX->KeysymToKeycode(kKey_Up)) {
      if (openBox) {
	int isel = openBox->GetSelected();
	if (isel > 0) {
	  isel--;
	} else {
	  TGListBox *elist = (TGListBox *)(openBox->GetListBox());
	  TList *el = ((TGCompositeFrame*)(elist->GetContainer()))->GetList();
	  isel = el->GetSize()-1;
	}
	openBox->Select(isel);
	openBox->GetListBox()->GetScrollBar()->SetPosition(isel);
      }
      return kFALSE;      
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode(kKey_Down)) {
      if (openBox) {
	int isel = openBox->GetSelected();
	isel++;
	openBox->Select(isel);
	isel = openBox->GetSelected();
	if (isel == -1 ) {
	  isel = 0;
	  openBox->Select(isel);
	}
	openBox->GetListBox()->GetScrollBar()->SetPosition(isel);
      }
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode(kKey_Space)) {
      if (focus) {
	if (tab == DTAB) {
	  if (focus->IsA() == TGCheckButton::Class()) {
	    Event_t* event = new Event_t();
	    event->fType = kButtonPress;
	    ((TGCheckButton*)focus)->HandleButton(event);
	    event->fType = kButtonRelease;
	    ((TGCheckButton*)focus)->HandleButton(event);
	    delete event;
	    return kFALSE;
	  }
	}
	if (focus->IsA() == XGTextEntry::Class()) {
	  return ((XGTextEntry*)focus)->HandleKey(event);
	} else if (focus->IsA() == XGComboBox::Class()) {
	  ((XGComboBox*)focus)->OpenBox();
	  return kFALSE;
	}
      }
    }

    if (openBox) {
      wasOpen = openBox;
      openBox->CloseBox();
      openBox = 0;
    }

    if ((int)event->fCode == gVirtualX->KeysymToKeycode('e') &&
	event->fState == kKeyMod1Mask) {
      if (tab != ETAB) {
	fTab->SetTab(ETAB);
      }
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('d') &&
	       event->fState == kKeyMod1Mask) {
      if (tab != DTAB) {
	fTab->SetTab(DTAB);
      }
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('t') &&
	       event->fState == kKeyMod1Mask) {
      if (tab != TTAB) {
	fTab->SetTab(TTAB);
      }
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('s') &&
	       event->fState == kKeyMod1Mask) {
      if (tab == ETAB) {
	setFocus(tentsa);
      } else if (tab == TTAB) {
	setFocus(tentto1);
      }
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('r') &&
	       event->fState == kKeyMod1Mask) {
      setFocus(tentrs);
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('p') &&
	       event->fState == kKeyMod1Mask) {
      if (tab == ETAB) {
	setFocus(tentsp);
      } else if (tab == DTAB) {
	setFocus(tent);
      }
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('f') &&
	       event->fState == kKeyMod1Mask) {
      if (tab == ETAB) {
	setFocus(tentrcp);
	return kFALSE;
      } else if (tab == DTAB) {
	setFocus(fChk1);
      }
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('k') &&
	       event->fState == kKeyMod1Mask) {
      setFocus(tentto2);
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('g') &&
	       event->fState == kKeyMod1Mask) {
      setFocus(tentto3);
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('b') &&
	       event->fState == kKeyMod1Mask) {
      setFocus(tsizex);
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('l') &&
	       event->fState == kKeyMod1Mask) {
      setFocus(tsizey);
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('a') &&
	       event->fState == kKeyMod1Mask) {
      if (tab == TTAB) {
	setFocus(tentto4);
	return kFALSE;
      } else if (tab == DTAB) {
	setFocus(fChk2);
      }
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('m') &&
	       event->fState == kKeyMod1Mask) {
      if (tab == ETAB) {
	setFocus(frcmdComboBox);
	return kFALSE;
      } else if (tab == DTAB) {
	setFocus(fChk3);
      }
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('x') &&
	       event->fState == kKeyMod1Mask) {
      if (tab == ETAB) {
	setFocus(fexComboBox);
      } else if (tab == DTAB) {
	setFocus(fxCombo);
      }
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('y') &&
	       event->fState == kKeyMod1Mask) {
      if (tab == DTAB) {
	setFocus(fyCombo);
      }
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('c') &&
	       event->fState == kKeyControlMask) {
      cout << "Control-c struck" << endl;
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode('i') &&
	       event->fState == kKeyControlMask) {
      cout << rcsid << endl;
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode(kKey_Escape)) {
      CloseWindow();
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode(kKey_Enter) ||
	       (int)event->fCode == gVirtualX->KeysymToKeycode(kKey_Return)) {
      Int_t msg = MK_MSG(kC_COMMAND, kCM_COMBOBOX);
      exSelected = fexComboBox->GetSelected();
      SendMessage(this, msg, EXAM, exSelected);
      return kFALSE;
    } else if ((int)event->fCode == gVirtualX->KeysymToKeycode(kKey_Tab)) {
      int ntab = fTab->GetCurrent();
      TList* tabList = (TList*)(tabWidgets->At(ntab));
      if (!tabList) {
	parent->MsgOut("PrefDialog::HandleKey: No tabList!");
	return kTRUE;
      }
      TIter next(tabList);
      while ((el = (TGObject *) next())) {
	if (el->IsA() == XGTextEntry::Class()) {
	  if ((XGTextEntry*)el == focus) {
	    TGObject *nxtel = (TGObject *)tabList->After(el);
	    if (!nxtel) break;
	    setFocus(nxtel);
	    return kFALSE;
	  }
	} else if (el->IsA() == XGComboBox::Class()) {
	  if ((XGComboBox*)el == focus) {
	    TGObject *nxtel = (TGObject *)tabList->After(el);
	    if (!nxtel) break;
	    setFocus(nxtel);
	    return kFALSE;
	  }
	} else if (el->IsA() == TGCheckButton::Class()) {
	  if ((TGCheckButton*)el == focus) {
	    TGObject *nxtel = (TGObject *)tabList->After(el);
	    if (!nxtel) break;
	    setFocus(nxtel);
	    return kFALSE;
	  }
	} else {
	  parent->MsgOut("PrefDialog::HandleKey: got some unknown widget!");
	}
      }
      TGObject *te = (TGObject*)tabList->At(0);
      setFocus(te);
      return kFALSE;
    }
  }
  return TGTransientFrame::HandleKey(event);
}

void PrefDialog::resetFocus()
{
  if (!focus) return;
  if ((focus->IsA() == XGTextEntry::Class())) {
    Event_t* event = new Event_t();
    event->fCode = kNotifyNormal;
    event->fState = kNotifyNormal;
    event->fType = kFocusOut;
    ((XGTextEntry*)focus)->HandleFocusChange(event);
//      } else if (el->IsA() == XGComboBox::Class()) {
  } else if ((focus->IsA() == TGCheckButton::Class())) {
    ((TGCheckButton*)focus)->ChangeOptions(0);
    ((TGCheckButton*)focus)->DrawBorder();
    fClient->NeedRedraw((TGCheckButton*)focus);
  }
  focus = 0;
}

void PrefDialog::setFocus(TGObject* el)
{
  resetFocus();
  if (el->IsA() == XGTextEntry::Class()) {
    Event_t* event = new Event_t();
    event->fCode = kButton1;
    event->fType = kButtonPress ;
    event->fX = 0;
    ((XGTextEntry*)el)->HandleButton(event);
    event->fCode = kNotifyNormal;
    event->fState = kNotifyNormal;
    event->fType = kFocusIn;
    ((XGTextEntry*)el)->HandleFocusChange(event);
    delete event;
    focus = (XGTextEntry*)el;
  } else if (el->IsA() == XGComboBox::Class()) {
    ((XGComboBox*)el)->OpenBox();
    gVirtualX->SetInputFocus(((XGComboBox*)el)->GetId());
    focus = (XGComboBox*)el;
  } else if (el->IsA() == TGCheckButton::Class()) {
    gVirtualX->SetInputFocus(((TGCheckButton*)el)->GetId());
    ((TGCheckButton*)el)->ChangeOptions(kRaisedFrame);
    ((TGCheckButton*)el)->DrawBorder();
    focus = (TGCheckButton*)el;
  } else {
    parent->MsgOut("PrefDialog::setFocus: got some unknown widget!");
  }
}

void PrefDialog::setFocus(Long_t gid)
{
//    cout << "PrefDialog::setFocus(Long_t gid): " << gid << endl;
  resetFocus();
  focus = fClient->GetWindowById((Handle_t)gid);
  if (!focus)
    parent->MsgOut("PrefDialog::setFocus: got some unknown window id!");
}


ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.