TSessionDialogs.cxx

Go to the documentation of this file.
00001 // @(#)root/sessionviewer:$Id: TSessionDialogs.cxx 31813 2009-12-10 15:50:14Z bellenot $
00002 // Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 //////////////////////////////////////////////////////////////////////////
00013 //                                                                      //
00014 // TSessionDialogs                                                      //
00015 //                                                                      //
00016 // This file defines several dialogs that are used by TSessionViewer.   //
00017 // The following dialogs are available: TNewChainDlg and TNewQueryDlg.  //
00018 //                                                                      //
00019 //////////////////////////////////////////////////////////////////////////
00020 
00021 #include "TSessionDialogs.h"
00022 #include "TSessionViewer.h"
00023 #include "TROOT.h"
00024 #include "TSystem.h"
00025 #include "TGButton.h"
00026 #include "TList.h"
00027 #include "TChain.h"
00028 #include "TDSet.h"
00029 #include "TGTextEntry.h"
00030 #include "TGTextBuffer.h"
00031 #include "TGNumberEntry.h"
00032 #include "TGLabel.h"
00033 #include "TGListView.h"
00034 #include "TGPicture.h"
00035 #include "TGFSContainer.h"
00036 #include "TGFileDialog.h"
00037 #include "TGListTree.h"
00038 #include "TInterpreter.h"
00039 #include "TApplication.h"
00040 #include "TKey.h"
00041 #include "TGTableLayout.h"
00042 #include "TGFileDialog.h"
00043 #include "TProof.h"
00044 #include "TFileInfo.h"
00045 #include "TGMsgBox.h"
00046 #include "TRegexp.h"
00047 
00048 ClassImp(TNewChainDlg)
00049 ClassImp(TNewQueryDlg)
00050 
00051 /* not yet used
00052 static const char *gParTypes[] = {
00053    "Par files",  "*.par",
00054    "All files",  "*",
00055     0,            0
00056 };
00057 */
00058 
00059 static const char *gDatasetTypes[] = {
00060    "ROOT files",    "*.root",
00061    "All files",     "*",
00062    0,               0
00063 };
00064 
00065 static const char *gFileTypes[] = {
00066    "C files",       "*.[C|c]*",
00067    "ROOT files",    "*.root",
00068    "All files",     "*",
00069    0,               0
00070 };
00071 
00072 //////////////////////////////////////////////////////////////////////////
00073 // New Chain Dialog
00074 //////////////////////////////////////////////////////////////////////////
00075 
00076 //______________________________________________________________________________
00077 TNewChainDlg::TNewChainDlg(const TGWindow *p, const TGWindow *main) :
00078    TGTransientFrame(p, main, 350, 300, kVerticalFrame)
00079 {
00080    // Create a new chain dialog box. Used to list chains present in memory
00081    // and offers the possibility to create new ones by executing macros
00082    // directly from the associate file container.
00083 
00084    Pixel_t backgnd;
00085    if (!p || !main) return;
00086    SetCleanup(kDeepCleanup);
00087    fClient->GetColorByName("#F0FFF0", backgnd);
00088    AddFrame(new TGLabel(this, new TGHotString("List of Chains in Memory :")),
00089             new TGLayoutHints(kLHintsLeft, 5, 5, 7, 2) );
00090 
00091    // Add TGListView used to show objects in memory
00092    fListView = new TGListView(this, 300, 100);
00093    fLVContainer = new TGLVContainer(fListView, kSunkenFrame, GetWhitePixel());
00094    fLVContainer->Associate(fListView);
00095    fLVContainer->SetViewMode(kLVSmallIcons);
00096    fLVContainer->SetCleanup(kDeepCleanup);
00097    AddFrame(fListView, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 4, 4, 4, 4));
00098 
00099    fListView->Connect("Clicked(TGLVEntry*, Int_t)", "TNewChainDlg",
00100             this, "OnElementClicked(TGLVEntry* ,Int_t)");
00101 
00102    // Add text entry showing type and name of user's selection
00103    TGCompositeFrame* frmSel = new TGHorizontalFrame(this, 300, 100);
00104    frmSel->SetCleanup(kDeepCleanup);
00105    frmSel->AddFrame(new TGLabel(frmSel, new TGHotString("Selected chain :")),
00106             new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5, 5, 5, 5) );
00107    fNameBuf = new TGTextBuffer(100);
00108    fName = new TGTextEntry(frmSel, fNameBuf);
00109    fName->Resize(200, fName->GetDefaultHeight());
00110    fName->Associate(this);
00111    fName->SetEnabled(kFALSE);
00112    fName->ChangeBackground(backgnd);
00113    frmSel->AddFrame(fName, new TGLayoutHints(kLHintsLeft | kLHintsCenterY | kLHintsExpandX, 5, 5, 5, 5));
00114    AddFrame(frmSel, new TGLayoutHints(kLHintsExpandX, 5, 5, 5, 5));
00115 
00116    AddFrame(new TGLabel(this, "Double-click on the macro to be executed to create a new Chain:"),
00117             new TGLayoutHints(kLHintsCenterX, 5, 5, 5, 2));
00118 
00119    // Add TGListview / TGFileContainer to allow user to execute Macros
00120    // for the creation of new TChains / TDSets
00121    TGListView* lv = new TGListView(this, 300, 100);
00122    AddFrame(lv,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 5, 5, 2, 5));
00123 
00124    Pixel_t white;
00125    gClient->GetColorByName("white",white);
00126    fContents = new TGFileContainer(lv, kSunkenFrame, white);
00127    fContents->SetCleanup(kDeepCleanup);
00128    fContents->SetFilter("*.[C|c]*");
00129    fContents->SetViewMode(kLVSmallIcons);
00130    fContents->Associate(this);
00131    fContents->SetDefaultHeaders();
00132    fContents->DisplayDirectory();
00133    fContents->AddFile("..");        // up level directory
00134    fContents->Resize();
00135    fContents->StopRefreshTimer();   // stop refreshing
00136 
00137    // position relative to the parent's window
00138    Window_t wdummy;
00139    Int_t  ax, ay;
00140    gVirtualX->TranslateCoordinates( main->GetId(),
00141                                     fClient->GetDefaultRoot()->GetId(),
00142                                     0, 0, ax, ay, wdummy);
00143    Move(ax + 200, ay + 35);
00144 
00145    TGCompositeFrame *tmp;
00146    AddFrame(tmp = new TGCompositeFrame(this, 140, 20, kHorizontalFrame),
00147             new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
00148    tmp->SetCleanup(kDeepCleanup);
00149    // Apply and Close buttons
00150    tmp->AddFrame(fOkButton = new TGTextButton(tmp, "&Ok", 0),
00151             new TGLayoutHints(kLHintsExpandX, 5, 5, 5, 5));
00152    tmp->AddFrame(fCancelButton = new TGTextButton(tmp, "&Cancel", 1),
00153             new TGLayoutHints(kLHintsExpandX, 5, 5, 5, 5));
00154    fOkButton->Associate(this);
00155    fCancelButton->Associate(this);
00156    fOkButton->SetEnabled(kFALSE);
00157 
00158    SetWindowName("Chain Selection Dialog");
00159    MapSubwindows();
00160    Layout();
00161    Resize(GetDefaultSize());
00162    MapWindow();
00163    UpdateList();
00164 }
00165 
00166 //______________________________________________________________________________
00167 TNewChainDlg::~TNewChainDlg()
00168 {
00169    // Delete chain dialog.
00170    if (IsZombie()) return;
00171    delete fLVContainer;
00172    delete fContents;
00173    Cleanup();
00174 }
00175 
00176 //______________________________________________________________________________
00177 void TNewChainDlg::OnElementSelected(TObject *obj)
00178 {
00179    // Emits OnElementSelected signal if dset is not zero.
00180 
00181    if (obj && (obj->IsA() == TChain::Class() ||
00182        obj->IsA() == TDSet::Class())) {
00183       Emit("OnElementSelected(TObject *)", (Long_t)obj);
00184    }
00185 }
00186 
00187 //______________________________________________________________________________
00188 void TNewChainDlg::OnElementClicked(TGLVEntry *entry, Int_t)
00189 {
00190    // Handle click in the Memory list view and put the type
00191    // and name of selected object in the text entry.
00192 
00193    fChain = (TObject *)entry->GetUserData();
00194    if (fChain->IsA() == TChain::Class()) {
00195       TString s = TString::Format("%s : %s" , ((TChain *)fChain)->GetTitle(),
00196                                   ((TChain *)fChain)->GetName());
00197       fName->SetText(s);
00198    }
00199    else if (fChain->IsA() == TDSet::Class()) {
00200       TString s = TString::Format("%s : %s" , ((TDSet *)fChain)->GetName(),
00201                                   ((TDSet *)fChain)->GetObjName());
00202       fName->SetText(s);
00203    }
00204    fOkButton->SetEnabled(kTRUE);
00205 }
00206 
00207 //______________________________________________________________________________
00208 void TNewChainDlg::UpdateList()
00209 {
00210    // Update Memory list view.
00211 
00212    TGLVEntry *item=0;
00213    TObject *obj = 0;
00214    fChains = gROOT->GetListOfDataSets();
00215    fLVContainer->RemoveAll();
00216    if (!fChains) return;
00217    TIter next(fChains);
00218    // loop on the list of chains/datasets in memory,
00219    // and fill the associated listview
00220    while ((obj = (TObject *)next())) {
00221       item = 0;
00222       if (obj->IsA() == TChain::Class()) {
00223          const char *title = ((TChain *)obj)->GetTitle();
00224          if (strlen(title) == 0)
00225             ((TChain *)obj)->SetTitle("TChain");
00226          item = new TGLVEntry(fLVContainer, ((TChain *)obj)->GetName(),
00227                               ((TChain *)obj)->GetTitle());
00228       }
00229       else if (obj->IsA() == TDSet::Class()) {
00230          item = new TGLVEntry(fLVContainer, ((TDSet *)obj)->GetObjName(),
00231                               ((TDSet *)obj)->GetName());
00232       }
00233       if (item) {
00234          item->SetUserData(obj);
00235          fLVContainer->AddItem(item);
00236       }
00237    }
00238    fClient->NeedRedraw(fLVContainer);
00239    Resize();
00240 }
00241 
00242 //______________________________________________________________________________
00243 void TNewChainDlg::DisplayDirectory(const TString &fname)
00244 {
00245    // Display content of directory.
00246 
00247    fContents->SetDefaultHeaders();
00248    gSystem->ChangeDirectory(fname);
00249    fContents->ChangeDirectory(fname);
00250    fContents->DisplayDirectory();
00251    fContents->AddFile("..");  // up level directory
00252    Resize();
00253 }
00254 
00255 //______________________________________________________________________________
00256 void TNewChainDlg::OnDoubleClick(TGLVEntry* f, Int_t btn)
00257 {
00258    // Handle double click in the File container.
00259 
00260    if (btn!=kButton1) return;
00261    gVirtualX->SetCursor(fContents->GetId(),gVirtualX->CreateCursor(kWatch));
00262 
00263    TString name(f->GetTitle());
00264 
00265    // Check if the file is a root macro file type
00266    if (name.Contains(".C")) {
00267       // form the command
00268       TString command = TString::Format(".x %s/%s",
00269                         gSystem->UnixPathName(fContents->GetDirectory()),
00270                         name.Data());
00271       // and process
00272       gApplication->ProcessLine(command.Data());
00273       UpdateList();
00274    } else {
00275       // if double clicked on a directory, then display it
00276       DisplayDirectory(name);
00277    }
00278    gVirtualX->SetCursor(fContents->GetId(),gVirtualX->CreateCursor(kPointer));
00279 }
00280 
00281 //______________________________________________________________________________
00282 Bool_t TNewChainDlg::ProcessMessage(Long_t msg, Long_t parm1, Long_t)
00283 {
00284    // Process messages for new chain dialog.
00285 
00286    switch (GET_MSG(msg)) {
00287       case kC_COMMAND:
00288          switch (GET_SUBMSG(msg)) {
00289             case kCM_BUTTON:
00290                switch (parm1) {
00291 
00292                   case 0:
00293                      // Apply button
00294                      fOkButton->SetEnabled(kFALSE);
00295                      OnElementSelected(fChain);
00296                      DeleteWindow();
00297                      break;
00298 
00299                   case 1:
00300                      // Close button
00301                      fChain = 0;
00302                      DeleteWindow();
00303                      break;
00304                }
00305                break;
00306             default:
00307                break;
00308          }
00309          break;
00310 
00311       case kC_CONTAINER:
00312          switch (GET_SUBMSG(msg)) {
00313             case kCT_ITEMDBLCLICK:
00314                if (parm1==kButton1)
00315                   OnDoubleClick((TGLVEntry*)fContents->GetLastActive(), parm1);
00316                break;
00317          }
00318          break;
00319       default:
00320          break;
00321    }
00322    return kTRUE;
00323 }
00324 
00325 //______________________________________________________________________________
00326 void TNewChainDlg::CloseWindow()
00327 {
00328    // Close file dialog.
00329 
00330    DeleteWindow();
00331 }
00332 
00333 
00334 //////////////////////////////////////////////////////////////////////////
00335 // New Query Dialog
00336 //////////////////////////////////////////////////////////////////////////
00337 
00338 //______________________________________________________________________________
00339 TNewQueryDlg::TNewQueryDlg(TSessionViewer *gui, Int_t Width, Int_t Height,
00340          TQueryDescription *query, Bool_t editmode) :
00341          TGTransientFrame(gClient->GetRoot(), gui, Width, Height)
00342 {
00343    // Create a new Query dialog, used by the Session Viewer, to Edit a Query if
00344    // the editmode flag is set, or to create a new one if not set.
00345 
00346    Window_t wdummy;
00347    Int_t  ax, ay;
00348    fEditMode = editmode;
00349    fModified = kFALSE;
00350    fChain = 0;
00351    fQuery = query;
00352    if (fQuery && fQuery->fChain) {
00353       fChain = fQuery->fChain;
00354    }
00355    Build(gui);
00356    // if in edit mode, update fields with query description data
00357    if (editmode && query)
00358       UpdateFields(query);
00359    else if (!editmode) {
00360       TQueryDescription *fquery;
00361       fquery = (TQueryDescription *)fViewer->GetActDesc()->fQueries->Last();
00362       if(fquery)
00363          fTxtQueryName->SetText(fquery->fQueryName);
00364       else
00365          fTxtQueryName->SetText("Query 1");
00366    }
00367    MapSubwindows();
00368    Resize(Width, Height);
00369    // hide options frame
00370    fFrmNewQuery->HideFrame(fFrmMore);
00371    fBtnMore->SetText(" More >> ");
00372    SetWMSizeHints(Width+5, Height+25, Width+5, Height+25, 1, 1);
00373    ChangeOptions(GetOptions() | kFixedSize);
00374    Layout();
00375    SetWindowName("Query Dialog");
00376    // Position relative to parent
00377    gVirtualX->TranslateCoordinates( fViewer->GetId(),
00378                                     fClient->GetDefaultRoot()->GetId(),
00379                                     0, 0, ax, ay, wdummy);
00380    Move(ax + fViewer->GetWidth()/2, ay + 35);
00381 }
00382 
00383 //______________________________________________________________________________
00384 TNewQueryDlg::~TNewQueryDlg()
00385 {
00386    // Delete query dialog.
00387 
00388    if (IsZombie()) return;
00389    Cleanup();
00390 }
00391 
00392 //______________________________________________________________________________
00393 void TNewQueryDlg::Build(TSessionViewer *gui)
00394 {
00395    // Build the "new query" dialog.
00396 
00397    TGButton*   btnTmp;
00398    fViewer = gui;
00399    SetLayoutManager(new TGVerticalLayout(this));
00400    SetCleanup(kDeepCleanup);
00401    SetMinWidth(500);
00402    fFrmNewQuery = new TGGroupFrame(this, "New Query");
00403    fFrmNewQuery->SetCleanup(kDeepCleanup);
00404 
00405    AddFrame(fFrmNewQuery, new TGLayoutHints(kLHintsExpandX |
00406          kLHintsExpandY, 2, 2, 2, 2));
00407    fFrmNewQuery->SetLayoutManager(new TGTableLayout(fFrmNewQuery, 6, 5));
00408 
00409    // add "Query Name" label and text entry
00410    fFrmNewQuery->AddFrame(new TGLabel(fFrmNewQuery, "Query Name :"),
00411          new TGTableLayoutHints(0, 1, 0, 1, kLHintsCenterY, 0, 5, 4, 0));
00412    fFrmNewQuery->AddFrame(fTxtQueryName = new TGTextEntry(fFrmNewQuery,
00413          (const char *)0, 1), new TGTableLayoutHints(1, 2, 0, 1,
00414          kLHintsCenterY, 5, 5, 4, 0));
00415 
00416    // add "TChain" label and text entry
00417    fFrmNewQuery->AddFrame(new TGLabel(fFrmNewQuery, "TChain :"),
00418          new TGTableLayoutHints(0, 1, 1, 2, kLHintsCenterY, 0, 5, 4, 0));
00419    fFrmNewQuery->AddFrame(fTxtChain = new TGTextEntry(fFrmNewQuery,
00420          (const char *)0, 2), new TGTableLayoutHints(1, 2, 1, 2,
00421          kLHintsCenterY, 5, 5, 4, 0));
00422    fTxtChain->SetToolTipText("Specify TChain or TDSet from memory or file");
00423    fTxtChain->SetEnabled(kFALSE);
00424    // add "Browse" button
00425    fFrmNewQuery->AddFrame(btnTmp = new TGTextButton(fFrmNewQuery, "Browse..."),
00426          new TGTableLayoutHints(2, 3, 1, 2, kLHintsCenterY, 5, 0, 4, 8));
00427    btnTmp->Connect("Clicked()", "TNewQueryDlg", this, "OnBrowseChain()");
00428 
00429    // add "Selector" label and text entry
00430    fFrmNewQuery->AddFrame(new TGLabel(fFrmNewQuery, "Selector :"),
00431          new TGTableLayoutHints(0, 1, 2, 3, kLHintsCenterY, 0, 5, 0, 0));
00432    fFrmNewQuery->AddFrame(fTxtSelector = new TGTextEntry(fFrmNewQuery,
00433          (const char *)0, 3), new TGTableLayoutHints(1, 2, 2, 3,
00434          kLHintsCenterY, 5, 5, 0, 0));
00435    // add "Browse" button
00436    fFrmNewQuery->AddFrame(btnTmp = new TGTextButton(fFrmNewQuery, "Browse..."),
00437          new TGTableLayoutHints(2, 3, 2, 3, kLHintsCenterY, 5, 0, 0, 8));
00438    btnTmp->Connect("Clicked()", "TNewQueryDlg", this, "OnBrowseSelector()");
00439 
00440    // add "Less <<" ("More >>") button
00441    fFrmNewQuery->AddFrame(fBtnMore = new TGTextButton(fFrmNewQuery, " Less << "),
00442          new TGTableLayoutHints(2, 3, 4, 5, kLHintsCenterY, 5, 5, 4, 0));
00443    fBtnMore->Connect("Clicked()", "TNewQueryDlg", this, "OnNewQueryMore()");
00444 
00445    // add (initially hidden) options frame
00446    fFrmMore = new TGCompositeFrame(fFrmNewQuery, 200, 200);
00447    fFrmMore->SetCleanup(kDeepCleanup);
00448 
00449    fFrmNewQuery->AddFrame(fFrmMore, new TGTableLayoutHints(0, 3, 5, 6,
00450          kLHintsExpandX | kLHintsExpandY));
00451    fFrmMore->SetLayoutManager(new TGTableLayout(fFrmMore, 4, 3));
00452 
00453    // add "Options" label and text entry
00454    fFrmMore->AddFrame(new TGLabel(fFrmMore, "Options :"),
00455          new TGTableLayoutHints(0, 1, 0, 1, kLHintsCenterY, 0, 5, 0, 0));
00456    fFrmMore->AddFrame(fTxtOptions = new TGTextEntry(fFrmMore,
00457          (const char *)0, 4), new TGTableLayoutHints(1, 2, 0, 1, 0, 22,
00458          0, 0, 8));
00459    fTxtOptions->SetText("ASYN");
00460 
00461    // add "Nb Entries" label and number entry
00462    fFrmMore->AddFrame(new TGLabel(fFrmMore, "Nb Entries :"),
00463          new TGTableLayoutHints(0, 1, 1, 2, kLHintsCenterY, 0, 5, 0, 0));
00464    fFrmMore->AddFrame(fNumEntries = new TGNumberEntry(fFrmMore, 0, 5, -1,
00465          TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber,
00466          TGNumberFormat::kNELNoLimits), new TGTableLayoutHints(1, 2, 1, 2,
00467          0, 22, 0, 0, 8));
00468    fNumEntries->SetIntNumber(-1);
00469    // add "First Entry" label and number entry
00470    fFrmMore->AddFrame(new TGLabel(fFrmMore, "First entry :"),
00471          new TGTableLayoutHints(0, 1, 2, 3, kLHintsCenterY, 0, 5, 0, 0));
00472    fFrmMore->AddFrame(fNumFirstEntry = new TGNumberEntry(fFrmMore, 0, 5, -1,
00473          TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
00474          TGNumberFormat::kNELNoLimits), new TGTableLayoutHints(1, 2, 2, 3, 0,
00475          22, 0, 0, 8));
00476 
00477    // add "Event list" label and text entry
00478    fFrmMore->AddFrame(new TGLabel(fFrmMore, "Event list :"),
00479          new TGTableLayoutHints(0, 1, 3, 4, kLHintsCenterY, 0, 5, 0, 0));
00480    fFrmMore->AddFrame(fTxtEventList = new TGTextEntry(fFrmMore,
00481          (const char *)0, 6), new TGTableLayoutHints(1, 2, 3, 4, 0, 22,
00482          5, 0, 0));
00483    // add "Browse" button
00484    fFrmMore->AddFrame(btnTmp = new TGTextButton(fFrmMore, "Browse..."),
00485          new TGTableLayoutHints(2, 3, 3, 4, 0, 6, 0, 0, 8));
00486    btnTmp->Connect("Clicked()", "TNewQueryDlg", this, "OnBrowseEventList()");
00487 
00488    fTxtQueryName->Associate(this);
00489    fTxtChain->Associate(this);
00490    fTxtSelector->Associate(this);
00491    fTxtOptions->Associate(this);
00492    fNumEntries->Associate(this);
00493    fNumFirstEntry->Associate(this);
00494    fTxtEventList->Associate(this);
00495 
00496    fTxtQueryName->Connect("TextChanged(char*)", "TNewQueryDlg", this,
00497                         "SettingsChanged()");
00498    fTxtChain->Connect("TextChanged(char*)", "TNewQueryDlg", this,
00499                         "SettingsChanged()");
00500    fTxtSelector->Connect("TextChanged(char*)", "TNewQueryDlg", this,
00501                         "SettingsChanged()");
00502    fTxtOptions->Connect("TextChanged(char*)", "TNewQueryDlg", this,
00503                         "SettingsChanged()");
00504    fNumEntries->Connect("ValueChanged(Long_t)", "TNewQueryDlg", this,
00505                         "SettingsChanged()");
00506    fNumFirstEntry->Connect("ValueChanged(Long_t)", "TNewQueryDlg", this,
00507                         "SettingsChanged()");
00508    fTxtEventList->Connect("TextChanged(char*)", "TNewQueryDlg", this,
00509                         "SettingsChanged()");
00510 
00511    TGCompositeFrame *tmp;
00512    AddFrame(tmp = new TGCompositeFrame(this, 140, 20, kHorizontalFrame),
00513          new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
00514    tmp->SetCleanup(kDeepCleanup);
00515    // Add "Save" and "Save & Submit" buttons if we are in edition mode
00516    // or "Add" and "Add & Submit" if we are not in edition mode.
00517    if (fEditMode) {
00518       fBtnSave = new TGTextButton(tmp, "Save");
00519       fBtnSubmit = new TGTextButton(tmp, "Save && Submit");
00520    }
00521    else {
00522       fBtnSave = new TGTextButton(tmp, "Add");
00523       fBtnSubmit = new TGTextButton(tmp, "Add && Submit");
00524    }
00525    tmp->AddFrame(fBtnSave, new TGLayoutHints(kLHintsLeft | kLHintsExpandX,
00526          3, 3, 3, 3));
00527    tmp->AddFrame(fBtnSubmit, new TGLayoutHints(kLHintsLeft | kLHintsExpandX,
00528          3, 3, 3, 3));
00529    fBtnSave->Connect("Clicked()", "TNewQueryDlg", this, "OnBtnSaveClicked()");
00530    fBtnSubmit->Connect("Clicked()", "TNewQueryDlg", this, "OnBtnSubmitClicked()");
00531    tmp->AddFrame(fBtnClose = new TGTextButton(tmp, "Close"),
00532          new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 3, 3, 3, 3));
00533    fBtnClose->Connect("Clicked()", "TNewQueryDlg", this, "OnBtnCloseClicked()");
00534    fBtnSave->SetState(kButtonDisabled);
00535    fBtnSubmit->SetState(kButtonDisabled);
00536 }
00537 
00538 //______________________________________________________________________________
00539 void TNewQueryDlg::CloseWindow()
00540 {
00541    // Called when window is closed via the window manager.
00542 
00543    DeleteWindow();
00544 }
00545 
00546 //______________________________________________________________________________
00547 void TNewQueryDlg::OnNewQueryMore()
00548 {
00549    // Show/hide options frame and update button text accordingly.
00550 
00551    if (fFrmNewQuery->IsVisible(fFrmMore)) {
00552       fFrmNewQuery->HideFrame(fFrmMore);
00553       fBtnMore->SetText(" More >> ");
00554    }
00555    else {
00556       fFrmNewQuery->ShowFrame(fFrmMore);
00557       fBtnMore->SetText(" Less << ");
00558    }
00559 }
00560 
00561 //______________________________________________________________________________
00562 void TNewQueryDlg::OnBrowseChain()
00563 {
00564    // Call new chain dialog.
00565 
00566    TNewChainDlg *dlg = new TNewChainDlg(fClient->GetRoot(), this);
00567    dlg->Connect("OnElementSelected(TObject *)", "TNewQueryDlg",
00568          this, "OnElementSelected(TObject *)");
00569 }
00570 
00571 //____________________________________________________________________________
00572 void TNewQueryDlg::OnElementSelected(TObject *obj)
00573 {
00574    // Handle OnElementSelected signal coming from new chain dialog.
00575 
00576    if (obj) {
00577       fChain = obj;
00578       if (obj->IsA() == TChain::Class())
00579          fTxtChain->SetText(((TChain *)fChain)->GetName());
00580       else if (obj->IsA() == TDSet::Class())
00581          fTxtChain->SetText(((TDSet *)fChain)->GetObjName());
00582    }
00583 }
00584 
00585 //______________________________________________________________________________
00586 void TNewQueryDlg::OnBrowseSelector()
00587 {
00588    // Open file browser to choose selector macro.
00589 
00590    TGFileInfo fi;
00591    fi.fFileTypes = gFileTypes;
00592    new TGFileDialog(fClient->GetRoot(), this, kFDOpen, &fi);
00593    if (!fi.fFilename) return;
00594    fTxtSelector->SetText(gSystem->UnixPathName(fi.fFilename));
00595 }
00596 
00597 //______________________________________________________________________________
00598 void TNewQueryDlg::OnBrowseEventList()
00599 {
00600    //Browse event list
00601 
00602 }
00603 
00604 //______________________________________________________________________________
00605 void TNewQueryDlg::OnBtnSaveClicked()
00606 {
00607    // Save current settings in main session viewer.
00608 
00609    // if we are in edition mode and query description is valid,
00610    // use it, otherwise create a new one
00611    TQueryDescription *newquery;
00612    if (fEditMode && fQuery)
00613       newquery = fQuery;
00614    else
00615       newquery = new TQueryDescription();
00616 
00617    // update query description fields
00618    newquery->fSelectorString  = fTxtSelector->GetText();
00619    if (fChain) {
00620       newquery->fTDSetString  = fChain->GetName();
00621       newquery->fChain        = fChain;
00622    }
00623    else {
00624       newquery->fTDSetString = "";
00625       newquery->fChain       = 0;
00626    }
00627    newquery->fQueryName      = fTxtQueryName->GetText();
00628    newquery->fOptions.Form("%s",fTxtOptions->GetText());
00629    newquery->fNoEntries      = fNumEntries->GetIntNumber();
00630    newquery->fFirstEntry     = fNumFirstEntry->GetIntNumber();
00631    newquery->fNbFiles        = 0;
00632    newquery->fResult         = 0;
00633 
00634    if (newquery->fChain) {
00635       if (newquery->fChain->IsA() == TChain::Class())
00636          newquery->fNbFiles = ((TChain *)newquery->fChain)->GetListOfFiles()->GetEntriesFast();
00637       else if (newquery->fChain->IsA() == TDSet::Class())
00638          newquery->fNbFiles = ((TDSet *)newquery->fChain)->GetListOfElements()->GetSize();
00639    }
00640    if (!fEditMode) {
00641       // if not in editor mode, create a new list tree item
00642       // and set user data to the newly created query description
00643       newquery->fResult = 0;
00644       newquery->fStatus = TQueryDescription::kSessionQueryCreated;
00645 
00646       TQueryDescription *fquery;
00647       fquery = (TQueryDescription *)fViewer->GetActDesc()->fQueries->FindObject(newquery->fQueryName);
00648       while (fquery) {
00649          int e = 1, j = 0, idx = 0;
00650          const char *name = fquery->fQueryName;
00651          for (int i=strlen(name)-1;i>0;i--) {
00652             if (isdigit(name[i])) {
00653                idx += (name[i]-'0') * e;
00654                e *= 10;
00655                j++;
00656             }
00657             else
00658                break;
00659          }
00660          if (idx > 0) {
00661             idx++;
00662             newquery->fQueryName.Remove(strlen(name)-j,j);
00663             newquery->fQueryName.Append(Form("%d",idx));
00664          }
00665          else
00666             newquery->fQueryName.Append(" 1");
00667          fquery = (TQueryDescription *)fViewer->GetActDesc()->fQueries->FindObject(newquery->fQueryName);
00668       }
00669       fTxtQueryName->SetText(newquery->fQueryName);
00670       fViewer->GetActDesc()->fQueries->Add((TObject *)newquery);
00671       TGListTreeItem *item = fViewer->GetSessionHierarchy()->FindChildByData(
00672          fViewer->GetSessionItem(), fViewer->GetActDesc());
00673       TGListTreeItem *item2 = fViewer->GetSessionHierarchy()->AddItem(item,
00674          newquery->fQueryName, fViewer->GetQueryConPict(), fViewer->GetQueryConPict());
00675       item2->SetUserData(newquery);
00676       fViewer->GetSessionHierarchy()->OpenItem(item);
00677       fViewer->GetSessionHierarchy()->ClearHighlighted();
00678       fViewer->GetSessionHierarchy()->HighlightItem(item2);
00679       fViewer->GetSessionHierarchy()->SetSelected(item2);
00680       fViewer->OnListTreeClicked(item2, 1, 0, 0);
00681    }
00682    else {
00683       // else if in editor mode, just update user data with modified
00684       // query description
00685       TGListTreeItem *item = fViewer->GetSessionHierarchy()->GetSelected();
00686       fViewer->GetSessionHierarchy()->RenameItem(item, newquery->fQueryName);
00687       item->SetUserData(newquery);
00688    }
00689    // update list tree
00690    fClient->NeedRedraw(fViewer->GetSessionHierarchy());
00691    fTxtQueryName->SelectAll();
00692    fTxtQueryName->SetFocus();
00693    fViewer->WriteConfiguration();
00694    fModified = kFALSE;
00695 }
00696 
00697 //______________________________________________________________________________
00698 void TNewQueryDlg::OnBtnSubmitClicked()
00699 {
00700    // Save and submit query description.
00701 
00702    OnBtnSaveClicked();
00703    fViewer->GetQueryFrame()->OnBtnSubmit();
00704 }
00705 
00706 //______________________________________________________________________________
00707 void TNewQueryDlg::OnBtnCloseClicked()
00708 {
00709    // Close dialog.
00710 
00711    Int_t result = kMBNo;
00712    if (fModified) {
00713       new TGMsgBox(fClient->GetRoot(), this, "Modified Settings",
00714                    "Do you wish to SAVE changes ?", 0,
00715                    kMBYes | kMBNo | kMBCancel, &result);
00716       if (result == kMBYes) {
00717          OnBtnSaveClicked();
00718       }
00719    }
00720    if (result == kMBNo) {
00721       DeleteWindow();
00722    }
00723 }
00724 
00725 //______________________________________________________________________________
00726 void TNewQueryDlg::Popup()
00727 {
00728    // Display dialog and set focus to query name text entry.
00729 
00730    MapWindow();
00731    fTxtQueryName->SetFocus();
00732 }
00733 
00734 //______________________________________________________________________________
00735 void TNewQueryDlg::SettingsChanged()
00736 {
00737    // Settings have changed, update GUI accordingly.
00738 
00739    if (fEditMode && fQuery) {
00740       if ((strcmp(fQuery->fSelectorString.Data(), fTxtSelector->GetText())) ||
00741           (strcmp(fQuery->fQueryName.Data(), fTxtQueryName->GetText())) ||
00742           (strcmp(fQuery->fOptions.Data(), fTxtOptions->GetText())) ||
00743           (fQuery->fNoEntries  != fNumEntries->GetIntNumber()) ||
00744           (fQuery->fFirstEntry != fNumFirstEntry->GetIntNumber()) ||
00745           (fQuery->fChain != fChain)) {
00746          fModified = kTRUE;
00747       }
00748       else {
00749          fModified = kFALSE;
00750       }
00751    }
00752    else {
00753       if ((fTxtQueryName->GetText()) &&
00754          ((fTxtQueryName->GetText()) ||
00755           (fTxtChain->GetText())))
00756          fModified = kTRUE;
00757       else
00758          fModified = kFALSE;
00759    }
00760    if (fModified) {
00761       fBtnSave->SetState(kButtonUp);
00762       fBtnSubmit->SetState(kButtonUp);
00763    }
00764    else {
00765       fBtnSave->SetState(kButtonDisabled);
00766       fBtnSubmit->SetState(kButtonDisabled);
00767    }
00768 }
00769 
00770 //______________________________________________________________________________
00771 void TNewQueryDlg::UpdateFields(TQueryDescription *desc)
00772 {
00773    // Update entry fields with query description values.
00774 
00775    fQuery = desc;
00776    fTxtQueryName->SetText(desc->fQueryName);
00777    fTxtChain->SetText("");
00778    if (desc->fChain)
00779       fTxtChain->SetText(desc->fTDSetString);
00780    fTxtSelector->SetText(desc->fSelectorString);
00781    fTxtOptions->SetText(desc->fOptions);
00782    fNumEntries->SetIntNumber(desc->fNoEntries);
00783    fNumFirstEntry->SetIntNumber(desc->fFirstEntry);
00784    fTxtEventList->SetText(desc->fEventList);
00785 }
00786 //______________________________________________________________________________
00787 Bool_t TNewQueryDlg::ProcessMessage(Long_t msg, Long_t parm1, Long_t)
00788 {
00789    // Process messages for new query dialog.
00790    // Essentially used to navigate between text entry fields.
00791 
00792    switch (GET_MSG(msg)) {
00793       case kC_TEXTENTRY:
00794          switch (GET_SUBMSG(msg)) {
00795             case kTE_ENTER:
00796             case kTE_TAB:
00797                switch (parm1) {
00798                   case 1: // Query Name
00799                      fTxtChain->SelectAll();
00800                      fTxtChain->SetFocus();
00801                      break;
00802                   case 2: // Chain Name
00803                      fTxtSelector->SelectAll();
00804                      fTxtSelector->SetFocus();
00805                      break;
00806                   case 3: // Selector Name
00807                      fTxtOptions->SelectAll();
00808                      fTxtOptions->SetFocus();
00809                      break;
00810                   case 4: // Options
00811                      fTxtEventList->SelectAll();
00812                      fTxtEventList->SetFocus();
00813                      break;
00814                   case 6: // Event List
00815                      fTxtQueryName->SelectAll();
00816                      fTxtQueryName->SetFocus();
00817                      break;
00818                }
00819                break;
00820 
00821             default:
00822                break;
00823          }
00824          break;
00825 
00826       default:
00827          break;
00828    }
00829    return kTRUE;
00830 }
00831 
00832 //////////////////////////////////////////////////////////////////////////
00833 // Upload DataSet Dialog
00834 //////////////////////////////////////////////////////////////////////////
00835 
00836 //______________________________________________________________________________
00837 TUploadDataSetDlg::TUploadDataSetDlg(TSessionViewer *gui, Int_t w, Int_t h) :
00838          TGTransientFrame(gClient->GetRoot(), gui, w, h)
00839 {
00840    // Create a Upload DataSet dialog box. Used to create and upload a dataset
00841 
00842    fUploading = kFALSE;
00843    if (!gui) return;
00844    fViewer = gui;
00845 
00846    SetCleanup(kDeepCleanup);
00847    TGHorizontalFrame *hFrame1 = new TGHorizontalFrame(this);
00848    hFrame1->SetCleanup(kDeepCleanup);
00849    hFrame1->AddFrame(new TGLabel(hFrame1,"Name of DataSet :"),
00850                      new TGLayoutHints(kLHintsLeft | kLHintsCenterY,
00851                      10, 10, 5, 5));
00852    fDSetName = new TGTextEntry(hFrame1, new TGTextBuffer(50));
00853    fDSetName->SetText("DataSet1");
00854    fDSetName->Resize(150, fDSetName->GetDefaultHeight());
00855    hFrame1->AddFrame(fDSetName, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,
00856                      10, 10, 5, 5));
00857    AddFrame(hFrame1, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,
00858             2, 2, 2, 2));
00859 
00860    // "DataSet Files" group frame
00861    TGGroupFrame *groupFrame1 = new TGGroupFrame(this, "DataSet Files");
00862    groupFrame1->SetCleanup(kDeepCleanup);
00863 
00864    // horizontal frame for files location URL
00865    TGHorizontalFrame *hFrame11 = new TGHorizontalFrame(groupFrame1);
00866    hFrame11->SetCleanup(kDeepCleanup);
00867    hFrame11->AddFrame(new TGLabel(hFrame11,"Location URL :"),
00868                      new TGLayoutHints(kLHintsLeft | kLHintsCenterY,
00869                      10, 10, 5, 5));
00870    fLocationURL = new TGTextEntry(hFrame11, new TGTextBuffer(150));
00871    fLocationURL->SetToolTipText("Enter location URL ( i.e \" root://lxplus//castor/cern.ch/user/n/name/*.root \" )");
00872    fLocationURL->Resize(210, fLocationURL->GetDefaultHeight());
00873    hFrame11->AddFrame(fLocationURL, new TGLayoutHints(kLHintsLeft |
00874                       kLHintsCenterY, 10, 10, 5, 5));
00875    fAddButton = new TGTextButton(hFrame11, " Add >> ", 0);
00876    fAddButton->SetToolTipText("Add file(s) to the list");
00877    fAddButton->Associate(this);
00878    hFrame11->AddFrame(fAddButton, new TGLayoutHints(kLHintsLeft | kLHintsCenterY |
00879                       kLHintsExpandX, 5, 10, 5, 5));
00880    groupFrame1->AddFrame(hFrame11, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00881                          kLHintsExpandX, 2, 2, 2, 2));
00882    // horizontal frame for the list view displaying list of files
00883    // and for a vertical frame with control buttons
00884    TGHorizontalFrame *hFrame2 = new TGHorizontalFrame(groupFrame1);
00885    hFrame2->SetCleanup(kDeepCleanup);
00886 
00887    // list view
00888    // Add TGListView used to show list of files
00889    fListView = new TGListView(hFrame2, 300, 100);
00890    fLVContainer = new TGLVContainer(fListView, kSunkenFrame, GetWhitePixel());
00891    fLVContainer->Associate(fListView);
00892    fLVContainer->SetViewMode(kLVDetails);
00893    fLVContainer->SetCleanup(kDeepCleanup);
00894    fLVContainer->SetHeaders(1);
00895    fLVContainer->SetHeader("File Name", kTextLeft, kTextLeft , 0);
00896    hFrame2->AddFrame(fListView, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00897                      kLHintsExpandX | kLHintsExpandY, 2, 2, 10, 10));
00898 
00899    // vertical frame for control buttons
00900    TGVerticalFrame *vFrame1 = new TGVerticalFrame(hFrame2);
00901    vFrame1->SetCleanup(kDeepCleanup);
00902 
00903    fBrowseButton = new TGTextButton(vFrame1, " Browse... ", 1);
00904    fBrowseButton->SetToolTipText("Add file(s) to the list");
00905    fBrowseButton->Associate(this);
00906    vFrame1->AddFrame(fBrowseButton, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00907                      kLHintsExpandX, 15, 5, 5, 5));
00908    fRemoveButton = new TGTextButton(vFrame1, " Remove ", 2);
00909    fRemoveButton->SetToolTipText("Remove selected file from the list");
00910    fRemoveButton->Associate(this);
00911    vFrame1->AddFrame(fRemoveButton, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00912                      kLHintsExpandX, 15, 5, 5, 5));
00913    fClearButton = new TGTextButton(vFrame1, " Clear ", 3);
00914    fClearButton->SetToolTipText("Clear list of files");
00915    fClearButton->Associate(this);
00916    vFrame1->AddFrame(fClearButton, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00917                      kLHintsExpandX, 15, 5, 5, 5));
00918 
00919    fOverwriteDSet = new TGCheckButton(vFrame1, "Overwrite DataSet");
00920    fOverwriteDSet->SetToolTipText("Overwrite DataSet");
00921    vFrame1->AddFrame(fOverwriteDSet, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00922                      kLHintsExpandX, 15, 5, 5, 5));
00923    fOverwriteFiles = new TGCheckButton(vFrame1, "Overwrite Files");
00924    fOverwriteFiles->SetToolTipText("Overwrite files in DataSet");
00925    vFrame1->AddFrame(fOverwriteFiles, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00926                      kLHintsExpandX, 15, 5, 5, 5));
00927    fAppendFiles = new TGCheckButton(vFrame1, "Append Files");
00928    fAppendFiles->SetToolTipText("Append files in DataSet");
00929    vFrame1->AddFrame(fAppendFiles, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00930                      kLHintsExpandX, 15, 5, 5, 5));
00931 
00932    fOverwriteDSet->Connect("Toggled(Bool_t)", "TUploadDataSetDlg", this,
00933          "OnOverwriteDataset(Bool_t)");
00934    fOverwriteFiles->Connect("Toggled(Bool_t)", "TUploadDataSetDlg", this,
00935          "OnOverwriteFiles(Bool_t)");
00936    fAppendFiles->Connect("Toggled(Bool_t)", "TUploadDataSetDlg", this,
00937          "OnAppendFiles(Bool_t)");
00938 
00939    hFrame2->AddFrame(vFrame1, new TGLayoutHints(kLHintsRight | kLHintsTop |
00940                      kLHintsExpandY, 2, 2, 2, 2));
00941    groupFrame1->AddFrame(hFrame2, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00942                          kLHintsExpandX | kLHintsExpandY, 2, 2, 2, 2));
00943 
00944    AddFrame(groupFrame1, new TGLayoutHints(kLHintsLeft | kLHintsTop |
00945             kLHintsExpandX, 5, 5, 2, 2));
00946 
00947    // horizontal frame for destination URL
00948    TGHorizontalFrame *hFrame3 = new TGHorizontalFrame(this);
00949    hFrame3->SetCleanup(kDeepCleanup);
00950    hFrame3->AddFrame(new TGLabel(hFrame3,"Destination URL :"),
00951                      new TGLayoutHints(kLHintsLeft | kLHintsCenterY,
00952                      15, 10, 5, 5));
00953    fDestinationURL = new TGTextEntry(hFrame3, new TGTextBuffer(150));
00954    if (fViewer->GetActDesc()->fConnected &&
00955       fViewer->GetActDesc()->fAttached &&
00956       fViewer->GetActDesc()->fProof &&
00957       fViewer->GetActDesc()->fProof->IsValid()) {
00958       // const char *dest = fViewer->GetActDesc()->fProof->GetDataPoolUrl();
00959       // fDestinationURL->SetText(dest);
00960    }
00961    fDestinationURL->SetToolTipText("Enter destination URL ( relative to \" root://host//proofpool/user/ \" )");
00962    fDestinationURL->Resize(305, fDestinationURL->GetDefaultHeight());
00963    hFrame3->AddFrame(fDestinationURL, new TGLayoutHints(kLHintsLeft |
00964                      kLHintsCenterY, 10, 15, 5, 5));
00965    AddFrame(hFrame3, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,
00966             2, 2, 2, 2));
00967 
00968    // horizontal frame for upload and close buttons
00969    TGHorizontalFrame *hFrame4 = new TGHorizontalFrame(this);
00970    hFrame4->SetCleanup(kDeepCleanup);
00971    fUploadButton = new TGTextButton(hFrame4, "Upload DataSet", 10);
00972    fUploadButton->SetToolTipText("Upload the dataset to the cluster");
00973    fUploadButton->Associate(this);
00974    hFrame4->AddFrame(fUploadButton, new TGLayoutHints(kLHintsLeft | kLHintsCenterY |
00975                      kLHintsExpandX, 15, 15, 2, 2));
00976    fCloseDlgButton = new TGTextButton(hFrame4, "Close Dialog", 11);
00977    fCloseDlgButton->SetToolTipText("Close the dialog");
00978    fCloseDlgButton->Associate(this);
00979    hFrame4->AddFrame(fCloseDlgButton, new TGLayoutHints(kLHintsLeft | kLHintsCenterY |
00980                      kLHintsExpandX, 15, 15, 2, 2));
00981    AddFrame(hFrame4, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX,
00982             2, 2, 2, 2));
00983 
00984    // position relative to the parent's window
00985    Window_t wdummy;
00986    Int_t  ax, ay;
00987    gVirtualX->TranslateCoordinates( gui->GetId(),
00988                                     fClient->GetDefaultRoot()->GetId(),
00989                                     0, 0, ax, ay, wdummy);
00990    Move(ax + 250, ay + 200);
00991 
00992    SetWindowName("Upload DataSet Dialog");
00993    MapSubwindows();
00994    MapWindow();
00995 
00996    Resize(w, h);
00997    SetWMSizeHints(w+5, h+5, w+5, h+5, 1, 1);
00998    ChangeOptions(GetOptions() | kFixedSize);
00999    Layout();
01000 }
01001 
01002 //______________________________________________________________________________
01003 TUploadDataSetDlg::~TUploadDataSetDlg()
01004 {
01005    // Delete chain dialog.
01006    if (IsZombie()) return;
01007    Cleanup();
01008 }
01009 
01010 //______________________________________________________________________________
01011 void TUploadDataSetDlg::CloseWindow()
01012 {
01013    // Close upload dataset dialog.
01014 
01015    if (!fUploading)
01016       DeleteWindow();
01017 }
01018 
01019 //______________________________________________________________________________
01020 Bool_t TUploadDataSetDlg::ProcessMessage(Long_t msg, Long_t parm1, Long_t)
01021 {
01022    // Process messages for upload dataset dialog.
01023 
01024    switch (GET_MSG(msg)) {
01025       case kC_COMMAND:
01026          switch (GET_SUBMSG(msg)) {
01027             case kCM_BUTTON:
01028                switch (parm1) {
01029                   case 0:
01030                      // Add button
01031                      if (fLocationURL->GetText())
01032                         AddFiles(fLocationURL->GetText());
01033                      break;
01034                   case 1:
01035                      // Add button
01036                      BrowseFiles();
01037                      break;
01038                   case 2:
01039                      // Remove button
01040                      RemoveFile();
01041                      break;
01042                   case 3:
01043                      // Clear button
01044                      ClearFiles();
01045                      break;
01046                   case 10:
01047                      // Upload button
01048                      UploadDataSet();
01049                      break;
01050                   case 11:
01051                      // Close button
01052                      CloseWindow();
01053                      break;
01054                }
01055                break;
01056             default:
01057                break;
01058          }
01059          break;
01060 
01061       default:
01062          break;
01063    }
01064    return kTRUE;
01065 }
01066 
01067 //______________________________________________________________________________
01068 void TUploadDataSetDlg::AddFiles(const char *fileName)
01069 {
01070    // Add File name(s) from the file location URL to the list view.
01071 
01072    if (strlen(fileName) < 5)
01073       return;
01074    if (strstr(fileName,"*.")) {
01075       // wildcarding case
01076       void *filesDir = gSystem->OpenDirectory(gSystem->DirName(fileName));
01077       const char* ent;
01078       TString filesExp(gSystem->BaseName(fileName));
01079       filesExp.ReplaceAll("*",".*");
01080       TRegexp rg(filesExp);
01081       while ((ent = gSystem->GetDirEntry(filesDir))) {
01082          TString entryString(ent);
01083          if (entryString.Index(rg) != kNPOS &&
01084              gSystem->AccessPathName(Form("%s/%s", gSystem->DirName(fileName),
01085                 ent), kReadPermission) == kFALSE) {
01086             TString text = TString::Format("%s/%s",
01087                gSystem->UnixPathName(gSystem->DirName(fileName)), ent);
01088             if (!fLVContainer->FindItem(text.Data())) {
01089                TGLVEntry *entry = new TGLVEntry(fLVContainer, text.Data(), text.Data());
01090                entry->SetPictures(gClient->GetPicture("rootdb_t.xpm"),
01091                                   gClient->GetPicture("rootdb_t.xpm"));
01092                fLVContainer->AddItem(entry);
01093             }
01094          }
01095       }
01096    }
01097    else {
01098       // single file
01099       if (!fLVContainer->FindItem(fileName)) {
01100          TGLVEntry *entry = new TGLVEntry(fLVContainer, fileName, fileName);
01101          entry->SetPictures(gClient->GetPicture("rootdb_t.xpm"),
01102                             gClient->GetPicture("rootdb_t.xpm"));
01103          fLVContainer->AddItem(entry);
01104       }
01105    }
01106    // update list view
01107    fListView->AdjustHeaders();
01108    fListView->Layout();
01109    fClient->NeedRedraw(fLVContainer);
01110 }
01111 
01112 //______________________________________________________________________________
01113 void TUploadDataSetDlg::AddFiles(TList *fileList)
01114 {
01115    // Add File name(s) from the file location URL to the list view.
01116 
01117    TObjString *el;
01118    TIter next(fileList);
01119    while ((el = (TObjString *) next())) {
01120       TString fileName = TString::Format("%s/%s",
01121                   gSystem->UnixPathName(gSystem->DirName(el->GetString())),
01122                   gSystem->BaseName(el->GetString()));
01123       // single file
01124       if (!fLVContainer->FindItem(fileName.Data())) {
01125          TGLVEntry *entry = new TGLVEntry(fLVContainer, fileName.Data(), fileName.Data());
01126          entry->SetPictures(gClient->GetPicture("rootdb_t.xpm"),
01127                             gClient->GetPicture("rootdb_t.xpm"));
01128          fLVContainer->AddItem(entry);
01129       }
01130    }
01131    // update list view
01132    fListView->AdjustHeaders();
01133    fListView->Layout();
01134    fClient->NeedRedraw(fLVContainer);
01135 }
01136 
01137 //______________________________________________________________________________
01138 void TUploadDataSetDlg::BrowseFiles()
01139 {
01140    // Opens the TGFileDialog to allow user to select local file(s) to be added
01141    // in the list view of dataset files.
01142 
01143    TGFileInfo fi;
01144    fi.fFileTypes = gDatasetTypes;
01145    fi.fFilename  = strdup("*.root");
01146    new TGFileDialog(fClient->GetRoot(), this, kFDOpen, &fi);
01147    if (fi.fMultipleSelection && fi.fFileNamesList) {
01148       AddFiles(fi.fFileNamesList);
01149    }
01150    else if (fi.fFilename) {
01151       AddFiles(fi.fFilename);
01152    }
01153 }
01154 
01155 //______________________________________________________________________________
01156 void TUploadDataSetDlg::ClearFiles()
01157 {
01158    // Clear content of the list view.
01159 
01160    fLVContainer->RemoveAll();
01161    fListView->Layout();
01162    // update list view
01163    fClient->NeedRedraw(fLVContainer);
01164 }
01165 
01166 //______________________________________________________________________________
01167 void TUploadDataSetDlg::OnOverwriteDataset(Bool_t on)
01168 {
01169    // Notification of Overwrite Dataset check button.
01170 
01171    if (on && fAppendFiles->IsOn())
01172       fAppendFiles->SetState(kButtonUp);
01173 }
01174 
01175 //______________________________________________________________________________
01176 void TUploadDataSetDlg::OnOverwriteFiles(Bool_t)
01177 {
01178    // Notification of Overwrite Files check button.
01179 
01180 }
01181 
01182 //______________________________________________________________________________
01183 void TUploadDataSetDlg::OnAppendFiles(Bool_t on)
01184 {
01185    // Notification of Append Files check button.
01186 
01187    if (on && fOverwriteDSet->IsOn())
01188       fOverwriteDSet->SetState(kButtonUp);
01189 }
01190 
01191 //______________________________________________________________________________
01192 void TUploadDataSetDlg::RemoveFile()
01193 {
01194    // Remove the selected entry from the list view.
01195 
01196    TGFrame *item = (TGFrame *)fLVContainer->GetLastActive();
01197    fLVContainer->RemoveItem(item);
01198    // update list view
01199    fListView->AdjustHeaders();
01200    fListView->Layout();
01201    fClient->NeedRedraw(fLVContainer);
01202 }
01203 
01204 //______________________________________________________________________________
01205 void TUploadDataSetDlg::UploadDataSet()
01206 {
01207    // Upload the dataset to the server.
01208 
01209    Int_t retval;
01210    TString fileList;
01211    const char *dsetName = fDSetName->GetText();
01212    const char *destination = fDestinationURL->GetText();
01213    UInt_t flags = 0;
01214    TList *skippedFiles = new TList();
01215    TList *datasetFiles = new TList();
01216 
01217    if (fUploading)
01218       return;
01219    if (!fViewer->GetActDesc()->fConnected ||
01220        !fViewer->GetActDesc()->fAttached ||
01221        !fViewer->GetActDesc()->fProof ||
01222        !fViewer->GetActDesc()->fProof->IsValid()) {
01223       return;
01224    }
01225    // Format upload flags with user selection
01226    if (fOverwriteDSet->IsOn())
01227       flags |= TProof::kOverwriteDataSet;
01228    else
01229       flags |= TProof::kNoOverwriteDataSet;
01230    if (fOverwriteFiles->IsOn())
01231       flags |= TProof::kOverwriteAllFiles;
01232    else
01233       flags |= TProof::kOverwriteNoFiles;
01234    if (fAppendFiles->IsOn()) {
01235       flags |= TProof::kAppend;
01236       if (flags & TProof::kNoOverwriteDataSet)
01237          flags &= ~TProof::kNoOverwriteDataSet;
01238    }
01239 
01240    Int_t ret = 0;
01241    TIter next(fLVContainer->GetList());
01242    TGFrameElement *el;
01243    TGLVEntry *entry;
01244 
01245    while ((el = (TGFrameElement *)next())) {
01246       entry = (TGLVEntry *) el->fFrame;
01247       const char *fname = gSystem->UnixPathName(entry->GetTitle());
01248       datasetFiles->Add(new TFileInfo(fname));
01249    }
01250    fUploading = kTRUE;
01251    fUploadButton->SetState(kButtonDisabled);
01252    fCloseDlgButton->SetState(kButtonDisabled);
01253 
01254    if (strlen(destination) < 2) destination = 0;
01255    ret = fViewer->GetActDesc()->fProof->UploadDataSet(dsetName,
01256                   datasetFiles, destination, flags, skippedFiles);
01257    if (ret == TProof::kDataSetExists) {
01258       // ask user what to do :
01259       // cancel/overwrite and change option
01260       new TGMsgBox(fClient->GetRoot(), this, "Upload DataSet",
01261                    TString::Format("The dataset \"%s\" already exists on the cluster ! Overwrite ?",
01262                    dsetName), kMBIconQuestion, kMBYes | kMBNo | kMBCancel | kMBAppend,
01263                    &retval);
01264       if (retval == kMBYes) {
01265          ret = fViewer->GetActDesc()->fProof->UploadDataSet(dsetName,
01266                           datasetFiles, destination,
01267                           TProof::kOverwriteDataSet |
01268                           TProof::kOverwriteNoFiles,
01269                           skippedFiles);
01270       }
01271       if (retval == kMBAppend) {
01272          ret = fViewer->GetActDesc()->fProof->UploadDataSet(dsetName,
01273                           datasetFiles, destination,
01274                           TProof::kAppend |
01275                           TProof::kOverwriteNoFiles,
01276                           skippedFiles);
01277       }
01278    }
01279    if (ret == TProof::kError) {
01280       // Inform user
01281       new TGMsgBox(fClient->GetRoot(), this, "Upload DataSet",
01282                    "Failed uploading dataset/files to the cluster",
01283                    kMBIconExclamation, kMBOk, &retval);
01284       fUploading = kFALSE;
01285       fUploadButton->SetState(kButtonUp);
01286       fCloseDlgButton->SetState(kButtonUp);
01287       return;
01288    }
01289    // Here we cope with files that existed on the cluster and were skipped.
01290    if (skippedFiles->GetSize()) {
01291       TIter nexts(skippedFiles);
01292       while (TFileInfo *obj = (TFileInfo*)nexts()) {
01293          // Notify user that file: obj->GetFirstUrl()->GetUrl() exists on
01294          // the cluster and ask user what to do
01295          new TGMsgBox(fClient->GetRoot(), this, "Upload DataSet",
01296                       TString::Format("The file \"%s\" already exists on the cluster ! Overwrite ?",
01297                       obj->GetFirstUrl()->GetUrl()), kMBIconQuestion,
01298                       kMBYes | kMBNo | kMBYesAll | kMBNoAll | kMBDismiss, &retval);
01299          if (retval == kMBYesAll) {
01300             ret = fViewer->GetActDesc()->fProof->UploadDataSet(dsetName,
01301                            skippedFiles, destination,
01302                            TProof::kAppend |
01303                            TProof::kOverwriteAllFiles);
01304             if (ret == TProof::kError) {
01305                // Inform user
01306                new TGMsgBox(fClient->GetRoot(), this, "Upload DataSet",
01307                             TString::Format("Failed uploading \"%s\" to the cluster",
01308                             obj->GetFirstUrl()->GetUrl()), kMBIconExclamation,
01309                             kMBOk, &retval);
01310             }
01311             else {
01312                new TGMsgBox(fClient->GetRoot(), this, "Upload DataSet",
01313                             "Files have been succesfully uploaded to the cluster",
01314                             kMBIconAsterisk, kMBOk, &retval);
01315             }
01316             fUploading = kFALSE;
01317             fUploadButton->SetState(kButtonUp);
01318             fCloseDlgButton->SetState(kButtonUp);
01319             return;
01320          }
01321          if ((retval == kMBNoAll) || (retval == kMBDismiss)) {
01322             break;
01323          }
01324          if (retval == kMBYes) {
01325             // Append one file to the dataSet
01326             ret = fViewer->GetActDesc()->fProof->UploadDataSet(dsetName,
01327                   obj->GetFirstUrl()->GetUrl(), destination,
01328                   TProof::kAppend | TProof::kOverwriteAllFiles);
01329             if (ret == TProof::kError) {
01330                // Inform user
01331                new TGMsgBox(fClient->GetRoot(), this, "Upload DataSet",
01332                             TString::Format("Failed uploading \"%s\" to the cluster",
01333                             obj->GetFirstUrl()->GetUrl()), kMBIconExclamation,
01334                             kMBOk, &retval);
01335             }
01336             else {
01337                new TGMsgBox(fClient->GetRoot(), this, "Upload DataSet",
01338                             "Files have been succesfully uploaded to the cluster",
01339                             kMBIconAsterisk, kMBOk, &retval);
01340             }
01341          }
01342       }
01343       skippedFiles->Clear();
01344    }
01345    else {
01346       new TGMsgBox(fClient->GetRoot(), this, "Upload DataSet",
01347                    "Files have been succesfully uploaded to the cluster",
01348                    kMBIconAsterisk, kMBOk, &retval);
01349    }
01350    // finally, update list of datasets in session viewer
01351    fViewer->GetSessionFrame()->UpdateListOfDataSets();
01352    fUploading = kFALSE;
01353    fUploadButton->SetState(kButtonUp);
01354    fCloseDlgButton->SetState(kButtonUp);
01355 }
01356 

Generated on Tue Jul 5 14:22:42 2011 for ROOT_528-00b_version by  doxygen 1.5.1