Revision 67b502021c47d95a161307bd8f930746f6be115f authored by Philippe Canal on 23 February 2016, 22:56:19 UTC, committed by Philippe Canal on 26 February 2016, 01:28:03 UTC
1 parent ab60d60
Raw File
XSReactionDlg.cxx
/*
 * $Header$
 * $Log$
 */

#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>

#include <Riostream.h>
#include <TSystem.h>
#include <TGTab.h>
#include <TGFrame.h>
#include <TGButton.h>
#include <TGWindow.h>
#include <TGButton.h>
#include <TGMsgBox.h>

#include "XSVarious.h"
#include "XSElementDlg.h"
#include "XSReactionDlg.h"

#include "NdbMTDir.h"

//ClassImp(XSReactionDlg)

// Options for filling containers
enum   DirOptions {
      DIROnlyFiles,
      DIROnlyDirectories,
      DIRBoth
   };

// Options for creating the path
enum   PathOptions {
      PATHIsotope,
      PATHProjectile,
      PATHDatabase,
      PATHFile
   };

enum   XSReactionMessages {
      REAC_ELEMENT_STEP,
      REAC_TABLE,
      REAC_OK,
      REAC_EXEC,
      REAC_CLOSE,
      REAC_RESET,
      REAC_PTABLE
   };

enum   ComboIds {
      ISOTOPE_COMBO,
      PROJECTILE_COMBO,
      TEMPERATURE_COMBO,
      DATABASE_COMBO,
      LINE_WIDTH_COMBO,
      LINE_COLOR_COMBO,
      MARKER_STYLE_COMBO,
      MARKER_COLOR_COMBO,
      MARKER_SIZE_COMBO,
      ERRORBAR_COLOR_COMBO,
      REACTION_LISTBOX,
   };

static   Int_t   LastWinX = -1;
static   Int_t   LastWinY = -1;

/* ----- XSReactionDlg ----- */
XSReactionDlg::XSReactionDlg( const TGWindow *p,
      const TGWindow *main, UInt_t initZ, UInt_t w, UInt_t h)
   : TGTransientFrame(p,main,w,h)
{
   // Remember the main window
   mainWindow = main;

   /* ---------- Prepare the Layout Hints ------- */
   lHFixed = new TGLayoutHints(kLHintsTop | kLHintsLeft,
               3, 3, 2, 2);
   lHExpX = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
               3, 3, 2, 2);
   lHExpY = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY,
               3, 3, 2, 2);
   lHExpXY = new TGLayoutHints(kLHintsTop | kLHintsLeft |
            kLHintsExpandX | kLHintsExpandY,
               3, 3, 2, 2);
   lHBot = new TGLayoutHints(kLHintsBottom | kLHintsRight,
               3, 3, 2, 2);

   lHExpXCen = new TGLayoutHints( kLHintsTop | kLHintsLeft |
            kLHintsExpandX | kLHintsCenterY,
            5, 5, 2, 2);
   lHFixedCen = new TGLayoutHints( kLHintsTop | kLHintsLeft |
            kLHintsCenterY,
            5, 5, 2, 2);

   /* --------- Create the Dialog -------------- */
   buttonFrame = new TGHorizontalFrame(this, 240, 20, kFixedWidth);
   okButton = new TGTextButton(buttonFrame, "&Ok", REAC_OK);
   okButton->Associate(this);
   execButton = new TGTextButton(buttonFrame, "&Execute", REAC_EXEC);
   execButton->Associate(this);
   resetButton = new TGTextButton(buttonFrame, "&Reset", REAC_RESET);
   resetButton->Associate(this);
   closeButton = new TGTextButton(buttonFrame, "&Close", REAC_CLOSE);
   closeButton->Associate(this);

   buttonFrame->AddFrame(okButton, lHExpX);
   buttonFrame->AddFrame(execButton, lHExpX);
   buttonFrame->AddFrame(resetButton, lHExpX);
   buttonFrame->AddFrame(closeButton, lHExpX);
   AddFrame(buttonFrame, lHBot);

   /* ------------ Material --------------- */
   materialGroup = new TGGroupFrame(this,"Material",kVerticalFrame);

   /* ----- First Sub-Frame ---- */
   frm1 = new TGHorizontalFrame(
               materialGroup, w, 36,
               kChildFrame|kFitWidth );
   frm1->ChangeBackground(0xFF00);

   elementLbl = new TGLabel(frm1,"Element:");
   elementLbl->SetTextJustify(kTextRight | kTextCenterY);
   frm1->AddFrame(elementLbl,lHFixedCen);

   elementBuf = new TGTextBuffer(20);
   elementText = new TGTextEntry(frm1,elementBuf);
   elementText->Resize(50, elementText->GetDefaultHeight());
   elementText->Associate(this);
   frm1->AddFrame(elementText,lHFixedCen);

   elementStep = new XSStepButton(frm1,REAC_ELEMENT_STEP);
   elementStep->Associate(this);
   frm1->AddFrame(elementStep,lHFixedCen);

   nameLbl = new TGLabel(frm1,"X",blueBoldGC);
   nameLbl->SetTextJustify(kTextLeft | kTextCenterY);
   frm1->AddFrame(nameLbl,lHExpXCen);

   ptableButton = new TGPictureButton(frm1,
            fClient->GetPicture(PTBL_ICON),
            REAC_PTABLE);
   ptableButton->SetToolTipText(
      "Choose the Element from the Periodic Table");
   ptableButton->Associate(this);
   frm1->AddFrame(ptableButton,lHFixedCen);

   materialGroup->AddFrame(frm1,lHExpX);

   /* ----- Second Sub-Frame ---- */
   frm2 = new TGHorizontalFrame(materialGroup,w,20,
            kChildFrame|kFitWidth);

   Vfrm1 = new TGCompositeFrame(frm2, w, 70,
               kChildFrame|kFitHeight|kFitWidth);
   Vfrm1->SetLayoutManager(new TGMatrixLayout(Vfrm1,0,4));

   chargeLbl = new TGLabel(Vfrm1,"Charge (Z):");
   chargeLbl->SetTextJustify(kTextRight | kTextCenterY);
   Vfrm1->AddFrame(chargeLbl);

   zLbl = new TGLabel(Vfrm1,"ZZZZZZZZ",blueBoldGC);
   zLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm1->AddFrame(zLbl);

   massLbl = new TGLabel(Vfrm1,"Atomic Mass:");
   massLbl->SetTextJustify(kTextRight | kTextCenterY);
   Vfrm1->AddFrame(massLbl);

   massValLbl = new TGLabel(Vfrm1,"ZZZZZZZZ",blueBoldGC);
   massValLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm1->AddFrame(massValLbl);

   densityLbl = new TGLabel(Vfrm1,"Density:");
   densityLbl->SetTextJustify(kTextRight | kTextCenterY);
   Vfrm1->AddFrame(densityLbl);

   densityValLbl = new TGLabel(Vfrm1,"ZZZZZZZZ",blueBoldGC);
   densityValLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm1->AddFrame(densityValLbl);

   oxidationLbl = new TGLabel(Vfrm1,"Oxidation:");
   oxidationLbl->SetTextJustify(kTextRight | kTextCenterY);
   Vfrm1->AddFrame(oxidationLbl);

   oxidationValLbl = new TGLabel(Vfrm1,"ZZZZZZZZ",blueBoldGC);
   oxidationValLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm1->AddFrame(oxidationValLbl);

   meltingPtLbl = new TGLabel(Vfrm1,"Melting Pt (C):");
   meltingPtLbl->SetTextJustify(kTextRight | kTextCenterY);
   Vfrm1->AddFrame(meltingPtLbl);

   meltingValLbl = new TGLabel(Vfrm1,"ZZZZZZZZ",blueBoldGC);
   meltingValLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm1->AddFrame(meltingValLbl);

   boilingPtLbl = new TGLabel(Vfrm1,"Boiling Pt (C):");
   boilingPtLbl->SetTextJustify(kTextRight | kTextCenterY);
   Vfrm1->AddFrame(boilingPtLbl);

   boilingValLbl = new TGLabel(Vfrm1,"ZZZZZZZZ",blueBoldGC);
   boilingValLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm1->AddFrame(boilingValLbl);

   frm2->AddFrame(Vfrm1,lHExpX);
   materialGroup->AddFrame(frm2,lHExpX);

   /* ----- Fourth Sub-Frame ---- */
   frm3 = new TGHorizontalFrame(materialGroup,w,20,
            kChildFrame|kFitWidth);

   isotopeLbl = new TGLabel(frm3,"Isotope (A):");
   isotopeLbl->SetTextJustify(kTextRight | kTextCenterY);
   frm3->AddFrame(isotopeLbl,lHFixedCen);

   isotopeCombo = new TGComboBox(frm3,ISOTOPE_COMBO);
   isotopeCombo->Resize(80,20);
   isotopeCombo->Associate(this);
   frm3->AddFrame(isotopeCombo,lHFixedCen);

   isotopeInfoLbl = new TGLabel(frm3,"Isotope Info:");
   isotopeInfoLbl->SetTextJustify(kTextRight | kTextCenterY);
   frm3->AddFrame(isotopeInfoLbl,lHFixedCen);

   isotopeInfoValLbl = new TGLabel(frm3,"MMMM",blueBoldGC);
   isotopeInfoValLbl->SetTextJustify(kTextLeft | kTextCenterY);
   frm3->AddFrame(isotopeInfoValLbl,lHExpXCen);

   materialGroup->AddFrame(frm3,lHExpX);

   AddFrame(materialGroup,lHExpX);

   /* --------------- Reaction ------------------ */
   reactionGroup = new TGGroupFrame(this,"Reaction",kVerticalFrame);

   frm4 = new TGHorizontalFrame(reactionGroup,w,60,
               kChildFrame|kFitWidth);

   Vfrm2 = new TGCompositeFrame(frm4, 160, 70,
               kChildFrame|kFitHeight|kFitWidth);

   Vfrm2->SetLayoutManager(new TGMatrixLayout(Vfrm2,0,2));

   projectileLbl = new TGLabel(Vfrm2,"Projectile:");
   projectileLbl->SetTextJustify(kTextRight | kTextCenterY);
   Vfrm2->AddFrame(projectileLbl);

   projectileCombo = new TGComboBox(Vfrm2,PROJECTILE_COMBO);
   projectileCombo->Resize(90,20);
   projectileCombo->Associate(this);
   Vfrm2->AddFrame(projectileCombo);

   temperatureLbl = new TGLabel(Vfrm2,"Temperature:");
   temperatureLbl->SetTextJustify(kTextRight | kTextCenterY);
   Vfrm2->AddFrame(temperatureLbl);

   temperatureCombo = new TGComboBox(Vfrm2,TEMPERATURE_COMBO);
   temperatureCombo->Resize(90,20);
   temperatureCombo->Associate(this);
   Vfrm2->AddFrame(temperatureCombo);

   databaseLbl = new TGLabel(Vfrm2,"Database:");
   databaseLbl->SetTextJustify(kTextRight | kTextCenterY);
   Vfrm2->AddFrame(databaseLbl);

   databaseCombo = new TGComboBox(Vfrm2,DATABASE_COMBO);
   databaseCombo->Resize(90,20);
   databaseCombo->Associate(this);
   Vfrm2->AddFrame(databaseCombo);

   frm4->AddFrame(Vfrm2,lHExpXCen);

   reactionLbl = new TGLabel(frm4,"Reaction:");
   reactionLbl->SetTextJustify(kTextLeft | kTextCenterY);
   frm4->AddFrame(reactionLbl,lHFixedCen);

   reactionList = new TGListBox(frm4,REACTION_LISTBOX);
   reactionList->Resize(70,80);
   //reactionList->SetMultipleSelections(kTRUE);
   reactionList->Associate(this);
   frm4->AddFrame(reactionList,lHExpXCen);

   reactionGroup->AddFrame(frm4,lHExpX);

   // --- Second sub frame ---
   frm5 = new TGHorizontalFrame(reactionGroup,w,20,
               kChildFrame|kFitWidth);
   reactionInfoLbl = new TGLabel(frm5,"Reaction Info:");
   reactionInfoLbl->SetTextJustify(kTextRight | kTextCenterY);
   frm5->AddFrame(reactionInfoLbl,lHFixedCen);

   reactionInfoValLbl = new TGLabel(frm5,"-",blueBoldGC);
   reactionInfoValLbl->SetTextJustify(kTextLeft | kTextCenterY);
   frm5->AddFrame(reactionInfoValLbl,lHExpXCen);

   reactionGroup->AddFrame(frm5,lHExpX);

   AddFrame(reactionGroup,lHExpX);

   /* --------------- Options ------------------ */
   optionGroup = new TGGroupFrame(this,"Options",kVerticalFrame);

   Vfrm3 = new TGCompositeFrame(optionGroup, w, 70,
            kChildFrame|kFitHeight|kFitWidth);

   Vfrm3->SetLayoutManager(new TGMatrixLayout(Vfrm3,0,4));

   lineWidthLbl = new TGLabel(Vfrm3,"Line Width:");
   lineWidthLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm3->AddFrame(lineWidthLbl);

   lineWidthCombo = new TGComboBox(Vfrm3,LINE_WIDTH_COMBO);
   lineWidthCombo->Resize(100,20);
   lineWidthCombo->Associate(this);
   Vfrm3->AddFrame(lineWidthCombo);

   lineColorLbl = new TGLabel(Vfrm3,"    Line Color:");
   lineColorLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm3->AddFrame(lineColorLbl);

   lineColorCombo = new TGComboBox(Vfrm3,LINE_COLOR_COMBO);
   lineColorCombo->Resize(100,20);
   lineColorCombo->Associate(this);
   Vfrm3->AddFrame(lineColorCombo);

   markerStyleLbl = new TGLabel(Vfrm3,"Marker Style:");
   markerStyleLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm3->AddFrame(markerStyleLbl);

   markerStyleCombo = new TGComboBox(Vfrm3,MARKER_STYLE_COMBO);
   markerStyleCombo->Resize(100,20);
   markerStyleCombo->Associate(this);
   Vfrm3->AddFrame(markerStyleCombo);

   markerColorLbl = new TGLabel(Vfrm3,"    Marker Color:");
   markerColorLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm3->AddFrame(markerColorLbl);

   markerColorCombo = new TGComboBox(Vfrm3, MARKER_COLOR_COMBO);
   markerColorCombo->Resize(100,20);
   markerColorCombo->Associate(this);
   Vfrm3->AddFrame(markerColorCombo);

   markerSizeLbl = new TGLabel(Vfrm3,"Marker Size:");
   markerSizeLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm3->AddFrame(markerSizeLbl);

   markerSizeCombo = new TGComboBox(Vfrm3, MARKER_SIZE_COMBO);
   markerSizeCombo->Resize(100,20);
   markerSizeCombo->Associate(this);
   Vfrm3->AddFrame(markerSizeCombo);

   errorbarColorLbl = new TGLabel(Vfrm3,"    ErrorBar Color:");
   errorbarColorLbl->SetTextJustify(kTextLeft | kTextCenterY);
   Vfrm3->AddFrame(errorbarColorLbl);

   errorbarColorCombo = new TGComboBox(Vfrm3,ERRORBAR_COLOR_COMBO);
   errorbarColorCombo->Resize(100,20);
   errorbarColorCombo->Associate(this);
   Vfrm3->AddFrame(errorbarColorCombo);

   optionGroup->AddFrame(Vfrm3,lHExpX);
   AddFrame(optionGroup,lHExpX);

   /* -------------- Information ------------------ */
   infoGroup = new TGGroupFrame(this,"Information",kVerticalFrame);

   infoView = new TGTextView(infoGroup, 200, 100,
            kChildFrame | kSunkenFrame);
   infoGroup->AddFrame(infoView,lHExpXY);

   AddFrame(infoGroup, lHExpXY);

   /* --------- Initialize layout algorithm with Resize() -------- */
   MapSubwindows();
   Resize(GetDefaultSize());

   /* --------- Initialise with Element Z ---------- */
   SetElement(initZ);
   InitCombos();

   /* --------- Set Windows Position --------- */
   int   ax, ay;

   if (LastWinX == -1) {   // Go to the middle of parent window
      Window_t wdum;
      gVirtualX->TranslateCoordinates(main->GetId(), GetParent()->GetId(),
         (((TGFrame *) main)->GetWidth() - fWidth) >> 1,
         (((TGFrame *) main)->GetHeight() - fHeight) >> 1,
         ax, ay, wdum);
      ax = MAX(ax,0);
      ay = MAX(ay,0);
   } else {
      ax = LastWinX;
      ay = LastWinY;
   }
   Move(ax,ay);
   SetWMPosition(ax,ay);

   /* --------- Map everything -------- */
   SetWindowName("Select Element/Reaction");
   MapWindow();

} // XSReactionDlg

/* ----- ~XSReactionDlg ----- */
XSReactionDlg::~XSReactionDlg()
{
   // --- Delete Layout Hints ---
   delete   lHFixed;
   delete   lHExpX;
   delete   lHExpY;
   delete   lHExpXY;
   delete   lHFixedCen;
   delete   lHExpXCen;

   // --- Delete Material Group ----
   delete   elementLbl;
   delete   elementText;
   delete   elementStep;
   delete   ptableButton;
   delete   chargeLbl;
   delete   zLbl;
   delete   nameLbl;
   delete   massLbl;
   delete   massValLbl;
   delete   densityLbl;
   delete   densityValLbl;
   delete   meltingPtLbl;
   delete   meltingValLbl;
   delete   boilingPtLbl;
   delete   boilingValLbl;
   delete   oxidationLbl;
   delete   oxidationValLbl;
   delete   isotopeInfoLbl;
   delete   isotopeInfoValLbl;
   delete   isotopeLbl;
   delete   isotopeCombo;
   delete   materialGroup;

   // --- Delete Reaction group ---
   delete   projectileLbl;
   delete   projectileCombo;
   delete   temperatureLbl;
   delete   temperatureCombo;
   delete   databaseLbl;
   delete   databaseCombo;
   delete   reactionLbl;
   delete   reactionList;
   delete   reactionInfoLbl;
   delete   reactionInfoValLbl;
   delete   reactionGroup;

   // --- Option Group ----
   delete   lineWidthLbl;
   delete   lineColorLbl;
   delete   markerStyleLbl;
   delete   markerColorLbl;
   delete   markerSizeLbl;
   delete   errorbarColorLbl;

   delete   lineWidthCombo;
   delete   lineColorCombo;
   delete   markerStyleCombo;
   delete   markerColorCombo;
   delete   markerSizeCombo;
   delete   errorbarColorCombo;

   delete   optionGroup;

   // --- Info Group ----
   delete   infoView;
   delete   infoGroup;

   // --- Frames ---
   delete   frm1;
   delete   frm2;
   delete   frm3;
   delete   frm4;
   delete   frm5;

   delete   Vfrm1;
   delete   Vfrm2;
   delete   Vfrm3;

   // --- Buttons ---
   delete   okButton;
   delete   execButton;
   delete   resetButton;
   delete   closeButton;
   delete   buttonFrame;
} // ~XSReactionDlg

/* ----- InitColorCombo ----- */
void
XSReactionDlg::InitColorCombo(TGComboBox *cb)
{
   // Normaly this should be filled with color entries!!!

   cb->AddEntry("Black",0);
   cb->AddEntry("Red",1);
   cb->AddEntry("Green",2);
   cb->AddEntry("Blue",3);
   cb->AddEntry("Yellow",4);
   cb->AddEntry("Magenta",5);
   cb->AddEntry("Cyan",6);
   // .......
   cb->Select(0);      // <<<< Should find the correct color...
} // InitColorCombos

/* ----- InitCombos ----- */
void
XSReactionDlg::InitCombos()
{
   InitColorCombo(lineColorCombo);
   InitColorCombo(markerColorCombo);
   InitColorCombo(errorbarColorCombo);

   /* ---- Line Widths ----- */
   lineWidthCombo->AddEntry("None",0);
   lineWidthCombo->AddEntry("1",1);
   lineWidthCombo->AddEntry("2",2);
   lineWidthCombo->AddEntry("3",3);
   lineWidthCombo->AddEntry("4",4);
   lineWidthCombo->AddEntry("5",5);
   lineWidthCombo->AddEntry("6",6);
   lineWidthCombo->AddEntry("7",7);
   lineWidthCombo->AddEntry("8",8);
   lineWidthCombo->AddEntry("9",9);
   lineWidthCombo->AddEntry("10",10);
   lineWidthCombo->Select(1);
   // --- Select the correct one ---

   /* ---- Marker Style ----- */
   markerStyleCombo->AddEntry("None",0);
   markerStyleCombo->AddEntry("Bullet",1);
   markerStyleCombo->AddEntry("Triangle Up",2);
   markerStyleCombo->AddEntry("Triangle Down",3);
   markerStyleCombo->AddEntry("Square",4);
   markerStyleCombo->AddEntry("Diamond",5);
   markerStyleCombo->AddEntry("Star",6);
   markerStyleCombo->AddEntry("Empty Bullet",7);
   markerStyleCombo->AddEntry("Empty Tri-Up",8);
   markerStyleCombo->AddEntry("Empty Tri-Down",9);
   markerStyleCombo->AddEntry("Empty Square",10);
   markerStyleCombo->Select(0);
   // --- Select the correct one ---

   /* ---- Marker Size ----- */
   markerSizeCombo->AddEntry("None",0);
   markerSizeCombo->AddEntry("0.1",1);
   markerSizeCombo->AddEntry("0.2",2);
   markerSizeCombo->AddEntry("0.3",3);
   markerSizeCombo->AddEntry("0.4",4);
   markerSizeCombo->AddEntry("0.5",5);
   markerSizeCombo->AddEntry("0.6",6);
   markerSizeCombo->AddEntry("0.7",7);
   markerSizeCombo->AddEntry("0.8",8);
   markerSizeCombo->AddEntry("0.9",9);
   markerSizeCombo->AddEntry("1.0",10);
   markerSizeCombo->Select(0);

   // --- Select the correct one ---
} // InitCombos

/* ----- GetString ------- */
const char *
XSReactionDlg::GetString( int box )
{
   const TGLBEntry   *entry;
   switch  (box) {
      case ISOTOPE_COMBO:
         entry = isotopeCombo->GetSelectedEntry();
         break;

      case PROJECTILE_COMBO:
         entry = projectileCombo->GetSelectedEntry();
         break;

      case TEMPERATURE_COMBO:
         entry = temperatureCombo->GetSelectedEntry();
         break;

      case DATABASE_COMBO:
         entry = databaseCombo->GetSelectedEntry();
         break;

      case LINE_WIDTH_COMBO:
         entry = lineWidthCombo->GetSelectedEntry();
         break;

      case LINE_COLOR_COMBO:
         entry = lineColorCombo->GetSelectedEntry();
         break;

      case MARKER_STYLE_COMBO:
         entry = markerStyleCombo->GetSelectedEntry();
         break;

      case MARKER_COLOR_COMBO:
         entry = markerColorCombo->GetSelectedEntry();
         break;

      case MARKER_SIZE_COMBO:
         entry = markerSizeCombo->GetSelectedEntry();
         break;

      case ERRORBAR_COLOR_COMBO:
         entry = errorbarColorCombo->GetSelectedEntry();
         break;

      case REACTION_LISTBOX:
         entry = reactionList->GetSelectedEntry();
         break;

      default:
         entry = NULL;
   }
   if (entry==NULL) return NULL;

   return ((TGTextLBEntry*)entry)->GetText()->GetString();
} // GetString

/* ----- CreatePath ------ */
char*
XSReactionDlg::CreatePath( int option )
{
   static   char   path[256];

   strlcpy(path, DBDIR,256);   // Initialise directory
   strlcat(path, XSelements->Mnemonic(Z),256);
   strlcat(path, PATHSEP,256);

   if (option == PATHIsotope) return path;

   /* --- add the selected isotope --- */
   strlcat(path, GetString(ISOTOPE_COMBO),256);
   strlcat(path, PATHSEP,256);

   if (option == PATHProjectile) return path;

   /* --- add the selected projectile --- */
   strlcat(path, GetString(PROJECTILE_COMBO),256);
   strlcat(path, PATHSEP,256);

   if (option == PATHDatabase) return path;

   /* --- finally add the file --- */
   strlcat(path, GetString(DATABASE_COMBO),256);

   return path;
} // CreatePath

/* ----- UpdateContainer ----- */
int
XSReactionDlg::UpdateContainer( TGListBox *lb, char *path, int option)
{
   const char *entry;
   FileStat_t st;

   // --- First Remove everything ---
   lb->RemoveEntries(0,1000);

   // Scan directory to update the combo box
   void *dirp = gSystem->OpenDirectory(path);
   if (dirp==NULL) {
      lb->AddEntry("-",0);
      return kTRUE;   // Ooops not found
   }

   int   i=0;
   while ((entry = gSystem->GetDirEntry(dirp))) {
      // Skip the . and .* directory entries
      if (entry[0] == '.') continue;

      char   fn[256];
      strlcpy(fn,path,256);
      strlcat(fn,entry,256);

      gSystem->GetPathInfo(fn, st);
      if (((option == DIROnlyFiles) && !R_ISDIR(st.fMode)) ||
          ((option == DIROnlyDirectories) && R_ISDIR(st.fMode)) ||
          (option == DIRBoth)) {
         lb->AddEntry(entry,i++);
      }
   }
   gSystem->FreeDirectory(dirp);
   if (i==0) {
      lb->AddEntry("None",0);
      return kTRUE;   // Ooops not found
   }
   return kFALSE;
} // UpdateContainer

/* ----- UpdateIsotopes ------ */
void
XSReactionDlg::UpdateIsotopes()
{
   // --- Update the isotopes ---
   UpdateContainer(
      isotopeCombo->GetListBox(),
      CreatePath(PATHIsotope),
      DIROnlyDirectories);
   isotopeCombo->Select(0);
} // UpdateIsotopes

/* ----- UpdateProjectile ------ */
void
XSReactionDlg::UpdateProjectile()
{
   // --- Update the projectiles ---
   UpdateContainer(
      projectileCombo->GetListBox(),
      CreatePath(PATHProjectile),
      DIROnlyDirectories);
   projectileCombo->Select(0);
} // UpdateProjectile

/* ----- UpdateDatabase ------ */
void
XSReactionDlg::UpdateDatabase()
{
   // --- Update the databases ---
   UpdateContainer(
      databaseCombo->GetListBox(),
      CreatePath(PATHDatabase),
      DIRBoth);
   databaseCombo->Select(0);
} // UpdateDatabase

/* ----- UpdateReactions ------ */
void
XSReactionDlg::UpdateReactions()
{
   NdbMTDir   elemDir;

   reactionList->RemoveEntries(0,1000);
   infoView->Clear();

   if (elemDir.LoadENDF(CreatePath(PATHFile)))
      return;

   int id = 0;
   for (int i=0; i<elemDir.Sections(); i++) {
      if (elemDir.DIRMF(i) == 3)
         reactionList->AddEntry(
            XSReactionDesc->GetShort(elemDir.DIRMT(i)),
            id++);
   }
        reactionList->MapSubwindows();
   reactionList->Select(0);

   // ------------------------------------------
   // Prepare a string with information
   TString   info;

   info.Append("Symbol name:\t\t");
   info.Append(elemDir.SymbolName());

   info.Append("\nLaboratory:\t\t");
   info.Append(elemDir.Laboratory());

   info.Append("\nEvaluation Date:\t");
   info.Append(elemDir.EvaluationDate());

   info.Append("\nAuthor(s):\t\t");
   info.Append(elemDir.Author());

   info.Append("\nReference:\t\t");
   info.Append(elemDir.Reference());

   info.Append("\nDistribution Date:\t");
   info.Append(elemDir.DistributionDate());
   info.Append("\nLast Revision Date:\t");
   info.Append(elemDir.LastRevisionDate());
   info.Append("\nMaster Entry Date:\t");
   info.Append(elemDir.MasterEntryDate());
   info.Append("\n\n");
   info.Append(elemDir.GetInfo());

   infoView->LoadBuffer(info.Data());
} // UpdateReactions

/* ----- UpdateCurIsotope ----- */
void
XSReactionDlg::UpdateCurIsotope()
{
   XSElement   *elem = XSelements->Elem(Z);

   const char *str = GetString(ISOTOPE_COMBO);
   if (str)
      isotopeInfoValLbl->SetText(
         new TGString(elem->IsotopeInfo(str)));
   else
      isotopeInfoValLbl->SetText(new TGString("-"));

   // --- Update combos depending on isotope ---
   UpdateProjectile();
   UpdateDatabase();
   UpdateReactions();
} // UpdateCurIsotope

/* ----- SetElement ----- */
void
XSReactionDlg::SetElement(UInt_t aZ)
{
   char   str[5];

   Z = aZ;
   if (Z<1)
      Z = 1;
   else
   if (Z>XSelements->GetSize())
      Z = XSelements->GetSize();


   XSElement   *elem = XSelements->Elem(Z);

   elementBuf->Clear();
   elementBuf->AddText(0,elem->Symbol());
   fClient->NeedRedraw(elementText);
   nameLbl->SetText(new TGString(elem->Name()));

   snprintf(str,5,"%d",Z);
   zLbl->SetText(new TGString(str));

   // --- Update several values for element ---
   massValLbl->SetText(new TGString(elem->AtomicWeight()));
   densityValLbl->SetText(new TGString(elem->Density()));
   densityValLbl->SetText(new TGString(elem->Density()));
   meltingValLbl->SetText(new TGString(elem->MeltingPt()));
   boilingValLbl->SetText(new TGString(elem->BoilingPt()));
   oxidationValLbl->SetText(new TGString(elem->Oxidation()));

   // --------------------------------
   UpdateIsotopes();
   UpdateCurIsotope();

   // --------------------------------
   // ---Update the rest of combos ---
   // --------------------------------
   temperatureCombo->RemoveEntries(0,1000);
   temperatureCombo->AddEntry("0",0);
   temperatureCombo->AddEntry("293",1);
   temperatureCombo->AddEntry("900",2);
   temperatureCombo->AddEntry("1000",3);
   temperatureCombo->Select(1);


   // Redraw everything
   fClient->NeedRedraw(this);
   Layout();
} // SetElement

/* ----- CloseWindow ----- */
void
XSReactionDlg::CloseWindow()
{
   // --- Remember old position ---
   Window_t wdum;
   gVirtualX->TranslateCoordinates(GetId(), GetParent()->GetId(),
      0, 0, LastWinX, LastWinY, wdum);

   delete this;
} // CloseWindow

/* ----- elementEntryChanged ---- */
void
XSReactionDlg::ElementEntryChanged()
{
   const   char   *name;
   UInt_t   newZ;

   /* --- get contents --- */
   name = elementBuf->GetString();

   /* --- check if it is a number --- */
   newZ = atoi(name);
   if ((newZ>0) && (newZ<=XSelements->GetSize())) {
      SetElement(newZ);
      return;
   }

   /* Search for the specific element */
   newZ = XSelements->Find(name);

   if (newZ == 0) {
      // --- Error Entry ---
      // issue message and put the old one
      char   msg[256];
      int   retval;
      snprintf(msg,256,"Element %s not found!", elementBuf->GetString());
      new TGMsgBox(fClient->GetRoot(),this,"Not found",msg,
            kMBIconAsterisk,kMBOk,&retval);
      SetElement(Z);
   } else
      SetElement(newZ);
} // ElementEntryChanged

/* ----- UpdateGraph ---- */
void
XSReactionDlg::UpdateGraph( NdbMTReactionXS *xs )
{
   char title[256];

   //!!! --- Only if new ---
   //!!! --- Else update the old one ---
   XSGraph *gr = new XSGraph(xs);

   // Prepare the title
   snprintf(title,256,"%s-%s %s",
         XSelements->Mnemonic(Z),
         GetString(ISOTOPE_COMBO),
         xs->Description().Data()
      );

   gr->GetGraph()->SetTitle(title);
   gr->GetGraph()->SetFillColor(19);
   gr->GetGraph()->SetLineColor(2);
   gr->GetGraph()->SetLineWidth(2);
   gr->GetGraph()->Draw("ALW");

//   gr->GetGraph()->GetHistogram()->SetXTitle(TString("Energy (eV)"));
//   gr->GetGraph()->GetHistogram()->SetYTitle(TString("Cross Section (barn)"));

   Add2GraphList(gr);
   fClient->NeedRedraw(canvasWindow);
   fClient->NeedRedraw(const_cast<TGWindow*>(mainWindow));
   canvas->Update();
} // UpdateGraph

/* ----- ExecCommand ---- */
Bool_t
XSReactionDlg::ExecCommand()
{
   // --- Load the data base ---
   NdbMTDir   el;
   if (el.LoadENDF(CreatePath(PATHFile)))
      return kTRUE;

   // --- Get the selected reaction ---
   const char *reacstr = GetString(REACTION_LISTBOX);

   // --- Search for the reaction ---
   for (int i=0; i<el.Sections(); i++) {
      if (el.DIRMF(i) == 3 && XSReactionDesc->GetShort(el.DIRMT(i))) {
         if (reacstr && !strcmp(reacstr,
              XSReactionDesc->GetShort(el.DIRMT(i)))) {
            NdbMTReactionXS   xs(el.DIRMT(i), reacstr);
            xs.LoadENDF(CreatePath(PATHFile));

            UpdateGraph(&xs);
         }
      }
   }
   return kFALSE;
} // ExecCommand

/* ----- ProcessButton ----- */
Bool_t
XSReactionDlg::ProcessButton(Long_t param1, Long_t param2)
{
   UInt_t   newZ;
   switch (param1) {
      case REAC_ELEMENT_STEP:
         if (param2==XSSTEPBUTTON_UP) {
            newZ = Z+1;
            if (newZ > XSelements->GetSize()) Z = 1;
         } else {
            newZ = Z-1;
            if (newZ<1) Z = XSelements->GetSize();
         }
         SetElement(newZ);
         break;

      case REAC_OK:
         // Execute the command and close the window
         if (!ExecCommand())
            CloseWindow();
         break;

      case REAC_EXEC:
         // Execute the command, but don't close the window
         ExecCommand();
         break;

      case REAC_RESET:
         SetElement(1);
         break;

      case REAC_CLOSE:
         CloseWindow();
         break;

      case REAC_PTABLE:
         newZ = Z;
         new XSElementDlg(fClient->GetRoot(), this, &newZ);
         if (newZ>0)
            SetElement(newZ);
         break;

      default:
         break;
   }
   return kTRUE;
} // ProcessButton

/* ----- ProcessCombo ------ */
Bool_t
XSReactionDlg::ProcessCombo( Long_t param1, Long_t param2 )
{
   printf("ComboMessage %ld %ld\n",param1,param2);

   switch (param1) {
      case ISOTOPE_COMBO:
         UpdateCurIsotope();
         break;

      case PROJECTILE_COMBO:
         UpdateDatabase();
         UpdateReactions();
         break;

      case DATABASE_COMBO:
         UpdateReactions();
         break;

      case REACTION_LISTBOX:
//////         reactionInfoValLbl->SetText(
//////            new TGString(elem->IsotopeInfo(str)));
         break;

      default:
         // Ooops an error in the code
         break;
   }

   return kTRUE;
} // ProcessCombo

/* ----- ProcessMessage ----- */
Bool_t
XSReactionDlg::ProcessMessage(Long_t msg, Long_t param1, Long_t param2)
{
   printf("Message = %d (%d)\n", GET_MSG(msg), GET_SUBMSG(msg));

   switch (GET_MSG(msg)) {
      case kC_COMMAND:
         switch (GET_SUBMSG(msg)) {
            case kCM_BUTTON:
               ProcessButton(param1,param2);
               break;

            case kCM_COMBOBOX:
               ProcessCombo(param1,param2);
               break;

            default:
               break;
         }
      case kC_TEXTENTRY:
         switch (GET_SUBMSG(msg)) {
            case kTE_ENTER:
               ElementEntryChanged();
               break;
            default:
               break;
         }
      default:
//         printf("Message = %d (%d)\n", GET_MSG(msg), GET_SUBMSG(msg));
         break;
   }
   return kTRUE;
} // ProcessMessage
back to top