Le 31/01/2010 17:44, Little, Douglas a écrit :
> Guillaume,
> Looks great. I think people will really like it.
> Thanks for all the hard work.
>
> Cheers!
> Doug
>
>
> -----Original Message-----
> From: Guillaume Lelarge [mailto:[email protected]]
> Sent: Sunday, January 31, 2010 10:04 AM
> To: Dave Page
> Cc: pgadmin-support; Little, Douglas
> Subject: Re: [pgadmin-support] feture request
>
> Le 28/01/2010 10:04, Dave Page a écrit :
>> On Thu, Jan 28, 2010 at 8:45 AM, Guillaume Lelarge
>> <[email protected]> wrote:
>>>>> * probably I need to add a Clear button?
>>>>
>>>> Nah - just delete the file.
>>>>
>>>
>>> When should it delete the file? do you mean that we should have a delete
>>> button? in the option dialog?
>>
>> No, I mean the user can delete it. If possible (not likely, but might
>> be fun to figure out), it might be nice to add a remove icon (circle
>> with an X?) to the end of the combo box so individual queries can be
>> removed.
>>
>
> Here is the patch I intend to commit. I added a "Delete All" and a
> "Delete Current" buttons. I didn't add code for the filename change, it
> will be part of another patch.
>
> See the screenshot to see how it looks on the query window.
>
> There's probably more to do with this feature, like the maximum number
> of statements to keep. I'll work on that later, probably not for the
> next release.
>
> Any more comments?
>
I changed a few things, the way we handle multiline queries for example.
Any last comments?
--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com
diff --git a/pgadmin/frm/frmQuery.cpp b/pgadmin/frm/frmQuery.cpp
index 7da6853..50979f3 100644
--- a/pgadmin/frm/frmQuery.cpp
+++ b/pgadmin/frm/frmQuery.cpp
@@ -79,6 +79,10 @@
#define CTRLID_CONNECTION 4200
#define CTRLID_DATABASELABEL 4201
+#define XML_FROM_WXSTRING(s) ((const xmlChar *)(const char *)s.mb_str(wxConvUTF8))
+#define WXSTRING_FROM_XML(s) wxString((char *)s, wxConvUTF8)
+#define XML_STR(s) ((const xmlChar *)s)
+
// Initialize execution 'mutex'. As this will always run in the
// main thread, there aren't any real concurrency issues, so
// a simple flag will suffice.
@@ -89,6 +93,7 @@ BEGIN_EVENT_TABLE(frmQuery, pgFrame)
EVT_ERASE_BACKGROUND( frmQuery::OnEraseBackground)
EVT_SIZE( frmQuery::OnSize)
EVT_COMBOBOX(CTRLID_CONNECTION, frmQuery::OnChangeConnection)
+EVT_COMBOBOX(CTL_SQLQUERYCBOX, frmQuery::OnChangeQuery)
EVT_CLOSE( frmQuery::OnClose)
EVT_SET_FOCUS( frmQuery::OnSetFocus)
EVT_MENU(MNU_NEW, frmQuery::OnNew)
@@ -153,6 +158,8 @@ EVT_MENU(QUERY_COMPLETE, frmQuery::OnQueryComplete)
EVT_MENU(PGSCRIPT_COMPLETE, frmQuery::OnScriptComplete)
EVT_NOTEBOOK_PAGE_CHANGED(CTL_NTBKCENTER, frmQuery::OnChangeNotebook)
EVT_SPLITTER_SASH_POS_CHANGED(GQB_HORZ_SASH, frmQuery::OnResizeHorizontally)
+EVT_BUTTON(CTL_DELETECURRENTBTN, frmQuery::OnDeleteCurrent)
+EVT_BUTTON(CTL_DELETEALLBTN, frmQuery::OnDeleteAll)
END_EVENT_TABLE()
class DnDFile : public wxFileDropTarget
@@ -401,12 +408,50 @@ pgsTimer(new pgScriptTimer(this))
//Create SQL editor notebook
sqlNotebook = new wxNotebook(this, CTL_NTBKCENTER, wxDefaultPosition, wxDefaultSize);
+ // Create panel for query
+ wxPanel *pnlQuery = new wxPanel(sqlNotebook);
+
+ // Create the outer box sizer
+ wxBoxSizer *boxQuery = new wxBoxSizer(wxVERTICAL);
+
+ // Create the inner box sizer
+ // This one will contain the combobox, and the two buttons
+ wxBoxSizer *boxHistory = new wxBoxSizer(wxHORIZONTAL);
+
+ // Query combobox
+ sqlQueries = new wxComboBox(pnlQuery, CTL_SQLQUERYCBOX, wxT(""), wxDefaultPosition, wxDefaultSize, NULL, wxCB_DROPDOWN);
+ LoadQueries();
+ boxHistory->Add(sqlQueries, 1, wxEXPAND | wxALL, 1);
+
+ // Delete Current button
+ btnDeleteCurrent = new wxButton(pnlQuery, CTL_DELETECURRENTBTN, wxT("Delete Current"));
+ btnDeleteCurrent->Enable(false);
+ boxHistory->Add(btnDeleteCurrent, 0, wxALL | wxALIGN_RIGHT, 1);
+
+ // Delete All button
+ btnDeleteAll = new wxButton(pnlQuery, CTL_DELETEALLBTN, wxT("Delete All"));
+ btnDeleteAll->Enable(sqlQueries->GetCount() > 0);
+ boxHistory->Add(btnDeleteAll, 0, wxALL | wxALIGN_RIGHT, 1);
+
+ boxQuery->Add(boxHistory, 0, wxEXPAND | wxALL, 1);
+
+ // Create the other inner box sizer
+ // This one will contain the SQL box
+ wxBoxSizer *boxSQL = new wxBoxSizer(wxHORIZONTAL);
+
// Query box
- sqlQuery = new ctlSQLBox(sqlNotebook, CTL_SQLQUERY, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSIMPLE_BORDER | wxTE_RICH2);
+ sqlQuery = new ctlSQLBox(pnlQuery, CTL_SQLQUERY, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSIMPLE_BORDER | wxTE_RICH2);
sqlQuery->SetDatabase(conn);
sqlQuery->SetMarginWidth(1, 16);
- sqlQuery->SetDropTarget(new DnDFile(this));
+ sqlQuery->SetDropTarget(new DnDFile(this));
SetEOLModeDisplay(sqlQuery->GetEOLMode());
+ boxSQL->Add(sqlQuery, 1, wxEXPAND | wxRIGHT | wxLEFT | wxBOTTOM, 1);
+
+ boxQuery->Add(boxSQL, 1, wxEXPAND | wxRIGHT | wxLEFT | wxBOTTOM, 1);
+
+ // Auto-sizing
+ pnlQuery->SetSizer(boxQuery);
+ boxQuery->Fit(pnlQuery);
// Results pane
outputPane = new wxNotebook(this, CTL_NTBKGQB, wxDefaultPosition, wxSize(500, 300));
@@ -426,7 +471,7 @@ pgsTimer(new pgScriptTimer(this))
adjustSizesTimer=NULL; // Timer used to avoid a bug when close outputPane
// Setup SQL editor notebook NBP_SQLEDTR
- sqlNotebook->AddPage(sqlQuery, _("SQL Editor"));
+ sqlNotebook->AddPage(pnlQuery, _("SQL Editor"));
sqlNotebook->AddPage(controller->getViewContainer(), _("Graphical Query Builder"));
sqlNotebook->SetSelection(0);
@@ -2182,6 +2227,13 @@ void frmQuery::execQuery(const wxString &query, int resultToRetrieve, bool singl
Update();
wxTheApp->Yield(true);
+ wxString tmp = query;
+ tmp.Replace(wxT("\n"), wxT(" "));
+ tmp.Replace(wxT("\r"), wxT(" "));
+ sqlQueries->Append(tmp);
+ histoQueries.Add(query);
+ SaveQueries();
+
startTimeQuery=wxGetLocalTimeMillis();
timer.Start(10);
@@ -2627,6 +2679,129 @@ wxColour frmQuery::GetServerColour()
return tmp;
}
+void frmQuery::LoadQueries()
+{
+ xmlTextReaderPtr reader;
+
+ if (!wxFile::Access(sysSettings::GetConfigFile(sysSettings::PGAHISTOQUERIES), wxFile::read))
+ return;
+
+ reader = xmlReaderForFile((const char *)sysSettings::GetConfigFile(sysSettings::PGAHISTOQUERIES).mb_str(wxConvUTF8),NULL,0);
+ if (!reader)
+ {
+ wxMessageBox(_("Failed to load histoqueries file!"));
+ return;
+ }
+
+ while (xmlTextReaderRead(reader))
+ {
+ wxString nodename = WXSTRING_FROM_XML(xmlTextReaderConstName(reader));
+
+ if (nodename == wxT("histoquery"))
+ {
+ xmlChar *cont = xmlTextReaderReadString(reader);
+
+ if (!cont)
+ continue;
+
+ if (WXSTRING_FROM_XML(cont) != wxT(""))
+ {
+ wxString query = WXSTRING_FROM_XML(cont);
+ wxString tmp = query;
+ tmp.Replace(wxT("\n"), wxT(" "));
+ tmp.Replace(wxT("\r"), wxT(" "));
+ sqlQueries->Append(tmp);
+ histoQueries.Add(query);
+ }
+
+ xmlFree(cont);
+ }
+ }
+
+ xmlTextReaderClose(reader);
+ xmlFreeTextReader(reader);
+ xmlCleanupParser();
+
+ return;
+}
+
+
+void frmQuery::SaveQueries()
+{
+ size_t i;
+ xmlTextWriterPtr writer;
+
+ writer = xmlNewTextWriterFilename((const char *)sysSettings::GetConfigFile(sysSettings::PGAHISTOQUERIES).mb_str(wxConvUTF8),0);
+ if (!writer)
+ {
+ wxMessageBox(_("Failed to write to histoqueries file!"));
+ return;
+ }
+ xmlTextWriterSetIndent(writer, 1);
+
+ if ((xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL) < 0) ||
+ (xmlTextWriterStartElement(writer, XML_STR("histoqueries")) < 0))
+ {
+ wxMessageBox(_("Failed to write to histoqueries file!"));
+ xmlFreeTextWriter(writer);
+ return;
+ }
+
+ for (i = 0; i < histoQueries.GetCount(); i++)
+ {
+ xmlTextWriterStartElement(writer, XML_STR("histoquery"));
+ xmlTextWriterWriteString(writer, XML_FROM_WXSTRING(histoQueries.Item(i)));
+ xmlTextWriterEndElement(writer);
+ }
+
+ if (xmlTextWriterEndDocument(writer) < 0)
+ {
+ wxMessageBox(_("Failed to write to histoqueries file!"));
+ }
+
+ xmlFreeTextWriter(writer);
+}
+
+
+void frmQuery::OnChangeQuery(wxCommandEvent &event)
+{
+ wxString query = histoQueries.Item(sqlQueries->GetSelection());
+ if (query.Length() > 0)
+ {
+ sqlQuery->SetText(query);
+ sqlQuery->Colourise(0, query.Length());
+ wxSafeYield(); // needed to process sqlQuery modify event
+ changed = false;
+ setExtendedTitle();
+ SetLineEndingStyle();
+ btnDeleteCurrent->Enable(true);
+ }
+ btnDeleteAll->Enable(sqlQueries->GetCount() > 0);
+}
+
+
+void frmQuery::OnDeleteCurrent(wxCommandEvent& event)
+{
+ histoQueries.RemoveAt(sqlQueries->GetSelection());
+ sqlQueries->Delete(sqlQueries->GetSelection());
+ sqlQueries->SetValue(wxT(""));
+ btnDeleteCurrent->Enable(false);
+ btnDeleteAll->Enable(sqlQueries->GetCount() > 0);
+ SaveQueries();
+}
+
+
+void frmQuery::OnDeleteAll(wxCommandEvent& event)
+{
+ histoQueries.Clear();
+ sqlQueries->Clear();
+ sqlQueries->SetValue(wxT(""));
+ btnDeleteCurrent->Enable(false);
+ btnDeleteAll->Enable(false);
+ SaveQueries();
+}
+
+
///////////////////////////////////////////////////////
wxWindow *queryToolBaseFactory::StartDialogSql(frmMain *form, pgObject *obj, const wxString &sql)
diff --git a/pgadmin/include/frm/frmQuery.h b/pgadmin/include/frm/frmQuery.h
index 0b771db..3ffc24c 100644
--- a/pgadmin/include/frm/frmQuery.h
+++ b/pgadmin/include/frm/frmQuery.h
@@ -83,6 +83,10 @@ private:
wxTextCtrl *msgResult, *msgHistory;
wxBitmapComboBox *cbConnection;
wxTextCtrl *scratchPad;
+ wxComboBox *sqlQueries;
+ wxButton *btnDeleteCurrent;
+ wxButton *btnDeleteAll;
+ wxArrayString histoQueries;
// Query timing/status update
wxTimer timer;
@@ -173,6 +177,9 @@ private:
void OnCommentText(wxCommandEvent& event);
void OnUncommentText(wxCommandEvent& event);
+ void OnDeleteCurrent(wxCommandEvent& event);
+ void OnDeleteAll(wxCommandEvent& event);
+
void OnTimer(wxTimerEvent & event);
void OpenLastFile();
@@ -191,6 +198,10 @@ private:
void OnMacroManage(wxCommandEvent& event);
void UpdateMacrosList();
+ void LoadQueries();
+ void SaveQueries();
+ void OnChangeQuery(wxCommandEvent &event);
+
wxBitmap CreateBitmap(const wxColour& colour);
wxColour GetServerColour();
@@ -236,7 +247,10 @@ enum
CTL_COLSGRID,
CTL_TIMERSIZES,
CTL_TIMERFRM,
- CTL_NTBKGQB
+ CTL_NTBKGQB,
+ CTL_SQLQUERYCBOX,
+ CTL_DELETECURRENTBTN,
+ CTL_DELETEALLBTN
};
///////////////////////////////////////////////////////
diff --git a/pgadmin/include/utils/sysSettings.h b/pgadmin/include/utils/sysSettings.h
index 95e7682..81e6788 100644
--- a/pgadmin/include/utils/sysSettings.h
+++ b/pgadmin/include/utils/sysSettings.h
@@ -181,7 +181,8 @@ public:
{
PGPASS,
PGAFAVOURITES,
- PGAMACROS
+ PGAMACROS,
+ PGAHISTOQUERIES
};
static wxString GetConfigFile(configFileName cfgname);
diff --git a/pgadmin/utils/sysSettings.cpp b/pgadmin/utils/sysSettings.cpp
index faa8c16..b9a73cb 100644
--- a/pgadmin/utils/sysSettings.cpp
+++ b/pgadmin/utils/sysSettings.cpp
@@ -683,7 +683,7 @@ void sysSettings::SetCanonicalLanguage(const wxLanguage &lang)
//////////////////////////////////////////////////////////////////////////
wxString sysSettings::GetConfigFile(configFileName cfgname)
{
- if (cfgname == PGPASS || cfgname == PGAFAVOURITES || cfgname == PGAMACROS)
+ if (cfgname == PGPASS || cfgname == PGAFAVOURITES || cfgname == PGAMACROS || cfgname == PGAHISTOQUERIES)
{
wxStandardPaths stdp;
wxString fname=stdp.GetUserConfigDir();
@@ -702,6 +702,9 @@ wxString sysSettings::GetConfigFile(configFileName cfgname)
case PGAMACROS:
fname += wxT("\\pgadmin_macros.xml");
break;
+ case PGAHISTOQUERIES:
+ fname += wxT("\\pgadmin_histoqueries.xml");
+ break;
}
#else
switch(cfgname)
@@ -715,6 +718,9 @@ wxString sysSettings::GetConfigFile(configFileName cfgname)
case PGAMACROS:
fname += wxT("/.pgadminmacros");
break;
+ case PGAHISTOQUERIES:
+ fname += wxT("/.pgadmin_histoqueries");
+ break;
}
#endif
return fname;
--
Sent via pgadmin-support mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-support