From b026e326c652be35e145ffa44af30d3e13f505f4 Mon Sep 17 00:00:00 2001
From: Fons Rademakers <Fons.Rademakers@cern.ch>
Date: Thu, 1 Feb 2007 16:55:52 +0000
Subject: [PATCH] From Bertrand: - Implement this feature request:
 https://savannah.cern.ch/bugs/?16887 - Fix the bug reported at:
 https://savannah.cern.ch/bugs/?20644

git-svn-id: http://root.cern.ch/svn/root/trunk@17624 27541ba8-7e3a-0410-8455-c3a389f83636
---
 proof/inc/TSessionDialogs.h           |  6 +-
 proof/inc/TSessionViewer.h            |  5 +-
 proof/src/TSessionDialogs.cxx         | 79 ++++++++++++++++++++++++--
 proof/src/TSessionViewer.cxx          | 81 ++++++++++++++++++++++++---
 sessionviewer/inc/TSessionDialogs.h   |  6 +-
 sessionviewer/inc/TSessionViewer.h    |  5 +-
 sessionviewer/src/TSessionDialogs.cxx | 79 ++++++++++++++++++++++++--
 sessionviewer/src/TSessionViewer.cxx  | 81 ++++++++++++++++++++++++---
 8 files changed, 310 insertions(+), 32 deletions(-)

diff --git a/proof/inc/TSessionDialogs.h b/proof/inc/TSessionDialogs.h
index d72d996735f..9e9af1dc996 100644
--- a/proof/inc/TSessionDialogs.h
+++ b/proof/inc/TSessionDialogs.h
@@ -1,4 +1,4 @@
-// @(#)root/proof:$Name:  $:$Id: TSessionDialogs.h,v 1.1 2006/11/17 15:50:17 rdm Exp $
+// @(#)root/proof:$Name:  $:$Id: TSessionDialogs.h,v 1.2 2007/02/01 14:21:28 brun Exp $
 // Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
 
 /*************************************************************************
@@ -79,7 +79,8 @@ public:
 class TNewQueryDlg : public TGTransientFrame {
 
 private:
-   Bool_t             fEditMode;        // kTRUE if used to edit existing query
+   Bool_t             fEditMode;       // kTRUE if used to edit existing query
+   Bool_t             fModified;       // kTRUE if settings have changed
    TGCompositeFrame  *fFrmNewQuery;    // top (main) frame
    TGCompositeFrame  *fFrmMore;        // options frame
    TGTextButton      *fBtnMore;        // "more >>" / "less <<" button
@@ -113,6 +114,7 @@ public:
    void     OnElementSelected(TObject *obj);
    void     CloseWindow();
    void     Popup();
+   void     SettingsChanged();
    void     UpdateFields(TQueryDescription *desc);
    virtual Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
 
diff --git a/proof/inc/TSessionViewer.h b/proof/inc/TSessionViewer.h
index de625c8ad85..84d6dea4549 100644
--- a/proof/inc/TSessionViewer.h
+++ b/proof/inc/TSessionViewer.h
@@ -1,4 +1,4 @@
-// @(#)root/proof:$Name:  $:$Id: TSessionViewer.h,v 1.2 2006/11/22 14:16:54 rdm Exp $
+// @(#)root/proof:$Name:  $:$Id: TSessionViewer.h,v 1.3 2006/11/28 12:10:52 rdm Exp $
 // Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
 
 /*************************************************************************
@@ -382,6 +382,7 @@ public:
    void     OnBrowseEventList();
    void     OnBtnSave();
    void     OnElementSelected(TObject *obj);
+   void     SettingsChanged();
    void     UpdateFields(TQueryDescription *desc);
 
    ClassDef(TEditQueryFrame, 0) // Edit query frame
@@ -410,6 +411,7 @@ private:
    TGTextButton         *fBtnSave;           // save query button
    TGTextView           *fInfoTextView;      // summary on current query
 
+   Bool_t                fModified;          // kTRUE if settings have changed
    Int_t                 fFiles;             // number of files processed
    Long64_t              fFirst;             // first event/entry to process
    Long64_t              fEntries;           // number of events/entries to process
@@ -440,6 +442,7 @@ public:
    TGTab   *GetTab() const { return fTab; }
 
    void     Feedback(TList *objs);
+   void     Modified(Bool_t mod = kTRUE);
    void     Progress(Long64_t total, Long64_t processed);
    void     Progress(Long64_t total, Long64_t processed,
                      Long64_t bytesread, Float_t initTime,
diff --git a/proof/src/TSessionDialogs.cxx b/proof/src/TSessionDialogs.cxx
index 1f70cde8a73..fede777cf7a 100644
--- a/proof/src/TSessionDialogs.cxx
+++ b/proof/src/TSessionDialogs.cxx
@@ -1,4 +1,4 @@
-// @(#)root/proof:$Name:  $:$Id: TSessionDialogs.cxx,v 1.4 2007/01/30 11:24:32 brun Exp $
+// @(#)root/proof:$Name:  $:$Id: TSessionDialogs.cxx,v 1.5 2007/01/31 16:46:10 rdm Exp $
 // Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
 
 /*************************************************************************
@@ -216,6 +216,7 @@ void TNewChainDlg::UpdateList()
    // loop on the list of chains/datasets in memory,
    // and fill the associated listview
    while ((obj = (TObject *)next())) {
+      item = 0;
       if (obj->IsA() == TChain::Class()) {
          const char *title = ((TChain *)obj)->GetTitle();
          if (strlen(title) == 0)
@@ -227,8 +228,10 @@ void TNewChainDlg::UpdateList()
          item = new TGLVEntry(fLVContainer, ((TDSet *)obj)->GetObjName(),
                               ((TDSet *)obj)->GetName());
       }
-      item->SetUserData(obj);
-      fLVContainer->AddItem(item);
+      if (item) {
+         item->SetUserData(obj);
+         fLVContainer->AddItem(item);
+      }
    }
    fClient->NeedRedraw(fLVContainer);
    Resize();
@@ -341,6 +344,7 @@ TNewQueryDlg::TNewQueryDlg(TSessionViewer *gui, Int_t Width, Int_t Height,
    Window_t wdummy;
    Int_t  ax, ay;
    fEditMode = editmode;
+   fModified = kFALSE;
    fChain = 0;
    fQuery = query;
    if (fQuery && fQuery->fChain) {
@@ -487,6 +491,21 @@ void TNewQueryDlg::Build(TSessionViewer *gui)
    fNumFirstEntry->Associate(this);
    fTxtEventList->Associate(this);
 
+   fTxtQueryName->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fTxtChain->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fTxtSelector->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fTxtOptions->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fNumEntries->Connect("ValueChanged(Long_t)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fNumFirstEntry->Connect("ValueChanged(Long_t)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fTxtEventList->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+
    TGCompositeFrame *tmp;
    AddFrame(tmp = new TGCompositeFrame(this, 140, 20, kHorizontalFrame),
          new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
@@ -510,6 +529,8 @@ void TNewQueryDlg::Build(TSessionViewer *gui)
    tmp->AddFrame(fBtnClose = new TGTextButton(tmp, "Close"),
          new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 3, 3, 3, 3));
    fBtnClose->Connect("Clicked()", "TNewQueryDlg", this, "OnBtnCloseClicked()");
+   fBtnSave->SetState(kButtonDisabled);
+   fBtnSubmit->SetState(kButtonDisabled);
 }
 
 //______________________________________________________________________________
@@ -568,7 +589,7 @@ void TNewQueryDlg::OnBrowseSelector()
    fi.fFileTypes = filetypes;
    new TGFileDialog(fClient->GetRoot(), this, kFDOpen, &fi);
    if (!fi.fFilename) return;
-   fTxtSelector->SetText(gSystem->BaseName(fi.fFilename));
+   fTxtSelector->SetText(gSystem->UnixPathName(fi.fFilename));
 }
 
 //______________________________________________________________________________
@@ -668,6 +689,7 @@ void TNewQueryDlg::OnBtnSaveClicked()
    fTxtQueryName->SelectAll();
    fTxtQueryName->SetFocus();
    fViewer->WriteConfiguration();
+   fModified = kFALSE;
 }
 
 //______________________________________________________________________________
@@ -684,7 +706,18 @@ void TNewQueryDlg::OnBtnCloseClicked()
 {
    // Close dialog.
 
-   DeleteWindow();
+   Int_t result = kMBNo;
+   if (fModified) {
+      new TGMsgBox(fClient->GetRoot(), this, "Modified Settings",
+                   "Do you wish to SAVE changes ?", 0,
+                   kMBYes | kMBNo | kMBCancel, &result);
+      if (result == kMBYes) {
+         OnBtnSaveClicked();
+      }
+   }
+   if (result == kMBNo) {
+      DeleteWindow();
+   }
 }
 
 //______________________________________________________________________________
@@ -696,6 +729,42 @@ void TNewQueryDlg::Popup()
    fTxtQueryName->SetFocus();
 }
 
+//______________________________________________________________________________
+void TNewQueryDlg::SettingsChanged()
+{
+   // Settings have changed, update GUI accordingly.
+
+   if (fEditMode && fQuery) {
+      if ((strcmp(fQuery->fSelectorString.Data(), fTxtSelector->GetText())) ||
+          (strcmp(fQuery->fQueryName.Data(), fTxtQueryName->GetText())) ||
+          (strcmp(fQuery->fOptions.Data(), fTxtOptions->GetText())) ||
+          (fQuery->fNoEntries  != fNumEntries->GetIntNumber()) ||
+          (fQuery->fFirstEntry != fNumFirstEntry->GetIntNumber()) ||
+          (fQuery->fChain != fChain)) {
+         fModified = kTRUE;
+      }
+      else {
+         fModified = kFALSE;
+      }
+   }
+   else {
+      if ((fTxtQueryName->GetText()) &&
+         ((fTxtQueryName->GetText()) ||
+          (fTxtChain->GetText())))
+         fModified = kTRUE;
+      else
+         fModified = kFALSE;
+   }
+   if (fModified) {
+      fBtnSave->SetState(kButtonUp);
+      fBtnSubmit->SetState(kButtonUp);
+   }
+   else {
+      fBtnSave->SetState(kButtonDisabled);
+      fBtnSubmit->SetState(kButtonDisabled);
+   }
+}
+
 //______________________________________________________________________________
 void TNewQueryDlg::UpdateFields(TQueryDescription *desc)
 {
diff --git a/proof/src/TSessionViewer.cxx b/proof/src/TSessionViewer.cxx
index 9140cfe724c..296936c8d92 100644
--- a/proof/src/TSessionViewer.cxx
+++ b/proof/src/TSessionViewer.cxx
@@ -1,4 +1,4 @@
-// @(#)root/proof:$Name:  $:$Id: TSessionViewer.cxx,v 1.7 2007/01/31 16:46:10 rdm Exp $
+// @(#)root/proof:$Name:  $:$Id: TSessionViewer.cxx,v 1.8 2007/02/01 14:58:44 brun Exp $
 // Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
 
 /*************************************************************************
@@ -2130,6 +2130,20 @@ void TEditQueryFrame::Build(TSessionViewer *gui)
    fNumFirstEntry->Associate(this);
    fTxtEventList->Associate(this);
 
+   fTxtQueryName->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fTxtChain->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fTxtSelector->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fTxtOptions->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fNumEntries->Connect("ValueChanged(Long_t)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fNumFirstEntry->Connect("ValueChanged(Long_t)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fTxtEventList->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
 }
 
 //______________________________________________________________________________
@@ -2180,7 +2194,7 @@ void TEditQueryFrame::OnBrowseSelector()
    fi.fFileTypes = macrotypes;
    new TGFileDialog(fClient->GetRoot(), this, kFDOpen, &fi);
    if (!fi.fFilename) return;
-   fTxtSelector->SetText(gSystem->BaseName(fi.fFilename));
+   fTxtSelector->SetText(gSystem->UnixPathName(fi.fFilename));
 }
 
 //______________________________________________________________________________
@@ -2235,15 +2249,44 @@ void TEditQueryFrame::OnBtnSave()
    fTxtQueryName->SelectAll();
    fTxtQueryName->SetFocus();
    fViewer->WriteConfiguration();
-   if (fViewer->GetActDesc()->fConnected &&
+   if (fViewer->GetActDesc()->fLocal ||
+      (fViewer->GetActDesc()->fConnected &&
        fViewer->GetActDesc()->fAttached &&
        fViewer->GetActDesc()->fProof &&
-       fViewer->GetActDesc()->fProof->IsValid()) {
+       fViewer->GetActDesc()->fProof->IsValid())) {
       fViewer->GetQueryFrame()->GetTab()->SetTab("Status");
       fViewer->GetQueryFrame()->OnBtnSubmit();
    }
 }
 
+//______________________________________________________________________________
+void TEditQueryFrame::SettingsChanged()
+{
+   // Settings have changed, update GUI accordingly.
+
+   if (fQuery) {
+      if ((strcmp(fQuery->fSelectorString.Data(), fTxtSelector->GetText())) ||
+          (strcmp(fQuery->fQueryName.Data(), fTxtQueryName->GetText())) ||
+          (strcmp(fQuery->fOptions.Data(), fTxtOptions->GetText())) ||
+          (fQuery->fNoEntries  != fNumEntries->GetIntNumber()) ||
+          (fQuery->fFirstEntry != fNumFirstEntry->GetIntNumber()) ||
+          (fQuery->fChain != fChain)) {
+         fViewer->GetQueryFrame()->Modified(kTRUE);
+      }
+      else {
+         fViewer->GetQueryFrame()->Modified(kFALSE);
+      }
+   }
+   else {
+      if ((fTxtQueryName->GetText()) &&
+         ((fTxtQueryName->GetText()) ||
+          (fTxtChain->GetText())))
+         fViewer->GetQueryFrame()->Modified(kTRUE);
+      else
+         fViewer->GetQueryFrame()->Modified(kFALSE);
+   }
+}
+
 //______________________________________________________________________________
 void TEditQueryFrame::UpdateFields(TQueryDescription *desc)
 {
@@ -2292,6 +2335,7 @@ void TSessionQueryFrame::Build(TSessionViewer *gui)
    fFirst = fEntries = fPrevTotal = 0;
    fPrevProcessed = 0;
    fViewer = gui;
+   fModified = kFALSE;
 
    // main query tab
    fTab = new TGTab(this, 200, 200);
@@ -2386,8 +2430,9 @@ void TSessionQueryFrame::Build(TSessionViewer *gui)
    fFD->Build(fViewer);
    tf->AddFrame(fFD, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 10, 0));
    TString btntxt;
-   if (fViewer->GetActDesc()->fProof &&
-       fViewer->GetActDesc()->fProof->IsValid()) {
+   if (fViewer->GetActDesc()->fLocal ||
+      (fViewer->GetActDesc()->fProof &&
+       fViewer->GetActDesc()->fProof->IsValid())) {
       btntxt = "         Submit         ";
    }
    else {
@@ -2411,9 +2456,28 @@ void TSessionQueryFrame::Build(TSessionViewer *gui)
          "OnBtnShowLog()");
    fBtnRetrieve->Connect("Clicked()", "TSessionQueryFrame", this,
          "OnBtnRetrieve()");
+//   fBtnSave->SetState(kButtonDisabled);
    Resize(350, 310);
 }
 
+//______________________________________________________________________________
+void TSessionQueryFrame::Modified(Bool_t mod)
+{
+   // Notify changes in query editor settings.
+
+   fModified = mod;
+   if (fModified) {
+      fBtnSave->SetState(kButtonUp);
+   }
+   else {
+      fBtnSave->SetState(kButtonDisabled);
+   }
+   if (fViewer->GetActDesc()->fLocal ||
+      (fViewer->GetActDesc()->fProof &&
+       fViewer->GetActDesc()->fProof->IsValid()))
+      fBtnSave->SetState(kButtonUp);
+}
+
 //______________________________________________________________________________
 void TSessionQueryFrame::Feedback(TList *objs)
 {
@@ -3148,10 +3212,11 @@ void TSessionQueryFrame::UpdateInfos()
    if (fViewer->GetActDesc()->fActQuery)
       fFD->UpdateFields(fViewer->GetActDesc()->fActQuery);
 
-   if (fViewer->GetActDesc()->fConnected &&
+   if (fViewer->GetActDesc()->fLocal ||
+      (fViewer->GetActDesc()->fConnected &&
        fViewer->GetActDesc()->fAttached &&
        fViewer->GetActDesc()->fProof &&
-       fViewer->GetActDesc()->fProof->IsValid()) {
+       fViewer->GetActDesc()->fProof->IsValid())) {
       fBtnSave->SetText("         Submit         ");
    }
    else {
diff --git a/sessionviewer/inc/TSessionDialogs.h b/sessionviewer/inc/TSessionDialogs.h
index d72d996735f..9e9af1dc996 100644
--- a/sessionviewer/inc/TSessionDialogs.h
+++ b/sessionviewer/inc/TSessionDialogs.h
@@ -1,4 +1,4 @@
-// @(#)root/proof:$Name:  $:$Id: TSessionDialogs.h,v 1.1 2006/11/17 15:50:17 rdm Exp $
+// @(#)root/proof:$Name:  $:$Id: TSessionDialogs.h,v 1.2 2007/02/01 14:21:28 brun Exp $
 // Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
 
 /*************************************************************************
@@ -79,7 +79,8 @@ public:
 class TNewQueryDlg : public TGTransientFrame {
 
 private:
-   Bool_t             fEditMode;        // kTRUE if used to edit existing query
+   Bool_t             fEditMode;       // kTRUE if used to edit existing query
+   Bool_t             fModified;       // kTRUE if settings have changed
    TGCompositeFrame  *fFrmNewQuery;    // top (main) frame
    TGCompositeFrame  *fFrmMore;        // options frame
    TGTextButton      *fBtnMore;        // "more >>" / "less <<" button
@@ -113,6 +114,7 @@ public:
    void     OnElementSelected(TObject *obj);
    void     CloseWindow();
    void     Popup();
+   void     SettingsChanged();
    void     UpdateFields(TQueryDescription *desc);
    virtual Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
 
diff --git a/sessionviewer/inc/TSessionViewer.h b/sessionviewer/inc/TSessionViewer.h
index de625c8ad85..84d6dea4549 100644
--- a/sessionviewer/inc/TSessionViewer.h
+++ b/sessionviewer/inc/TSessionViewer.h
@@ -1,4 +1,4 @@
-// @(#)root/proof:$Name:  $:$Id: TSessionViewer.h,v 1.2 2006/11/22 14:16:54 rdm Exp $
+// @(#)root/proof:$Name:  $:$Id: TSessionViewer.h,v 1.3 2006/11/28 12:10:52 rdm Exp $
 // Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
 
 /*************************************************************************
@@ -382,6 +382,7 @@ public:
    void     OnBrowseEventList();
    void     OnBtnSave();
    void     OnElementSelected(TObject *obj);
+   void     SettingsChanged();
    void     UpdateFields(TQueryDescription *desc);
 
    ClassDef(TEditQueryFrame, 0) // Edit query frame
@@ -410,6 +411,7 @@ private:
    TGTextButton         *fBtnSave;           // save query button
    TGTextView           *fInfoTextView;      // summary on current query
 
+   Bool_t                fModified;          // kTRUE if settings have changed
    Int_t                 fFiles;             // number of files processed
    Long64_t              fFirst;             // first event/entry to process
    Long64_t              fEntries;           // number of events/entries to process
@@ -440,6 +442,7 @@ public:
    TGTab   *GetTab() const { return fTab; }
 
    void     Feedback(TList *objs);
+   void     Modified(Bool_t mod = kTRUE);
    void     Progress(Long64_t total, Long64_t processed);
    void     Progress(Long64_t total, Long64_t processed,
                      Long64_t bytesread, Float_t initTime,
diff --git a/sessionviewer/src/TSessionDialogs.cxx b/sessionviewer/src/TSessionDialogs.cxx
index 1f70cde8a73..fede777cf7a 100644
--- a/sessionviewer/src/TSessionDialogs.cxx
+++ b/sessionviewer/src/TSessionDialogs.cxx
@@ -1,4 +1,4 @@
-// @(#)root/proof:$Name:  $:$Id: TSessionDialogs.cxx,v 1.4 2007/01/30 11:24:32 brun Exp $
+// @(#)root/proof:$Name:  $:$Id: TSessionDialogs.cxx,v 1.5 2007/01/31 16:46:10 rdm Exp $
 // Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
 
 /*************************************************************************
@@ -216,6 +216,7 @@ void TNewChainDlg::UpdateList()
    // loop on the list of chains/datasets in memory,
    // and fill the associated listview
    while ((obj = (TObject *)next())) {
+      item = 0;
       if (obj->IsA() == TChain::Class()) {
          const char *title = ((TChain *)obj)->GetTitle();
          if (strlen(title) == 0)
@@ -227,8 +228,10 @@ void TNewChainDlg::UpdateList()
          item = new TGLVEntry(fLVContainer, ((TDSet *)obj)->GetObjName(),
                               ((TDSet *)obj)->GetName());
       }
-      item->SetUserData(obj);
-      fLVContainer->AddItem(item);
+      if (item) {
+         item->SetUserData(obj);
+         fLVContainer->AddItem(item);
+      }
    }
    fClient->NeedRedraw(fLVContainer);
    Resize();
@@ -341,6 +344,7 @@ TNewQueryDlg::TNewQueryDlg(TSessionViewer *gui, Int_t Width, Int_t Height,
    Window_t wdummy;
    Int_t  ax, ay;
    fEditMode = editmode;
+   fModified = kFALSE;
    fChain = 0;
    fQuery = query;
    if (fQuery && fQuery->fChain) {
@@ -487,6 +491,21 @@ void TNewQueryDlg::Build(TSessionViewer *gui)
    fNumFirstEntry->Associate(this);
    fTxtEventList->Associate(this);
 
+   fTxtQueryName->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fTxtChain->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fTxtSelector->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fTxtOptions->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fNumEntries->Connect("ValueChanged(Long_t)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fNumFirstEntry->Connect("ValueChanged(Long_t)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+   fTxtEventList->Connect("TextChanged(char*)", "TNewQueryDlg", this,
+                        "SettingsChanged()");
+
    TGCompositeFrame *tmp;
    AddFrame(tmp = new TGCompositeFrame(this, 140, 20, kHorizontalFrame),
          new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
@@ -510,6 +529,8 @@ void TNewQueryDlg::Build(TSessionViewer *gui)
    tmp->AddFrame(fBtnClose = new TGTextButton(tmp, "Close"),
          new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 3, 3, 3, 3));
    fBtnClose->Connect("Clicked()", "TNewQueryDlg", this, "OnBtnCloseClicked()");
+   fBtnSave->SetState(kButtonDisabled);
+   fBtnSubmit->SetState(kButtonDisabled);
 }
 
 //______________________________________________________________________________
@@ -568,7 +589,7 @@ void TNewQueryDlg::OnBrowseSelector()
    fi.fFileTypes = filetypes;
    new TGFileDialog(fClient->GetRoot(), this, kFDOpen, &fi);
    if (!fi.fFilename) return;
-   fTxtSelector->SetText(gSystem->BaseName(fi.fFilename));
+   fTxtSelector->SetText(gSystem->UnixPathName(fi.fFilename));
 }
 
 //______________________________________________________________________________
@@ -668,6 +689,7 @@ void TNewQueryDlg::OnBtnSaveClicked()
    fTxtQueryName->SelectAll();
    fTxtQueryName->SetFocus();
    fViewer->WriteConfiguration();
+   fModified = kFALSE;
 }
 
 //______________________________________________________________________________
@@ -684,7 +706,18 @@ void TNewQueryDlg::OnBtnCloseClicked()
 {
    // Close dialog.
 
-   DeleteWindow();
+   Int_t result = kMBNo;
+   if (fModified) {
+      new TGMsgBox(fClient->GetRoot(), this, "Modified Settings",
+                   "Do you wish to SAVE changes ?", 0,
+                   kMBYes | kMBNo | kMBCancel, &result);
+      if (result == kMBYes) {
+         OnBtnSaveClicked();
+      }
+   }
+   if (result == kMBNo) {
+      DeleteWindow();
+   }
 }
 
 //______________________________________________________________________________
@@ -696,6 +729,42 @@ void TNewQueryDlg::Popup()
    fTxtQueryName->SetFocus();
 }
 
+//______________________________________________________________________________
+void TNewQueryDlg::SettingsChanged()
+{
+   // Settings have changed, update GUI accordingly.
+
+   if (fEditMode && fQuery) {
+      if ((strcmp(fQuery->fSelectorString.Data(), fTxtSelector->GetText())) ||
+          (strcmp(fQuery->fQueryName.Data(), fTxtQueryName->GetText())) ||
+          (strcmp(fQuery->fOptions.Data(), fTxtOptions->GetText())) ||
+          (fQuery->fNoEntries  != fNumEntries->GetIntNumber()) ||
+          (fQuery->fFirstEntry != fNumFirstEntry->GetIntNumber()) ||
+          (fQuery->fChain != fChain)) {
+         fModified = kTRUE;
+      }
+      else {
+         fModified = kFALSE;
+      }
+   }
+   else {
+      if ((fTxtQueryName->GetText()) &&
+         ((fTxtQueryName->GetText()) ||
+          (fTxtChain->GetText())))
+         fModified = kTRUE;
+      else
+         fModified = kFALSE;
+   }
+   if (fModified) {
+      fBtnSave->SetState(kButtonUp);
+      fBtnSubmit->SetState(kButtonUp);
+   }
+   else {
+      fBtnSave->SetState(kButtonDisabled);
+      fBtnSubmit->SetState(kButtonDisabled);
+   }
+}
+
 //______________________________________________________________________________
 void TNewQueryDlg::UpdateFields(TQueryDescription *desc)
 {
diff --git a/sessionviewer/src/TSessionViewer.cxx b/sessionviewer/src/TSessionViewer.cxx
index 9140cfe724c..296936c8d92 100644
--- a/sessionviewer/src/TSessionViewer.cxx
+++ b/sessionviewer/src/TSessionViewer.cxx
@@ -1,4 +1,4 @@
-// @(#)root/proof:$Name:  $:$Id: TSessionViewer.cxx,v 1.7 2007/01/31 16:46:10 rdm Exp $
+// @(#)root/proof:$Name:  $:$Id: TSessionViewer.cxx,v 1.8 2007/02/01 14:58:44 brun Exp $
 // Author: Marek Biskup, Jakub Madejczyk, Bertrand Bellenot 10/08/2005
 
 /*************************************************************************
@@ -2130,6 +2130,20 @@ void TEditQueryFrame::Build(TSessionViewer *gui)
    fNumFirstEntry->Associate(this);
    fTxtEventList->Associate(this);
 
+   fTxtQueryName->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fTxtChain->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fTxtSelector->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fTxtOptions->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fNumEntries->Connect("ValueChanged(Long_t)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fNumFirstEntry->Connect("ValueChanged(Long_t)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
+   fTxtEventList->Connect("TextChanged(char*)", "TEditQueryFrame", this,
+                        "SettingsChanged()");
 }
 
 //______________________________________________________________________________
@@ -2180,7 +2194,7 @@ void TEditQueryFrame::OnBrowseSelector()
    fi.fFileTypes = macrotypes;
    new TGFileDialog(fClient->GetRoot(), this, kFDOpen, &fi);
    if (!fi.fFilename) return;
-   fTxtSelector->SetText(gSystem->BaseName(fi.fFilename));
+   fTxtSelector->SetText(gSystem->UnixPathName(fi.fFilename));
 }
 
 //______________________________________________________________________________
@@ -2235,15 +2249,44 @@ void TEditQueryFrame::OnBtnSave()
    fTxtQueryName->SelectAll();
    fTxtQueryName->SetFocus();
    fViewer->WriteConfiguration();
-   if (fViewer->GetActDesc()->fConnected &&
+   if (fViewer->GetActDesc()->fLocal ||
+      (fViewer->GetActDesc()->fConnected &&
        fViewer->GetActDesc()->fAttached &&
        fViewer->GetActDesc()->fProof &&
-       fViewer->GetActDesc()->fProof->IsValid()) {
+       fViewer->GetActDesc()->fProof->IsValid())) {
       fViewer->GetQueryFrame()->GetTab()->SetTab("Status");
       fViewer->GetQueryFrame()->OnBtnSubmit();
    }
 }
 
+//______________________________________________________________________________
+void TEditQueryFrame::SettingsChanged()
+{
+   // Settings have changed, update GUI accordingly.
+
+   if (fQuery) {
+      if ((strcmp(fQuery->fSelectorString.Data(), fTxtSelector->GetText())) ||
+          (strcmp(fQuery->fQueryName.Data(), fTxtQueryName->GetText())) ||
+          (strcmp(fQuery->fOptions.Data(), fTxtOptions->GetText())) ||
+          (fQuery->fNoEntries  != fNumEntries->GetIntNumber()) ||
+          (fQuery->fFirstEntry != fNumFirstEntry->GetIntNumber()) ||
+          (fQuery->fChain != fChain)) {
+         fViewer->GetQueryFrame()->Modified(kTRUE);
+      }
+      else {
+         fViewer->GetQueryFrame()->Modified(kFALSE);
+      }
+   }
+   else {
+      if ((fTxtQueryName->GetText()) &&
+         ((fTxtQueryName->GetText()) ||
+          (fTxtChain->GetText())))
+         fViewer->GetQueryFrame()->Modified(kTRUE);
+      else
+         fViewer->GetQueryFrame()->Modified(kFALSE);
+   }
+}
+
 //______________________________________________________________________________
 void TEditQueryFrame::UpdateFields(TQueryDescription *desc)
 {
@@ -2292,6 +2335,7 @@ void TSessionQueryFrame::Build(TSessionViewer *gui)
    fFirst = fEntries = fPrevTotal = 0;
    fPrevProcessed = 0;
    fViewer = gui;
+   fModified = kFALSE;
 
    // main query tab
    fTab = new TGTab(this, 200, 200);
@@ -2386,8 +2430,9 @@ void TSessionQueryFrame::Build(TSessionViewer *gui)
    fFD->Build(fViewer);
    tf->AddFrame(fFD, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 10, 0));
    TString btntxt;
-   if (fViewer->GetActDesc()->fProof &&
-       fViewer->GetActDesc()->fProof->IsValid()) {
+   if (fViewer->GetActDesc()->fLocal ||
+      (fViewer->GetActDesc()->fProof &&
+       fViewer->GetActDesc()->fProof->IsValid())) {
       btntxt = "         Submit         ";
    }
    else {
@@ -2411,9 +2456,28 @@ void TSessionQueryFrame::Build(TSessionViewer *gui)
          "OnBtnShowLog()");
    fBtnRetrieve->Connect("Clicked()", "TSessionQueryFrame", this,
          "OnBtnRetrieve()");
+//   fBtnSave->SetState(kButtonDisabled);
    Resize(350, 310);
 }
 
+//______________________________________________________________________________
+void TSessionQueryFrame::Modified(Bool_t mod)
+{
+   // Notify changes in query editor settings.
+
+   fModified = mod;
+   if (fModified) {
+      fBtnSave->SetState(kButtonUp);
+   }
+   else {
+      fBtnSave->SetState(kButtonDisabled);
+   }
+   if (fViewer->GetActDesc()->fLocal ||
+      (fViewer->GetActDesc()->fProof &&
+       fViewer->GetActDesc()->fProof->IsValid()))
+      fBtnSave->SetState(kButtonUp);
+}
+
 //______________________________________________________________________________
 void TSessionQueryFrame::Feedback(TList *objs)
 {
@@ -3148,10 +3212,11 @@ void TSessionQueryFrame::UpdateInfos()
    if (fViewer->GetActDesc()->fActQuery)
       fFD->UpdateFields(fViewer->GetActDesc()->fActQuery);
 
-   if (fViewer->GetActDesc()->fConnected &&
+   if (fViewer->GetActDesc()->fLocal ||
+      (fViewer->GetActDesc()->fConnected &&
        fViewer->GetActDesc()->fAttached &&
        fViewer->GetActDesc()->fProof &&
-       fViewer->GetActDesc()->fProof->IsValid()) {
+       fViewer->GetActDesc()->fProof->IsValid())) {
       fBtnSave->SetText("         Submit         ");
    }
    else {
-- 
GitLab