SVN Commit by andreas: r4286 - in trunk/pgadmin3: . src/ctl src/dlg src/frm src/include src/include/ctl src/schema src/ui
От | svn@pgadmin.org |
---|---|
Тема | SVN Commit by andreas: r4286 - in trunk/pgadmin3: . src/ctl src/dlg src/frm src/include src/include/ctl src/schema src/ui |
Дата | |
Msg-id | 200506071829.j57ITrhV023904@developer.pgadmin.org обсуждение исходный текст |
Список | pgadmin-hackers |
Author: andreas Date: 2005-06-07 19:29:52 +0100 (Tue, 07 Jun 2005) New Revision: 4286 Modified: trunk/pgadmin3/CHANGELOG.txt trunk/pgadmin3/src/ctl/ctlComboBox.cpp trunk/pgadmin3/src/dlg/dlgAggregate.cpp trunk/pgadmin3/src/frm/frmStatus.cpp trunk/pgadmin3/src/include/ctl/ctlComboBox.h trunk/pgadmin3/src/include/dlgAggregate.h trunk/pgadmin3/src/include/pgAggregate.h trunk/pgadmin3/src/schema/pgAggregate.cpp trunk/pgadmin3/src/ui/dlgAggregate.xrc Log: Support for pgsql 8.1 aggregate sortop Modified: trunk/pgadmin3/CHANGELOG.txt =================================================================== --- trunk/pgadmin3/CHANGELOG.txt 2005-06-07 18:23:49 UTC (rev 4285) +++ trunk/pgadmin3/CHANGELOG.txt 2005-06-07 18:29:52 UTC (rev 4286) @@ -17,9 +17,10 @@ </ul> <br> <ul> + <li>2005-06-03 AP Support for pgsql 8.1 aggregate sortop <li>2005-06-03 AP Support for pgsql 8.1 pg_stat_activity <li>2005-06-03 AP Support for pgsql 8.1 instrumentation - <li>2005-06-01 AP Support for Procedures aka functions with out parameters + <li>2005-06-01 AP Support for Procedures aka functions "with out-parameters" <li>2005-06-01 AP Support for EDB8.0 <li>2005-05-31 DP 1.2.3 Fix domain RE SQL, per Ivan <li>2005-05-31 DP 1.2.3 Add missing ; to RE SQL, per Ivan Modified: trunk/pgadmin3/src/ctl/ctlComboBox.cpp =================================================================== --- trunk/pgadmin3/src/ctl/ctlComboBox.cpp 2005-06-07 18:23:49 UTC (rev 4285) +++ trunk/pgadmin3/src/ctl/ctlComboBox.cpp 2005-06-07 18:29:52 UTC (rev 4286) @@ -25,6 +25,26 @@ }; + + +int wxComboBoxFix::Append(const wxString& item, const wxString &str) +{ + return wxComboBox::Append(item, new StringClientData(str)); +} + + +int wxComboBoxFix::Append(const wxString& item, long l) +{ + return wxComboBox::Append(item, (void*)l); +} + + +int wxComboBoxFix::Append(const wxString& item, OID oid) +{ + return wxComboBox::Append(item, (void*)oid); +} + + int wxComboBoxFix::FillLongKey(pgConnBase *conn, const wxChar *qry) { int cnt=0; @@ -33,7 +53,7 @@ { long l=set.GetLong(0); wxString txt=set.GetVal(1); - Append(txt, (void*)l); + Append(txt, l); cnt++; } return cnt; @@ -48,7 +68,7 @@ { OID oid=set.GetOid(0); wxString txt=set.GetVal(1); - Append(txt, (void*)oid); + Append(txt, oid); cnt++; } return cnt; @@ -63,23 +83,30 @@ { wxString str=set.GetVal(0); wxString txt=set.GetVal(1); - Append(txt, new StringClientData(txt)); + Append(txt, str); cnt++; } return cnt; } + long wxComboBoxFix::GetLongKey(int sel) { + if (sel < 0) + sel = GetSelection(); return (long)GetClientData(sel); } OID wxComboBoxFix::GetOIDKey(int sel) { + if (sel < 0) + sel = GetSelection(); return (OID)GetClientData(sel); } wxString wxComboBoxFix::GetStringKey(int sel) { + if (sel < 0) + sel = GetSelection(); StringClientData *scd=(StringClientData*)GetClientObject(sel); if (scd) return scd->str; Modified: trunk/pgadmin3/src/dlg/dlgAggregate.cpp =================================================================== --- trunk/pgadmin3/src/dlg/dlgAggregate.cpp 2005-06-07 18:23:49 UTC (rev 4285) +++ trunk/pgadmin3/src/dlg/dlgAggregate.cpp 2005-06-07 18:29:52 UTC (rev 4286) @@ -31,16 +31,18 @@ #define cbStateType CTRL_COMBOBOX2("cbStateType") #define cbStateFunc CTRL_COMBOBOX("cbStateFunc") #define cbFinalFunc CTRL_COMBOBOX("cbFinalFunc") +#define cbSortOp CTRL_COMBOBOX("cbSortOp") #define txtInitial CTRL_TEXT("txtInitial") BEGIN_EVENT_TABLE(dlgAggregate, dlgTypeProperty) EVT_TEXT(XRCID("cbBaseType"), dlgAggregate::OnChangeTypeBase) - EVT_COMBOBOX(XRCID("cbBaseType"), dlgProperty::OnChange) + EVT_COMBOBOX(XRCID("cbBaseType"), dlgAggregate::OnChangeType) EVT_TEXT(XRCID("cbStateType"), dlgAggregate::OnChangeTypeState) - EVT_COMBOBOX(XRCID("cbStateType"), dlgProperty::OnChange) + EVT_COMBOBOX(XRCID("cbStateType"), dlgAggregate::OnChangeType) EVT_COMBOBOX(XRCID("cbStateFunc"), dlgProperty::OnChange) + EVT_COMBOBOX(XRCID("cbSortOp"), dlgProperty::OnChange) EVT_TEXT(XRCID("cbStateFunc"), dlgProperty::OnChange) END_EVENT_TABLE(); @@ -65,6 +67,9 @@ if (!connection->BackendMinimumVersion(7, 5)) cbOwner->Disable(); + if (!connection->BackendMinimumVersion(8, 1)) + cbSortOp->Disable(); + if (aggregate) { // edit mode @@ -79,14 +84,17 @@ cbFinalFunc->Append(aggregate->GetFinalFunction()); cbFinalFunc->SetSelection(0); + cbSortOp->Append(aggregate->GetSortOp()); + cbSortOp->SetSelection(0); + txtInitial->SetValue(aggregate->GetInitialCondition()); if (!connection->BackendMinimumVersion(7, 4)) txtName->Disable(); cbBaseType->Disable(); cbStateType->Disable(); - cbStateFunc->Disable(); cbFinalFunc->Disable(); + cbSortOp->Disable(); txtInitial->Disable(); } else @@ -136,20 +144,20 @@ void dlgAggregate::OnChangeTypeBase(wxCommandEvent &ev) { cbBaseType->GuessSelection(ev); - CheckChange(); + OnChangeType(ev); } void dlgAggregate::OnChangeTypeState(wxCommandEvent &ev) { cbStateType->GuessSelection(ev); - CheckChange(); + OnChangeType(ev); } void dlgAggregate::OnChangeType(wxCommandEvent &ev) { - procedures.Clear(); cbStateFunc->Clear(); cbFinalFunc->Clear(); + cbSortOp->Clear(); if (cbBaseType->GetGuessedSelection() >= 0 && cbStateType->GetGuessedSelection() >= 0) { @@ -158,21 +166,21 @@ wxT(" FROM pg_proc p\n") wxT(" JOIN pg_type t ON t.oid=p.prorettype\n") wxT(" JOIN pg_namespace n ON n.oid=pronamespace\n") - wxT(" WHERE proargtypes[2] = 0"); + wxT(" WHERE COALESCE(proargtypes[2],0) = 0"); pgSet *set=connection->ExecuteSet(qry + wxT("\n AND prorettype = ") + GetTypeOid(cbStateType->GetGuessedSelection()+1) + wxT("\n AND proargtypes[0] = ") + GetTypeOid(cbStateType->GetGuessedSelection()+1) + - wxT("\n AND (proargtypes[1]= 0 OR proargtypes[1]= ") + wxT("\n AND (COALESCE(proargtypes[1],0) = 0 OR proargtypes[1]= ") + GetTypeOid(cbBaseType->GetGuessedSelection()) + wxT(")")); if (set) { while (!set->Eof()) { - procedures.Add(database->GetQuotedSchemaPrefix(set->GetVal(wxT("nspname"))) + qtIdent(set->GetVal(wxT("proname")))); - cbStateFunc->Append(database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"))); + cbStateFunc->Append(database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname")), + database->GetQuotedSchemaPrefix(set->GetVal(wxT("nspname"))) + qtIdent(set->GetVal(wxT("proname")))); set->MoveNext(); } @@ -180,25 +188,46 @@ } - procedures.Add(wxEmptyString); cbFinalFunc->Append(wxT(" ")); set=connection->ExecuteSet(qry + wxT("\n AND proargtypes[0] = ") + GetTypeOid(cbStateType->GetGuessedSelection()+1) + - wxT("\n AND proargtypes[1]= 0")); + wxT("\n AND COALESCE(proargtypes[1],0)= 0")); if (set) { while (!set->Eof()) { - procedures.Add(database->GetQuotedSchemaPrefix(set->GetVal(wxT("nspname"))) + qtIdent(set->GetVal(wxT("proname")))); - cbFinalFunc->Append(database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname"))); + cbFinalFunc->Append(database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("proname")), + database->GetQuotedSchemaPrefix(set->GetVal(wxT("nspname"))) + qtIdent(set->GetVal(wxT("proname")))); set->MoveNext(); } delete set; } + + cbSortOp->Append(wxT(" "), wxEmptyString); + + set=connection->ExecuteSet( + wxT("SELECT oprname, nspname\n") + wxT(" FROM pg_operator op\n") + wxT(" JOIN pg_namespace nsp on nsp.oid=oprnamespace\n") + wxT(" WHERE oprleft = ") + GetTypeOid(cbBaseType->GetGuessedSelection()) + wxT("\n") + wxT(" AND oprright = ") + GetTypeOid(cbBaseType->GetGuessedSelection()) + wxT("\n")); + + if (set) + { + while (!set->Eof()) + { + wxString key = database->GetQuotedSchemaPrefix(set->GetVal(wxT("nspname"))) + qtIdent(set->GetVal(wxT("oprname"))); + wxString txt = database->GetSchemaPrefix(set->GetVal(wxT("nspname"))) + set->GetVal(wxT("oprname")); + cbSortOp->Append(txt, key); + set->MoveNext(); + } + delete set; + } } + CheckChange(); } @@ -221,18 +250,22 @@ name=GetName(); sql = wxT("CREATE AGGREGATE ") + schema->GetQuotedPrefix() + qtIdent(name) + wxT("(\n BASETYPE=") + GetQuotedTypename(cbBaseType->GetGuessedSelection()) - + wxT(",\n SFUNC=") + procedures.Item(cbStateFunc->GetSelection()) + + wxT(",\n SFUNC=") + cbStateFunc->GetStringKey() + wxT(", STYPE=") + GetQuotedTypename(cbStateType->GetGuessedSelection() +1); // skip "any" type if (cbFinalFunc->GetSelection() > 0) { sql += wxT(",\n FINALFUNC=") - + procedures.Item(cbFinalFunc->GetSelection() + cbStateFunc->GetCount()); + + cbFinalFunc->GetStringKey(); } wxString initial=txtInitial->GetValue().Strip(wxString::both); if (!initial.IsEmpty()) sql += wxT(",\n INITCOND=") + qtString(initial); - + + wxString opr=cbSortOp->GetStringKey(); + if (!opr.IsEmpty()) + sql += wxT(",\n SORTOP=") + opr; + sql += wxT(");\n"); AppendOwnerNew(sql, wxT("AGGREGATE ") + schema->GetQuotedPrefix() + qtIdent(name)+ Modified: trunk/pgadmin3/src/frm/frmStatus.cpp =================================================================== --- trunk/pgadmin3/src/frm/frmStatus.cpp 2005-06-07 18:23:49 UTC (rev 4285) +++ trunk/pgadmin3/src/frm/frmStatus.cpp 2005-06-07 18:29:52 UTC (rev 4286) @@ -712,7 +712,7 @@ wxString fn= set->GetVal(wxT("filename")); wxDateTime ts=set->GetDateTime(wxT("filetime")); - cbLogfiles->Append(DateToAnsiStr(ts), new wxDateTime(ts)); + cbLogfiles->Append(DateToAnsiStr(ts), (void*)new wxDateTime(ts)); set->MoveNext(); } Modified: trunk/pgadmin3/src/include/ctl/ctlComboBox.h =================================================================== --- trunk/pgadmin3/src/include/ctl/ctlComboBox.h 2005-06-07 18:23:49 UTC (rev 4285) +++ trunk/pgadmin3/src/include/ctl/ctlComboBox.h 2005-06-07 18:29:52 UTC (rev 4286) @@ -17,6 +17,8 @@ #include <wx/wx.h> #include "base/base.h" + + class pgConnBase; class wxComboBoxFix : public wxComboBox { @@ -25,13 +27,21 @@ int FillLongKey(pgConnBase *conn, const wxChar *qry); int FillOidKey(pgConnBase *conn, const wxChar *qry); int FillStringKey(pgConnBase *conn, const wxChar *qry); - long GetLongKey(int sel); - OID GetOIDKey(int sel); - wxString GetStringKey(int sel); + long GetLongKey(int sel=-1); + OID GetOIDKey(int sel=-1); + wxString GetStringKey(int sel=-1); bool SetKey(long val); bool SetKey(OID val); bool SetKey(const wxString &val); + int Append(const wxString& item) { return wxComboBox::Append(item); } + int Append(const wxString& item, void *data) { return wxComboBox::Append(item, data); } + int Append(const wxString& item, const wxString &str); + int Append(const wxString& item, long l); + int Append(const wxString& item, OID oid); + + + #ifdef __WXMSW__ wxString GetValue() const { return wxGetWindowText(GetHwnd()); } #endif Modified: trunk/pgadmin3/src/include/dlgAggregate.h =================================================================== --- trunk/pgadmin3/src/include/dlgAggregate.h 2005-06-07 18:23:49 UTC (rev 4285) +++ trunk/pgadmin3/src/include/dlgAggregate.h 2005-06-07 18:29:52 UTC (rev 4286) @@ -36,8 +36,6 @@ void OnChangeType(wxCommandEvent &ev); void OnChangeTypeBase(wxCommandEvent &ev); void OnChangeTypeState(wxCommandEvent &ev); - - wxArrayString procedures; DECLARE_EVENT_TABLE(); }; Modified: trunk/pgadmin3/src/include/pgAggregate.h =================================================================== --- trunk/pgadmin3/src/include/pgAggregate.h 2005-06-07 18:23:49 UTC (rev 4285) +++ trunk/pgadmin3/src/include/pgAggregate.h 2005-06-07 18:29:52 UTC (rev 4286) @@ -48,14 +48,19 @@ void iSetFinalFunction(const wxString& s) { finalFunction=s; } wxString GetInitialCondition() { return initialCondition; } void iSetInitialCondition(const wxString& s) { initialCondition=s; } + wxString GetSortOp() { return sortOp; } + void iSetSortOp(const wxString &s) { sortOp=s; } + wxString GetQuotedSortOp() { return quotedSortOp; } + void iSetQuotedSortOp(const wxString &s) { quotedSortOp=s; } + bool DropObject(wxFrame *frame, wxTreeCtrl *browser, bool cascaded); wxString GetSql(wxTreeCtrl *browser); pgObject *Refresh(wxTreeCtrl *browser, const wxTreeItemId item); private: pgSchema *schema; - wxString inputType, stateType, finalType, + wxString inputType, stateType, finalType, sortOp, quotedSortOp, stateFunction, finalFunction, initialCondition; }; Modified: trunk/pgadmin3/src/schema/pgAggregate.cpp =================================================================== --- trunk/pgadmin3/src/schema/pgAggregate.cpp 2005-06-07 18:23:49 UTC (rev 4285) +++ trunk/pgadmin3/src/schema/pgAggregate.cpp 2005-06-07 18:29:52 UTC (rev 4286) @@ -50,6 +50,8 @@ AppendIfFilled(sql, wxT(",\n FINALFUNC="), qtIdent(GetFinalFunction())); if (GetInitialCondition().length() > 0) sql += wxT(",\n INITCOND=") + qtString(GetInitialCondition()); + AppendIfFilled(sql, wxT(",\n SORTOP="), GetQuotedSortOp()); + sql += wxT("\n);\n") + GetOwnerSql(8, 0, wxT("AGGREGATE ") + GetQuotedFullIdentifier() + wxT("(") + qtIdent(GetInputType()) @@ -88,6 +90,8 @@ properties->AppendItem(_("State function"), GetStateFunction()); properties->AppendItem(_("Final type"), GetFinalType()); properties->AppendItem(_("Final function"), GetFinalFunction()); + if (GetConnection()->BackendMinimumVersion(8,1)) + properties->AppendItem(_("Sort operator"), GetSortOp()); properties->AppendItem(_("Initial condition"), GetInitialCondition()); properties->AppendItem(_("System aggregate?"), GetSystemObject()); properties->AppendItem(_("Comment"), GetComment()); @@ -113,7 +117,7 @@ pgObject *pgAggregate::ReadObjects(pgCollection *collection, wxTreeCtrl *browser, const wxString &restriction) { pgAggregate *aggregate=0; - pgSet *aggregates= collection->GetDatabase()->ExecuteSet( + wxString sql= wxT("SELECT aggfnoid::oid, proname AS aggname, pg_get_userbyid(proowner) AS aggowner, aggtransfn,\n") wxT( "aggfinalfn, proargtypes[0] AS aggbasetype, ") wxT( "CASE WHEN (ti.typlen = -1 AND ti.typelem != 0) THEN (SELECT at.typname FROM pg_type at WHERE at.oid= ti.typelem) || '[]' ELSE ti.typname END as inputname, ") @@ -121,8 +125,20 @@ wxT( "CASE WHEN (tt.typlen = -1 AND tt.typelem != 0) THEN (SELECT at.typname FROM pg_type at WHERE at.oid= tt.typelem) || '[]' ELSE tt.typname END as transname, ") wxT( "prorettype AS aggfinaltype, ") wxT( "CASE WHEN (tf.typlen = -1 AND tf.typelem != 0) THEN (SELECT at.typname FROM pg_type at WHERE at.oid= tf.typelem) || '[]' ELSE tf.typname END as finalname, ") - wxT( "agginitval, description\n") - wxT(" FROM pg_aggregate ag\n") + wxT( "agginitval, description"); + + if (collection->GetDatabase()->BackendMinimumVersion(8, 1)) + { + sql += wxT(", oprname, opn.nspname as oprnsp\n") + wxT(" FROM pg_aggregate ag\n") + wxT(" LEFT OUTER JOIN pg_operator op ON op.oid=aggsortop\n") + wxT(" LEFT OUTER JOIN pg_namespace opn ON opn.oid=op.oprnamespace"); + } + else + sql += wxT("\n FROM pg_aggregate ag\n"); + + + pgSet *aggregates= collection->GetDatabase()->ExecuteSet(sql + wxT(" JOIN pg_proc pr ON pr.oid = ag.aggfnoid\n") wxT(" JOIN pg_type ti on ti.oid=proargtypes[0]\n") wxT(" JOIN pg_type tt on tt.oid=aggtranstype\n") @@ -143,15 +159,28 @@ if (aggregates->GetVal(wxT("inputname")) == wxT("any")) aggregate->iSetInputType(wxT("\"any\"")); else - aggregate->iSetInputType(aggregates->GetVal(wxT("inputname"))); + aggregate->iSetInputType(aggregates->GetVal(wxT("inputname"))); aggregate->iSetStateType(aggregates->GetVal(wxT("transname"))); aggregate->iSetStateFunction(aggregates->GetVal(wxT("aggtransfn"))); aggregate->iSetFinalType(aggregates->GetVal(wxT("finalname"))); - aggregate->iSetFinalFunction(aggregates->GetVal(wxT("aggfinalfn"))); + + wxString final=aggregates->GetVal(wxT("aggfinalfn")); + if (final != wxT("-")) + aggregate->iSetFinalFunction(final); aggregate->iSetInitialCondition(aggregates->GetVal(wxT("agginitval"))); aggregate->iSetComment(aggregates->GetVal(wxT("description"))); + if (collection->GetDatabase()->BackendMinimumVersion(8, 1)) + { + wxString oprname=aggregates->GetVal(wxT("oprname")); + if (!oprname.IsEmpty()) + { + wxString oprnsp=aggregates->GetVal(wxT("oprnsp")); + aggregate->iSetSortOp(collection->GetDatabase()->GetSchemaPrefix(oprnsp) + oprname); + aggregate->iSetQuotedSortOp(collection->GetDatabase()->GetQuotedSchemaPrefix(oprnsp) + + qtIdent(oprname)); + } + } - if (browser) { collection->AppendBrowserItem(browser, aggregate); Modified: trunk/pgadmin3/src/ui/dlgAggregate.xrc =================================================================== --- trunk/pgadmin3/src/ui/dlgAggregate.xrc 2005-06-07 18:23:49 UTC (rev 4285) +++ trunk/pgadmin3/src/ui/dlgAggregate.xrc 2005-06-07 18:29:52 UTC (rev 4286) @@ -1,4 +1,4 @@ -<?xml version="1.0" ?> +<?xml version="1.0" encoding="ISO-8859-1"?> <resource> <object class="wxDialog" name="dlgAggregate"> <title></title> @@ -7,105 +7,170 @@ <label>Properties</label> <object class="wxPanel" name="pnlProperties"> <object class="wxStaticText" name="stName"> + <label>Name</label> + <pos>5,7d</pos> </object> <object class="wxTextCtrl" name="txtName"> + <pos>70,5d</pos> + <size>135,-1d</size> </object> <object class="wxStaticText" name="stOID"> + <label>OID</label> + <pos>5,22d</pos> </object> <object class="wxTextCtrl" name="txtOID"> + <pos>70,20d</pos> + <size>135,-1d</size> </object> <object class="wxStaticText" name="stOwner"> + <label>Owner</label> + <pos>5,37d</pos> </object> <object class="ctlComboBox" name="cbOwner"> + <pos>70,35d</pos> + <size>135,12d</size> + <content/> + <style>wxCB_DROPDOWN</style> </object> <object class="wxStaticText" name="stBaseType"> + <label>Input type</label> + <pos>5,52d</pos> </object> <object class="ctlComboBox" name="cbBaseType"> + <content/> + <pos>70,50d</pos> + <size>135,12d</size> + <style>wxCB_DROPDOWN</style> </object> <object class="wxStaticText" name="stStateType"> + <label>State type</label> + <pos>5,67d</pos> </object> <object class="ctlComboBox" name="cbStateType"> + <content/> + <pos>70,65d</pos> + <size>135,12d</size> + <style>wxCB_DROPDOWN</style> </object> <object class="wxStaticText" name="stStateFunc"> + <label>State function</label> + <pos>5,82d</pos> </object> <object class="wxComboBox" name="cbStateFunc"> + <content/> + <pos>70,80d</pos> + <size>135,12d</size> + <style>wxCB_READONLY|wxCB_DROPDOWN</style> </object> <object class="wxStaticText" name="stFinalFunc"> + <label>Final function</label> + <pos>5,97d</pos> </object> <object class="wxComboBox" name="cbFinalFunc"> + <content/> + <pos>70,95d</pos> + <size>135,12d</size> + <style>wxCB_READONLY|wxCB_DROPDOWN</style> </object> + <object class="wxStaticText" name="stSortOp"> + <label>Sort Operator</label> + <pos>5,112d</pos> + </object> + <object class="wxComboBox" name="cbSortOp"> + <content/> + <pos>70,110d</pos> + <size>135,12d</size> + <style>wxCB_READONLY|wxCB_DROPDOWN</style> + </object> <object class="wxStaticText" name="stInitial"> + <label>Initial condition</label> - <pos>5,112d</pos> + + <pos>5,127d</pos> </object> <object class="wxTextCtrl" name="txtInitial"> - <pos>70,110d</pos> + + <pos>70,125d</pos> + <size>135,-1d</size> </object> <object class="wxStaticText" name="stComment"> + <label>Comment</label> - <pos>5,127d</pos> + + <pos>5,142d</pos> </object> <object class="wxTextCtrl" name="txtComment"> - <pos>70,125d</pos> - <size>135,72d</size> + + <pos>70,140d</pos> + + <size>135,57d</size> + <style>wxTE_MULTILINE</style> </object> </object> + <selected>1</selected> </object> <pos>2,2d</pos> <size>214,215d</size> </object> <object class="wxButton" name="wxID_HELP"> + <label>Help</label> + <pos>3,221d</pos> </object> <object class="wxButton" name="wxID_OK"> + <label>OK</label> + <default>1</default> + <pos>113,221d</pos> </object> <object class="wxButton" name="wxID_CANCEL"> + <label>Cancel</label> + <pos>166,221d</pos> </object> <size>218,240d</size>
В списке pgadmin-hackers по дате отправления: