This is a multi-part message in MIME format.
--------------080902010403050508020105
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
Dave Page a écrit :
> On Tue, Jun 17, 2008 at 10:51 PM, Guillaume Lelarge
> <guillaume@[EMAIL PROTECTED]
> wrote:
>> Dave Page a écrit :
>>> When you open a properties dialogue, it gets passed a pointer to the
>>> pgObject which it may use right up until it is closed. If you refresh
>>> part of the tree, you delete and recreate all the pgObjects under the
>>> node you refresh, so the dialogue can end up with a pointer to an
>>> object that's been deleted.
>>>
>> OK, but this is already an issue.
>
> Right, but my point is that this is going to make it more likely to
occur.
>
> I wonder if we need some reference counting on objects in the tree,
> and only allow any kind of refresh if all child nodes have a ref count
> of zero. I'm not entirely sure how we'd implement that.
>
>> Here is patch revision 2. It creates a new textfield for the second SQL
>> query, and it takes care of the refresh of the tree. This patch seems
to
>> resolve all issues I could find (apart from the one above).
>>
>> Comments?
>
> - Can we only have the dual textboxes on the dialogues that actually
> need them please?
>
Done. I thought we didn't hide UI objects, only disable them, to get a
more consistant UI.
> - The 'do you want to lose your changes' prompt should only be shown
> if changes have actually been made.
>
Done too.
> - There is a drawing artifact on Mac. I may have to look at that after
> you commit if you have no access to suitable hardware (maybe you can
> get JPA to spring for a Mac Mini - they're nice and cheap :-p )
>
I forwarded this mail to jpa and damien, just to know what they think
about your great idea :) Unfortunately, no answer yet.
The button text doesn't please me. Neither do the message box text. If
one has a better idea, I'll be glad to know about it.
Cheers.
--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com
--------------080902010403050508020105
Content-Type: text/x-patch;
name="enablingsqltextfield_v3.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="enablingsqltextfield_v3.patch"
Index: pgadmin/include/dlg/dlgProperty.h
===================================================================
--- pgadmin/include/dlg/dlgProperty.h (revision 7376)
+++ pgadmin/include/dlg/dlgProperty.h (working copy)
@[EMAIL PROTECTED]
-60,6 +60,8 @[EMAIL PROTECTED]
void EnableOK(bool enable);
virtual bool IsUpToDate() { return true; };
void ShowObject();
+
+ void FillSQLTextfield();
void CheckValid(bool &enable, const bool condition, const wxString
&msg);
static dlgProperty *CreateDlg(frmMain *frame, pgObject *node, bool
asNew, pgaFactory *factory=0);
@[EMAIL PROTECTED]
-86,6 +88,7 @[EMAIL PROTECTED]
void OnChange(wxCommandEvent &ev);
void OnChangeOwner(wxCommandEvent &ev);
void OnChangeStc(wxStyledTextEvent& event);
+ void OnChangeReadOnly(wxCommandEvent& event);
protected:
void AddUsers(ctlComboBoxFix *cb1, ctlComboBoxFix *cb2=0);
@[EMAIL PROTECTED]
-97,7 +100,7 @[EMAIL PROTECTED]
pgDatabase *database;
frmMain *mainForm;
- ctlSQLBox *sqlPane;
+ wxPanel *sqlPane;
wxTextValidator numericValidator;
@[EMAIL PROTECTED]
-105,6 +108,10 @[EMAIL PROTECTED]
wxTextCtrl *txtName, *txtOid, *txtComment;
ctlComboBox *cbOwner;
ctlComboBox *cbClusterSet;
+ wxCheckBox *chkReadOnly;
+ ctlSQLBox *sqlTextField1;
+ ctlSQLBox *sqlTextField2;
+ bool enableSQL2;
int width, height;
wxTreeItemId item, owneritem;
Index: pgadmin/dlg/dlgProperty.cpp
===================================================================
--- pgadmin/dlg/dlgProperty.cpp (revision 7376)
+++ pgadmin/dlg/dlgProperty.cpp (working copy)
@[EMAIL PROTECTED]
-59,8 +59,6 @[EMAIL PROTECTED]
#include "schema/pgUser.h"
-
-
class replClientData : public wxClientData
{
public:
@[EMAIL PROTECTED]
-72,6 +70,9 @[EMAIL PROTECTED]
};
+#define CTRLID_CHKSQLTEXTFIELD 1000
+
+
BEGIN_EVENT_TABLE(dlgProperty, DialogWithHelp)
EVT_NOTEBOOK_PAGE_CHANGED(XRCID("nbNotebook"),
dlgProperty::OnPageSelect)
@[EMAIL PROTECTED]
-80,6 +81,8 @[EMAIL PROTECTED]
EVT_COMBOBOX(XRCID("cbOwner"),
dlgProperty::OnChange)
EVT_TEXT(XRCID("txtComment"),
dlgProperty::OnChange)
+ EVT_CHECKBOX(CTRLID_CHKSQLTEXTFIELD,
dlgProperty::OnChangeReadOnly)
+
EVT_BUTTON(wxID_HELP, dlgProperty::OnHelp)
EVT_BUTTON(wxID_OK, dlgProperty::OnOK)
EVT_BUTTON(wxID_APPLY, dlgProperty::OnApply)
@[EMAIL PROTECTED]
-90,6 +93,8 @[EMAIL PROTECTED]
{
readOnly=false;
sqlPane=0;
+ sqlTextField1=0;
+ sqlTextField2=0;
processing=false;
mainForm=frame;
database=0;
@[EMAIL PROTECTED]
-117,6 +122,11 @[EMAIL PROTECTED]
txtComment = CTRL_TEXT("txtComment");
cbOwner = CTRL_COMBOBOX2("cbOwner");
cbClusterSet = CTRL_COMBOBOX2("cbClusterSet");
+
+ wxString db = wxT("Database");
+ wxString ts = wxT("Tablespace");
+ enableSQL2 = db.Cmp(factory->GetTypeName()) == 0
+ || ts.Cmp(factory->GetTypeName()) == 0;
wxNotebookPage *page=nbNotebook->GetPage(0);
wxASSERT(page != NULL);
@[EMAIL PROTECTED]
-311,7 +321,50 @[EMAIL PROTECTED]
void dlgProperty::CreateAdditionalPages()
{
- sqlPane = new ctlSQLBox(nbNotebook, CTL_PROPSQL, wxDefaultPosition,
wxDefaultSize, wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY |
wxTE_RICH2);
+ int width, height;
+
+ // get a few sizes and widths
+#ifdef __WIN32__
+ GetClientSize(&width, &height);
+#else
+ nbNotebook->GetClientSize(&width, &height);
+ height -= ConvertDialogToPixels(wxPoint(0, 20)).y; // sizes of tabs
+#endif
+ wxPoint zeroPos=ConvertDialogToPixels(wxPoint(5, 5));
+ wxSize chkSize=ConvertDialogToPixels(wxSize(65,12));
+
+ // add a panel
+ sqlPane = new wxPanel(nbNotebook);
+
+ // add checkbox to the panel
+ chkReadOnly = new wxCheckBox(sqlPane, CTRLID_CHKSQLTEXTFIELD,
wxT("Read only"),
+ wxPoint(zeroPos.x, zeroPos.y),
+ chkSize);
+ chkReadOnly->SetValue(true);
+
+ // add ctlSQLBoxes to the panel
+
+ if (enableSQL2)
+ {
+ sqlTextField1 = new ctlSQLBox(sqlPane, CTL_PROPSQL,
+ wxPoint(zeroPos.x, zeroPos.y + chkSize.GetHeight()),
+ wxSize(width - 2 * zeroPos.x, (height - 3 * zeroPos.y) / 2),
+ wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_RICH2);
+
+ sqlTextField2 = new ctlSQLBox(sqlPane, CTL_PROPSQL,
+ wxPoint(zeroPos.x, zeroPos.y + chkSize.GetHeight() + (height - 3 *
zeroPos.y) / 2),
+ wxSize(width - 2 * zeroPos.x, (height - 3 * zeroPos.y) / 2),
+ wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_RICH2);
+ }
+ else
+ {
+ sqlTextField1 = new ctlSQLBox(sqlPane, CTL_PROPSQL,
+ wxPoint(zeroPos.x, zeroPos.y + chkSize.GetHeight()),
+ wxSize(width - 2 * zeroPos.x, (height - 3 * zeroPos.y)),
+ wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_RICH2);
+ }
+
+ // add panel to the notebook
nbNotebook->AddPage(sqlPane, wxT("SQL"));
}
@[EMAIL PROTECTED]
-506,6 +559,78 @[EMAIL PROTECTED]
}
+void dlgProperty::OnChangeReadOnly(wxCommandEvent &ev)
+{
+ size_t pos;
+
+ if (sqlTextField1->GetText().Cmp(GetSql()) != 0 ||
+ (enableSQL2 && sqlTextField2->GetText().Cmp(GetSql2()) != 0))
+ {
+ if (wxMessageBox(_("Are you sure you wish to cancel your edit?"),
_("SQL editor"), wxYES_NO) == wxNO)
+ {
+ chkReadOnly->SetValue(false);
+ return;
+ }
+ }
+
+ sqlTextField1->SetReadOnly(chkReadOnly->GetValue());
+ if (enableSQL2)
+ {
+ sqlTextField2->SetReadOnly(chkReadOnly->GetValue());
+ }
+ for (pos = 0; pos < nbNotebook->GetPageCount() - 1; pos++)
+ {
+ nbNotebook->GetPage(pos)->Enable(chkReadOnly->GetValue());
+ }
+
+ if (chkReadOnly->GetValue())
+ {
+ FillSQLTextfield();
+ }
+}
+
+
+void dlgProperty::FillSQLTextfield()
+{
+ // create a function because this is a duplicated code
+ sqlTextField1->SetReadOnly(false);
+ if (enableSQL2)
+ {
+ sqlTextField2->SetReadOnly(false);
+ }
+ if (btnOK->IsEnabled())
+ {
+ wxString tmp;
+ if (cbClusterSet && cbClusterSet->GetSelection() > 0)
+ {
+ replClientData
*data=(replClientData*)cbClusterSet->GetClientData(cbClusterSet->GetSelection());
+ tmp.Printf(_("-- Execute replicated using cluster \"%s\", set
%ld\n"), data->cluster.c_str(), data->setId);
+ }
+ sqlTextField1->SetText(tmp + GetSql());
+ if (enableSQL2)
+ {
+ sqlTextField2->SetText(GetSql2());
+ }
+ }
+ else
+ {
+ if (GetObject())
+ sqlTextField1->SetText(_("-- nothing to change"));
+ else
+ sqlTextField1->SetText(_("-- definition incomplete"));
+ if (enableSQL2)
+ {
+ sqlTextField2->SetText(wxT(""));
+ }
+ }
+ sqlTextField1->SetReadOnly(true);
+ if (enableSQL2)
+ {
+ sqlTextField2->SetReadOnly(true);
+ }
+}
+
+
bool dlgProperty::tryUpdate(wxTreeItemId collectionItem)
{
ctlTree *browser=mainForm->GetBrowser();
@[EMAIL PROTECTED]
-608,7 +733,7 @[EMAIL PROTECTED]
mainForm->GetSqlPane()->SetReadOnly(true);
}
}
- else if (item)
+ else if (item && chkReadOnly->GetValue())
{
wxTreeItemId collectionItem=item;
@[EMAIL PROTECTED]
-753,8 +878,25 @[EMAIL PROTECTED]
return;
}
- wxString sql=GetSql();
- wxString sql2=GetSql2();
+ wxString sql;
+ wxString sql2;
+ if (chkReadOnly->GetValue())
+ {
+ sql = GetSql();
+ sql2 = GetSql2();
+ }
+ else
+ {
+ sql = sqlTextField1->GetText();
+ if (enableSQL2)
+ {
+ sql2 = sqlTextField2->GetText();
+ }
+ else
+ {
+ sql2 = wxT("");
+ }
+ }
if (!apply(sql, sql2))
{
@[EMAIL PROTECTED]
-768,27 +910,10 @[EMAIL PROTECTED]
void dlgProperty::OnPageSelect(wxNotebookEvent& event)
{
- if (sqlPane && event.GetSelection() ==
(int)nbNotebook->GetPageCount()-1)
+ if (sqlTextField1 && chkReadOnly->GetValue() &&
+ event.GetSelection() == (int)nbNotebook->GetPageCount()-1)
{
- sqlPane->SetReadOnly(false);
- if (btnOK->IsEnabled())
- {
- wxString tmp;
- if (cbClusterSet && cbClusterSet->GetSelection() > 0)
- {
- replClientData
*data=(replClientData*)cbClusterSet->GetClientData(cbClusterSet->GetSelection());
- tmp.Printf(_("-- Execute replicated using cluster \"%s\",
set %ld\n"), data->cluster.c_str(), data->setId);
- }
- sqlPane->SetText(tmp + GetSql() + GetSql2());
- }
- else
- {
- if (GetObject())
- sqlPane->SetText(_("-- nothing to change"));
- else
- sqlPane->SetText(_("-- definition incomplete"));
- }
- sqlPane->SetReadOnly(true);
+ FillSQLTextfield();
}
}
--------------080902010403050508020105
Content-Type: text/plain
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0
--
Sent via pgadmin-hackers mailing list (pgadmin-hackers@[EMAIL PROTECTED]
)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers
--------------080902010403050508020105--


|