void frmMain::execSelChange(wxTreeItemId item, bool currentNode) { static bool refresh = true; if (currentNode) { ResetLists(); sqlPane->Clear(); } // Get the item data, and feed it to the relevant handler, // cast as required. currentObject = browser->GetObject(item); // If we didn't get an object, then we may have a right click, or // invalid click, so ignore. if (!currentObject) { menuFactories->CheckMenu(currentObject, menuBar, toolBar); } else { int settingRefreshOnClick = settings->GetRefreshOnClick(); if (settingRefreshOnClick != REFRESH_OBJECT_NONE && refresh && currentObject->GetTypeName() != wxT("Server") && currentObject->GetTypeName() != wxT("Servers") && currentObject->GetTypeName() != wxT("Database") && !currentObject->IsCollection()) { refresh = false; if (settingRefreshOnClick == REFRESH_OBJECT_ONLY ) { //We can not update the schema, because it would cause an update to the entire tree. if (currentObject->GetTypeName() != wxT("Schema")) { wxTreeItemId currentItem = currentObject->GetId(); pgObject *newData = currentObject->Refresh(browser, currentItem); if (newData != 0) { wxLogInfo(wxT("Replacing with new node %s %s for refresh"), newData->GetTypeName().c_str(), newData->GetQuotedFullIdentifier().c_str()); browser->DeleteChildren(currentItem); 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 currentObject; currentObject = newData; } else browser->Delete(currentItem); } } else Refresh(currentObject); refresh = true; } if (currentNode) { properties->Freeze(); setDisplay(currentObject, properties, sqlPane); properties->Thaw(); } else setDisplay(currentObject, 0, 0); } }
void frmMain::execSelChange(wxTreeItemId item, bool currentNode) { static bool refresh = true; if (currentNode) { ResetLists(); sqlPane->Clear(); } // Get the item data, and feed it to the relevant handler, // cast as required. // // Lock the assignment to prevent the race conditions between onSelRightClick and execSelChange. // s_currentObjectMutex.Lock(); currentObject = browser->GetObject(item); s_currentObjectMutex.Unlock(); // If we didn't get an object, then we may have a right click, or // invalid click, so ignore. if (!currentObject) { menuFactories->CheckMenu(currentObject, menuBar, toolBar); } else { int settingRefreshOnClick = settings->GetRefreshOnClick(); if (settingRefreshOnClick != REFRESH_OBJECT_NONE && refresh && currentObject->GetTypeName() != wxT("Server") && currentObject->GetTypeName() != wxT("Servers") && currentObject->GetTypeName() != wxT("Database") && !currentObject->IsCollection()) { refresh = false; if (settingRefreshOnClick == REFRESH_OBJECT_ONLY ) { // We can not update the schema, because it would cause an update to the entire tree. if (currentObject->GetTypeName() != wxT("Schema")) { wxTreeItemId currentItem = currentObject->GetId(); // Do not refresh and instead bail out if dialog of the currently selected // node or it's child node is open, as refresh would delete this node's object // and could cause a crash pgObject *obj = NULL; if (currentItem) obj = browser->GetObject(currentItem); if (obj && obj->CheckOpenDialogs(browser, currentItem)) { properties->Freeze(); setDisplay(currentObject, properties, sqlPane); properties->Thaw(); refresh = true; return; } pgObject *newData = currentObject->Refresh(browser, currentItem); if (newData != 0) { wxLogInfo(wxT("Replacing with new node %s %s for refresh"), newData->GetTypeName().c_str(), newData->GetQuotedFullIdentifier().c_str()); browser->DeleteChildren(currentItem); 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 currentObject; currentObject = newData; } else { // OK, we failed to refresh, so select the parent and delete the child. browser->SelectItem(browser->GetItemParent(currentItem)); browser->Delete(currentItem); } } } else Refresh(currentObject); refresh = true; } if (currentNode) { properties->Freeze(); setDisplay(currentObject, properties, sqlPane); properties->Thaw(); } else setDisplay(currentObject, 0, 0); } }
frmMain::frmMain(const wxString &title) : pgFrame((wxFrame *)NULL, title) { msgLevel = 0; lastPluginUtility = NULL; pluginUtilityCount = 0; m_refreshing = false; dlgName = wxT("frmMain"); SetMinSize(wxSize(600, 450)); RestorePosition(50, 50, 750, 550, 600, 450); wxWindowBase::SetFont(settings->GetSystemFont()); { wxLogInfo(wxT("Using fontmetrics %d/%d, %d Point"), GetCharWidth(), GetCharHeight(), GetFont().GetPointSize()); wxLogInfo(wxT("Native Description '%s'"), GetFont().GetNativeFontInfoDesc().c_str()); wxWindowDC dc(this); dc.SetFont(GetFont()); wxCoord w, h, d, e; dc.GetTextExtent(wxT("M"), &w, &h, &d, &e); wxLogInfo(wxT("Draw size of 'M': w=%d, h=%d, descent %d, external lead %d."), w, h, d, e); dc.GetTextExtent(wxT("g"), &w, &h, &d, &e); wxLogInfo(wxT("Draw size of 'g': w=%d, h=%d, descent %d, external lead %d."), w, h, d, e); dc.GetTextExtent(wxT("Mg"), &w, &h, &d, &e); wxLogInfo(wxT("Draw size of 'Mg': w=%d, h=%d, descent %d, external lead %d."), w, h, d, e); } // Current database denyCollapseItem = wxTreeItemId(); currentObject = 0; appearanceFactory->SetIcons(this); // notify wxAUI which frame to use manager.SetManagedWindow(this); manager.SetFlags(wxAUI_MGR_DEFAULT | wxAUI_MGR_TRANSPARENT_DRAG | wxAUI_MGR_ALLOW_ACTIVE_PANE); // wxGTK needs this deferred pgaFactory::RealizeImages(); CreateMenus(); // Setup the object browser browser = new ctlTree(this, CTL_BROWSER, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS | wxSIMPLE_BORDER); browser->SetImageList(imageList); // Setup the listview listViews = new ctlAuiNotebook(this, CTL_NOTEBOOK, wxDefaultPosition, wxDefaultSize, wxAUI_NB_TOP | wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_MOVE | wxAUI_NB_TAB_EXTERNAL_MOVE | wxAUI_NB_SCROLL_BUTTONS | wxAUI_NB_WINDOWLIST_BUTTON); // Switch to the generic list control. Native doesn't play well with // multi-row select on Mac. #ifdef __WXMAC__ wxSystemOptions::SetOption(wxT("mac.listctrl.always_use_generic"), true); #endif properties = new ctlListView(listViews, CTL_PROPVIEW, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER); statistics = new ctlListView(listViews, CTL_STATVIEW, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER); dependencies = new ctlListView(listViews, CTL_DEPVIEW, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER); dependents = new ctlListView(listViews, CTL_REFVIEW, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER); // Switch back to the native list control. #ifdef __WXMAC__ wxSystemOptions::SetOption(wxT("mac.listctrl.always_use_generic"), false); #endif listViews->AddPage(properties, _("Properties")); // NBP_PROPERTIES listViews->AddPage(statistics, _("Statistics")); // NBP_STATISTICS listViews->AddPage(dependencies, _("Dependencies")); // NBP_DEPENDENCIES listViews->AddPage(dependents, _("Dependents")); // NBP_DEPENDENTS properties->SetImageList(imageList, wxIMAGE_LIST_SMALL); statistics->SetImageList(imageList, wxIMAGE_LIST_SMALL); dependencies->SetImageList(imageList, wxIMAGE_LIST_SMALL); dependents->SetImageList(imageList, wxIMAGE_LIST_SMALL); wxColour background; background = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); statistics->SetBackgroundColour(background); dependencies->SetBackgroundColour(background); dependents->SetBackgroundColour(background); // Setup the SQL pane sqlPane = new ctlSQLBox(this, CTL_SQLPANE, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSIMPLE_BORDER | wxTE_READONLY | wxTE_RICH2); sqlPane->SetBackgroundColour(background); // Setup menus pgaFactory::RegisterMenu(this, wxCommandEventHandler(frmMain::OnNew)); menuFactories->RegisterMenu(this, wxCommandEventHandler(frmMain::OnAction)); menuFactories->CheckMenu(0, menuBar, toolBar); // Kickstart wxAUI manager.AddPane(browser, wxAuiPaneInfo().Name(wxT("objectBrowser")).Caption(_("Object browser")).Left().MinSize(wxSize(100, 200)).BestSize(wxSize(200, 450))); manager.AddPane(listViews, wxAuiPaneInfo().Name(wxT("listViews")).Caption(_("Info pane")).Center().CaptionVisible(false).CloseButton(false).MinSize(wxSize(200, 100)).BestSize(wxSize(400, 200))); manager.AddPane(sqlPane, wxAuiPaneInfo().Name(wxT("sqlPane")).Caption(_("SQL pane")).Bottom().MinSize(wxSize(200, 100)).BestSize(wxSize(400, 200))); manager.AddPane(toolBar, wxAuiPaneInfo().Name(wxT("toolBar")).Caption(_("Tool bar")).ToolbarPane().Top().LeftDockable(false).RightDockable(false)); // Now load the layout wxString perspective; settings->Read(wxT("frmMain/Perspective-") + wxString(FRMMAIN_PERSPECTIVE_VER), &perspective, FRMMAIN_DEFAULT_PERSPECTIVE); manager.LoadPerspective(perspective, true); // and reset the captions for the current language manager.GetPane(wxT("objectBrowser")).Caption(_("Object browser")); manager.GetPane(wxT("listViews")).Caption(_("Info pane")); manager.GetPane(wxT("sqlPane")).Caption(_("SQL pane")); manager.GetPane(wxT("toolBar")).Caption(_("Tool bar")); // Sync the View menu options viewMenu->Check(MNU_SQLPANE, manager.GetPane(wxT("sqlPane")).IsShown()); viewMenu->Check(MNU_OBJECTBROWSER, manager.GetPane(wxT("objectBrowser")).IsShown()); viewMenu->Check(MNU_TOOLBAR, manager.GetPane(wxT("toolBar")).IsShown()); ResetLists(); // tell the manager to "commit" all the changes just made manager.Update(); // Add the root node serversObj = new pgServerCollection(serverFactory.GetCollectionFactory()); wxTreeItemId root = browser->AddRoot(_("Server Groups"), serversObj->GetIconId(), -1, serversObj); // Work around a bug in the generic tree control in wxWidgets, // Per http://trac.wxwidgets.org/ticket/10085 browser->SetItemText(root, _("Server Groups")); // Load servers RetrieveServers(); browser->Expand(root); browser->SortChildren(root); }