Re: Enabling SQL text field in the SQL tab of object dialog - Mailing list pgadmin-hackers

From Guillaume Lelarge
Subject Re: Enabling SQL text field in the SQL tab of object dialog
Date
Msg-id 486A0C66.1040906@lelarge.info
Whole thread Raw
In response to Re: Enabling SQL text field in the SQL tab of object dialog  (Guillaume Lelarge <guillaume@lelarge.info>)
Responses Re: Enabling SQL text field in the SQL tab of object dialog  ("Dave Page" <dpage@postgresql.org>)
List pgadmin-hackers
Guillaume Lelarge a écrit :
> Dave Page a écrit :
>> On Fri, Jun 20, 2008 at 12:48 AM, Guillaume Lelarge
>> <guillaume@lelarge.info> wrote:
>>> Done. I thought we didn't hide UI objects, only disable them, to get
>>> a more
>>> consistant UI.
>>
>> On a single dialogue we disable objects so that dialogue will always
>> have the same layout no matter what server you're connected to. The
>> design from dialogue to dialogue may change as appropriate however.
>>
>>> 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.
>>
>> How about 'Lock DDL' for the checkbox? The message box could be
>> something like:
>>
>> Locking the DDL will replace it with generated SQL. Are your sure you
>> wish to lose the changes you have made?
>>
>> I can't help thinking that 'Lock DDL' is unnecessarily obscure though.
>> Maybe 'Read only' is better.
>>
>
> I like "Lock DDL". Perhaps "Read only DDL" would please you more ?
>
>> In anycase, there are still some sizing issues to resolve - see the
>> attach screenshots for examples.
>>
>
> It is great on GTK. I really should get a windows build system... and a
> Mac Mini :)
>

I'm at the PostgreSQL booth, for the RMLL in Mont-de-Marsan
(http://rmll.info). I'm trying the wifi system :)

Here is the patch that fixes your issue on Win32. Works great on Win32
and Linux... I'm not sure for Mac OS X though.


--
Guillaume.
  http://www.postgresqlfr.org
  http://dalibo.com
Index: pgadmin/include/dlg/dlgProperty.h
===================================================================
--- pgadmin/include/dlg/dlgProperty.h    (revision 7386)
+++ pgadmin/include/dlg/dlgProperty.h    (working copy)
@@ -60,6 +60,8 @@
     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);
@@ -86,6 +88,7 @@
     void OnChange(wxCommandEvent &ev);
     void OnChangeOwner(wxCommandEvent &ev);
     void OnChangeStc(wxStyledTextEvent& event);
+    void OnChangeReadOnly(wxCommandEvent& event);

 protected:
     void AddUsers(ctlComboBoxFix *cb1, ctlComboBoxFix *cb2=0);
@@ -97,7 +100,7 @@
     pgDatabase *database;

     frmMain *mainForm;
-    ctlSQLBox *sqlPane;
+    wxPanel *sqlPane;

     wxTextValidator numericValidator;

@@ -105,6 +108,10 @@
     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 7386)
+++ pgadmin/dlg/dlgProperty.cpp    (working copy)
@@ -59,8 +59,6 @@
 #include "schema/pgUser.h"


-
-
 class replClientData : public wxClientData
 {
 public:
@@ -72,6 +70,9 @@
 };


+#define CTRLID_CHKSQLTEXTFIELD 1000
+
+
 BEGIN_EVENT_TABLE(dlgProperty, DialogWithHelp)
     EVT_NOTEBOOK_PAGE_CHANGED(XRCID("nbNotebook"),  dlgProperty::OnPageSelect)

@@ -80,6 +81,8 @@
     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)
@@ -90,6 +93,8 @@
 {
     readOnly=false;
     sqlPane=0;
+    sqlTextField1=0;
+    sqlTextField2=0;
     processing=false;
     mainForm=frame;
     database=0;
@@ -117,6 +122,11 @@
     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);
@@ -311,7 +321,46 @@

 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
+    nbNotebook->GetClientSize(&width, &height);
+    height -= ConvertDialogToPixels(wxPoint(0, 20)).y;   // sizes of tabs
+    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 - 3 * 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 - 3 * 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 - 3 * zeroPos.x, (height - 3 * zeroPos.y)),
+            wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_RICH2);
+    }
+
+    // add panel to the notebook
     nbNotebook->AddPage(sqlPane, wxT("SQL"));
 }

@@ -506,6 +555,78 @@
 }


+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();
@@ -608,7 +729,7 @@
             mainForm->GetSqlPane()->SetReadOnly(true);
         }
     }
-    else if (item)
+    else if (item && chkReadOnly->GetValue())
     {
         wxTreeItemId collectionItem=item;

@@ -753,8 +874,25 @@
         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))
     {
@@ -768,27 +906,10 @@

 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();
     }
 }


pgadmin-hackers by date:

Previous
From: "Dave Page"
Date:
Subject: Re: Support for integrated tsearch configuration
Next
From: "Dave Page"
Date:
Subject: Re: Enabling SQL text field in the SQL tab of object dialog