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