void CViewWork::UpdateSelection() { int i, n, row; CTaskItemGroup* pGroup = NULL; RESULT* result = NULL; PROJECT* project = NULL; CC_STATUS status; CMainDocument* pDoc = wxGetApp().GetDocument(); std::string first_project_url; wxString strMachineName; bool wasSuspended=false; bool all_same_project=false; bool enableShowGraphics = false; bool enableShowVMConsole = false; bool enableSuspendResume = false; bool enableAbort = false; bool enableProperties = false; wxASSERT(NULL != pDoc); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); wxASSERT(NULL != m_pTaskPane); CBOINCBaseView::PreUpdateSelection(); pGroup = m_TaskGroups[0]; n = m_pListPane->GetSelectedItemCount(); if (n > 0) { enableShowGraphics = true; enableShowVMConsole = true; enableSuspendResume = true; enableAbort = true; pDoc->GetCoreClientStatus(status); if (status.task_suspend_reason & ~(SUSPEND_REASON_CPU_THROTTLE)) { enableShowGraphics = false; enableShowVMConsole = false; } pDoc->GetConnectedComputerName(strMachineName); if (!pDoc->IsComputerNameLocal(strMachineName)) { enableShowGraphics = false; enableShowVMConsole = false; } } if (pDoc->m_ActiveTasksOnly) { m_pTaskPane->UpdateTask( pGroup->m_Tasks[BTN_ACTIVE_ONLY], _("Show all tasks"), _("Show all tasks.") ); } else { m_pTaskPane->UpdateTask( pGroup->m_Tasks[BTN_ACTIVE_ONLY], _("Show active tasks"), _("Show only active tasks.") ); } row = -1; for (i=0; i<n; i++) { // Step through all selected items row = m_pListPane->GetNextItem(row, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (row < 0) break; // Should never happen result = pDoc->result(m_iSortedIndexes[row]); if (!result) continue; if (i == 0) { wasSuspended = result->suspended_via_gui; if (result->suspended_via_gui) { m_pTaskPane->UpdateTask( pGroup->m_Tasks[BTN_SUSPEND], _("Resume"), _("Resume work for this task.") ); } else { m_pTaskPane->UpdateTask( pGroup->m_Tasks[BTN_SUSPEND], _("Suspend"), _("Suspend work for this task.") ); } } else { if (wasSuspended != result->suspended_via_gui) { // Disable Suspend / Resume button if the multiple selection // has a mix of suspended and not suspended tasks enableSuspendResume = false; } } // Disable Show VM console if the selected task hasn't registered a remote // desktop connection // if (!strlen(result->remote_desktop_addr)) { enableShowVMConsole = false; } // Disable Show Graphics button if the selected task can't display graphics // if (!strlen(result->web_graphics_url) && !strlen(result->graphics_exec_path)) { enableShowGraphics = false; } if (result->suspended_via_gui || result->project_suspended_via_gui || (result->scheduler_state != CPU_SCHED_SCHEDULED) ) { enableShowGraphics = false; } // Disable Abort button if any selected task already aborted if ( result->active_task_state == PROCESS_ABORT_PENDING || result->active_task_state == PROCESS_ABORTED || result->state == RESULT_ABORTED ) { enableAbort = false; } if (i == 0) { first_project_url = result->project_url; all_same_project = true; } else { if (first_project_url != result->project_url) { all_same_project = false; } } if (n == 1) { enableProperties = true; } } // To minimize flicker, set each button only once to the final desired state pGroup->m_Tasks[BTN_GRAPHICS]->m_pButton->Enable(enableShowGraphics); if (enableShowVMConsole) { pGroup->m_Tasks[BTN_VMCONSOLE]->m_pButton->Enable(); pGroup->m_Tasks[BTN_VMCONSOLE]->m_pButton->Show(); } else { pGroup->m_Tasks[BTN_VMCONSOLE]->m_pButton->Disable(); pGroup->m_Tasks[BTN_VMCONSOLE]->m_pButton->Hide(); } pGroup->m_Tasks[BTN_SUSPEND]->m_pButton->Enable(enableSuspendResume); pGroup->m_Tasks[BTN_ABORT]->m_pButton->Enable(enableAbort); pGroup->m_Tasks[BTN_PROPERTIES]->m_pButton->Enable(enableProperties); if (all_same_project) { project = pDoc->state.lookup_project(result->project_url); UpdateWebsiteSelection(GRP_WEBSITES, project); if(m_TaskGroups.size()>1) { m_pTaskPane->EnableTaskGroupTasks(m_TaskGroups[1]); } } else { UpdateWebsiteSelection(GRP_WEBSITES, NULL); if(m_TaskGroups.size()>1) { m_pTaskPane->DisableTaskGroupTasks(m_TaskGroups[1]); } } CBOINCBaseView::PostUpdateSelection(); }
void CViewProjects::UpdateSelection() { CTaskItemGroup* pGroup = NULL; PROJECT* project = NULL; CMainDocument* pDoc = wxGetApp().GetDocument(); int i, n, row; bool wasSuspended=false, wasNoNewWork=false; bool enableUpdate = false; bool enableSuspendResume = false; bool enableNoNewTasks = false; bool enableReset = false; bool enableDetach = false; bool enableProperties = false; wxASSERT(pDoc); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); wxASSERT(m_pTaskPane); wxASSERT(m_pListPane); CBOINCBaseView::PreUpdateSelection(); // Update the tasks static box buttons // pGroup = m_TaskGroups[0]; n = m_pListPane->GetSelectedItemCount(); if (n > 0) { enableUpdate = true; enableSuspendResume = true; enableNoNewTasks = true; enableReset = true; enableDetach = true; } row = -1; for (i=0; i<n; i++) { // Step through all selected items row = m_pListPane->GetNextItem(row, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (row < 0) break; // Should never happen project = pDoc->project(m_iSortedIndexes[row]); if (!project) { m_pTaskPane->DisableTaskGroupTasks(pGroup); if(m_TaskGroups.size()>1) { m_pTaskPane->DisableTaskGroupTasks(m_TaskGroups[1]); } return; } if (i == 0) { wasSuspended = project->suspended_via_gui; if (project->suspended_via_gui) { m_pTaskPane->UpdateTask( pGroup->m_Tasks[BTN_SUSPEND], _("Resume"), _("Resume tasks for this project.") ); } else { m_pTaskPane->UpdateTask( pGroup->m_Tasks[BTN_SUSPEND], _("Suspend"), _("Suspend tasks for this project.") ); } } else { if (wasSuspended != project->suspended_via_gui) { // Disable Suspend / Resume button if the multiple selection // has a mix of suspended and not suspended projects enableSuspendResume = false; } } if (i == 0) { wasNoNewWork = project->dont_request_more_work; if (project->dont_request_more_work) { m_pTaskPane->UpdateTask( pGroup->m_Tasks[BTN_NOWORK], _("Allow new tasks"), _("Allow fetching new tasks for this project.") ); } else { m_pTaskPane->UpdateTask( pGroup->m_Tasks[BTN_NOWORK], _("No new tasks"), _("Don't fetch new tasks for this project.") ); } } else { if (wasNoNewWork != project->dont_request_more_work) { // Disable Allow New Work / No New Work button if the multiple // selection has a mix of Allow New Work and No New Work projects enableNoNewTasks = false; } } if (project->attached_via_acct_mgr) { enableDetach = false; } } if (n == 1) { enableProperties = true; UpdateWebsiteSelection(GRP_WEBSITES, project); if(m_TaskGroups.size()>1) { m_pTaskPane->EnableTaskGroupTasks(m_TaskGroups[1]); } } else { UpdateWebsiteSelection(GRP_WEBSITES, NULL); if(m_TaskGroups.size()>1) { m_pTaskPane->DisableTaskGroupTasks(m_TaskGroups[1]); } } // To minimize flicker, set each button only once to the final desired state pGroup->m_Tasks[BTN_UPDATE]->m_pButton->Enable(enableUpdate); pGroup->m_Tasks[BTN_SUSPEND]->m_pButton->Enable(enableSuspendResume); pGroup->m_Tasks[BTN_NOWORK]->m_pButton->Enable(enableNoNewTasks); pGroup->m_Tasks[BTN_RESET]->m_pButton->Enable(enableReset); pGroup->m_Tasks[BTN_DETACH]->m_pButton->Enable(enableDetach); pGroup->m_Tasks[BTN_PROPERTIES]->m_pButton->Enable(enableProperties); CBOINCBaseView::PostUpdateSelection(); }