From c473ebee44c02cbe4a186cb0b94787f03c064bd3 Mon Sep 17 00:00:00 2001 From: Dave Page Date: Wed, 20 May 2009 11:12:34 +0000 Subject: [PATCH] Fix dlgIndex so that we don't specify column options (ASC/DESC, NULLS FIRST/LAST) for index types other than btree. git-svn-id: svn://svn.pgadmin.org/trunk@7874 a7884b65-44f6-0310-8a51-81a127f17b15 --- pgadmin/dlg/dlgIndex.cpp | 82 +++++++++++++++++++++++++++++++--- pgadmin/include/dlg/dlgIndex.h | 3 ++ 2 files changed, 78 insertions(+), 7 deletions(-) diff --git a/pgadmin/dlg/dlgIndex.cpp b/pgadmin/dlg/dlgIndex.cpp index 2838eca30a..084bfbbf14 100644 --- a/pgadmin/dlg/dlgIndex.cpp +++ b/pgadmin/dlg/dlgIndex.cpp @@ -158,6 +158,7 @@ BEGIN_EVENT_TABLE(dlgIndex, dlgIndexBase) #ifdef __WXMAC__ EVT_SIZE( dlgIndex::OnChangeSize) #endif + EVT_COMBOBOX(XRCID("cbType"), dlgIndex::OnSelectType) END_EVENT_TABLE(); @@ -197,6 +198,56 @@ void dlgIndex::CheckChange() } } +void dlgIndex::OnSelectType(wxCommandEvent &ev) +{ + // The column options available change depending on the + // index type. We need to clear the column list, and + // setup some of the other controls accordingly. + + wxString newType = cbType->GetValue(); + bool changingDefault = false; + + // Detect if we're changing between default and btree (which are the same) to + // avoid annoying the user needlessly. + if ((m_previousType == wxEmptyString && cbType->GetValue() == wxT("btree")) || + (m_previousType == wxT("btree") && cbType->GetValue() == wxEmptyString)) + changingDefault = true; + + if (lstColumns->GetItemCount() > 0 && !changingDefault) + { + if (wxMessageBox(_("Changing the index type will cause the column list to be cleared. Do you wish to continue?"), _("Change index type?"), wxYES_NO) == wxNO) + { + cbType->SetValue(m_previousType); + return; + } + + // Move all the columns back to the combo + for (int pos = lstColumns->GetItemCount(); pos > 0; pos--) + { + wxString colName = lstColumns->GetItemText(pos - 1); + + lstColumns->DeleteItem(pos - 1); + cbColumns->Append(colName); + } + } + + if (newType == wxT("btree") || newType == wxEmptyString) + { + chkDesc->Enable(true); + rdbNullsFirst->Enable(true); + rdbNullsLast->Enable(true); + } + else + { + chkDesc->Enable(false); + rdbNullsFirst->Enable(false); + rdbNullsLast->Enable(false); + } + + // Make a note of the type so we can compare if it changes again. + m_previousType = cbType->GetValue(); +} + wxString dlgIndex::GetColumns() { @@ -235,8 +286,10 @@ int dlgIndex::Go(bool modal) { // edit mode: view only + // We only display the column options (ASC/DESC, NULLS FIRST/LAST) + // on PostgreSQL 8.3+, for btree indexes. wxArrayString colsArr = index->GetColumnList(); - if (this->database->BackendMinimumVersion(8, 3)) + if (this->database->BackendMinimumVersion(8, 3) && index->GetIndexType() == wxT("btree")) { wxString colDef, colRest, colName, descDef, nullsDef; const wxString firstOrder = wxT(" NULLS FIRST"), lastOrder = wxT(" NULLS LAST"), descOrder = wxT(" DESC"); @@ -350,21 +403,36 @@ void dlgIndex::OnAddCol(wxCommandEvent &ev) { if (chkDesc->GetValue()) { - lstColumns->SetItem(colIndex, 1, wxT("DESC")); + if (chkDesc->IsEnabled()) + lstColumns->SetItem(colIndex, 1, wxT("DESC")); + if (rdbNullsLast->GetValue()) - lstColumns->SetItem(colIndex, 2, wxT("LAST")); + { + if (rdbNullsLast->IsEnabled()) + lstColumns->SetItem(colIndex, 2, wxT("LAST")); + } else - lstColumns->SetItem(colIndex, 2, wxT("FIRST")); + { + if (rdbNullsLast->IsEnabled()) + lstColumns->SetItem(colIndex, 2, wxT("FIRST")); + } } else { - lstColumns->SetItem(colIndex, 1, wxT("ASC")); + if (chkDesc->IsEnabled()) + lstColumns->SetItem(colIndex, 1, wxT("ASC")); if (rdbNullsFirst->GetValue()) - lstColumns->SetItem(colIndex, 2, wxT("FIRST")); + { + if (rdbNullsFirst->IsEnabled()) + lstColumns->SetItem(colIndex, 2, wxT("FIRST")); + } else - lstColumns->SetItem(colIndex, 2, wxT("LAST")); + { + if (rdbNullsLast->IsEnabled()) + lstColumns->SetItem(colIndex, 2, wxT("LAST")); + } } } diff --git a/pgadmin/include/dlg/dlgIndex.h b/pgadmin/include/dlg/dlgIndex.h index aec36931d9..c4f7768d7f 100644 --- a/pgadmin/include/dlg/dlgIndex.h +++ b/pgadmin/include/dlg/dlgIndex.h @@ -59,10 +59,13 @@ class dlgIndex : public dlgIndexBase void OnChangeSize(wxSizeEvent &ev); #endif + void OnSelectType(wxCommandEvent &ev); void OnDescChange(wxCommandEvent &ev); void OnAddCol(wxCommandEvent &ev); void OnRemoveCol(wxCommandEvent &ev); + wxString m_previousType; + DECLARE_EVENT_TABLE() };