📄 admindlg.cpp
字号:
strCommand.Printf (wxT("add %s --accept_license"), (const wxChar*) strPathName); strCommand.Replace (wxT("\\"), wxT("/")); // backslashes -> forward slashes for Tcl_EvalFile if (! EvalTclFile (3, strCommand, _("Adding package"))) // if not successful { // try the next file } else { bRepositoryChanged = TRUE; } } } // refresh the package tree only if necessary if (bRepositoryChanged && ! PopulatePackageTree (m_strRepository)) { } }}void ecAdminDialog::OnRemove(wxCommandEvent& event){ wxTreeCtrl* treeCtrl = (wxTreeCtrl*) FindWindow( ecID_ADMIN_DIALOG_TREE) ; const wxTreeItemId hTreeItem = treeCtrl->GetSelection (); if (! hTreeItem || !hTreeItem.IsOk()) return; if (wxYES != wxMessageBox (_("The selected package will be deleted from the repository. Core eCos packages may be restored only by reinstalling eCos.\n\nDo you wish to continue?"), _("Remove Package"), wxYES_NO | wxICON_EXCLAMATION)) return; ecAdminItemData* data = (ecAdminItemData*) treeCtrl->GetItemData (hTreeItem); if (data) // if a package node is selected { // remove all package version nodes wxString pstrPackage(data->m_string); bool bStatus = TRUE; long cookie; wxTreeItemId hChildItem = treeCtrl->GetFirstChild (hTreeItem, cookie); while (hChildItem && bStatus) { const wxTreeItemId hNextChildItem = treeCtrl->GetNextSibling (hChildItem); bStatus = RemovePackageVersion (hChildItem); hChildItem = hNextChildItem; } // remove the package node if (bStatus) { treeCtrl->Delete (hTreeItem); } } else // a version node is selected { // remove the version node const wxTreeItemId hParentItem = treeCtrl->GetParent (hTreeItem); wxASSERT (hParentItem && hParentItem.IsOk() ); if (RemovePackageVersion (hTreeItem) && ! treeCtrl->ItemHasChildren (hParentItem)) // if the only version was deleted { // remove the package node treeCtrl->Delete (hParentItem); } }}void ecAdminDialog::OnClose(wxCommandEvent& event){ event.Skip();}bool ecAdminDialog::FindUserToolsPath(){#ifdef __WXMSW__ HKEY hKey; if (ERROR_SUCCESS != RegOpenKeyEx (HKEY_CURRENT_USER, _T("Software\\eCos Configuration Tool\\Paths\\UserToolsDir"), 0, KEY_READ, &hKey)) return FALSE; TCHAR szBuffer [MAX_PATH + 1]; DWORD dwBufferLength = MAX_PATH + 1; LONG lStatus = RegQueryValueEx (hKey, _T("Folder"), NULL, NULL, (LPBYTE) szBuffer, &dwBufferLength); RegCloseKey (hKey); if (ERROR_SUCCESS != lStatus) return FALSE; m_strUserTools = szBuffer; // TRACE (_T("User tools found at %s\n"), m_strUserTools); return ! m_strUserTools.IsEmpty ();#else // wxMessageBox("Sorry, ecAdminDialog::FindUserToolsPath not implemented for this platform."); return FALSE;#endif}bool ecAdminDialog::RemovePackageVersion (wxTreeItemId hTreeItem){ wxTreeCtrl* treeCtrl = (wxTreeCtrl*) FindWindow( ecID_ADMIN_DIALOG_TREE) ; const wxTreeItemId hParentItem = treeCtrl->GetParent (hTreeItem); wxASSERT (hParentItem); ecAdminItemData* data = (ecAdminItemData*) treeCtrl->GetItemData (hParentItem); wxASSERT( data ); if (!data) return FALSE; wxString pstrPackage = data->m_string ; wxString strCommand; wxString itemText(treeCtrl->GetItemText (hTreeItem)); strCommand.Printf (wxT("remove %s --version %s"), (const wxChar*) pstrPackage, (const wxChar*) itemText); if (! EvalTclFile (3, strCommand, wxT("Removing package"))) // if not successful return false; treeCtrl->Delete (hTreeItem); // remove the selected item from the tree return TRUE;}void ecAdminDialog::ClearPackageTree (){ wxTreeCtrl* treeCtrl = (wxTreeCtrl*) FindWindow( ecID_ADMIN_DIALOG_TREE) ; wxTreeItemId hPackage = treeCtrl->GetRootItem (); if (! hPackage.IsOk()) // if no packages in the tree... return; // ...nothing to do while (hPackage.IsOk()) { const wxTreeItemId hNextPackage = treeCtrl->GetNextSibling(hPackage); treeCtrl->Delete (hPackage); hPackage = hNextPackage; }}// Trivial handlers; otherwise CdlPackagesDatabaseBody::make asserts.static void CdlErrorHandler (std::string message){};static void CdlWarningHandler (std::string message){};bool ecAdminDialog::PopulatePackageTree (const wxString& packageDatabase){ wxTreeCtrl* treeCtrl = (wxTreeCtrl*) FindWindow( ecID_ADMIN_DIALOG_TREE) ; // delete any existing CDL database if (m_CdlPkgData) { delete m_CdlPkgData; m_CdlPkgData = NULL; } // load the package database try { // Cdl asserts unless the handlers are present. m_CdlPkgData = CdlPackagesDatabaseBody::make (ecUtils::UnicodeToStdStr (packageDatabase), &CdlErrorHandler, &CdlWarningHandler); } catch (CdlStringException exception) { wxString strMessage; strMessage.Printf (_("Error loading database:\n\n%s"), (const wxChar*) wxString (exception.get_message ().c_str ())); wxMessageBox(strMessage, wxGetApp().GetSettings().GetAppName(), wxICON_EXCLAMATION|wxOK); return FALSE; } catch (...) { wxMessageBox(_("Error loading database"), (const wxChar*) wxGetApp().GetSettings().GetAppName(), wxICON_EXCLAMATION|wxOK); return FALSE; } // clear the old package tree ClearPackageTree (); // Add a root item wxTreeItemId rootId = m_treeCtrl->AddRoot(_("Packages"), 0, -1); // populate the new package tree const std::vector<std::string>& packages = m_CdlPkgData->get_packages (); for (std::vector<std::string>::const_iterator package = packages.begin (); package != packages.end (); package++) { // add a package node wxTreeItemId hPackage = treeCtrl->AppendItem (treeCtrl->GetRootItem(), wxString (m_CdlPkgData->get_package_aliases (*package) [0].c_str ())); treeCtrl->SetItemData (hPackage, new ecAdminItemData(wxString (package->c_str ()))); treeCtrl->SetItemImage (hPackage, 0, wxTreeItemIcon_Normal); treeCtrl->SetItemImage (hPackage, 0, wxTreeItemIcon_Selected); treeCtrl->SetItemImage (hPackage, 0, wxTreeItemIcon_Expanded); treeCtrl->SetItemImage (hPackage, 0, wxTreeItemIcon_SelectedExpanded); const std::vector<std::string>& versions = m_CdlPkgData->get_package_versions (* package); for (std::vector<std::string>::const_iterator version = versions.begin (); version != versions.end (); version++) { // add a version node const wxTreeItemId hVersion = treeCtrl->AppendItem ( hPackage, wxString (version->c_str ())); treeCtrl->SetItemImage (hVersion, 1, wxTreeItemIcon_Normal); treeCtrl->SetItemImage (hVersion, 1, wxTreeItemIcon_Selected); treeCtrl->SetItemImage (hVersion, 1, wxTreeItemIcon_Expanded); treeCtrl->SetItemImage (hVersion, 1, wxTreeItemIcon_SelectedExpanded); } treeCtrl->SortChildren (hPackage); // sort the version nodes } treeCtrl->SortChildren (treeCtrl->GetRootItem()); // sort the package nodes treeCtrl->Expand(treeCtrl->GetRootItem()); return TRUE;}bool ecAdminDialog::EvalTclFile(int nargc, const wxString& Argv, const wxString& msg){ wxProgressDialog dlgWait(msg, _("Please wait..."), 100, this); dlgWait.Update(50);//TRACE (_T("Evaluating ecosadmin.tcl %s\n"), pszArgv); // set up the data structure which is passed to the Tcl thread wxString strArgc; strArgc.Printf (wxT("%d"), nargc); std::string argv0 = ecUtils::UnicodeToStdStr (m_strRepository) + "/ecosadmin.tcl"; std::string argv = ecUtils::UnicodeToStdStr (Argv); std::string argc = ecUtils::UnicodeToStdStr (strArgc); Tcl_Interp * interp = Tcl_CreateInterp ();#ifdef __WXMSW__ Tcl_Channel outchan = Tcl_OpenFileChannel (interp, "nul", "a+", 777); Tcl_SetStdChannel (outchan, TCL_STDOUT); // direct standard output to NUL:#endif const char * pszStatus = Tcl_SetVar (interp, "argv0", (char*) argv0.c_str(), 0); pszStatus = Tcl_SetVar (interp, "argv", (char*) argv.c_str(), 0); pszStatus = Tcl_SetVar (interp, "argc", (char*) argc.c_str(), 0); pszStatus = Tcl_SetVar (interp, "gui_mode", "1", 0); // return errors in result string int nStatus = Tcl_EvalFile (interp, (char*) argv0.c_str()); const char* result = Tcl_GetStringResult (interp);#ifdef __WXMSW__ Tcl_SetStdChannel (NULL, TCL_STDOUT); Tcl_UnregisterChannel (interp, outchan);#endif Tcl_DeleteInterp (interp); wxString strErrorMessage (result); // report any error if (! strErrorMessage.IsEmpty ()) { wxString msg (_("Command execution error:\n\n") + strErrorMessage); wxMessageBox(msg, wxGetApp().GetSettings().GetAppName(), wxICON_EXCLAMATION|wxOK); return FALSE; } else if (TCL_OK != nStatus) { wxString msg (_("Command execution error")); wxMessageBox(msg, wxGetApp().GetSettings().GetAppName(), wxICON_EXCLAMATION|wxOK); return FALSE; } return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -