
//--------------------------------------//
// macro gui1.C                         //
//--------------------------------------//
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

#include <TROOT.h>
#include <TApplication.h>
#include <TVirtualX.h>

#include <RQ_OBJECT.h>
#include <TGFrame.h>
#include <TGMenu.h>
#include <TGTextEntry.h>
#include <TGTextBuffer.h>
#include <TGListBox.h>
#include <TGFileDialog.h>
#include <TSystem.h>
#include <TEnv.h>


const char *filetypes[] = { "All files",     "*",
                            "ROOT files",    "*.root",
                            "ROOT macros",   "*.C",
                            0,               0 };

class TNewDlog {

   RQ_OBJECT()

   private:
      TGMainFrame       *fMain;
      TGCompositeFrame   *fFrameLT;
      TGGroupFrame        *fFrameInfo;
      TGTextEntry          *fNameF;
      TGTextBuffer         *fBufF;
      TGTextEntry          *fNameL;
      TGTextBuffer         *fBufL;
      TGGroupFrame        *fFrameDir;
//      TGListBox            *fDir;
      TGTextEntry          *fDir;
      TGTextBuffer         *fBufDir;
      TGButton             *fBrowseBtn;
      TGCompositeFrame   *fFrameLB;
      TGButton            *fOkBtn;
      TGButton            *fCancelBtn;

   public:
      TNewDlog(const TGWindow *vWindow,
         UInt_t vWidth, UInt_t vHeight, UInt_t vOptions =
kVerticalFrame);
      virtual ~TNewDlog();

   // slots
      void FCloseWindow();
      void FBrowse();
      void FPressOK();
      void FCancel();
      void FChangeFocus();
};


TNewDlog::TNewDlog(const TGWindow *vWindow,
                           UInt_t vWidth, UInt_t vHeight, UInt_t
vOptions)
{
   fMain = new TGMainFrame(vWindow, vWidth, vHeight, vOptions);
   fMain->Connect("CloseWindow()", "TNewDlog", this, "FCloseWindow()");

// FrameLT for subframes
   fFrameLT = new TGCompositeFrame(fMain, 200, 20, kVerticalFrame);
   fMain->AddFrame(fFrameLT, new TGLayoutHints(kLHintsLeft |
kLHintsTop));

// Subframe Project Info
   fFrameInfo = new TGGroupFrame(fFrameLT, "Author Info",
kVerticalFrame);
//   fFrameInfo->SetLayoutManager(new TGTableLayout(fFrameInfo,2,2));
//error
   fFrameInfo->SetLayoutManager(new TGMatrixLayout(fFrameInfo,0,2,10));
   fFrameLT->AddFrame(fFrameInfo,
             new TGLayoutHints(kLHintsTop | kLHintsLeft |
kLHintsExpandX,5,5,5,5));

   fFrameInfo->AddFrame(new TGLabel(fFrameInfo,new TGString("First
Name")),
             new TGLayoutHints(kLHintsTop | kLHintsLeft));

   fNameF = new TGTextEntry(fFrameInfo, fBufF = new TGTextBuffer(100),
-1);
   fNameF->Connect("ReturnPressed()", "TNewDlog", this, "FPressOK()");
   fNameF->Connect("TabPressed()", "TNewDlog", this, "FChangeFocus()");
   fFrameInfo->AddFrame(fNameF,
               new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 2, 2));

   fNameF->Resize(250, fNameF->GetDefaultHeight());

   fFrameInfo->AddFrame(new TGLabel(fFrameInfo,new TGString("Last
Name")),
             new TGLayoutHints(kLHintsTop | kLHintsLeft));

   fNameL = new TGTextEntry(fFrameInfo, fBufL = new TGTextBuffer(100),
-1);
   fNameL->Connect("ReturnPressed()", "TNewDlog", this, "FPressOK()");
   fNameL->Connect("TabPressed()", "TNewDlog", this, "FChangeFocus()");
   fFrameInfo->AddFrame(fNameL,
               new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 2, 2));

   fNameL->Resize(250, fNameL->GetDefaultHeight());

// Subframe Directory
   fFrameDir = new TGGroupFrame(fFrameLT, "Directory",
kHorizontalFrame);
   fFrameLT->AddFrame(fFrameDir,
             new TGLayoutHints(kLHintsTop | kLHintsLeft |
kLHintsExpandX,5, 5, 5, 5));

   fDir = new TGTextEntry(fFrameDir, fBufDir = new TGTextBuffer(255),
-1);
   fDir->Connect("ReturnPressed()", "TNewDlog", this, "FPressOK()");
   fDir->Connect("TabPressed()", "TNewDlog", this, "FChangeFocus()");
//   fDir = new TGListBox(fFrameDir,-1);
   fDir->Resize(400,20);
   char tmp[255];
   sprintf(tmp,"%s",gSystem->WorkingDirectory());
   fDir->SetText(tmp);
//   fDir->AddEntry(tmp,1);
   fFrameDir->AddFrame(fDir, new
TGLayoutHints(kLHintsLeft|kLHintsTop,2,2,2,2));

   fBrowseBtn = new TGTextButton(fFrameDir, "&Browse...", 1);
   fBrowseBtn->Connect("Clicked()", "TNewDlog", this, "FBrowse()");
   fFrameDir->AddFrame(fBrowseBtn, new TGLayoutHints(kLHintsRight |
kLHintsTop));

// FrameLB for OK, Cancel
   fFrameLB = new TGHorizontalFrame(fMain, 200, 20, kFixedWidth);
   fMain->AddFrame(fFrameLB, new TGLayoutHints(kLHintsLeft |
kLHintsBottom));

   fOkBtn = new TGTextButton(fFrameLB, "&OK", 1);
   fOkBtn->Connect("Clicked()", "TNewDlog", this, "FPressOK()");
   //fOkBtn->Resize(150,20); // does not work
   fFrameLB->AddFrame(fOkBtn,
             new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
                               5, 5, 5, 5));

   fCancelBtn = new TGTextButton(fFrameLB, "&Cancel", 1);
   fCancelBtn->Connect("Clicked()", "TNewDlog", this, "FCancel()");
   fFrameLB->AddFrame(fCancelBtn,
             new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
                               5, 5, 5, 5));

   fFrameLB->Resize(150, fOkBtn->GetDefaultHeight());

   fMain->MapSubwindows();
   fMain->Resize(fMain->GetDefaultSize());
   fMain->SetWMPosition(140,120);
   fMain->Move(140,120);
//   fMain->Resize(400,220);

   fMain->SetWindowName("New Dialog");

   fMain->MapWindow();
}//Constructor

//----------------------------------------------------------------------//

TNewDlog::~TNewDlog()
{
   delete fOkBtn; delete fCancelBtn; delete fFrameLB;
   delete fBrowseBtn; delete fDir; delete fFrameDir;
   delete fNameL; delete fNameF; delete fFrameInfo;
   delete fFrameLT;

   delete fMain;
}//Destructor

//----------------------------------------------------------------------//

void TNewDlog::FCloseWindow()
{
   delete this;
}//FCloseWindow

//----------------------------------------------------------------------//

void TNewDlog::FBrowse()
{
   printf("Browse\n");

   TGFileInfo fi;
   fi.fFileTypes = filetypes;
   fi.fIniDir    = StrDup(fBufDir->GetString());
   printf("fIniDir = %s\n", fi.fIniDir);
   new TGFileDialog(gClient->GetRoot(), fMain, kFDOpen, &fi);
   printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
   fDir->SetText(fi.fIniDir);
}//FBrowseProject

//----------------------------------------------------------------------//

void TNewDlog::FCancel()
{
// Clear entries
   fBufF->Clear();
   fBufL->Clear();

   printf("Cancel\n");
}//FCancel

//----------------------------------------------------------------------//

void TNewDlog::FPressOK()
{
   cout << "First Name: " << fBufF->GetString() << endl;
   cout << "Last Name: " << fBufL->GetString() << endl;
   cout << "Directory: " << fBufDir->GetString() << endl;

   fMain->SendCloseMessage();
}//FPressOK

//----------------------------------------------------------------------//

void TNewDlog::FChangeFocus()
{
   if (gTQSender == fNameF)
      fNameL->SetFocus();

   if (gTQSender == fNameL)
      fDir->SetFocus();

   if (gTQSender == fDir)
      fNameF->SetFocus();
}

//----------------------------------------------------------------------//

void guiex2()
{
   new TNewDlog(gClient->GetRoot(), 400, 220);
}

//-------------------------END-------------------


