void frmMain::OnTreeSelChanged(wxTreeEvent& event) { denyCollapseItem=wxTreeItemId(); // Reset the listviews/SQL pane if (event.GetItem()) execSelChange(event.GetItem(), true); }
void frmMain::OnTreeSelChanged(wxTreeEvent &event) { /* * Do not honour the tree selection change, while a property dialog is * closed and refresh is in progress */ if (m_refreshing) return; denyCollapseItem = wxTreeItemId(); // Reset the listviews/SQL pane if (event.GetItem()) execSelChange(event.GetItem(), true); }
void frmMain::OnExpand(wxTreeEvent &event) { wxCookieType cookie; wxTreeItemId item = browser->GetFirstChild(event.GetItem(), cookie); if (item && !browser->GetItemData(item)) { // the expanding node has a dummy item. // delete dummy item, and expand kids. execSelChange(event.GetItem(), browser->GetSelection() == item); // we don't have any kids, so don't expand if (!browser->GetChildrenCount(event.GetItem())) event.Veto(); } }
bool frmMain::CheckAlive() { bool userInformed = false; bool closeIt = false; wxTreeItemIdValue foldercookie; wxTreeItemId folderitem = browser->GetFirstChild(browser->GetRootItem(), foldercookie); while (folderitem) { if (browser->ItemHasChildren(folderitem)) { wxCookieType cookie; wxTreeItemId serverItem=browser->GetFirstChild(folderitem, cookie); while (serverItem) { pgServer *server=(pgServer*)browser->GetObject(serverItem); if (server && server->IsCreatedBy(serverFactory) && server->connection()) { if (server->connection()->IsAlive()) { wxCookieType cookie2; wxTreeItemId item = browser->GetFirstChild(serverItem, cookie2); while (item) { pgObject *obj=browser->GetObject(item); if (obj && obj->IsCreatedBy(databaseFactory.GetCollectionFactory())) { wxCookieType cookie3; item = browser->GetFirstChild(obj->GetId(), cookie3); while (item) { pgDatabase *db=(pgDatabase*)browser->GetObject(item); if (db && db->IsCreatedBy(databaseFactory)) { pgConn *conn=db->GetConnection(); if (conn) { if (!conn->IsAlive() && (conn->GetStatus() == PGCONN_BROKEN || conn->GetStatus() == PGCONN_BAD)) { conn->Close(); if (!userInformed) { wxMessageDialog dlg(this, _("Do you want to attempt to reconnect to the database?"), wxString::Format(_("Connection to database %s lost."), db->GetName().c_str()), wxICON_EXCLAMATION|wxYES_NO|wxYES_DEFAULT); closeIt = (dlg.ShowModal() == wxID_NO); userInformed = true; } if (closeIt) { db->Disconnect(); browser->DeleteChildren(db->GetId()); db->UpdateIcon(browser); } else { // Create a server object and connect it. wxBusyInfo waiting(wxString::Format(_("Reconnecting to database %s"), db->GetName().c_str()), this); // Give the UI a chance to redraw wxSafeYield(); wxMilliSleep(100); wxSafeYield(); if (!conn->Reconnect()) { db->Disconnect(); browser->DeleteChildren(db->GetId()); db->UpdateIcon(browser); } else // Indicate things are back to normal userInformed = false; } } } } item = browser->GetNextChild(obj->GetId(), cookie3); } } item = browser->GetNextChild(serverItem, cookie2); } } else { if (server->connection()->GetStatus() == PGCONN_BROKEN || server->connection()->GetStatus() == PGCONN_BAD) { server->connection()->Close(); if (!userInformed) { wxMessageDialog dlg(this, _("Do you want to attempt to reconnect to the server?"), wxString::Format(_("Connection to server %s lost."), server->GetName().c_str()), wxICON_EXCLAMATION|wxYES_NO|wxYES_DEFAULT); closeIt = (dlg.ShowModal() == wxID_NO); userInformed = true; } if (closeIt) { server->Disconnect(this); browser->SelectItem(serverItem); execSelChange(serverItem, true); browser->DeleteChildren(serverItem); } else { // Create a server object and connect it. wxBusyInfo waiting(wxString::Format(_("Reconnecting to server %s (%s:%d)"), server->GetDescription().c_str(), server->GetName().c_str(), server->GetPort()), this); // Give the UI a chance to redraw wxSafeYield(); wxMilliSleep(100); wxSafeYield(); if (!server->connection()->Reconnect()) { server->Disconnect(this); browser->SelectItem(serverItem); execSelChange(serverItem, true); browser->DeleteChildren(serverItem); } else // Indicate things are back to normal userInformed = false; } } } } serverItem = browser->GetNextChild(serversObj->GetId(), cookie); } } folderitem = browser->GetNextChild(browser->GetRootItem(), foldercookie); } return userInformed; }
void frmMain::Refresh(pgObject *data) { StartMsg(data->GetTranslatedMessage(REFRESHINGDETAILS)); browser->Freeze(); wxTreeItemId currentItem=data->GetId(); // Scan the child nodes and make a list of those that are expanded // This is not an exact science as node names may change etc. wxArrayString expandedNodes; GetExpandedChildNodes(currentItem, expandedNodes); browser->DeleteChildren(currentItem); // refresh information about the object data->SetDirty(); pgObject *newData = data->Refresh(browser, currentItem); bool done = !data->GetConnection() || data->GetConnection()->GetStatus() == PGCONN_OK; if (newData != data) { wxLogInfo(wxT("Deleting %s %s for refresh"), data->GetTypeName().c_str(), data->GetQuotedFullIdentifier().c_str()); if (data == currentObject) currentObject = newData; if (newData) { wxLogInfo(wxT("Replacing with new node %s %s for refresh"), newData->GetTypeName().c_str(), newData->GetQuotedFullIdentifier().c_str()); newData->SetId(currentItem); // not done automatically browser->SetItemData(currentItem, newData); // Update the node text if this is an object, as it may have been renamed if (!newData->IsCollection()) browser->SetItemText(currentItem, newData->GetDisplayName()); delete data; } else { wxLogInfo(wxT("No object to replace: vanished after refresh.")); // If the connection is dead, just return here if (data->GetConnection()->GetStatus() != PGCONN_OK) { CheckAlive(); browser->Thaw(); return; } wxTreeItemId delItem=currentItem; currentItem=browser->GetItemParent(currentItem); browser->SelectItem(currentItem); browser->Delete(delItem); } } if (currentItem) { execSelChange(currentItem, currentItem == browser->GetSelection()); // Attempt to expand any child nodes that were previously expanded ExpandChildNodes(currentItem, expandedNodes); } browser->Thaw(); EndMsg(done); }
void frmMain::Refresh(pgObject *data) { bool done = false; pgObject *obj = NULL; StartMsg(data->GetTranslatedMessage(REFRESHINGDETAILS)); browser->Freeze(); wxTreeItemId currentItem = data->GetId(); if (currentItem) obj = browser->GetObject(currentItem); if (obj && obj->CheckOpenDialogs(browser, currentItem)) { wxString msg = _("There are properties dialogues open for one or more objects that would be refreshed. Please close the properties dialogues and try again."); wxMessageBox(msg, _("Cannot refresh browser"), wxICON_WARNING | wxOK); } else { if (data->GetMetaType() == PGM_SCHEMA && !data->IsCollection() && data->GetConnection()->BackendMinimumVersion(9, 3)) { // Event triggers backend functions are at schema level. // Hence, we can consider that Event Triggers at schema level and partly at database. // So, if any schema is refreshed, we need to the event trigger collection as well. // It's a special case, which effects the schema operations on the event triggers as well. // To solve this, we are navigating to the parent node (database node), and then locating event trigger collections. // Once we've found the event triggers collection, we refresh it. // wxTreeItemId dbItem = browser->GetItemParent(browser->GetItemParent(browser->GetSelection())); pgCollection *eventTrgCol = browser->FindCollection(eventTriggerFactory, dbItem); if(eventTrgCol) Refresh(eventTrgCol); } // Scan the child nodes and make a list of those that are expanded // This is not an exact science as node names may change etc. wxArrayString expandedNodes; GetExpandedChildNodes(currentItem, expandedNodes); browser->DeleteChildren(currentItem); // refresh information about the object data->SetDirty(); pgObject *newData = data->Refresh(browser, currentItem); done = !data->GetConnection() || data->GetConnection()->GetStatus() == PGCONN_OK; if (newData != data) { wxLogInfo(wxT("Deleting %s %s for refresh"), data->GetTypeName().c_str(), data->GetQuotedFullIdentifier().c_str()); if (data == currentObject) currentObject = newData; if (newData) { wxLogInfo(wxT("Replacing with new node %s %s for refresh"), newData->GetTypeName().c_str(), newData->GetQuotedFullIdentifier().c_str()); newData->SetId(currentItem); // not done automatically browser->SetItemData(currentItem, newData); // Update the node text if this is an object, as it may have been renamed if (!newData->IsCollection()) browser->SetItemText(currentItem, newData->GetDisplayName()); delete data; data = NULL; } else { wxLogInfo(wxT("No object to replace: vanished after refresh.")); // If the connection is dead, just return here if (data->GetConnection()->GetStatus() != PGCONN_OK) { CheckAlive(); browser->Thaw(); return; } wxTreeItemId delItem = currentItem; currentItem = browser->GetItemParent(currentItem); browser->SelectItem(currentItem); browser->Delete(delItem); } } if (currentItem) { // Select the current node execSelChange(currentItem, currentItem == browser->GetSelection()); // Attempt to expand any child nodes that were previously expanded ExpandChildNodes(currentItem, expandedNodes); } } browser->Thaw(); EndMsg(done); }