Index: frmMain.h =================================================================== RCS file: /projects/pgadmin3/src/include/frmMain.h,v retrieving revision 1.53 retrieving revision 1.54 diff -Lsrc/include/frmMain.h -Lsrc/include/frmMain.h -u -w -r1.53 -r1.54 --- src/include/frmMain.h +++ src/include/frmMain.h @@ -46,11 +46,11 @@ void SetStatusText(const wxString &msg); void SetButtons(pgObject *obj=0); - void SetDatabase(pgDatabase *newDatabase) { m_database = newDatabase; } void execSelChange(wxTreeItemId item, bool currentNode); void Refresh(pgObject *data); void RemoveFrame(wxWindow *frame); + void SetDatabase(pgDatabase *newDatabase) { m_database = newDatabase; } wxImageList *GetImageList() { return images; } wxTreeCtrl *GetBrowser() { return browser; } @@ -62,7 +62,6 @@ private: windowList frames; - pgDatabase *m_database; wxTreeCtrl *browser; ctlListView *properties; ctlListView *statistics; @@ -81,6 +80,10 @@ wxString timermsg; long msgLevel; + wxTreeItemId denyCollapseItem; + pgObject *currentObject; + pgDatabase *m_database; + void OnKeyDown(wxKeyEvent& event); void OnAbout(wxCommandEvent& event); void OnContents(wxCommandEvent& event); @@ -110,6 +113,8 @@ void OnPageChange(wxNotebookEvent& event); void OnPropSelChanged(wxListEvent& event); + void OnPropSelActivated(wxListEvent& event); + void OnPropRightClick(wxListEvent& event); void OnTreeSelChanged(wxTreeEvent &event); void OnTreeKeyDown(wxTreeEvent& event); void OnConnect(wxCommandEvent &ev); @@ -132,7 +137,7 @@ void OnCheckAlive(wxCommandEvent& event); bool dropSingleObject(pgObject *data, bool updateFinal); - void doPopup(wxPoint point, pgObject *object); + void doPopup(wxWindow *win, wxPoint point, pgObject *object); void appendIfEnabled(int id); bool checkAlive(); void setDisplay(pgObject *data, ctlListView *props=0, ctlSQLBox *sqlbox=0); @@ -140,8 +145,6 @@ void RetrieveServers(); int ReconnectServer(pgServer *server); wxTreeItemId RestoreEnvironment(pgServer *server); - wxTreeItemId denyCollapseItem; - pgObject *GetSelectedObject(); DECLARE_EVENT_TABLE() }; Index: events.cpp =================================================================== RCS file: /projects/pgadmin3/src/ui/events.cpp,v retrieving revision 1.114 retrieving revision 1.115 diff -Lsrc/ui/events.cpp -Lsrc/ui/events.cpp -u -w -r1.114 -r1.115 --- src/ui/events.cpp +++ src/ui/events.cpp @@ -122,6 +122,8 @@ EVT_MENU(MNU_CONTEXTMENU, frmMain::OnContextMenu) EVT_NOTEBOOK_PAGE_CHANGED(CTL_NOTEBOOK, frmMain::OnPageChange) EVT_LIST_ITEM_SELECTED(CTL_PROPVIEW, frmMain::OnPropSelChanged) + EVT_LIST_ITEM_ACTIVATED(CTL_PROPVIEW, frmMain::OnPropSelActivated) + EVT_LIST_ITEM_RIGHT_CLICK(CTL_PROPVIEW, frmMain::OnPropRightClick) EVT_TREE_SEL_CHANGED(CTL_BROWSER, frmMain::OnTreeSelChanged) EVT_TREE_ITEM_EXPANDING(CTL_BROWSER, frmMain::OnExpand) EVT_TREE_ITEM_COLLAPSING(CTL_BROWSER, frmMain::OnCollapse) @@ -229,9 +231,9 @@ void frmMain::OnStartService(wxCommandEvent& WXUNUSED(event)) { - pgServer *server= (pgServer*)GetSelectedObject(); - if (server && server->GetType() == PG_SERVER) + if (currentObject && currentObject->GetType() == PG_SERVER) { + pgServer *server= (pgServer*)currentObject; StartMsg(_("Starting service")); bool rc = server->StartService(); if (rc) @@ -243,9 +245,9 @@ void frmMain::OnStopService(wxCommandEvent& WXUNUSED(event)) { - pgServer *server= (pgServer*)GetSelectedObject(); - if (server && server->GetType() == PG_SERVER) + if (currentObject && currentObject->GetType() == PG_SERVER) { + pgServer *server= (pgServer*)currentObject; wxMessageDialog msg(this, _("Are you sure you wish shutdown this server?"), _("Stop service"), wxYES_NO | wxICON_QUESTION); if (msg.ShowModal() != wxID_YES) @@ -297,9 +299,8 @@ { wxString page; - pgObject *obj = GetSelectedObject(); - if (obj) - page=obj->GetHelpPage(true); + if (currentObject) + page=currentObject->GetHelpPage(true); if (page.IsEmpty()) page = wxT("sql-commands"); @@ -346,11 +347,10 @@ void frmMain::OnStatus(wxCommandEvent &event) { - pgObject *data = GetSelectedObject(); - if (!data) + if (!currentObject) return; - pgServer *server=data->GetServer(); + pgServer *server=currentObject->GetServer(); if (!server) return; @@ -369,13 +369,13 @@ void frmMain::OnCount(wxCommandEvent &event) { - pgObject *data = GetSelectedObject(); - if (!data) - return; - if (data->GetType() == PG_TABLE) + if (currentObject && currentObject->GetType() == PG_TABLE) { - ((pgTable*)data)->UpdateRows(); - data->ShowTreeDetail(0, 0, properties); + ((pgTable*)currentObject)->UpdateRows(); + + wxTreeItemId item=browser->GetSelection(); + if (currentObject == (pgObject*)browser->GetItemData(item)) + currentObject->ShowTreeDetail(0, 0, properties); } } @@ -393,14 +393,13 @@ // We need to pass the server to the password form // Get the item data, and feed it to the relevant handler, // cast as required. - pgObject *data = GetSelectedObject(); - if (data) + if (currentObject) { - int type = data->GetType(); + int type = currentObject->GetType(); switch (type) { case PG_SERVER: - winPassword->SetServer((pgServer *)data); + winPassword->SetServer((pgServer *)currentObject); winPassword->Show(TRUE); break; @@ -415,11 +414,9 @@ void frmMain::OnMaintenance(wxCommandEvent &ev) { - pgObject *data = GetSelectedObject(); - - if (data) + if (currentObject) { - frmMaintenance *frm=new frmMaintenance(this, data); + frmMaintenance *frm=new frmMaintenance(this, currentObject); frm->Go(); } } @@ -427,10 +424,9 @@ void frmMain::OnBackup(wxCommandEvent &event) { - pgObject *data = GetSelectedObject(); - if (data) + if (currentObject) { - frmBackup *frm=new frmBackup(this, data); + frmBackup *frm=new frmBackup(this, currentObject); frm->Go(); } } @@ -438,21 +434,18 @@ void frmMain::OnRestore(wxCommandEvent &event) { - pgObject *data = GetSelectedObject(); - if (data) + if (currentObject) { - frmRestore *frm=new frmRestore(this, data); + frmRestore *frm=new frmRestore(this, currentObject); frm->Go(); } } void frmMain::OnIndexcheck(wxCommandEvent &ev) { - pgObject *data = GetSelectedObject(); - - if (data) + if (currentObject) { - frmIndexcheck *frm=new frmIndexcheck(this, data); + frmIndexcheck *frm=new frmIndexcheck(this, currentObject); frm->Go(); } } @@ -460,11 +453,9 @@ void frmMain::OnGrantWizard(wxCommandEvent &ev) { - pgObject *data = GetSelectedObject(); - - if (data) + if (currentObject) { - frmGrantWizard *frm=new frmGrantWizard(this, data); + frmGrantWizard *frm=new frmGrantWizard(this, currentObject); frm->Go(); } } @@ -472,11 +463,10 @@ void frmMain::OnSql(wxCommandEvent &ev) { - pgObject *data = GetSelectedObject(); - if (!data) + if (!currentObject) return; - pgDatabase *db=data->GetDatabase(); + pgDatabase *db=currentObject->GetDatabase(); if (!db) return; @@ -508,13 +498,12 @@ void frmMain::ViewData(bool filter) { - pgSchemaObject *data = (pgSchemaObject *)GetSelectedObject(); - if (!data) + if (!currentObject) return; - if (data->GetType() != PG_TABLE && data->GetType() != PG_VIEW) + if (currentObject->GetType() != PG_TABLE && currentObject->GetType() != PG_VIEW) return; - pgDatabase *db=data->GetDatabase(); + pgDatabase *db=((pgSchemaObject*)currentObject)->GetDatabase(); if (!db) return; @@ -527,9 +516,9 @@ + wxT(" (") + server->GetName() + wxT(":") + NumToStr((long)server->GetPort()) + wxT(") - ") + db->GetName() - + wxT(" - ") + data->GetFullIdentifier(); + + wxT(" - ") + currentObject->GetFullIdentifier(); - frmEditGrid *eg= new frmEditGrid(this, txt, conn, data); + frmEditGrid *eg= new frmEditGrid(this, txt, conn, (pgSchemaObject*)currentObject); frames.Append(eg); eg->ShowForm(filter); } @@ -673,18 +662,37 @@ pgObject *data=(pgObject*)browser->GetItemData(item); if (data && data->IsCollection()) { - data=((pgCollection*)data)->FindChild(browser, event.GetIndex()); - if (data) + currentObject=((pgCollection*)data)->FindChild(browser, event.GetIndex()); + if (currentObject) { - setDisplay(data); + setDisplay(currentObject); sqlPane->SetReadOnly(false); - sqlPane->SetText(data->GetSql(browser)); + sqlPane->SetText(currentObject->GetSql(browser)); sqlPane->SetReadOnly(true); } } } +void frmMain::OnPropSelActivated(wxListEvent& event) +{ + if (currentObject && currentObject->CanEdit()) + { + wxCommandEvent nullEvent; + OnProperties(nullEvent); + } +} + + +void frmMain::OnPropRightClick(wxListEvent& event) +{ + OnPropSelChanged(event); + + if (currentObject) + doPopup(properties, event.GetPoint(), currentObject); +} + + void frmMain::OnTreeSelChanged(wxTreeEvent& event) { denyCollapseItem=wxTreeItemId(); @@ -708,22 +716,22 @@ // Get the item data, and feed it to the relevant handler, // cast as required. - pgObject *data = (pgObject *)browser->GetItemData(item); + currentObject = (pgObject *)browser->GetItemData(item); // If we didn't get an object, then we may have a right click, or // invalid click, so ignore. - if (!data) return; + if (!currentObject) return; if (currentNode) { properties->Freeze(); statistics->Freeze(); - setDisplay(data, properties, sqlPane); + setDisplay(currentObject, properties, sqlPane); properties->Thaw(); statistics->Thaw(); } else - setDisplay(data, 0, 0); + setDisplay(currentObject, 0, 0); } @@ -909,7 +917,7 @@ void frmMain::OnConnect(wxCommandEvent &ev) { - pgServer *server = (pgServer *)GetSelectedObject(); + pgServer *server = (pgServer *)currentObject; if (server && server->GetType() == PG_SERVER && !server->GetConnected()) ReconnectServer(server); } @@ -917,7 +925,7 @@ void frmMain::OnDisconnect(wxCommandEvent &ev) { - pgServer *server = (pgServer *)GetSelectedObject(); + pgServer *server = (pgServer *)currentObject; if (server && server->GetType() == PG_SERVER && server->Disconnect()) { browser->SetItemImage(server->GetId(), PGICON_SERVERBAD, wxTreeItemIcon_Normal); @@ -988,7 +996,7 @@ } } -void frmMain::doPopup(wxPoint point, pgObject *object) +void frmMain::doPopup(wxWindow *win, wxPoint point, pgObject *object) { if (treeContextMenu) delete treeContextMenu; @@ -1000,7 +1008,10 @@ appendIfEnabled(MNU_ADDSERVER); appendIfEnabled(MNU_PASSWORD); } + appendIfEnabled(MNU_REFRESH); + + if (browser->GetSelection() == object->GetId()) appendIfEnabled(MNU_COUNT); if (object) @@ -1058,7 +1069,7 @@ } if (currentSize) - PopupMenu(treeContextMenu, point); + win->PopupMenu(treeContextMenu, point); } //////////////////////////////////////////////////////////////////////////////// @@ -1082,7 +1093,7 @@ point.x += origin.x; point.y += origin.y; - doPopup(point, (pgObject*)browser->GetItemData(item)); + doPopup(this, point, (pgObject*)browser->GetItemData(item)); } } @@ -1093,43 +1104,32 @@ //////////////////////////////////////////////////////////////////////////////// void frmMain::OnSelRightClick(wxTreeEvent& event) { - // Check if item is selected wxTreeItemId item = event.GetItem(); if (item != browser->GetSelection()) + { browser->SelectItem(item); + currentObject = (pgObject*)browser->GetItemData(item); + } - // Get mouse point data - wxPoint point = event.GetPoint(); - wxPoint origin = GetClientAreaOrigin(); - - // Because this Tree is inside a vertical splitter, we - // must compensate for the size of the other elements - point.x += origin.x; - point.y += origin.y; - - // popup the menu - doPopup(point, (pgObject*)browser->GetItemData(item)); + if (currentObject) + doPopup(browser, event.GetPoint(), currentObject); } void frmMain::OnDelete(wxCommandEvent &ev) { - wxWindow *current=wxWindow::FindFocus(); - - if (current == browser || current == properties) OnDrop(ev); } void frmMain::OnDrop(wxCommandEvent &ev) { - wxWindow *current=wxWindow::FindFocus(); wxTreeItemId item=browser->GetSelection(); pgCollection *collection = (pgCollection*)browser->GetItemData(item); - if (current == browser) - dropSingleObject(collection, true); - else if (current == properties) + if (collection == currentObject) + dropSingleObject(currentObject, true); + else { if (collection && collection->IsCollection()) { @@ -1148,15 +1148,6 @@ return; } - if (data->GetSystemObject()) - { - wxMessageDialog msg(this, wxString::Format(_("Cannot drop system %s"), - data->GetTranslatedTypeName().c_str(), ""), - _("Trying to drop system object"), wxICON_EXCLAMATION); - msg.ShowModal(); - return; - } - if (data->RequireDropConfirm() || settings->GetConfirmDelete()) { wxMessageDialog msg(this, _("Are you sure you wish to drop multiple objects?"), @@ -1169,19 +1160,27 @@ bool done=true; long count=0; - while (done && data) + while (done && data && index >= 0) + { + if (data->GetSystemObject()) { + wxMessageDialog msg(this, wxString::Format(_("Cannot drop system %s"), + data->GetTranslatedTypeName().c_str(), ""), + _("Trying to drop system object"), wxICON_EXCLAMATION); + msg.ShowModal(); + return; + } + done = dropSingleObject(data, false); if (done) { + properties->DeleteItem(index); count++; - index = properties->GetNextSelected(index); + index = properties->GetFirstSelected(); if (index >= 0) - data=collection->FindChild(browser, index-count); - else - break; + data=collection->FindChild(browser, index); } } Refresh(collection); @@ -1270,6 +1269,7 @@ void frmMain::OnRefresh(wxCommandEvent &ev) { // Refresh - Clear the treeview below the current selection + // this doesn't use currentObject deliberately! wxTreeItemId item=browser->GetSelection(); pgObject *data = (pgObject*)browser->GetItemData(item); @@ -1282,11 +1282,9 @@ void frmMain::OnCreate(wxCommandEvent &ev) { - pgObject *data = GetSelectedObject(); - - if (data) + if (currentObject) { - if (!dlgProperty::CreateObjectDialog(this, data, -1)) + if (!dlgProperty::CreateObjectDialog(this, currentObject, -1)) checkAlive(); } } @@ -1300,11 +1298,10 @@ OnConnect(ev); return; } - pgObject *data = GetSelectedObject(); - if (data) + if (currentObject) { - if (!dlgProperty::CreateObjectDialog(this, data, type)) + if (!dlgProperty::CreateObjectDialog(this, currentObject, type)) checkAlive(); } } @@ -1312,11 +1309,9 @@ void frmMain::OnProperties(wxCommandEvent &ev) { - pgObject *data = GetSelectedObject(); - - if (data) + if (currentObject) { - if (!dlgProperty::EditObjectDialog(this, sqlPane, data)) + if (!dlgProperty::EditObjectDialog(this, sqlPane, currentObject)) checkAlive(); } } Index: frmMain.cpp =================================================================== RCS file: /projects/pgadmin3/src/ui/frmMain.cpp,v retrieving revision 1.108 retrieving revision 1.109 diff -Lsrc/ui/frmMain.cpp -Lsrc/ui/frmMain.cpp -u -w -r1.108 -r1.109 --- src/ui/frmMain.cpp +++ src/ui/frmMain.cpp @@ -138,8 +138,9 @@ } // Current database - m_database = NULL; denyCollapseItem=wxTreeItemId(); + currentObject = 0; + m_database = 0; // Icon wxIconBundle icons; @@ -497,35 +498,6 @@ } -pgObject *frmMain::GetSelectedObject() -{ - wxTreeItemId item=browser->GetSelection(); - pgObject *data = (pgObject*)browser->GetItemData(item); - - /* When it isn't connected. */ - if (data == NULL) - return 0; - - if (data->IsCollection()) - { - wxWindow *win=wxWindow::FindFocus(); - if (!win) - return data; - if (win == listViews) - { - if (listViews->GetSelection()) - win = properties; - } - if (win == properties || win->GetParent() == properties) - return ((pgCollection*)data)->FindChild(browser, properties->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)); - } - else - return data; - - return 0; -} - - void frmMain::RemoveFrame(wxWindow *frame) { frames.DeleteObject(frame);