void CSimpleTaskPanel::DisplayIdleState() { CMainDocument* pDoc = wxGetApp().GetDocument(); wxASSERT(pDoc); if ( pDoc->IsReconnecting() ) { error_time = 0; UpdateStaticText(&m_StatusValueText, _("Retrieving current status.")); } else if ( pDoc->IsConnected() && pDoc->state.projects.size() == 0) { error_time = 0; UpdateStaticText(&m_StatusValueText, m_sNoProjectsString); } else if ( DownloadingResults() ) { error_time = 0; UpdateStaticText(&m_StatusValueText, _("Downloading work from the server.")); } else if ( Suspended() ) { CC_STATUS status; pDoc->GetCoreClientStatus(status); if ( status.task_suspend_reason & SUSPEND_REASON_BATTERIES ) { UpdateStaticText(&m_StatusValueText, _("Processing Suspended: Running On Batteries.")); } else if ( status.task_suspend_reason & SUSPEND_REASON_USER_ACTIVE ) { UpdateStaticText(&m_StatusValueText, _("Processing Suspended: User Active.")); } else if ( status.task_suspend_reason & SUSPEND_REASON_USER_REQ ) { UpdateStaticText(&m_StatusValueText, _("Processing Suspended: User paused processing.")); } else if ( status.task_suspend_reason & SUSPEND_REASON_TIME_OF_DAY ) { UpdateStaticText(&m_StatusValueText, _("Processing Suspended: Time of Day.")); } else if ( status.task_suspend_reason & SUSPEND_REASON_BENCHMARKS ) { UpdateStaticText(&m_StatusValueText, _("Processing Suspended: Benchmarks Running.")); } else { UpdateStaticText(&m_StatusValueText, _("Processing Suspended.")); } } else if ( ProjectUpdateScheduled() ) { error_time = 0; UpdateStaticText(&m_StatusValueText, _("Waiting to contact project servers.")); } else { if ( error_time == 0 ) { error_time = time(NULL) + 10; UpdateStaticText(&m_StatusValueText, _("Retrieving current status")); } else if ( error_time < time(NULL) ) { // TODO: should we display "ERROR" like old Simple GUI? if ( pDoc->IsConnected() ) { UpdateStaticText(&m_StatusValueText, _("No work available to process")); } else { UpdateStaticText(&m_StatusValueText, _("Unable to connect to the core client")); } } else { UpdateStaticText(&m_StatusValueText, _("Retrieving current status")); } } }
void CViewNotices::OnListRender(wxTimerEvent& WXUNUSED(event)) { wxLogTrace(wxT("Function Start/End"), wxT("CViewNotices::OnListRender - Function Begin")); static bool s_bInProgress = false; static wxString strLastMachineName = wxEmptyString; wxString strNewMachineName = wxEmptyString; CMainDocument* pDoc = wxGetApp().GetDocument(); wxASSERT(pDoc); wxASSERT(m_pHtmlListPane); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (s_bInProgress) return; s_bInProgress = true; if (pDoc->IsConnected()) { pDoc->GetConnectedComputerName(strNewMachineName); if (strLastMachineName != strNewMachineName) { strLastMachineName = strNewMachineName; m_pHtmlListPane->Clear(); } } // Don't call Freeze() / Thaw() here because it causes an unnecessary redraw m_pHtmlListPane->UpdateUI(); pDoc->UpdateUnreadNoticeState(); s_bInProgress = false; wxLogTrace(wxT("Function Start/End"), wxT("CViewNotices::OnListRender - Function End")); }
void CBOINCBaseFrame::OnAlertPoll(wxTimerEvent& WXUNUSED(event)) { static bool bAlreadyRunningLoop = false; CMainDocument* pDoc = wxGetApp().GetDocument(); if (!bAlreadyRunningLoop && m_pAlertPollTimer->IsRunning()) { bAlreadyRunningLoop = true; // Update idle detection if needed. wxGetApp().UpdateSystemIdleDetection(); // Check to see if there is anything that we need to do from the // dial up user perspective. if (pDoc && m_pDialupManager) { // Timer events are handled while the RPC Wait dialog is shown // which may cause unintended recursion and repeatedly posting // the same RPC requests from timer routines. if (pDoc->IsConnected() && !pDoc->WaitingForRPC()) { m_pDialupManager->OnPoll(); } } if (m_bShowConnectionFailedAlert && IsShown()) { m_bShowConnectionFailedAlert = false; ShowConnectionFailedAlert(); } bAlreadyRunningLoop = false; } }
void CSimpleFrame::OnProjectsAttachToProject(wxCommandEvent& WXUNUSED(event)) { wxLogTrace(wxT("Function Start/End"), wxT("CSimpleFrame::OnProjectsAttachToProject - Function Begin")); CMainDocument* pDoc = wxGetApp().GetDocument(); wxASSERT(pDoc); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (!pDoc->IsUserAuthorized()) return; if (pDoc->IsConnected()) { CWizardAttach* pWizard = new CWizardAttach(this); wxString strURL = wxEmptyString; pWizard->Run(strURL, false); if (pWizard) pWizard->Destroy(); } else { ShowNotCurrentlyConnectedAlert(); } wxLogTrace(wxT("Function Start/End"), wxT("CSimpleFrame::OnProjectsAttachToProject - Function End")); }
void CSimpleProjectPanel::OnWizardUpdate() { wxLogTrace(wxT("Function Start/End"), wxT("CProjectsComponent::OnWizardUpdate - Function Begin")); CMainDocument* pDoc = wxGetApp().GetDocument(); CSimpleGUIPanel* pPanel = wxDynamicCast(GetParent(), CSimpleGUIPanel); wxASSERT(pDoc); wxASSERT(pPanel); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (!pDoc->IsUserAuthorized()) return; if (!pDoc->IsConnected()) return; pPanel->SetDlgOpen(true); CWizardAttach* pWizard = new CWizardAttach(this); pWizard->SyncToAccountManager(); if (pWizard) pWizard->Destroy(); // btnSynchronize->Refresh(); pPanel->SetDlgOpen(false); wxLogTrace(wxT("Function Start/End"), wxT("CProjectsComponent::OnWizardUpdate - Function End")); }
void ClientStateIndicator::DisplayState() { CMainDocument* pDoc = wxGetApp().GetDocument(); if ( pDoc->IsReconnecting() ) { error_time = 0; SetActionState(_("Retrieving current status.")); } else if ( pDoc->IsConnected() && pDoc->state.projects.size() == 0) { error_time = 0; SetPausedState(_("You don't have any projects. Please Add a Project.")); } else if ( DownloadingResults() ) { error_time = 0; SetActionState(_("Downloading work from the server.")); } else if ( Suspended() ) { CC_STATUS status; pDoc->GetCoreClientStatus(status); if ( status.task_suspend_reason & SUSPEND_REASON_BATTERIES ) { SetActionState(_("Processing Suspended: Running On Batteries.")); } else if ( status.task_suspend_reason & SUSPEND_REASON_USER_ACTIVE ) { SetActionState(_("Processing Suspended: User Active.")); } else if ( status.task_suspend_reason & SUSPEND_REASON_USER_REQ ) { SetActionState(_("Processing Suspended: User paused processing.")); } else if ( status.task_suspend_reason & SUSPEND_REASON_TIME_OF_DAY ) { SetActionState(_("Processing Suspended: Time of Day.")); } else if ( status.task_suspend_reason & SUSPEND_REASON_BENCHMARKS ) { SetActionState(_("Processing Suspended: Benchmarks Running.")); } else { SetActionState(_("Processing Suspended.")); } } else if ( ProjectUpdateScheduled() ) { error_time = 0; SetActionState(_("Waiting to contact project servers.")); } else { if ( error_time == 0 ) { error_time = time(NULL) + 10; SetActionState(_("Retrieving current status")); } else if ( error_time < time(NULL) ) { if ( pDoc->IsConnected() ) { SetNoActionState(_("No work available to process")); } else { SetNoActionState(_("Unable to connect to the core client")); } } else { SetActionState(_("Retrieving current status")); } } }
bool ClientStateIndicator::Suspended() { CMainDocument* pDoc = wxGetApp().GetDocument(); CC_STATUS status; bool result = false; pDoc->GetCoreClientStatus(status); if ( pDoc->IsConnected() && status.task_suspend_reason > 0 && status.task_suspend_reason != SUSPEND_REASON_DISK_SIZE && status.task_suspend_reason != SUSPEND_REASON_CPU_THROTTLE ) { result = true; } return result; }
void CViewNotices::OnListRender(wxTimerEvent& WXUNUSED(event)) { wxLogTrace(wxT("Function Start/End"), wxT("CViewNotices::OnListRender - Function Begin")); static bool s_bInProgress = false; static wxString strLastMachineName = wxEmptyString; wxString strNewMachineName = wxEmptyString; bool bMissingItems; CC_STATUS status; CMainDocument* pDoc = wxGetApp().GetDocument(); wxFileSystemHandler *internetFSHandler = wxGetApp().GetInternetFSHandler(); wxASSERT(pDoc); wxASSERT(m_pHtmlListPane); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); wxASSERT(internetFSHandler); if (s_bInProgress) return; s_bInProgress = true; if (pDoc->IsConnected()) { pDoc->GetConnectedComputerName(strNewMachineName); if (strLastMachineName != strNewMachineName) { strLastMachineName = strNewMachineName; m_FetchingNoticesText->Show(); m_NoNoticesText->Hide(); ((CBOINCInternetFSHandler*)internetFSHandler)->ClearCache(); m_pHtmlListPane->Clear(); if (m_bMissingItems) { m_ReloadNoticesText->Hide(); m_ReloadNoticesButton->Hide(); m_bMissingItems = false; Layout(); } } } // Don't call Freeze() / Thaw() here because it causes an unnecessary redraw m_pHtmlListPane->UpdateUI(); bMissingItems = ((CBOINCInternetFSHandler*)internetFSHandler)->ItemsFailedToLoad(); if (bMissingItems != m_bMissingItems) { m_ReloadNoticesText->Show(bMissingItems); m_ReloadNoticesButton->Show(bMissingItems); Layout(); m_bMissingItems = bMissingItems; } m_FetchingNoticesText->Show(m_pHtmlListPane->m_bDisplayFetchingNotices); m_NoNoticesText->Show(m_pHtmlListPane->m_bDisplayEmptyNotice); pDoc->UpdateUnreadNoticeState(); s_bInProgress = false; wxLogTrace(wxT("Function Start/End"), wxT("CViewNotices::OnListRender - Function End")); }
// Check to see if the # of projects void CProjectsComponent::UpdateProjectArray() { CMainDocument* pDoc = wxGetApp().GetDocument(); if ( pDoc->IsConnected() ) { int m_projCnt = pDoc->GetSimpleProjectCount(); // If a new project has been added, figure out which one and then add it; if ( m_projCnt > (int) m_statProjects.size() ) { PROJECT* project; for(int i=0; i < m_projCnt; i++) { project = pDoc->state.projects[i]; bool found = false; std::vector<StatImageLoader*>::iterator j; for(j=m_statProjects.begin(); j < m_statProjects.end(); j++) { if (!strcmp(project->master_url, (*j)->project_url)) { found = true; break; } } if ( !found ) { StatImageLoader *i_statW = new StatImageLoader(this, project->master_url); i_statW->LoadImage(); m_statProjects.push_back(i_statW); // recurse in case there is more then one change UpdateProjectArray(); } } } else if ( m_projCnt < (int) m_statProjects.size() ) { PROJECT* project = NULL; std::vector<StatImageLoader*>::iterator i; for(i=m_statProjects.begin(); i < m_statProjects.end(); i++) { project = pDoc->state.lookup_project((*i)->project_url); if ( project == NULL ) { (*i)->Show(false); delete (*i); m_statProjects.erase(i); break; } } } else { return; } UpdateDisplayedProjects(); } else { std::vector<StatImageLoader*>::iterator i; for(i=m_statProjects.end(); i >= m_statProjects.begin(); i--) { (*i)->Show(false); delete (*i); } m_statProjects.clear(); } }
void CPanelMessages::OnRefresh() { if (!m_bProcessingRefreshEvent) { m_bProcessingRefreshEvent = true; static wxString strLastMachineName = wxEmptyString; wxString strNewMachineName = wxEmptyString; CC_STATUS status; CMainDocument* pDoc = wxGetApp().GetDocument(); wxASSERT(pDoc); wxASSERT(m_pHtmlListPane); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (pDoc->IsConnected()) { pDoc->GetConnectedComputerName(strNewMachineName); if (strLastMachineName != strNewMachineName) { strLastMachineName = strNewMachineName; m_FetchingNoticesText->Show(); m_NoNoticesText->Hide(); m_pHtmlListPane->Clear(); if (m_bNoNoticesTextWasDisplayed || !m_bFetchingNoticesTextWasDisplayed) { Layout(); } m_bFetchingNoticesTextWasDisplayed = true; m_bNoNoticesTextWasDisplayed = false; } } else { m_pHtmlListPane->Clear(); } // Don't call Freeze() / Thaw() here because it causes an unnecessary redraw m_pHtmlListPane->UpdateUI(); if (m_bFetchingNoticesTextWasDisplayed != m_pHtmlListPane->m_bDisplayFetchingNotices) { m_bFetchingNoticesTextWasDisplayed = m_pHtmlListPane->m_bDisplayFetchingNotices; m_FetchingNoticesText->Show(m_bFetchingNoticesTextWasDisplayed); Layout(); } if (m_bNoNoticesTextWasDisplayed != m_pHtmlListPane->m_bDisplayEmptyNotice) { m_bNoNoticesTextWasDisplayed = m_pHtmlListPane->m_bDisplayEmptyNotice; m_NoNoticesText->Show(m_bNoNoticesTextWasDisplayed); Layout(); } pDoc->UpdateUnreadNoticeState(); } }
void CSimpleProjectPanel::OnWizardAttach(wxCommandEvent& event) { wxLogTrace(wxT("Function Start/End"), wxT("CProjectsComponent::OnWizardAttach - Function Begin")); CMainDocument* pDoc = wxGetApp().GetDocument(); CSimpleGUIPanel* pPanel = wxDynamicCast(GetParent(), CSimpleGUIPanel); wxASSERT(pDoc); wxASSERT(pPanel); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (!pDoc->IsUserAuthorized()) return; if (!pDoc->IsConnected()) return; pPanel->SetDlgOpen(true); pPanel->OnProjectsAttachToProject(event); // btnAddProj->Refresh(); pPanel->SetDlgOpen(false); wxLogTrace(wxT("Function Start/End"), wxT("CProjectsComponent::OnWizardAttach - Function End")); }
void CSimpleFrame::OnMenuOpening( wxMenuEvent &event) { wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnMenuOpening - Function Begin")); CMainDocument* pDoc = wxGetApp().GetDocument(); wxMenu* menuFile = NULL; wxMenu* menuHelp = NULL; wxASSERT(pDoc); bool isConnected = pDoc->IsConnected(); wxMenu* menu = event.GetMenu(); menu->FindItem(ID_CLOSEWINDOW, &menuFile); menu->FindItem(ID_HELPBOINC, &menuHelp); size_t numItems = menu->GetMenuItemCount(); for (size_t pos = 0; pos < numItems; ++pos) { wxMenuItem * item = menu->FindItemByPosition(pos); if ((menu == menuFile) || (menu == menuHelp)) { // Always enable all items in File menu or Help menu: // ID_CLOSEWINDOW, wxID_EXIT, ID_HELPBOINC, ID_HELPBOINCMANAGER, // ID_HELPBOINCWEBSITE, wxID_ABOUT item->Enable(true); } else { // Disable other menu items if not connected to client item->Enable(isConnected); } } // wxID_EXIT and wxID_PREFERENCES are not in File menu on some platforms wxMenuItem* exitItem = menu->FindChildItem(wxID_EXIT, NULL); if (exitItem) { exitItem->Enable(true); } wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnMenuOpening - Function End")); }
// called from CSimpleFrame::OnRefreshView() void CSimpleGUIPanel::OnFrameRender() { CMainDocument* pDoc = wxGetApp().GetDocument(); wxASSERT(pDoc); int workCount = pDoc->GetSimpleGUIWorkCount(); CC_STATUS status; bool isSuspended; // OnFrameRender() may be called while SimpleGUI initialization is // in progress due to completion of a periodic get_messages RPC, // causing unintended recursion in CMainDocument::RequestRPC(). // Check for that situation here. if (pDoc->WaitingForRPC()) return; // Workaround for Linux refresh problem if (m_irefreshCount < REFRESH_WAIT) { ++m_irefreshCount; m_taskPanel->UpdatePanel(true); return; } if (workCount != m_oldWorkCount) { if (workCount < 0) { m_projPanel->Hide(); } else if (m_oldWorkCount == 0) { m_projPanel->Show(); } this->Layout(); ReskinInterface(); } if (IsShown()) { if ( pDoc->IsConnected() ) { // Show Resume or Suspend as appropriate pDoc->GetCoreClientStatus(status); isSuspended = (RUN_MODE_NEVER == status.task_mode); if ((isSuspended != m_bIsSuspended) || (!m_SuspendResumeButton->IsEnabled())) { m_bIsSuspended = isSuspended; m_SuspendResumeButton->SetLabel(m_bIsSuspended ? m_sResumeString : m_sSuspendString); m_SuspendResumeButton->SetToolTip(m_bIsSuspended ? m_sResumeButtonToolTip : m_sSuspendButtonToolTip); } m_SuspendResumeButton->Enable(); } else { m_SuspendResumeButton->SetToolTip(wxEmptyString); m_SuspendResumeButton->Disable(); } UpdateProjectView(); if (m_bNewNoticeAlert) { wxRect r = m_NoticesButton->GetRect(); r.Inflate(4, 4); RefreshRect(r, m_bNoticesButtonIsRed); m_bNoticesButtonIsRed = !m_bNoticesButtonIsRed; } // State changes can cause the BSG to crash if a dialogue is open. // Defer state change until after the dialogue is closed if ( dlgOpen ) { return; } m_oldWorkCount = workCount; m_taskPanel->UpdatePanel(false); } }
void CViewMessages::OnListRender (wxTimerEvent& event) { bool isConnected; static bool was_connected = false; static wxString strLastMachineName = wxEmptyString; wxString strNewMachineName = wxEmptyString; CMainDocument* pDoc = wxGetApp().GetDocument(); wxASSERT(pDoc); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (!m_bProcessingListRenderEvent) { m_bProcessingListRenderEvent = true; wxASSERT(m_pListPane); isConnected = pDoc->IsConnected(); wxInt32 iDocCount = GetDocCount(); if (0 >= iDocCount) { m_pListPane->DeleteAllItems(); } else { // If connection status changed, adjust color of messages display if (was_connected != isConnected) { was_connected = isConnected; if (isConnected) { m_pMessageInfoAttr->SetTextColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); m_pMessageErrorAttr->SetTextColour(*wxRED); } else { m_pMessageInfoAttr->SetTextColour(CBOINCListCtrl::GetBlendedColour( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT), wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW), 0.5)); m_pMessageErrorAttr->SetTextColour(CBOINCListCtrl::GetBlendedColour(*wxRED, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW), 0.5)); } m_pMessageInfoAttr->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); m_pMessageErrorAttr->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); // Force a complete update m_pListPane->DeleteAllItems(); m_pListPane->SetItemCount(iDocCount); } if (m_iPreviousDocCount != iDocCount) m_pListPane->SetItemCount(iDocCount); } if ((iDocCount > 1) && (_EnsureLastItemVisible()) && (m_iPreviousDocCount != iDocCount)) { m_pListPane->EnsureVisible(iDocCount - 1); } if (isConnected) { pDoc->GetConnectedComputerName(strNewMachineName); if (strLastMachineName != strNewMachineName) { strLastMachineName = strNewMachineName; if (iDocCount > 1) { m_pListPane->EnsureVisible(iDocCount - 1); } } } if (m_iPreviousDocCount != iDocCount) { m_iPreviousDocCount = iDocCount; } m_bProcessingListRenderEvent = false; } event.Skip(); }
void CSimpleProjectPanel::UpdateProjectList() { CMainDocument* pDoc = wxGetApp().GetDocument(); ProjectSelectionData* selData; PROJECT* project; char* ctrl_url; int i, j, oldProjectSelection, newProjectSelection; if ( pDoc->IsConnected() ) { int projCnt = pDoc->GetSimpleProjectCount(); int ctrlCount = m_ProjectSelectionCtrl->GetCount(); oldProjectSelection = m_ProjectSelectionCtrl->GetSelection(); // If a new project has been added, figure out which one for(i=0; i<projCnt; i++) { project = pDoc->state.projects[i]; bool found = false; for(j=0; j<ctrlCount; j++) { ctrl_url = ((ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j))->project_url; if (!strcmp(project->master_url, ctrl_url)) { found = true; break; } } // if it isn't currently in the list then we have a new one! lets add it if ( !found ) { wxString projname(project->project_name.c_str(), wxConvUTF8); #if SORTPROJECTLIST int alphaOrder; for(j = 0; j < ctrlCount; ++j) { alphaOrder = (m_ProjectSelectionCtrl->GetString(j)).CmpNoCase(projname); if (alphaOrder > 0) { break; // Insert the new item here (sorted by item label) } } #endif selData = new ProjectSelectionData; strncpy(selData->project_url, project->master_url, sizeof(selData->project_url)); selData->project_files_downloaded_time = project->project_files_downloaded_time; wxBitmap* projectBM = GetProjectSpecificBitmap(selData->project_url); #if SORTPROJECTLIST if (j < ctrlCount) { m_ProjectSelectionCtrl->Insert(projname, *projectBM, j, (void*)selData); if (j <= oldProjectSelection) { ++oldProjectSelection; m_ProjectSelectionCtrl->SetSelection(oldProjectSelection); } } else #endif { m_ProjectSelectionCtrl->Append(projname, *projectBM, (void*)selData); } ctrlCount = m_ProjectSelectionCtrl->GetCount(); } } newProjectSelection = oldProjectSelection; if ( projCnt < ctrlCount ) { project = NULL; // Check items in descending order so deletion won't change indexes of items yet to be checked for(j=ctrlCount-1; j>=0; --j) { ctrl_url = ((ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j))->project_url; project = pDoc->state.lookup_project(ctrl_url); if ( project == NULL ) { selData = (ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j); delete selData; // Indicate to Delete() we have cleaned up the Selection Data m_ProjectSelectionCtrl->SetClientData(j, NULL); m_ProjectSelectionCtrl->Delete(j); if (j == oldProjectSelection) { int newCount = m_ProjectSelectionCtrl->GetCount(); if (newProjectSelection < newCount) { // Select the next item if one exists m_ProjectSelectionCtrl->SetSelection(newProjectSelection); } else if (newCount > 0) { // Select the previous item if one exists newProjectSelection = newCount-1; m_ProjectSelectionCtrl->SetSelection(newProjectSelection); } else { newProjectSelection = -1; m_ProjectSelectionCtrl->SetSelection(wxNOT_FOUND); } } } } } // Check to see if we need to reload the project icon ctrlCount = m_ProjectSelectionCtrl->GetCount(); for(j=0; j<ctrlCount; j++) { selData = (ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j); ctrl_url = selData->project_url; project = pDoc->state.lookup_project(ctrl_url); if ( project->project_files_downloaded_time > selData->project_files_downloaded_time ) { wxBitmap* projectBM = GetProjectSpecificBitmap(ctrl_url); selData->project_files_downloaded_time = project->project_files_downloaded_time; m_ProjectSelectionCtrl->SetItemBitmap(j, *projectBM); } } } }
void CSimpleProjectPanel::UpdateInterface() { int n, count = -1; bool b_needMenuRebuild = false; wxString str = wxEmptyString; wxString projName = wxEmptyString; CMainDocument* pDoc = wxGetApp().GetDocument(); wxASSERT(pDoc); // Should we display the synchronize button instead of the // attach to project button? if ( pDoc->IsConnected() ) { CC_STATUS status; int is_acct_mgr_detected = 0; pDoc->GetCoreClientStatus(status); if (pDoc->m_iAcct_mgr_info_rpc_result == 0) { // We use an integer rather than a bool to force action the first time is_acct_mgr_detected = pDoc->ami.acct_mgr_url.size() ? 1 : 0; if ((m_UsingAccountManager != is_acct_mgr_detected) || (!m_TaskAddProjectButton->IsEnabled())) { m_UsingAccountManager = is_acct_mgr_detected; if (is_acct_mgr_detected) { m_TaskAddProjectButton->SetLabel(m_sSynchronizeString); m_TaskAddProjectButton->Enable(); m_TaskAddProjectButton->SetToolTip(m_sSynchronizeToolTip); } else { m_TaskAddProjectButton->SetLabel(m_sAddProjectString); if (!status.disallow_attach) { m_TaskAddProjectButton->Enable(); m_TaskAddProjectButton->SetToolTip(m_sAddProjectToolTip); } } this->Layout(); } } else { m_TaskAddProjectButton->Disable(); } UpdateProjectList(); count = m_ProjectSelectionCtrl->GetCount(); } if (count > 0) { n = m_ProjectSelectionCtrl->GetSelection(); if ((n < 0) || (n > count -1)) { m_ProjectSelectionCtrl->SetSelection(0); n = 0; } // Check to see if we need to rebuild the menu char* ctrl_url = ((ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(n))->project_url; if (strcmp(m_CurrentSelectedProjectURL, ctrl_url)) { b_needMenuRebuild = true; strncpy(m_CurrentSelectedProjectURL, ctrl_url, sizeof(m_CurrentSelectedProjectURL)); } PROJECT* project = pDoc->state.lookup_project(ctrl_url); if ( project != NULL && project->last_rpc_time > m_Project_last_rpc_time ) { b_needMenuRebuild = true; m_Project_last_rpc_time = project->last_rpc_time; } if (b_needMenuRebuild) { m_ProjectWebSitesButton->RebuildMenu(); } m_ProjectWebSitesButton->Enable(); m_ProjectCommandsButton->Enable(); if (m_fDisplayedCredit != project->user_total_credit) { str.Printf(wxT("%s: %s"), m_sTotalWorkDoneString.c_str(), format_number(project->user_total_credit, 0) ); UpdateStaticText(&m_TotalCreditValue, str); m_TotalCreditValue->SetName(str); // For accessibility on Windows } projName = m_ProjectSelectionCtrl->GetStringSelection(); str.Printf(_("Pop up a menu of web sites for project %s"), projName.c_str()); m_ProjectWebSitesButton->SetToolTip(str); str.Printf(_("Pop up a menu of commands to apply to project %s"), projName.c_str()); m_ProjectCommandsButton->SetToolTip(str); } else { m_ProjectWebSitesButton->Disable(); m_ProjectCommandsButton->Disable(); m_CurrentSelectedProjectURL[0] = '\0'; m_fDisplayedCredit = -1.0; UpdateStaticText(&m_TotalCreditValue, wxEmptyString); m_TotalCreditValue->SetName(wxEmptyString); // For accessibility on Windows m_ProjectWebSitesButton->SetToolTip(wxEmptyString); m_ProjectCommandsButton->SetToolTip(wxEmptyString); } }
void CViewMessages::OnListRender (wxTimerEvent& event) { bool isConnected; static bool was_connected = false; static wxString strLastMachineName = wxEmptyString; wxString strNewMachineName = wxEmptyString; CMainDocument* pDoc = wxGetApp().GetDocument(); wxASSERT(pDoc); wxASSERT(wxDynamicCast(pDoc, CMainDocument)); if (!m_bProcessingListRenderEvent) { m_bProcessingListRenderEvent = true; wxASSERT(m_pListPane); isConnected = pDoc->IsConnected(); wxInt32 iRowCount = GetDocCount(); if (0 >= iRowCount) { m_pListPane->DeleteAllItems(); } else { // If connection status changed, adjust color of messages display if (was_connected != isConnected) { was_connected = isConnected; if (isConnected) { m_pMessageInfoAttr->SetTextColour(*wxBLACK); m_pMessageErrorAttr->SetTextColour(*wxRED); m_pMessageInfoGrayAttr->SetTextColour(*wxBLACK); m_pMessageErrorGrayAttr->SetTextColour(*wxRED); } else { wxColourDatabase colorBase; m_pMessageInfoAttr->SetTextColour(wxColour(128, 128, 128)); m_pMessageErrorAttr->SetTextColour(wxColour(255, 128, 128)); m_pMessageInfoGrayAttr->SetTextColour(wxColour(128, 128, 128)); m_pMessageErrorGrayAttr->SetTextColour(wxColour(255, 128, 128)); } // Force a complete update m_pListPane->DeleteAllItems(); m_pListPane->SetItemCount(iRowCount); m_iPreviousRowCount = 0; // Force scrolling to bottom } else { // Connection status didn't change if (m_iPreviousRowCount != iRowCount) { m_pListPane->SetItemCount(iRowCount); } } } if ((iRowCount>1) && (_EnsureLastItemVisible()) && (m_iPreviousRowCount != iRowCount)) { m_pListPane->EnsureVisible(iRowCount - 1); } if (isConnected) { pDoc->GetConnectedComputerName(strNewMachineName); if (strLastMachineName != strNewMachineName) { strLastMachineName = strNewMachineName; if (iRowCount) { m_pListPane->EnsureVisible(iRowCount - 1); } } } if (m_iPreviousRowCount != iRowCount) { m_iPreviousRowCount = iRowCount; } m_bProcessingListRenderEvent = false; } event.Skip(); }
void CSimpleProjectPanel::UpdateProjectList() { CMainDocument* pDoc = wxGetApp().GetDocument(); ProjectSelectionData* selData; PROJECT* project; char* ctrl_url; int i, j; if ( pDoc->IsConnected() ) { int projCnt = pDoc->GetSimpleProjectCount(); int ctrlCount = m_ProjectSelectionCtrl->GetCount(); // If a new project has been added, figure out which one and then add it; while ( projCnt > ctrlCount ) { for(i=0; i<projCnt; i++) { project = pDoc->state.projects[i]; bool found = false; for(j=0; j<ctrlCount; j++) { ctrl_url = ((ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j))->project_url; if (!strcmp(project->master_url, ctrl_url)) { found = true; break; } } if ( !found ) { selData = new ProjectSelectionData; strncpy(selData->project_url, project->master_url, sizeof(selData->project_url)); selData->project_files_downloaded_time = 0.0; wxBitmap* projectBM = GetProjectSpecificBitmap(selData->project_url); wxString projname(project->project_name.c_str(), wxConvUTF8); m_ProjectSelectionCtrl->Append(projname, *projectBM, (void*)selData); ctrlCount = m_ProjectSelectionCtrl->GetCount(); } } } if ( projCnt < ctrlCount ) { project = NULL; // Check items in descending order so deletion won't change indexes of items yet to be checked for(j=ctrlCount-1; j>=0; --j) { char* ctrl_url = ((ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j))->project_url; project = pDoc->state.lookup_project(ctrl_url); if ( project == NULL ) { selData = (ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j); delete selData; m_ProjectSelectionCtrl->Delete(j); } } } // Check to see if we need to reload the project icon ctrlCount = m_ProjectSelectionCtrl->GetCount(); for(j=0; j<ctrlCount; j++) { selData = (ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j); ctrl_url = selData->project_url; project = pDoc->state.lookup_project(ctrl_url); if ( project->project_files_downloaded_time > selData->project_files_downloaded_time ) { wxBitmap* projectBM = GetProjectSpecificBitmap(ctrl_url); selData->project_files_downloaded_time = project->project_files_downloaded_time; m_ProjectSelectionCtrl->SetItemBitmap(j, *projectBM); } } } }