Dave Page a écrit :
> On Wed, Jan 7, 2009 at 10:08 PM, Guillaume Lelarge
> <[email protected]> wrote:
>> I suppose the cool functionality is wxAUI_NB_TAB_SPLIT :)
> 
> Yep.
> 
>> Actually, I find this great. It works nice on Mac OS X, but I disabled
>> it on v2 because it crashes the linux build. Perhaps I did something
>> wrong but even the auidemo sample from wxGTK crashes.
>>
>> (re-enables the "cool functionality", so crashes a lot on my laptop)
> 
> Oh, rats. I hate getting my hands dirty on wxGTK :-(
> 

I found this bug report : http://trac.wxwidgets.org/ticket/4841

My issue seems related to this.

>> You mean, to have a close box only on the active tab? (aka
>> wxAUI_NB_CLOSE_ON_ACTIVE_TAB)
> 
> Yes.
> 
>> With the perspective code, yes. I need to better understand it to code
>> it for the server status window.
> 
> It's pretty simple really - you've got most of it, just the toggle
> functions to add to switch things on or off via the menu. We also used
> to add event handlers for OnSize and OnEraseBackground to fix some
> display issues, but I'm not sure if thats still a problem with moden
> versions of wxWidgets.
> 

Done.

> Some comments on the patch:
> 
> - The form setup code is a pretty large hunk of code. Can we get some
> more comments and blank lines in there to break things up a little?

It should be done. There's more comments and the code is a bit factored.

> - The form underneath the AUI controls seems to have some drawing
> issues on XP. The refresh bar is just about unusable for example.
> 

Yeah. Even with this new patch, I still have this issue and no idea how
to fix this. I tried the OnSize and OnEraseBackground methods, but that
didn't fix it.

> Thats about it for the moment - nothing too serious.
> 

I attached the new patch version.


-- 
Guillaume.
 http://www.postgresqlfr.org
 http://dalibo.com
Index: pgadmin/include/frm/frmStatus.h
===================================================================
--- pgadmin/include/frm/frmStatus.h	(révision 7557)
+++ pgadmin/include/frm/frmStatus.h	(copie de travail)
@@ -19,14 +19,56 @@
 #include <wx/spinctrl.h>
 #include <wx/notebook.h>
 
+// wxAUI
+#include <wx/aui/aui.h>
+#include <wx/aui/auibook.h>
+
 #include "dlg/dlgClasses.h"
 #include "utils/factory.h"
 
-#define CTL_STATUSLIST 300
+enum
+{
+    CTL_NTBK=250,
+    CTL_RATELABEL,
+    CTL_RATESLIDER,
+    CTL_RATELABEL2,
+    CTL_REFRESHBTN,
+    CTL_CLOSEBTN,
+    CTL_STATUSLIST,
+    CTL_CANCELBTN1,
+    CTL_TERMINATEBTN1,
+    CTL_LOCKLIST,
+    CTL_CANCELBTN2,
+    CTL_TERMINATEBTN2,
+    CTL_XACTLIST,
+    CTL_COMMITBTN,
+    CTL_ROLLBACKBTN,
+    CTL_LOGLIST,
+    CTL_LOGCBO,
+    CTL_ROTATEBTN,
+    MNU_STATUSPAGE,
+    MNU_LOCKPAGE,
+    MNU_XACTPAGE,
+    MNU_LOGPAGE
+};
 
+
+#define FRMSTATUS_PERSPECTIVE_VER wxT("$Rev$")
+
+#ifdef __WXMAC__
+#define FRMSTATUS_DEFAULT_PERSPECTIVE wxT("layout2|name=rateBar;caption=Rate bar;state=16788208;dir=1;layer=10;row=0;pos=0;prop=100000;bestw=240;besth=23;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=toolBar;caption=Tool bar;state=16788208;dir=1;layer=10;row=0;pos=243;prop=100000;bestw=120;besth=21;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=415;floaty=793;floatw=-1;floath=-1|name=notebook;caption=notebook;state=1020;dir=5;layer=0;row=0;pos=0;prop=100000;bestw=300;besth=200;minw=200;minh=100;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|")
+#else
+#ifdef __WXGTK__
+#define FRMSTATUS_DEFAULT_PERSPECTIVE wxT("layout2|name=rateBar;caption=Rate bar;state=16788208;dir=1;layer=10;row=0;pos=0;prop=100000;bestw=305;besth=30;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=toolBar;caption=Tool bar;state=16788208;dir=1;layer=10;row=0;pos=243;prop=100000;bestw=120;besth=30;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=415;floaty=793;floatw=-1;floath=-1|name=notebook;caption=notebook;state=1020;dir=5;layer=0;row=0;pos=0;prop=100000;bestw=300;besth=200;minw=200;minh=100;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|")
+#else
+#define FRMSTATUS_DEFAULT_PERSPECTIVE wxT("layout2|name=rateBar;caption=Rate bar;state=16788208;dir=1;layer=10;row=0;pos=0;prop=100000;bestw=232;besth=23;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=toolBar;caption=Tool bar;state=16788208;dir=1;layer=10;row=0;pos=243;prop=100000;bestw=100;besth=21;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=415;floaty=793;floatw=-1;floath=-1|name=notebook;caption=notebook;state=1020;dir=5;layer=0;row=0;pos=0;prop=100000;bestw=300;besth=200;minw=200;minh=100;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|")
+#endif
+#endif
+
+
 // Class declarations
 
-class frmStatus : public pgDialog
+class frmStatus : public pgFrame
 {
 public:
     frmStatus(frmMain *form, const wxString& _title, pgConn *conn);
@@ -34,13 +76,37 @@
     void Go();
     
 private:
+    wxSlider     *slRate;
+    wxStaticText *stRate;
+    wxAuiNotebook   *nbStatus;
+    wxComboBox   *cbLogfiles;
+    wxButton     *btnRotateLog;
+    
+    ctlListView *statusList;
+    ctlListView *lockList;
+    ctlListView *xactList;
+    ctlListView *logList;
+    
+    void AddStatusPage();
+    void AddLockPage();
+    void AddXactPage();
+    void AddLogPage();
+
     void OnHelp(wxCommandEvent& ev);
-    void OnCloseBtn(wxCommandEvent &event);
+    void OnExit(wxCommandEvent& event);
+
+    void OnToggleStatusPage(wxCommandEvent& event);
+    void OnToggleLockPage(wxCommandEvent& event);
+    void OnToggleXactPage(wxCommandEvent& event);
+    void OnToggleLogPage(wxCommandEvent& event);
+    void OnDefaultView(wxCommandEvent& event);
+    
     void OnClose(wxCloseEvent &event);
     void OnRefresh(wxCommandEvent &event);
     void OnRefreshTimer(wxTimerEvent &event);
     void OnRateChange(wxScrollEvent &event);
 	void OnNotebookPageChanged(wxNotebookEvent& event);
+	void OnNotebookPageClosed(wxAuiNotebookEvent& event);
     void OnTerminateBtn(wxCommandEvent &event);
     void OnCancelBtn(wxCommandEvent &event);
 	void OnSelStatusItem(wxListEvent &event);
@@ -60,6 +126,8 @@
 
 	void checkConnection();
     
+    wxAuiManager manager;
+    
     frmMain *mainForm;
     wxButton *btnCancelSt, *btnTerminateSt,*btnCancelLk, *btnTerminateLk, *btnCommit, *btnRollback;
 
@@ -70,7 +138,7 @@
     wxDateTime logfileTimestamp, latestTimestamp;
     wxString logDirectory, logfileName;
     bool showCurrent, isCurrent;
-
+    
     pgConn *connection;
     long backend_pid;
     wxTimer *timer;
Index: pgadmin/frm/frmStatus.cpp
===================================================================
--- pgadmin/frm/frmStatus.cpp	(révision 7557)
+++ pgadmin/frm/frmStatus.cpp	(copie de travail)
@@ -17,97 +17,302 @@
 #include <wx/image.h>
 #include <wx/textbuf.h>
 
+// wxAUI
+#include <wx/aui/aui.h>
+#include <wx/aui/auibook.h>
+
 // App headers
 #include "frm/frmStatus.h"
 #include "frm/frmHint.h"
 #include "frm/frmMain.h"
 #include "utils/pgfeatures.h"
 #include "schema/pgServer.h"
+#include "ctl/ctlMenuToolbar.h"
 
+// Icons
+#include "images/readdata.xpm"
 
 #define TIMER_ID 333
-BEGIN_EVENT_TABLE(frmStatus, pgDialog)
+BEGIN_EVENT_TABLE(frmStatus, pgFrame)
+    EVT_MENU(MNU_EXIT,               				frmStatus::OnExit)
+/*
+    EVT_MENU(MNU_CUT,                				frmStatus::OnCut)
+    EVT_MENU(MNU_COPY,               				frmStatus::OnCopy)
+    EVT_MENU(MNU_PASTE,              				frmStatus::OnPaste)
+    EVT_MENU(MNU_CLEAR,              				frmStatus::OnClear)
+    EVT_MENU(MNU_UNDO,               				frmStatus::OnUndo)
+    EVT_MENU(MNU_REDO,               				frmStatus::OnRedo)
+*/
+    EVT_MENU(MNU_REFRESH,                           frmStatus::OnRefresh)
+    EVT_MENU(MNU_HELP,               				frmStatus::OnHelp)
+    EVT_MENU(MNU_STATUSPAGE,        				frmStatus::OnToggleStatusPage)
+    EVT_MENU(MNU_LOCKPAGE,            				frmStatus::OnToggleLockPage)
+    EVT_MENU(MNU_XACTPAGE,         				    frmStatus::OnToggleXactPage)
+    EVT_MENU(MNU_LOGPAGE,         				    frmStatus::OnToggleLogPage)
+    EVT_MENU(MNU_DEFAULTVIEW,        				frmStatus::OnDefaultView)
+
     EVT_BUTTON(wxID_REFRESH,	     				frmStatus::OnRefresh)
-    EVT_BUTTON(wxID_CLOSE,	  				        frmStatus::OnCloseBtn)
-    EVT_BUTTON(wxID_CANCEL,          				frmStatus::OnCloseBtn)
-    EVT_BUTTON(XRCID("btnCancelSt"),          		frmStatus::OnCancelBtn)
+    EVT_BUTTON(CTL_CANCELBTN1,          		    frmStatus::OnCancelBtn)
     EVT_BUTTON(wxID_STOP,            				frmStatus::OnTerminateBtn)
-    EVT_BUTTON(XRCID("btnCommit"),                  frmStatus::OnCommit)
-    EVT_BUTTON(XRCID("btnRollback"),                frmStatus::OnRollback)
+    EVT_BUTTON(CTL_COMMITBTN,                       frmStatus::OnCommit)
+    EVT_BUTTON(CTL_ROLLBACKBTN,                     frmStatus::OnRollback)
     EVT_CLOSE(										frmStatus::OnClose)
-    EVT_COMMAND_SCROLL(XRCID("slRate"),             frmStatus::OnRateChange)
-	EVT_NOTEBOOK_PAGE_CHANGING(XRCID("nbStatus"),	frmStatus::OnNotebookPageChanged)
+    EVT_COMMAND_SCROLL(CTL_RATESLIDER,              frmStatus::OnRateChange)
+	EVT_NOTEBOOK_PAGE_CHANGING(CTL_NOTEBOOK,        frmStatus::OnNotebookPageChanged)
+	EVT_AUINOTEBOOK_PAGE_CLOSE(CTL_NTBK,            frmStatus::OnNotebookPageClosed)
     EVT_TIMER(TIMER_ID,								frmStatus::OnRefreshTimer)
-	EVT_LIST_ITEM_SELECTED(XRCID("lstStatus"),		frmStatus::OnSelStatusItem)
-	EVT_LIST_ITEM_DESELECTED(XRCID("lstStatus"),	frmStatus::OnSelStatusItem)
-	EVT_LIST_ITEM_SELECTED(XRCID("lstLocks"),		frmStatus::OnSelLockItem)
-	EVT_LIST_ITEM_DESELECTED(XRCID("lstLocks"),		frmStatus::OnSelLockItem)
-	EVT_LIST_ITEM_SELECTED(XRCID("lstXacts"),		frmStatus::OnSelXactItem)
-	EVT_LIST_ITEM_DESELECTED(XRCID("lstXacts"),		frmStatus::OnSelXactItem)
-    EVT_COMBOBOX(XRCID("cbLogfiles"),               frmStatus::OnLoadLogfile)
-    EVT_BUTTON(XRCID("btnRotateLog"),               frmStatus::OnRotateLogfile)
+	EVT_LIST_ITEM_SELECTED(CTL_STATUSLIST,		    frmStatus::OnSelStatusItem)
+	EVT_LIST_ITEM_DESELECTED(CTL_STATUSLIST,	    frmStatus::OnSelStatusItem)
+	EVT_LIST_ITEM_SELECTED(CTL_LOCKLIST,		    frmStatus::OnSelLockItem)
+	EVT_LIST_ITEM_DESELECTED(CTL_LOCKLIST,		    frmStatus::OnSelLockItem)
+	EVT_LIST_ITEM_SELECTED(CTL_XACTLIST,		    frmStatus::OnSelXactItem)
+	EVT_LIST_ITEM_DESELECTED(CTL_XACTLIST,		    frmStatus::OnSelXactItem)
+    EVT_COMBOBOX(CTL_LOGCBO,                        frmStatus::OnLoadLogfile)
+    EVT_BUTTON(CTL_ROTATEBTN,                       frmStatus::OnRotateLogfile)
 END_EVENT_TABLE();
 
 
-#define statusList      CTRL_LISTVIEW("lstStatus")
-#define lockList        CTRL_LISTVIEW("lstLocks")
-#define xactList        CTRL_LISTVIEW("lstXacts")
-#define logList         CTRL_LISTVIEW("lstLog")
-#define slRate          CTRL_SLIDER("slRate")
-#define stRate          CTRL_STATIC("stRate")
-#define nbStatus		CTRL_NOTEBOOK("nbStatus")
-#define cbLogfiles      CTRL_COMBOBOX("cbLogfiles")
-#define btnRotateLog    CTRL_BUTTON("btnRotateLog")
+void ChangeButtonId(wxButton *btn, int id, const wxChar *txt)
+{
+    btn->SetId(id);
+    btn->SetLabel(txt);
+}
 
 
-void frmStatus::OnCloseBtn(wxCommandEvent &event)
+frmStatus::frmStatus(frmMain *form, const wxString& _title, pgConn *conn) : pgFrame(NULL, _title)
 {
-    Destroy();
+    dlgName = wxT("frmStatus");
+    
+	loaded = false;
+    xactPage=2;
+    logPage=3;
+
+    mainForm=form;
+    timer=0;
+    connection=conn;
+    logHasTimestamp = false;
+    logFormatKnown = false;
+
+    statusBar=CreateStatusBar(1);
+    SetStatusBarPane(-1);
+    
+    SetTitle(_title);
+    appearanceFactory->SetIcons(this);
+
+    wxWindowBase::SetFont(settings->GetSystemFont());
+
+    // notify wxAUI which frame to use
+    manager.SetManagedWindow(this);
+    manager.SetFlags(wxAUI_MGR_DEFAULT | wxAUI_MGR_TRANSPARENT_DRAG);
+
+    // build menu bar
+    menuBar = new wxMenuBar();
+
+    fileMenu = new wxMenu();
+    fileMenu->Append(MNU_EXIT, _("E&xit\tAlt-F4"), _("Exit query window"));
+
+    menuBar->Append(fileMenu, _("&File"));
+
+    editMenu = new wxMenu();
+    editMenu->Append(MNU_UNDO, _("&Undo\tCtrl-Z"), _("Undo last action"), wxITEM_NORMAL);
+    editMenu->Append(MNU_REDO, _("&Redo\tCtrl-Y"), _("Redo last action"), wxITEM_NORMAL);
+    editMenu->AppendSeparator();
+    editMenu->Append(MNU_CUT, _("Cu&t\tCtrl-X"), _("Cut selected text to clipboard"), wxITEM_NORMAL);
+    editMenu->Append(MNU_COPY, _("&Copy\tCtrl-C"), _("Copy selected text to clipboard"), wxITEM_NORMAL);
+    editMenu->Append(MNU_PASTE, _("&Paste\tCtrl-V"), _("Paste selected text from clipboard"), wxITEM_NORMAL);
+    editMenu->Append(MNU_CLEAR, _("C&lear window"), _("Clear edit window"), wxITEM_NORMAL);
+
+    menuBar->Append(editMenu, _("&Edit"));
+
+    viewMenu = new wxMenu();
+    viewMenu->Append(MNU_STATUSPAGE, _("&Activity\tCtrl-Alt-A"), _("Show or hide the activity tab."), wxITEM_CHECK);
+    viewMenu->Append(MNU_LOCKPAGE, _("&Locks\tCtrl-Alt-L"), _("Show or hide the locks tab."), wxITEM_CHECK);
+    viewMenu->Append(MNU_XACTPAGE, _("&Transactions\tCtrl-Alt-T"), _("Show or hide the transactions tab."), wxITEM_CHECK);
+    viewMenu->Append(MNU_LOGPAGE, _("Log&file\tCtrl-Alt-F"), _("Show or hide the logfile tab."), wxITEM_CHECK);
+    viewMenu->AppendSeparator();
+    viewMenu->Append(MNU_DEFAULTVIEW, _("&Default view\tCtrl-Alt-V"), _("Restore the default view."));
+
+    menuBar->Append(viewMenu, _("&View"));
+
+    wxMenu *helpMenu=new wxMenu();
+    helpMenu->Append(MNU_CONTENTS, _("&Help"), _("Open the helpfile."));
+
+    menuBar->Append(helpMenu, _("&Help"));
+
+    SetMenuBar(menuBar);
+    
+    // Set up toolbar
+    toolBar = new ctlMenuToolbar(this, -1, wxDefaultPosition, wxDefaultSize, wxTB_FLAT | wxTB_NODIVIDER);
+    toolBar->SetToolBitmapSize(wxSize(16, 16));
+    toolBar->AddTool(MNU_REFRESH, _("Refresh"), wxBitmap(readdata_xpm), _("Refresh."), wxITEM_NORMAL);
+    // Set up rate toolbar
+    ctlMenuToolbar *rateBar = new ctlMenuToolbar(this, -1, wxDefaultPosition, wxDefaultSize, wxTB_FLAT | wxTB_NODIVIDER);
+    rateBar->SetToolBitmapSize(wxSize(24, 24));
+    wxStaticText *stRateLabel = new wxStaticText(rateBar, CTL_RATELABEL, _("Refresh rate:"));
+    rateBar->AddControl(stRateLabel);
+    slRate = new wxSlider(rateBar, CTL_RATESLIDER, 1, 0, 600, wxDefaultPosition, wxSize(150, -1));
+    rateBar->AddControl(slRate);
+    stRate = new wxStaticText(rateBar, CTL_RATELABEL2, _("Stopped"), wxDefaultPosition, wxSize(100, -1));
+    rateBar->AddControl(stRate);
+
+    // Set up notebook
+    nbStatus = new wxAuiNotebook(this, CTL_NTBK);
+    AddStatusPage();
+    AddLockPage();
+    AddXactPage();
+    AddLogPage();
+
+    // page 0 is selected by default
+    nbStatus->SetSelection(0);
+    
+    // Sync the View menu options
+    viewMenu->Check(MNU_STATUSPAGE, true);
+    viewMenu->Check(MNU_LOCKPAGE, true);
+    viewMenu->Check(MNU_XACTPAGE, true);
+    viewMenu->Check(MNU_LOGPAGE, true);
+
+    // Create panel
+    manager.AddPane(toolBar, wxAuiPaneInfo().Name(wxT("toolBar")).Caption(_("Tool bar")).ToolbarPane().Top().LeftDockable(false).RightDockable(false));
+    manager.AddPane(rateBar, wxAuiPaneInfo().Name(wxT("rateBar")).Caption(_("Rate bar")).ToolbarPane().Top().LeftDockable(false).RightDockable(false));
+    manager.AddPane(nbStatus, wxAuiPaneInfo().Name(wxT("notebook")).Caption(_("notebook")).Center().CaptionVisible(false).CloseButton(false).MinSize(wxSize(200, 100)).BestSize(wxSize(300, 200)));
+
+    // Now load the layout
+    wxString perspective;
+    settings->Read(wxT("frmStatus/Perspective-") + VerFromRev(FRMSTATUS_PERSPECTIVE_VER), &perspective, FRMSTATUS_DEFAULT_PERSPECTIVE);
+    manager.LoadPerspective(perspective, true);
+
+    // tell the manager to "commit" all the changes just made
+    manager.Update();
+
+    long rate;
+    settings->Read(wxT("frmStatus/Refreshrate"), &rate, 1);
+    slRate->SetValue(rate);
+
+    wxString msg;
+    switch (rate)
+    {
+    case 0:
+        msg.Printf(_("Stopped"));
+        break;
+    case 1:
+        msg.Printf(_("1 second"));
+        break;
+    default:
+        msg.Printf(_("%d seconds"), rate);
+        break;
+    }
+    stRate->SetLabel(msg);
+
+    timer=new wxTimer(this, TIMER_ID);
+    backend_pid=connection->GetBackendPID();
+
+    //this->SetSizer(item0);
+    //item0->Fit(this);
+
+    RestorePosition(100, 100, 600, 500, 450, 300);
+
+	loaded = true;
 }
 
+
+frmStatus::~frmStatus()
+{
+    if (mainForm)
+        mainForm->RemoveFrame(this);
+
+    settings->Write(wxT("frmStatus/Perspective-") + VerFromRev(FRMSTATUS_PERSPECTIVE_VER), manager.SavePerspective());
+    manager.UnInit();
+
+    SavePosition();
+    settings->Write(wxT("frmStatus/Refreshrate"), slRate->GetValue());
+
+    delete timer;
+    if (connection)
+        delete connection;
+
+    for (size_t index = 0 ; index < nbStatus->GetPageCount() ; index++)
+    {
+        if (nbStatus->GetPageText(index) == wxT("Logfile"))
+        {
+            if (logPage > 0)
+                emptyLogfileCombo();
+        }
+    }
+}
+
+
+void frmStatus::Go()
+{
+    Show(true);
+    wxCommandEvent nullEvent;
+
+    long rate = slRate->GetValue();
+    
+    wxString msg;
+    switch (rate)
+    {
+    case 0:
+        msg.Printf(_("Stopped"));
+        break;
+    case 1:
+        msg.Printf(_("1 second"));
+        break;
+    default:
+        msg.Printf(_("%d seconds"), rate);
+        break;
+    }
+    stRate->SetLabel(msg);
+
+    if (rate)
+        timer->Start(rate*1000L);
+
+    OnRefresh(nullEvent);
+}
+
+
 void frmStatus::OnClose(wxCloseEvent &event)
 {
     Destroy();
 }
 
 
-void ChangeButtonId(wxButton *btn, int id, const wxChar *txt)
+void frmStatus::OnExit(wxCommandEvent& event)
 {
-    btn->SetId(id);
-    btn->SetLabel(txt);
+    Destroy();
 }
 
 
-frmStatus::frmStatus(frmMain *form, const wxString& _title, pgConn *conn)
+void frmStatus::AddStatusPage()
 {
-	loaded = false;
-    xactPage=2;
-    logPage=3;
+    // Create panel
+    wxPanel *pnlActivity = new wxPanel(nbStatus);
+    
+    // Create flex grid
+    wxFlexGridSizer *grdActivity = new wxFlexGridSizer(2, 1, 5, 5);
+    grdActivity->AddGrowableCol(0);
+    grdActivity->AddGrowableRow(0);
 
-    wxWindowBase::SetFont(settings->GetSystemFont());
-    LoadResource(0, wxT("frmStatus")); 
+    // Add the list control
+    wxListCtrl *lstStatus = new wxListCtrl(pnlActivity, CTL_STATUSLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER);
+    grdActivity->Add(lstStatus, 0, wxGROW, 3);
 
-    RestorePosition(-1, -1, 400, 240, 200, 150);
-    SetTitle(_title);
-    appearanceFactory->SetIcons(this);
+    // Add the controls' flex grid and its controls
+    wxFlexGridSizer *item3 = new wxFlexGridSizer(1, 2, 5, 5);
+    btnCancelSt = new wxButton(pnlActivity, CTL_CANCELBTN1, _("Cancel"));
+    item3->Add(btnCancelSt, 0, wxALL|wxALIGN_CENTRE|wxALIGN_CENTRE_VERTICAL, 5);
+    btnTerminateSt = new wxButton(pnlActivity, CTL_TERMINATEBTN1, _("Terminate"));
+    item3->Add(btnTerminateSt, 0, wxALL|wxALIGN_CENTRE|wxALIGN_CENTRE_VERTICAL, 5);
+    grdActivity->Add(item3, 0, wxGROW, 3);
 
-    mainForm=form;
-    timer=0;
-    connection=conn;
-    logHasTimestamp = false;
-    logFormatKnown = false;
-    btnCancelSt = CTRL_BUTTON("btnCancelSt");
-    btnCancelLk = CTRL_BUTTON("btnCancelLk");
-    btnTerminateSt = CTRL_BUTTON("btnTerminateSt");
-    btnTerminateLk = CTRL_BUTTON("btnTerminateLk");
-    btnCommit = CTRL_BUTTON("btnCommit");
-    btnRollback = CTRL_BUTTON("btnRollback");
-    ChangeButtonId(btnTerminateSt, wxID_STOP, _("Terminate"));
-    ChangeButtonId(btnTerminateLk, wxID_STOP, _("Terminate"));
-
-    logfileLength = 0;
-    backend_pid=conn->GetBackendPID();
-
+    // Add the panel to the notebook
+    nbStatus->AddPage(pnlActivity, wxT("Status"));
+    
+    // Auto-sizing
+    pnlActivity->SetSizer(grdActivity);
+    grdActivity->Fit(pnlActivity);
+    
+    // Add each column to the list control
+    statusList = (ctlListView*)lstStatus;
     statusList->AddColumn(wxT("PID"), 35);
     statusList->AddColumn(_("Database"), 70);
     statusList->AddColumn(_("User"), 70);
@@ -116,16 +321,51 @@
         statusList->AddColumn(_("Client"), 70);
 		statusList->AddColumn(_("Client start"), 80);
 	}
-
     if (connection->BackendMinimumVersion(7, 4))
         statusList->AddColumn(_("Query start"), 50);
-
     if (connection->BackendMinimumVersion(8, 3))
         statusList->AddColumn(_("TX start"), 50);
-
 	statusList->AddColumn(_("Blocked by"), 35);
     statusList->AddColumn(_("Query"), 500);
 
+    // Fix buttons
+    ChangeButtonId(btnTerminateSt, wxID_STOP, _("Terminate"));
+	btnCancelSt->Enable(false);
+	btnTerminateSt->Enable(false);
+}
+
+
+void frmStatus::AddLockPage()
+{
+    // Create panel
+    wxPanel *pnlLock = new wxPanel(nbStatus);
+    
+    // Create flex grid
+    wxFlexGridSizer *grdLock = new wxFlexGridSizer(2, 1, 5, 5);
+    grdLock->AddGrowableCol(0);
+    grdLock->AddGrowableRow(0);
+
+    // Add the list control
+    wxListCtrl *lstLocks = new wxListCtrl(pnlLock, CTL_XACTLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER);
+    grdLock->Add(lstLocks, 0, wxGROW, 3);
+
+    // Add the controls' flex grid and its controls
+    wxFlexGridSizer *item5 = new wxFlexGridSizer(1, 2, 5, 5);
+    btnCancelLk = new wxButton(pnlLock, CTL_CANCELBTN2, _("Cancel"));
+    item5->Add(btnCancelLk, 0, wxALL|wxALIGN_CENTRE|wxALIGN_CENTRE_VERTICAL, 5);
+    btnTerminateLk = new wxButton(pnlLock, CTL_TERMINATEBTN2, _("Terminate"));
+    item5->Add(btnTerminateLk, 0, wxALL|wxALIGN_CENTRE|wxALIGN_CENTRE_VERTICAL, 5);
+    grdLock->Add(item5, 0, wxGROW, 3);
+
+    // Add the panel to the notebook
+    nbStatus->AddPage(pnlLock, wxT("Locks"));
+    
+    // Auto-sizing
+    pnlLock->SetSizer(grdLock);
+    grdLock->Fit(pnlLock);
+
+    // Add each column to the list control
+    lockList = (ctlListView*)lstLocks;
     lockList->AddColumn(wxT("PID"), 35);
     lockList->AddColumn(_("Database"), 50);
     lockList->AddColumn(_("Relation"), 50);
@@ -137,9 +377,46 @@
     lockList->AddColumn(_("Granted"), 50);
     if (connection->BackendMinimumVersion(7, 4))
         lockList->AddColumn(_("Start"), 50);
-
     lockList->AddColumn(_("Query"), 500);
 
+    // Fix buttons
+    ChangeButtonId(btnTerminateLk, wxID_STOP, _("Terminate"));
+	btnCancelLk->Enable(false);
+	btnTerminateLk->Enable(false);
+}
+
+
+void frmStatus::AddXactPage()
+{
+    // Create panel
+    wxPanel *pnlXacts = new wxPanel(nbStatus);
+    
+    // Create flex grid
+    wxFlexGridSizer *grdXacts = new wxFlexGridSizer(2, 1, 5, 5);
+    grdXacts->AddGrowableCol(0);
+    grdXacts->AddGrowableRow(0);
+
+    // Add the list control
+    wxListCtrl *lstXacts = new wxListCtrl(pnlXacts, CTL_LOCKLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER);
+    grdXacts->Add(lstXacts, 0, wxGROW, 3);
+
+    // Add the controls' flex grid and its controls
+    wxFlexGridSizer *item4 = new wxFlexGridSizer(1, 2, 5, 5);
+    btnCommit = new wxButton(pnlXacts, CTL_COMMITBTN, _("Commit"));
+    item4->Add(btnCommit, 0, wxALL|wxALIGN_CENTRE|wxALIGN_CENTRE_VERTICAL, 5);
+    btnRollback = new wxButton(pnlXacts, CTL_ROLLBACKBTN, _("Rollback"));
+    item4->Add(btnRollback, 0, wxALL|wxALIGN_CENTRE|wxALIGN_CENTRE_VERTICAL, 5);
+    grdXacts->Add(item4, 0, wxGROW, 3);
+
+    // Add the panel to the notebook
+    nbStatus->AddPage(pnlXacts, wxT("Transactions"));
+
+    // Auto-sizing
+    pnlXacts->SetSizer(grdXacts);
+    grdXacts->Fit(pnlXacts);
+
+    // Add each column to the list control
+    xactList = (ctlListView*)lstXacts;
     if (connection->BackendMinimumVersion(8, 1))
     {
         xactList->AddColumn(wxT("XID"), 50);
@@ -155,6 +432,35 @@
         xactPage=-5;
     }
 
+    // Fix buttons
+    if (connection->BackendMinimumVersion(8, 1))
+    {
+	    btnCommit->Enable(false);
+	    btnRollback->Enable(false);
+    }
+}
+
+
+void frmStatus::AddLogPage()
+{
+    wxPanel *pnlLog = new wxPanel(nbStatus);
+    wxFlexGridSizer *grdLog = new wxFlexGridSizer(2, 1, 5, 5);
+    grdLog->AddGrowableCol(0);
+    grdLog->AddGrowableRow(0);
+    wxListCtrl *lstLog = new wxListCtrl(pnlLog, CTL_LOGLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER);
+    grdLog->Add(lstLog, 0, wxGROW, 3);
+    wxFlexGridSizer *item6 = new wxFlexGridSizer(1, 2, 5, 5);
+    cbLogfiles = new wxComboBox(pnlLog, CTL_LOGCBO, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL,
+    wxCB_READONLY|wxCB_DROPDOWN);
+    item6->Add(cbLogfiles, 0, wxALL|wxALIGN_CENTRE|wxALIGN_CENTRE_VERTICAL, 5);
+    btnRotateLog = new wxButton(pnlLog, CTL_ROTATEBTN, _("Rotate"));
+    item6->Add(btnRotateLog, 0, wxALL, 5);
+    grdLog->Add(item6, 0, wxGROW, 3);
+    pnlLog->SetSizer(grdLog);
+    grdLog->Fit(pnlLog);
+    nbStatus->AddPage(pnlLog, wxT("Logfile"));
+    logList = (ctlListView*)lstLog;
+
     if (connection->BackendMinimumVersion(8, 0) && 
 		 connection->HasFeature(FEATURE_FILEREAD))
     {
@@ -188,83 +494,117 @@
         nbStatus->DeletePage(logPage);
         logPage=-5;
     }
-    long rate;
-    settings->Read(wxT("frmStatus/Refreshrate"), &rate, 1);
-    slRate->SetValue(rate);
 
-    wxString msg;
-    switch (rate)
+    // Re-initialize variables
+    logfileLength = 0;
+}
+
+
+void frmStatus::OnToggleStatusPage(wxCommandEvent& event)
+{
+    if (viewMenu->IsChecked(MNU_STATUSPAGE))
     {
-    case 0:
-        msg.Printf(_("Stopped"));
-        break;
-    case 1:
-        msg.Printf(_("1 second"));
-        break;
-    default:
-        msg.Printf(_("%d seconds"), rate);
-        break;
+        AddStatusPage();
     }
-    stRate->SetLabel(msg);
+    else
+    {
+        for (size_t i=0 ; i<nbStatus->GetPageCount() ; i++)
+        {
+            if (nbStatus->GetPageText(i) == wxT("Status"))
+                nbStatus->DeletePage(i);
+        }
+    }
+}
 
-    timer=new wxTimer(this, TIMER_ID);
 
-	btnCancelSt->Enable(false);
-	btnTerminateSt->Enable(false);
-	btnCancelLk->Enable(false);
-	btnTerminateLk->Enable(false);
-    if (connection->BackendMinimumVersion(8, 1))
+void frmStatus::OnToggleLockPage(wxCommandEvent& event)
+{
+    if (viewMenu->IsChecked(MNU_LOCKPAGE))
     {
-	    btnCommit->Enable(false);
-	    btnRollback->Enable(false);
+        AddLockPage();
     }
-
-	loaded = true;
+    else
+    {
+        for (size_t i=0 ; i<nbStatus->GetPageCount() ; i++)
+        {
+            if (nbStatus->GetPageText(i) == wxT("Locks"))
+                nbStatus->DeletePage(i);
+        }
+    }
 }
 
 
-frmStatus::~frmStatus()
+void frmStatus::OnToggleXactPage(wxCommandEvent& event)
 {
-    mainForm->RemoveFrame(this);
+    if (viewMenu->IsChecked(MNU_XACTPAGE))
+    {
+        AddXactPage();
+    }
+    else
+    {
+        for (size_t i=0 ; i<nbStatus->GetPageCount() ; i++)
+        {
+            if (nbStatus->GetPageText(i) == wxT("Transactions"))
+                nbStatus->DeletePage(i);
+        }
+    }
+}
 
-    SavePosition();
-    settings->Write(wxT("frmStatus/Refreshrate"), slRate->GetValue());
 
-    delete timer;
-    if (connection)
-        delete connection;
-
-    if (logPage > 0)
-        emptyLogfileCombo();
+void frmStatus::OnToggleLogPage(wxCommandEvent& event)
+{
+    if (viewMenu->IsChecked(MNU_LOGPAGE))
+    {
+        AddLogPage();
+    }
+    else
+    {
+        for (size_t i=0 ; i<nbStatus->GetPageCount() ; i++)
+        {
+            if (nbStatus->GetPageText(i) == wxT("Logfile"))
+                nbStatus->DeletePage(i);
+        }
+    }
 }
 
 
-void frmStatus::Go()
+void frmStatus::OnDefaultView(wxCommandEvent& event)
 {
-    Show(true);
-    wxCommandEvent nullEvent;
-
-    long rate = slRate->GetValue();
-    
-    wxString msg;
-    switch (rate)
+    // Delete all tabs...
+    for (size_t i=0 ; i<nbStatus->GetPageCount() ; i++)
     {
-    case 0:
-        msg.Printf(_("Stopped"));
-        break;
-    case 1:
-        msg.Printf(_("1 second"));
-        break;
-    default:
-        msg.Printf(_("%d seconds"), rate);
-        break;
+        nbStatus->DeletePage(0);
     }
-    stRate->SetLabel(msg);
+    
+    // then recreate all tabs
+    AddStatusPage();
+    AddLockPage();
+    AddXactPage();
+    AddLogPage();
+    
+    // Page 0 is selected by default
+    nbStatus->SetSelection(0);
+    
+    // Sync the View menu options
+    viewMenu->Check(MNU_STATUSPAGE, true);
+    viewMenu->Check(MNU_LOCKPAGE, true);
+    viewMenu->Check(MNU_XACTPAGE, true);
+    viewMenu->Check(MNU_LOGPAGE, true);
+}
 
-    if (rate)
-        timer->Start(rate*1000L);
 
-    OnRefresh(nullEvent);
+void frmStatus::OnHelp(wxCommandEvent& event)
+{
+    
+    wxLogError(wxT("Heeeeelp!"));
+    wxString page;
+    if (page.IsEmpty())
+        page=wxT("sql-commands");
+
+    if (connection->GetIsEdb())
+        DisplayHelp(page, HELP_ENTERPRISEDB);
+    else
+        DisplayHelp(page, HELP_POSTGRESQL);
 }
 
 
@@ -287,6 +627,22 @@
 }
 
 
+void frmStatus::OnNotebookPageClosed(wxAuiNotebookEvent& event)
+{
+    if (nbStatus->GetPageText(nbStatus->GetSelection()) == wxT("Status"))
+        viewMenu->Check(MNU_STATUSPAGE, false);
+
+    if (nbStatus->GetPageText(nbStatus->GetSelection()) == wxT("Locks"))
+        viewMenu->Check(MNU_LOCKPAGE, false);
+
+    if (nbStatus->GetPageText(nbStatus->GetSelection()) == wxT("Transactions"))
+        viewMenu->Check(MNU_XACTPAGE, false);
+
+    if (nbStatus->GetPageText(nbStatus->GetSelection()) == wxT("Logfile"))
+        viewMenu->Check(MNU_LOGPAGE, false);
+}
+
+
 void frmStatus::OnRateChange(wxScrollEvent &event)
 {
     if (timer)
@@ -331,14 +687,14 @@
 	// To avoid hammering the lock manager (and the network for that matter),
 	// only query for the required tab.
 
-	wxLogNull nolog;
+	//wxLogNull nolog;
 
 	if (!connection)
 	    return;
 
     connection->ExecuteVoid(wxT("SET log_statement='none';"));
 
-	if (nbStatus->GetSelection() == 0)
+	if (nbStatus->GetPageText(nbStatus->GetSelection()) == wxT("Status"))
     {
         // Status
 		long row=0;
@@ -421,7 +777,7 @@
                 row++;
 		}
 	}
-	else if (nbStatus->GetSelection() == 1)
+	else if (nbStatus->GetPageText(nbStatus->GetSelection()) == wxT("Locks"))
     {
 		// Locks
 		long row=0;
@@ -545,7 +901,7 @@
                 row++;
 		}
 	}
-    else if (nbStatus->GetSelection() == xactPage)
+    else if (nbStatus->GetPageText(nbStatus->GetSelection()) == wxT("Transactions"))
     {
 		// Transactions
 		long row=0;
@@ -597,17 +953,23 @@
         else
             checkConnection();
 
-        row=0;
-		while (row < lockList->GetItemCount())
-		{
-			long itempid=StrToLong(lockList->GetItemText(row));
-			if (itempid && itempid > pid)
-				lockList->DeleteItem(row);
-            else
-                row++;
-		}
+        for (size_t i=0 ; i<nbStatus->GetPageCount() ; i++)
+        {
+            if (nbStatus->GetPageText(i) == wxT("Locks"))
+            {
+                row=0;
+		        while (row < lockList->GetItemCount())
+		        {
+			        long itempid=StrToLong(lockList->GetItemText(row));
+			        if (itempid && itempid > pid)
+				        lockList->DeleteItem(row);
+                    else
+                        row++;
+		        }
+		    }
+        }
     }
-    else if (nbStatus->GetSelection() == logPage)
+    else if (nbStatus->GetPageText(nbStatus->GetSelection()) == wxT("Logfile"))
     {
         long newlen=0;
 
@@ -703,12 +1065,14 @@
 
 void frmStatus::checkConnection()
 {
+    wxLogError(wxT("beg checkConnection"));
     if (!connection->IsAlive())
 	{
 	    delete connection;
 		connection=0;
 		statusBar->SetStatusText(_("Connection broken."));
 	}
+    wxLogError(wxT("end checkConnection"));
 }
 
 
@@ -731,6 +1095,7 @@
     }
 }
 
+
 void frmStatus::addLogFile(const wxString &filename, const wxDateTime timestamp, long len, long &read, bool skipFirst)
 {
     wxString line;
@@ -797,7 +1162,6 @@
 }
 
 
-
 void frmStatus::addLogLine(const wxString &str, bool formatted)
 {
     int row=logList->GetItemCount();
-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers

Reply via email to