Index: src/ch/StatusDlg.cpp =================================================================== diff -u -rc435ab507c8b8280264188b49e9ada56d46c0261 -r8068e0c351055554340ac9755d1bc846893bf2b8 --- src/ch/StatusDlg.cpp (.../StatusDlg.cpp) (revision c435ab507c8b8280264188b49e9ada56d46c0261) +++ src/ch/StatusDlg.cpp (.../StatusDlg.cpp) (revision 8068e0c351055554340ac9755d1bc846893bf2b8) @@ -18,13 +18,17 @@ ***************************************************************************/ #include "stdafx.h" #include "ch.h" +#include "../libchcore/TTaskManager.h" +#include "../libchcore/TTask.h" #include "resource.h" #include "StatusDlg.h" #include "BufferSizeDlg.h" -#include "ReplacePathsDlg.h" #include "StringHelpers.h" #include "StaticEx.h" #include "Structs.h" +#include "../libchcore/TTaskStatsSnapshot.h" +#include "../libchcore/TTaskManagerStatsSnapshot.h" +#include "CfgProperties.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -37,41 +41,37 @@ ///////////////////////////////////////////////////////////////////////////// // CStatusDlg dialog -CStatusDlg::CStatusDlg(CTaskArray* pTasks, CWnd* pParent /*=NULL*/) - : ictranslate::CLanguageDialog(CStatusDlg::IDD, pParent, &m_bLock) +CStatusDlg::CStatusDlg(chcore::TTaskManager* pTasks, CWnd* pParent /*=nullptr*/) + : ictranslate::CLanguageDialog(IDD_STATUS_DIALOG, pParent, &m_bLock), + m_spTaskMgrStats(new chcore::TTaskManagerStatsSnapshot), + m_pTasks(pTasks) { - //{{AFX_DATA_INIT(CStatusDlg) - //}}AFX_DATA_INIT - m_i64LastProcessed=0; - m_i64LastAllTasksProcessed=0; - m_pTasks=pTasks; - m_dwLastUpdate=0; - RegisterStaticExControl(AfxGetInstanceHandle()); } CStatusDlg::~CStatusDlg() { - } void CStatusDlg::DoDataExchange(CDataExchange* pDX) { CLanguageDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CStatusDlg) - DDX_Control(pDX, IDC_TASK_PROGRESS, m_ctlCurrentProgress); + DDX_Control(pDX, IDC_TASKCOUNT_PROGRESS, m_ctlTaskCountProgress); + DDX_Control(pDX, IDC_TASKSIZE_PROGRESS, m_ctlTaskSizeProgress); + DDX_Control(pDX, IDC_CURRENTOBJECT_PROGRESS, m_ctlCurrentObjectProgress); + DDX_Control(pDX, IDC_SUBTASKCOUNT_PROGRESS, m_ctlSubTaskCountProgress); + DDX_Control(pDX, IDC_SUBTASKSIZE_PROGRESS, m_ctlSubTaskSizeProgress); + DDX_Control(pDX, IDC_GLOBAL_PROGRESS, m_ctlProgressAll); DDX_Control(pDX, IDC_STATUS_LIST, m_ctlStatusList); - DDX_Control(pDX, IDC_ALL_PROGRESS, m_ctlProgressAll); - //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CStatusDlg,ictranslate::CLanguageDialog) //{{AFX_MSG_MAP(CStatusDlg) ON_WM_TIMER() ON_BN_CLICKED(IDC_PAUSE_BUTTON, OnPauseButton) ON_BN_CLICKED(IDC_CANCEL_BUTTON, OnCancelButton) - ON_BN_CLICKED(IDC_ROLL_UNROLL_BUTTON, OnRollUnrollButton) ON_BN_CLICKED(IDC_SET_PRIORITY_BUTTON, OnSetPriorityButton) + ON_BN_CLICKED(IDC_TASK_ADVANCED_BUTTON, OnTaskAdvancedOptions) ON_BN_CLICKED(IDC_SET_BUFFERSIZE_BUTTON, OnSetBuffersizeButton) ON_BN_CLICKED(IDC_START_ALL_BUTTON, OnStartAllButton) ON_BN_CLICKED(IDC_RESTART_BUTTON, OnRestartButton) @@ -82,8 +82,6 @@ ON_BN_CLICKED(IDC_REMOVE_FINISHED_BUTTON, OnRemoveFinishedButton) ON_NOTIFY(LVN_KEYDOWN, IDC_STATUS_LIST, OnKeydownStatusList) ON_NOTIFY(LVN_CHANGEDSELECTION, IDC_STATUS_LIST, OnSelectionChanged) - ON_BN_CLICKED(IDC_ADVANCED_BUTTON, OnAdvancedButton) - ON_COMMAND(ID_POPUP_REPLACE_PATHS, OnPopupReplacePaths) ON_BN_CLICKED(IDC_SHOW_LOG_BUTTON, OnShowLogButton) ON_BN_CLICKED(IDC_STICK_BUTTON, OnStickButton) ON_BN_CLICKED(IDC_RESUME_BUTTON, OnResumeButton) @@ -148,11 +146,11 @@ m_ctlStatusList.SetImageList(&m_images, LVSIL_SMALL); // set fixed progresses ranges - m_ctlCurrentProgress.SetRange32(0, 100); + m_ctlTaskCountProgress.SetRange32(0, 100); m_ctlProgressAll.SetRange32(0, 100); // change the size of a dialog - ApplyDisplayDetails(true); + StickDialogToScreenEdge(); // ApplyButtonsState(); // EnableControls(false); @@ -170,10 +168,10 @@ } stIndex++; - }; + } // refresh data timer - SetTimer(777, (UINT)GetConfig().get_signed_num(PP_STATUSREFRESHINTERVAL), NULL); + SetTimer(777, GetPropValue(GetConfig()), nullptr); return TRUE; } @@ -183,22 +181,33 @@ // enable/disable controls GetDlgItem(IDC_SET_BUFFERSIZE_BUTTON)->EnableWindow(bEnable); GetDlgItem(IDC_SET_PRIORITY_BUTTON)->EnableWindow(bEnable); + GetDlgItem(IDC_TASK_ADVANCED_BUTTON)->EnableWindow(bEnable); if (!bEnable) { - // get rid of text id disabling + GetDlgItem(IDC_TASKID_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTASKID_STRING)); + GetDlgItem(IDC_OPERATION_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYOPERATIONTEXT_STRING)); - GetDlgItem(IDC_SOURCE_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYSOURCETEXT_STRING)); - GetDlgItem(IDC_DESTINATION_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYDESTINATIONTEXT_STRING)); + GetDlgItem(IDC_SOURCEOBJECT_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYSOURCETEXT_STRING)); + GetDlgItem(IDC_DESTINATIONOBJECT_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYDESTINATIONTEXT_STRING)); GetDlgItem(IDC_BUFFERSIZE_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYBUFFERSIZETEXT_STRING)); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPRIORITYTEXT_STRING)); + GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPRIORITYTEXT_STRING)); - GetDlgItem(IDC_PROGRESS_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPROCESSEDTEXT_STRING)); - GetDlgItem(IDC_TRANSFER_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTRANSFERTEXT_STRING)); - GetDlgItem(IDC_TIME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTIMETEXT_STRING)); - GetDlgItem(IDC_ASSOCIATEDFILES__STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYASSOCFILE_STRING)); + // subtask + GetDlgItem(IDC_SUBTASKNAME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYSUBTASKNAME_STRING)); + GetDlgItem(IDC_SUBTASKPROCESSED_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPROCESSEDTEXT_STRING)); + GetDlgItem(IDC_SUBTASKTIME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTIMETEXT_STRING)); + GetDlgItem(IDC_SUBTASKTRANSFER_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTRANSFERTEXT_STRING)); - m_ctlCurrentProgress.SetPos(0); + GetDlgItem(IDC_TASKPROCESSED_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPROCESSEDTEXT_STRING)); + GetDlgItem(IDC_TASKTRANSFER_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTRANSFERTEXT_STRING)); + GetDlgItem(IDC_TASKTIME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTIMETEXT_STRING)); + + m_ctlTaskCountProgress.SetPos(0); + m_ctlTaskSizeProgress.SetPos(0); + m_ctlCurrentObjectProgress.SetPos(0); + m_ctlSubTaskCountProgress.SetPos(0); + m_ctlSubTaskSizeProgress.SetPos(0); } } @@ -212,234 +221,121 @@ RefreshStatus(); // reenable - SetTimer(777, (UINT)GetConfig().get_signed_num(PP_STATUSREFRESHINTERVAL), NULL); + SetTimer(777, GetPropValue(GetConfig()), nullptr); } CLanguageDialog::OnTimer(nIDEvent); } -void CStatusDlg::AddTaskInfo(int nPos, const CTaskPtr& spTask, DWORD dwCurrentTime) +void CStatusDlg::OnSetBuffersizeButton() { - _ASSERTE(spTask != NULL); - if(spTask == NULL) + chcore::TTaskPtr spTask = GetSelectedItemPointer(); + if(!spTask) return; - // index to string - _itot(nPos, m_szData, 10); - - // get data snapshot from task - spTask->GetSnapshot(&td); - - // index subitem - lvi.mask=LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; - lvi.iItem=nPos; - lvi.iSubItem=0; - lvi.pszText=td.m_szStatusText; - lvi.cchTextMax=lstrlen(lvi.pszText); - lvi.lParam = spTask->GetSessionUniqueID(); - lvi.iImage=GetImageFromStatus(td.m_uiStatus); - if (nPos < m_ctlStatusList.GetItemCount()) - m_ctlStatusList.SetItem(&lvi); - else - m_ctlStatusList.InsertItem(&lvi); - - // status subitem - lvi.mask=LVIF_TEXT; - lvi.iSubItem=1; - m_strTemp = td.m_strFileName; - lvi.pszText=m_strTemp.GetBuffer(0); - m_strTemp.ReleaseBuffer(); - lvi.cchTextMax=lstrlen(lvi.pszText); - m_ctlStatusList.SetItem(&lvi); - - // insert 'file' subitem - lvi.iSubItem=2; - m_strTemp=td.m_pdpDestPath->GetPath(); - lvi.pszText=m_strTemp.GetBuffer(0); - m_strTemp.ReleaseBuffer(); - lvi.cchTextMax=lstrlen(lvi.pszText); - m_ctlStatusList.SetItem(&lvi); - - // insert dest subitem - lvi.iSubItem=3; - _itot( td.m_nPercent, m_szData, 10 ); - _tcscat(m_szData, _T(" %")); - lvi.pszText=m_szData; - lvi.cchTextMax=lstrlen(lvi.pszText); - m_ctlStatusList.SetItem(&lvi); - - // right side update - if(spTask == m_spSelectedItem && GetConfig().get_bool(PP_STATUSSHOWDETAILS)) + int iCurrentBufferIndex = 0; + chcore::TTaskStatsSnapshotPtr spTaskStats = m_spTaskMgrStats->GetTaskStatsForTaskID(boost::numeric_cast(GetSelectedItemSessionUniqueID())); + if(spTaskStats) { - // data that can be changed by a thread - GetDlgItem(IDC_OPERATION_STATIC)->SetWindowText(td.m_szStatusText); // operation - GetDlgItem(IDC_SOURCE_STATIC)->SetWindowText(td.m_strFullFilePath); // src object - - // count of processed data/overall count of data - _sntprintf(m_szData, _MAX_PATH, _T("%d/%d ("), td.m_stIndex, td.m_stSize); - m_strTemp=CString(m_szData); - m_strTemp+=GetSizeString(td.m_ullProcessedSize, m_szData, _MAX_PATH)+CString(_T("/")); - m_strTemp+=GetSizeString(td.m_ullSizeAll, m_szData, _MAX_PATH)+CString(_T(")")); - _sntprintf(m_szData, _MAX_PATH, _T(" (%s%d/%d)"), GetResManager().LoadString(IDS_CURRENTPASS_STRING), td.m_ucCurrentCopy, td.m_ucCopies); - m_strTemp+=m_szData; - GetDlgItem(IDC_PROGRESS_STATIC)->SetWindowText(m_strTemp); - - // transfer - if (m_i64LastProcessed == 0) // if first time - show average - m_strTemp=GetSizeString( td.m_timeElapsed ? td.m_ullProcessedSize/td.m_timeElapsed : 0, m_szData, _MAX_PATH); // last avg - else - if ( (dwCurrentTime-m_dwLastUpdate) != 0) - m_strTemp=GetSizeString( (static_cast(td.m_ullProcessedSize) - static_cast(m_i64LastProcessed))/(static_cast(dwCurrentTime-m_dwLastUpdate)/1000.0), m_szData, _MAX_PATH); - else - m_strTemp=GetSizeString( 0ULL, m_szData, _MAX_PATH); - - // avg transfer - GetDlgItem(IDC_TRANSFER_STATIC)->SetWindowText(m_strTemp+_T("/s (")+CString(GetResManager().LoadString(IDS_AVERAGEWORD_STRING)) - +CString(GetSizeString(td.m_timeElapsed ? td.m_ullProcessedSize/td.m_timeElapsed : 0, m_szData, _MAX_PATH))+_T("/s )") - ); - - // elapsed time / estimated total time (estimated time left) - FormatTime(td.m_timeElapsed, m_szTimeBuffer1, 40); - time_t timeTotal = (td.m_ullProcessedSize == 0) ? 0 : (long)(td.m_ullSizeAll * td.m_timeElapsed / td.m_ullProcessedSize); - FormatTime(timeTotal, m_szTimeBuffer2, 40); - FormatTime(std::max((time_t)0l, timeTotal - td.m_timeElapsed), m_szTimeBuffer3, 40); - - _sntprintf(m_szData, _MAX_PATH, _T("%s / %s (%s)"), m_szTimeBuffer1, m_szTimeBuffer2, m_szTimeBuffer3); - GetDlgItem(IDC_TIME_STATIC)->SetWindowText(m_szData); - - // remember current processed data (used for calculating transfer) - m_i64LastProcessed=td.m_ullProcessedSize; - - // set progress - m_ctlCurrentProgress.SetPos(td.m_nPercent); - - SetBufferSizesString(td.m_pbsSizes->m_auiSizes[td.m_iCurrentBufferIndex], td.m_iCurrentBufferIndex); - - // data that can be changed only by user from outside the thread - // refresh only when there are new selected item -// if (spTask != m_spLastSelected) - { - GetDlgItem(IDC_DESTINATION_STATIC)->SetWindowText(td.m_pdpDestPath->GetPath()); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(td.m_nPriority))); - GetDlgItem(IDC_ASSOCIATEDFILES__STATIC)->SetWindowText(*td.m_pstrUniqueName+_T(".atd (.atp, .log)")); - } - - // refresh m_spLastSelected - m_spLastSelected = spTask; + chcore::TSubTaskStatsSnapshotPtr spSubTaskStats = spTaskStats->GetSubTasksStats().GetCurrentSubTaskSnapshot(); + if(spSubTaskStats) + iCurrentBufferIndex = spSubTaskStats->GetCurrentBufferIndex(); } -} -void CStatusDlg::OnSetBuffersizeButton() -{ - CTaskPtr spTask = GetSelectedItemPointer(); - if(!spTask) - return; + chcore::TBufferSizes tBufferSizes; + spTask->GetBufferSizes(tBufferSizes); - CBufferSizeDlg dlg; - dlg.m_bsSizes = *spTask->GetBufferSizes(); - dlg.m_iActiveIndex = spTask->GetCurrentBufferIndex(); + CBufferSizeDlg dlg(&tBufferSizes, (chcore::TBufferSizes::EBufferType)iCurrentBufferIndex); if(dlg.DoModal() == IDOK) - spTask->SetBufferSizes(&dlg.m_bsSizes); + spTask->SetBufferSizes(dlg.GetBufferSizes()); } -CTaskPtr CStatusDlg::GetSelectedItemPointer() +chcore::TTaskPtr CStatusDlg::GetSelectedItemPointer() { - // returns ptr to a CTask for a given element in listview + // returns ptr to a TTask for a given element in listview if(m_ctlStatusList.GetSelectedCount() == 1) { POSITION pos = m_ctlStatusList.GetFirstSelectedItemPosition(); int nPos = m_ctlStatusList.GetNextSelectedItem(pos); - return m_pTasks->GetTaskBySessionUniqueID(m_ctlStatusList.GetItemData(nPos)); + return m_pTasks->GetTaskByTaskID(boost::numeric_cast(m_ctlStatusList.GetItemData(nPos))); } - return CTaskPtr(); + return chcore::TTaskPtr(); } -void CStatusDlg::OnRollUnrollButton() +size_t CStatusDlg::GetSelectedItemSessionUniqueID() { - // change settings in config dialog - GetConfig().set_bool(PP_STATUSSHOWDETAILS, !GetConfig().get_bool(PP_STATUSSHOWDETAILS)); + // returns ptr to a TTask for a given element in listview + if(m_ctlStatusList.GetSelectedCount() == 1) + { + POSITION pos = m_ctlStatusList.GetFirstSelectedItemPosition(); + int nPos = m_ctlStatusList.GetNextSelectedItem(pos); + return m_ctlStatusList.GetItemData(nPos); + } - ApplyDisplayDetails(); + return std::numeric_limits::max(); } -void CStatusDlg::ApplyDisplayDetails(bool bInitial) +void CStatusDlg::StickDialogToScreenEdge() { // get coord of screen and window CRect rcScreen, rect; SystemParametersInfo(SPI_GETWORKAREA, 0, &rcScreen, 0); GetWindowRect(&rect); - bool bDetails=GetConfig().get_bool(PP_STATUSSHOWDETAILS); - - // stick cause - if (rect.right == rcScreen.right && rect.bottom == rcScreen.bottom) - bInitial=true; - - GetDlgItem(IDC_ROLL_UNROLL_BUTTON)->SetWindowText(bDetails ? _T("<<") : _T(">>")); - - CRect list, progress; - m_ctlProgressAll.GetWindowRect(&progress); - ScreenToClient(&progress); - m_ctlStatusList.GetWindowRect(&list); - ScreenToClient(&list); - - // set dialog size - CRect destRect; - if (!bInitial) - { - destRect.left=0; - destRect.top=0; - destRect.right=bDetails ? progress.right+list.left+3*GetSystemMetrics(SM_CXBORDER) : list.right+list.left+3*GetSystemMetrics(SM_CXBORDER); - destRect.bottom=rect.Height(); - SetWindowPos(NULL, destRect.left, destRect.top, destRect.right, destRect.bottom, SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER); - } - else - { - SetWindowPos(NULL, rcScreen.right-(bDetails ? progress.right+list.left+3*GetSystemMetrics(SM_CXBORDER) : list.right+list.left+3*GetSystemMetrics(SM_CXBORDER)), - rcScreen.bottom-rect.Height(), (bDetails ? progress.right+list.left+3*GetSystemMetrics(SM_CXBORDER) : list.right+list.left+3*GetSystemMetrics(SM_CXBORDER)), - rect.Height(), SWP_NOOWNERZORDER | SWP_NOZORDER); - } + SetWindowPos(nullptr, rcScreen.right-rect.Width(), + rcScreen.bottom-rect.Height(), rect.Width(), rect.Height(), + SWP_NOOWNERZORDER | SWP_NOZORDER); } void CStatusDlg::ApplyButtonsState() { - // remember ptr to CTask - m_spSelectedItem=GetSelectedItemPointer(); - bool bShowLog=GetConfig().get_bool(PP_CMCREATELOG); + // remember ptr to TTask + chcore::TTaskPtr spSelectedTask = GetSelectedItemPointer(); // set status of buttons pause/resume/cancel - if (m_spSelectedItem != NULL) + if (spSelectedTask != nullptr) { - GetDlgItem(IDC_RESTART_BUTTON)->EnableWindow(true); - GetDlgItem(IDC_SHOW_LOG_BUTTON)->EnableWindow(bShowLog); - GetDlgItem(IDC_DELETE_BUTTON)->EnableWindow(true); - - if (m_spSelectedItem->GetStatus(ST_STEP_MASK) == ST_FINISHED - || m_spSelectedItem->GetStatus(ST_STEP_MASK) == ST_CANCELLED) + if(spSelectedTask->GetTaskState() == chcore::eTaskState_LoadError) { - GetDlgItem(IDC_CANCEL_BUTTON)->EnableWindow(false); + GetDlgItem(IDC_SHOW_LOG_BUTTON)->EnableWindow(true); GetDlgItem(IDC_PAUSE_BUTTON)->EnableWindow(false); GetDlgItem(IDC_RESUME_BUTTON)->EnableWindow(false); - } + GetDlgItem(IDC_RESTART_BUTTON)->EnableWindow(false); + GetDlgItem(IDC_CANCEL_BUTTON)->EnableWindow(false); + GetDlgItem(IDC_DELETE_BUTTON)->EnableWindow(true); + } else { - // pause/resume - if (m_spSelectedItem->GetStatus(ST_WORKING_MASK) & ST_PAUSED) + GetDlgItem(IDC_RESTART_BUTTON)->EnableWindow(true); + GetDlgItem(IDC_SHOW_LOG_BUTTON)->EnableWindow(true); + GetDlgItem(IDC_DELETE_BUTTON)->EnableWindow(true); + + if (spSelectedTask->GetTaskState() == chcore::eTaskState_Finished || spSelectedTask->GetTaskState() == chcore::eTaskState_Cancelled) { + GetDlgItem(IDC_CANCEL_BUTTON)->EnableWindow(false); GetDlgItem(IDC_PAUSE_BUTTON)->EnableWindow(false); - GetDlgItem(IDC_RESUME_BUTTON)->EnableWindow(true); + GetDlgItem(IDC_RESUME_BUTTON)->EnableWindow(false); } else { - GetDlgItem(IDC_PAUSE_BUTTON)->EnableWindow(true); - if (m_spSelectedItem->GetStatus(ST_WAITING_MASK) & ST_WAITING) + // pause/resume + if (spSelectedTask->GetTaskState() == chcore::eTaskState_Paused) + { + GetDlgItem(IDC_PAUSE_BUTTON)->EnableWindow(false); GetDlgItem(IDC_RESUME_BUTTON)->EnableWindow(true); + } else - GetDlgItem(IDC_RESUME_BUTTON)->EnableWindow(false); + { + GetDlgItem(IDC_PAUSE_BUTTON)->EnableWindow(true); + if (spSelectedTask->GetTaskState() == chcore::eTaskState_Waiting) + GetDlgItem(IDC_RESUME_BUTTON)->EnableWindow(true); + else + GetDlgItem(IDC_RESUME_BUTTON)->EnableWindow(false); + } + + GetDlgItem(IDC_CANCEL_BUTTON)->EnableWindow(true); } - - GetDlgItem(IDC_CANCEL_BUTTON)->EnableWindow(true); } } else @@ -464,7 +360,7 @@ } CMenu* pPopup = menu.GetSubMenu(0); - ASSERT(pPopup != NULL); + ASSERT(pPopup != nullptr); if(pPopup) { // set point in which to set menu @@ -475,55 +371,89 @@ } } +void CStatusDlg::OnTaskAdvancedOptions() +{ + CMenu menu; + HMENU hMenu = GetResManager().LoadMenu(MAKEINTRESOURCE(IDR_TASK_ADVANCED_MENU)); + if(!menu.Attach(hMenu)) + { + DestroyMenu(hMenu); + return; + } + + CMenu* pPopup = menu.GetSubMenu(0); + ASSERT(pPopup != nullptr); + if(pPopup) + { + // set point in which to set menu + CRect rect; + GetDlgItem(IDC_TASK_ADVANCED_BUTTON)->GetWindowRect(&rect); + + pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rect.right + 1, rect.top, this); + } +} + BOOL CStatusDlg::OnCommand(WPARAM wParam, LPARAM lParam) { if (HIWORD(wParam) == 0) { if (LOWORD(wParam) >= ID_POPUP_TIME_CRITICAL && LOWORD(wParam) <= ID_POPUP_IDLE) { // processing priority - if ( (m_spSelectedItem=GetSelectedItemPointer()) == NULL ) + chcore::TTaskPtr spSelectedTask = GetSelectedItemPointer(); + + if(spSelectedTask == nullptr) return ictranslate::CLanguageDialog::OnCommand(wParam, lParam); switch (LOWORD(wParam)) { case ID_POPUP_TIME_CRITICAL: - m_spSelectedItem->SetPriority(THREAD_PRIORITY_TIME_CRITICAL); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_TIME_CRITICAL))); + spSelectedTask->SetPriority(THREAD_PRIORITY_TIME_CRITICAL); + GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_TIME_CRITICAL))); break; case ID_POPUP_HIGHEST: - m_spSelectedItem->SetPriority(THREAD_PRIORITY_HIGHEST); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_HIGHEST))); + spSelectedTask->SetPriority(THREAD_PRIORITY_HIGHEST); + GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_HIGHEST))); break; case ID_POPUP_ABOVE_NORMAL: - m_spSelectedItem->SetPriority(THREAD_PRIORITY_ABOVE_NORMAL); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_ABOVE_NORMAL))); + spSelectedTask->SetPriority(THREAD_PRIORITY_ABOVE_NORMAL); + GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_ABOVE_NORMAL))); break; case ID_POPUP_NORMAL: - m_spSelectedItem->SetPriority(THREAD_PRIORITY_NORMAL); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_NORMAL))); + spSelectedTask->SetPriority(THREAD_PRIORITY_NORMAL); + GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_NORMAL))); break; case ID_POPUP_BELOW_NORMAL: - m_spSelectedItem->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_BELOW_NORMAL))); + spSelectedTask->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); + GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_BELOW_NORMAL))); break; case ID_POPUP_LOWEST: - m_spSelectedItem->SetPriority(THREAD_PRIORITY_LOWEST); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_LOWEST))); + spSelectedTask->SetPriority(THREAD_PRIORITY_LOWEST); + GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_LOWEST))); break; case ID_POPUP_IDLE: - m_spSelectedItem->SetPriority(THREAD_PRIORITY_IDLE); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_IDLE))); + spSelectedTask->SetPriority(THREAD_PRIORITY_IDLE); + GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_IDLE))); break; } } + else if(LOWORD(wParam) == ID_POPUP_RESET_APPLY_TO_ALL) + { + // processing priority + chcore::TTaskPtr spSelectedTask = GetSelectedItemPointer(); + + if(spSelectedTask == nullptr) + return ictranslate::CLanguageDialog::OnCommand(wParam, lParam); + + spSelectedTask->RestoreFeedbackDefaults(); + } } return ictranslate::CLanguageDialog::OnCommand(wParam, lParam); } void CStatusDlg::OnPauseButton() { - CTaskPtr spTask = GetSelectedItemPointer(); + chcore::TTaskPtr spTask = GetSelectedItemPointer(); if(spTask) { TRACE("PauseProcessing call...\n"); @@ -535,10 +465,10 @@ void CStatusDlg::OnResumeButton() { - CTaskPtr spTask = GetSelectedItemPointer(); + chcore::TTaskPtr spTask = GetSelectedItemPointer(); if(spTask) { - if(spTask->GetStatus(ST_WAITING_MASK) & ST_WAITING) + if(spTask->GetTaskState() == chcore::eTaskState_Waiting) spTask->SetForceFlag(); else spTask->ResumeProcessing(); @@ -549,7 +479,7 @@ void CStatusDlg::OnCancelButton() { - CTaskPtr spTask = GetSelectedItemPointer(); + chcore::TTaskPtr spTask = GetSelectedItemPointer(); if(spTask) { spTask->CancelProcessing(); @@ -559,7 +489,7 @@ void CStatusDlg::OnRestartButton() { - CTaskPtr spTask = GetSelectedItemPointer(); + chcore::TTaskPtr spTask = GetSelectedItemPointer(); if(spTask) { spTask->RestartProcessing(); @@ -569,18 +499,21 @@ void CStatusDlg::OnDeleteButton() { - CTaskPtr spTask = GetSelectedItemPointer(); + chcore::TTaskPtr spTask = GetSelectedItemPointer(); if(spTask) { - UINT uiStatus = spTask->GetStatus(ST_STEP_MASK); - if((uiStatus & ST_STEP_MASK) != ST_FINISHED && (uiStatus & ST_STEP_MASK) != ST_CANCELLED) + chcore::ETaskCurrentState eTaskState = spTask->GetTaskState(); + switch(eTaskState) { - // ask if cancel + case chcore::eTaskState_Finished: + case chcore::eTaskState_Cancelled: + case chcore::eTaskState_LoadError: + break; // allow processing as-is + + default: + // ask to cancel if(MsgBox(IDS_CONFIRMCANCEL_STRING, MB_OKCANCEL | MB_ICONQUESTION) == IDOK) - { - // cancel spTask->CancelProcessing(); - } else return; } @@ -634,11 +567,11 @@ break; case VK_SPACE: { - CTaskPtr spTask = GetSelectedItemPointer(); + chcore::TTaskPtr spTask = GetSelectedItemPointer(); if (!spTask) return; - if(spTask->GetStatus(ST_WORKING_MASK) & ST_PAUSED) + if(spTask->GetTaskState() == chcore::eTaskState_Paused) OnResumeButton(); else OnPauseButton(); @@ -649,105 +582,101 @@ *pResult = 0; } -int CStatusDlg::GetImageFromStatus(UINT nStatus) +int CStatusDlg::GetImageFromStatus(chcore::ETaskCurrentState eState) { - if ( (nStatus & ST_STEP_MASK) == ST_CANCELLED ) + switch(eState) + { + case chcore::eTaskState_Cancelled: return 4; - if ( (nStatus & ST_STEP_MASK) == ST_FINISHED ) + case chcore::eTaskState_Finished: return 3; - if ( (nStatus & ST_WAITING_MASK) == ST_WAITING ) + case chcore::eTaskState_Waiting: return 5; - if ( (nStatus & ST_WORKING_MASK) == ST_PAUSED ) + case chcore::eTaskState_Paused: return 2; - if ( (nStatus & ST_WORKING_MASK) == ST_ERROR ) + case chcore::eTaskState_Error: + case chcore::eTaskState_LoadError: return 1; - return 0; + default: + return 0; + } } -LPTSTR CStatusDlg::FormatTime(time_t timeSeconds, LPTSTR lpszBuffer, size_t stMaxBufferSize) +CString CStatusDlg::FormatTime(unsigned long long timeSeconds) { + if(timeSeconds > 30*24*3600) // more than 30 days + return L"\u221E"; // infinity character + long lDays = boost::numeric_cast(timeSeconds/86400); timeSeconds %= 86400; long lHours = boost::numeric_cast(timeSeconds/3600); timeSeconds %= 3600; long lMinutes = boost::numeric_cast(timeSeconds/60); timeSeconds %= 60; + CString strResult; if(lDays != 0) - _sntprintf(lpszBuffer, stMaxBufferSize, _T("%02d:%02d:%02d:%02d"), lDays, lHours, lMinutes, timeSeconds); + strResult.Format(_T("%02ld:%02ld:%02ld:%02I64u"), lDays, lHours, lMinutes, timeSeconds); else { if (lHours != 0) - _sntprintf(lpszBuffer, stMaxBufferSize, _T("%02d:%02d:%02d"), lHours, lMinutes, timeSeconds); + strResult.Format(_T("%02ld:%02ld:%02I64u"), lHours, lMinutes, timeSeconds); else - _sntprintf(lpszBuffer, stMaxBufferSize, _T("%02d:%02d"), lMinutes, timeSeconds); + strResult.Format(_T("%02ld:%02I64u"), lMinutes, timeSeconds); } - return lpszBuffer; + return strResult; } +CString CStatusDlg::FormatTimeMiliseconds(unsigned long long timeMiliSeconds) +{ + unsigned long long timeSeconds = timeMiliSeconds / 1000; + return FormatTime(timeSeconds); +} + void CStatusDlg::RefreshStatus() { // remember address of a current selection - m_spSelectedItem=GetSelectedItemPointer(); + size_t stSelectedTaskID = GetSelectedItemSessionUniqueID(); - // current time - DWORD dwCurrentTime=GetTickCount(); + // get all the stats needed + m_pTasks->GetStatsSnapshot(m_spTaskMgrStats); // get rid of item after the current part - m_ctlStatusList.LimitItems(boost::numeric_cast(m_pTasks->GetSize())); + m_ctlStatusList.LimitItems(boost::numeric_cast(m_spTaskMgrStats->GetTaskStatsCount())); // add task info - for(size_t stIndex = 0; stIndex < m_pTasks->GetSize(); ++stIndex) + for(size_t stIndex = 0; stIndex < m_spTaskMgrStats->GetTaskStatsCount(); ++stIndex) { - AddTaskInfo(boost::numeric_cast(stIndex), m_pTasks->GetAt(stIndex), dwCurrentTime); + chcore::TTaskStatsSnapshotPtr spTaskStats = m_spTaskMgrStats->GetTaskStatsAt(stIndex); + // set (update/add new) entry in the task list (on the left) + SetTaskListEntry(stIndex, spTaskStats); + + // right side update + if(spTaskStats->GetTaskID() == stSelectedTaskID) + UpdateTaskStatsDetails(spTaskStats); } - // percent - int nPercent=m_pTasks->GetPercent(); - // set title - if (m_pTasks->GetSize() != 0) - _sntprintf(m_szData, _MAX_PATH, _T("%s [%d %%]"), GetResManager().LoadString(IDS_STATUSTITLE_STRING), m_pTasks->GetPercent()); - else - _sntprintf(m_szData, _MAX_PATH, _T("%s"), GetResManager().LoadString(IDS_STATUSTITLE_STRING)); + SetWindowTitle(GetProgressWindowTitleText()); + + // refresh overall progress + m_ctlProgressAll.SetRange(0, 100); + m_ctlProgressAll.SetPos(boost::numeric_cast(m_spTaskMgrStats->GetCombinedProgress() * 100.0)); - // if changed - GetWindowText(m_strTemp); - if (m_strTemp != CString(m_szData)) - SetWindowText(m_szData); + // progress - count of processed data/count of data + CString strTemp; + strTemp = GetSizeString(m_spTaskMgrStats->GetProcessedSize()) + CString(_T("/")); + strTemp += GetSizeString(m_spTaskMgrStats->GetTotalSize()); + GetDlgItem(IDC_GLOBALPROCESSED_STATIC)->SetWindowText(strTemp); - // refresh overall progress - if (GetConfig().get_bool(PP_STATUSSHOWDETAILS)) - { - m_ctlProgressAll.SetPos(nPercent); - - // progress - count of processed data/count of data - m_strTemp=GetSizeString(m_pTasks->GetPosition(), m_szData, _MAX_PATH)+CString(_T("/")); - m_strTemp+=GetSizeString(m_pTasks->GetRange(), m_szData, _MAX_PATH); - GetDlgItem(IDC_OVERALL_PROGRESS_STATIC)->SetWindowText(m_strTemp); - - // transfer - if (m_i64LastAllTasksProcessed == 0) - m_i64LastAllTasksProcessed=m_pTasks->GetPosition(); - - if (dwCurrentTime-m_dwLastUpdate != 0) - m_strTemp=GetSizeString( (static_cast(m_pTasks->GetPosition()) - static_cast(m_i64LastAllTasksProcessed))/static_cast(static_cast(dwCurrentTime-m_dwLastUpdate)/1000.0), m_szData, _MAX_PATH); - else - m_strTemp=GetSizeString( 0ULL, m_szData, _MAX_PATH); - - GetDlgItem(IDC_OVERALL_TRANSFER_STATIC)->SetWindowText(m_strTemp+_T("/s")); - m_i64LastAllTasksProcessed=m_pTasks->GetPosition(); - m_dwLastUpdate=dwCurrentTime; - } + // transfer + CString strSpeed = GetSpeedString(m_spTaskMgrStats->GetSizeSpeed(), m_spTaskMgrStats->GetAvgSizeSpeed(), m_spTaskMgrStats->GetCountSpeed(), m_spTaskMgrStats->GetAvgCountSpeed()); + GetDlgItem(IDC_GLOBALTRANSFER_STATIC)->SetWindowText(strSpeed); // if selection's missing - hide controls if (m_ctlStatusList.GetSelectedCount() == 0) - { EnableControls(false); - m_spLastSelected.reset(); - m_i64LastProcessed=0; - } else EnableControls(); // enable controls @@ -767,81 +696,19 @@ CLanguageDialog::OnCancel(); } -void CStatusDlg::OnAdvancedButton() -{ - CMenu menu; - HMENU hMenu=GetResManager().LoadMenu(MAKEINTRESOURCE(IDR_ADVANCED_MENU)); - if (!menu.Attach(hMenu)) - { - DestroyMenu(hMenu); - return; - } - - CMenu* pPopup = menu.GetSubMenu(0); - ASSERT(pPopup != NULL); - if(pPopup) - { - // get the point to show menu at - CRect rect; - GetDlgItem(IDC_ADVANCED_BUTTON)->GetWindowRect(&rect); - - pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rect.right+1, rect.top, this); - } -} - -void CStatusDlg::OnPopupReplacePaths() -{ - // check if there's a selection currently - if ( (m_spSelectedItem=GetSelectedItemPointer()) != NULL ) - { - if (m_spSelectedItem->GetStatus(ST_WORKING_MASK) & ST_PAUSED) - { - bool bContinue=false; - if (m_spSelectedItem->GetStatus(ST_WORKING_MASK) == ST_ERROR) - { - m_spSelectedItem->PauseProcessing(); - bContinue=true; - } - - // assuming here that there's selection and task is paused - CReplacePathsDlg dlg; - dlg.m_spTask=m_spSelectedItem; - if (dlg.DoModal() == IDOK) - { - // change 'no case' - int iClipboard=m_spSelectedItem->ReplaceClipboardStrings(dlg.m_strSource, dlg.m_strDest); - - ictranslate::CFormat fmt(GetResManager().LoadString(IDS_REPLACEPATHSTEXT_STRING)); - fmt.SetParam(_t("%count"), iClipboard); - AfxMessageBox(fmt); - } - - // resume if earlier was an error - if (bContinue) - m_spSelectedItem->ResumeProcessing(); - } - else - MsgBox(IDS_TASKNOTPAUSED_STRING); - } - else - MsgBox(IDS_TASKNOTSELECTED_STRING); -} - void CStatusDlg::OnShowLogButton() { // show log - CTaskPtr spTask = GetSelectedItemPointer(); - if (!spTask || !GetConfig().get_bool(PP_CMCREATELOG)) + chcore::TTaskPtr spTask = GetSelectedItemPointer(); + if(!spTask) return; - unsigned long lResult = (unsigned long)(ShellExecute(this->m_hWnd, _T("open"), _T("notepad.exe"), - CString(spTask->GetTaskPath()) + spTask->GetUniqueName() + _T(".log"), NULL, SW_SHOWNORMAL)); - if(lResult < 32) + ULONG_PTR hResult = (ULONG_PTR)ShellExecute(this->m_hWnd, _T("open"), _T("notepad.exe"), spTask->GetLogPath().ToString(), nullptr, SW_SHOWNORMAL); + if(hResult < 32) { - CString str = CString(spTask->GetTaskPath()) + spTask->GetUniqueName()+_T(".log"); ictranslate::CFormat fmt(GetResManager().LoadString(IDS_SHELLEXECUTEERROR_STRING)); - fmt.SetParam(_t("%errno"), lResult); - fmt.SetParam(_t("%path"), str); + fmt.SetParam(_T("%errno"), hResult); + fmt.SetParam(_T("%path"), spTask->GetLogPath().ToString()); AfxMessageBox(fmt); } } @@ -858,37 +725,36 @@ void CStatusDlg::OnStickButton() { - ApplyDisplayDetails(true); + StickDialogToScreenEdge(); } -void CStatusDlg::SetBufferSizesString(UINT uiValue, int iIndex) +void CStatusDlg::SetBufferSizesString(unsigned long long ullValue, int iIndex) { - TCHAR szData[1024]; + CString strResult; switch(iIndex) { - case BI_DEFAULT: - GetResManager().LoadStringCopy(IDS_BSDEFAULT_STRING, szData, 256); + case chcore::TBufferSizes::eBuffer_Default: + strResult = GetResManager().LoadString(IDS_BSDEFAULT_STRING); break; - case BI_ONEDISK: - GetResManager().LoadStringCopy(IDS_BSONEDISK_STRING, szData, 256); + case chcore::TBufferSizes::eBuffer_OneDisk: + strResult = GetResManager().LoadString(IDS_BSONEDISK_STRING); break; - case BI_TWODISKS: - GetResManager().LoadStringCopy(IDS_BSTWODISKS_STRING, szData, 256); + case chcore::TBufferSizes::eBuffer_TwoDisks: + strResult = GetResManager().LoadString(IDS_BSTWODISKS_STRING); break; - case BI_CD: - GetResManager().LoadStringCopy(IDS_BSCD_STRING, szData, 256); + case chcore::TBufferSizes::eBuffer_CD: + strResult = GetResManager().LoadString(IDS_BSCD_STRING); break; - case BI_LAN: - GetResManager().LoadStringCopy(IDS_BSLAN_STRING, szData, 256); + case chcore::TBufferSizes::eBuffer_LAN: + strResult = GetResManager().LoadString(IDS_BSLAN_STRING); break; default: _ASSERTE(false); - szData[0] = _T('\0'); } - _tcscat(szData, GetSizeString((ull_t)uiValue, m_szData, _MAX_PATH)); + strResult += GetSizeString(ullValue); - GetDlgItem(IDC_BUFFERSIZE_STATIC)->SetWindowText(szData); + GetDlgItem(IDC_BUFFERSIZE_STATIC)->SetWindowText(strResult); } void CStatusDlg::PostCloseMessage() @@ -952,10 +818,11 @@ { ClearResizableControls(); - AddResizableControl(IDC_001_STATIC, 0, 0, 0.5, 0.0); + // left part of dialog (task list) + AddResizableControl(IDC_TASKLIST_LABEL_STATIC, 0, 0, 0.5, 0.0); AddResizableControl(IDC_STATUS_LIST, 0, 0, 0.5, 1.0); - AddResizableControl(IDC_ROLL_UNROLL_BUTTON, 0.5, 0, 0, 0); + // left part of dialog (buttons under the task list) AddResizableControl(IDC_PAUSE_BUTTON, 0, 1.0, 0, 0); AddResizableControl(IDC_RESTART_BUTTON, 0, 1.0, 0, 0); AddResizableControl(IDC_RESUME_BUTTON, 0, 1.0, 0, 0); @@ -966,55 +833,387 @@ AddResizableControl(IDC_CANCEL_ALL_BUTTON, 0, 1.0, 0, 0); AddResizableControl(IDC_REMOVE_FINISHED_BUTTON, 0, 1.0, 0, 0); AddResizableControl(IDC_RESTART_ALL_BUTTON, 0, 1.0, 0, 0); - AddResizableControl(IDC_ADVANCED_BUTTON, 0, 1.0, 0, 0); + AddResizableControl(IDC_TASK_ADVANCED_BUTTON, 0, 1.0, 0, 0); - AddResizableControl(IDC_STICK_BUTTON, 1.0, 1.0, 0, 0); + // left part of dialog (global stats) + AddResizableControl(IDC_GLOBAL_GROUP_STATIC, 0.0, 1.0, 0.5, 0); - // sections separators - AddResizableControl(IDC_014_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_015_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_GLOBALPROCESSED_LABEL_STATIC, 0.0, 1.0, 0.0, 0.0); + AddResizableControl(IDC_GLOBALPROCESSED_STATIC, 0.0, 1.0, 0.5, 0); + AddResizableControl(IDC_GLOBALTRANSFER_LABEL_STATIC, 0.0, 1.0, 0.0, 0.0); + AddResizableControl(IDC_GLOBALTRANSFER_STATIC, 0.0, 1.0, 0.5, 0); + AddResizableControl(IDC_GLOBALPROGRESS_LABEL_STATIC, 0.0, 1.0, 0.0, 0.0); + AddResizableControl(IDC_GLOBAL_PROGRESS, 0.0, 1.0, 0.5, 0.0); - AddResizableControl(IDC_018_STATIC, 0.5, 0.0, 0.25, 0); - AddResizableControl(IDC_019_STATIC, 0.5, 0.0, 0.25, 0); - AddResizableControl(IDC_016_STATIC, 0.75, 0.0, 0.25, 0); - AddResizableControl(IDC_017_STATIC, 0.75, 0.0, 0.25, 0); + // right part of dialog (task info) + AddResizableControl(IDC_TASKINFORMATION_GROUP_STATIC, 0.5, 0.0, 0.5, 0); - // left part of right column - AddResizableControl(IDC_002_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_003_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_004_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_005_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_006_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_007_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_009_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_010_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_011_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_012_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_013_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_020_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_021_STATIC, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_SHOW_LOG_BUTTON, 0.5, 0.0, 0.0, 0); - AddResizableControl(IDC_SHOW_LOG_BUTTON, 0.5, 0.0, 0.0, 0.0); + // right part of dialog (subsequent entries) + AddResizableControl(IDC_TASKID_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_TASKID_STATIC, 0.5, 0.0, 0.5, 0); - // full length right column - AddResizableControl(IDC_ALL_PROGRESS, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_TASK_PROGRESS, 0.5, 0.0, 0.5, 0); - - // right part of right column - AddResizableControl(IDC_ASSOCIATEDFILES__STATIC, 0.5, 0.0, 0.5, 0); + AddResizableControl(IDC_OPERATION_LABEL_STATIC, 0.5, 0.0, 0.0, 0); AddResizableControl(IDC_OPERATION_STATIC, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_SOURCE_STATIC, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_DESTINATION_STATIC, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_PROGRESS_STATIC, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_TIME_STATIC, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_TRANSFER_STATIC, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_OVERALL_PROGRESS_STATIC, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_OVERALL_TRANSFER_STATIC, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_BUFFERSIZE_STATIC, 0.5, 0.0, 0.5, 0); - AddResizableControl(IDC_PRIORITY_STATIC, 0.5, 0.0, 0.5, 0); + AddResizableControl(IDC_SOURCEOBJECT_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_SOURCEOBJECT_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_DESTINATIONOBJECT_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_DESTINATIONOBJECT_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_BUFFERSIZE_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_BUFFERSIZE_STATIC, 0.5, 0.0, 0.5, 0); AddResizableControl(IDC_SET_BUFFERSIZE_BUTTON, 1.0, 0.0, 0.0, 0.0); + + AddResizableControl(IDC_THREADPRIORITY_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_THREADPRIORITY_STATIC, 0.5, 0.0, 0.5, 0); AddResizableControl(IDC_SET_PRIORITY_BUTTON, 1.0, 0.0, 0.0, 0.0); + // right part of the dialog (subtask stats) + AddResizableControl(IDC_CURRENTPHASE_GROUP_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_SUBTASKNAME_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_SUBTASKNAME_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_SUBTASKPROCESSED_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_SUBTASKPROCESSED_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_SUBTASKTIME_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_SUBTASKTIME_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_SUBTASKTRANSFER_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_SUBTASKTRANSFER_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_CURRENTOBJECT_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_CURRENTOBJECT_PROGRESS, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_SUBTASKCOUNT_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_SUBTASKCOUNT_PROGRESS, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_SUBTASKSIZE_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_SUBTASKSIZE_PROGRESS, 0.5, 0.0, 0.5, 0); + + // right part of the dialog (task stats) + AddResizableControl(IDC_ENTIRETASK_GROUP_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_TASKPROCESSED_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_TASKPROCESSED_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_TASKTIME_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_TASKTIME_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_TASKTRANSFER_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_TASKTRANSFER_STATIC, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_TASKCOUNT_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_TASKCOUNT_PROGRESS, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_TASKSIZE_LABEL_STATIC, 0.5, 0.0, 0.0, 0); + AddResizableControl(IDC_TASKSIZE_PROGRESS, 0.5, 0.0, 0.5, 0); + + AddResizableControl(IDC_SHOW_LOG_BUTTON, 1.0, 0.0, 0.0, 0); + AddResizableControl(IDC_STICK_BUTTON, 1.0, 1.0, 0, 0); + InitializeResizableControls(); } + +CString CStatusDlg::GetStatusString(const chcore::TTaskStatsSnapshotPtr& spTaskStats) +{ + CString strStatusText; + // status string + // first + switch(spTaskStats->GetTaskState()) + { + case chcore::eTaskState_Error: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_ERROR_STRING); + strStatusText += _T("/"); + break; + } + case chcore::eTaskState_LoadError: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_LOADERROR_STRING); + strStatusText += _T("/"); + break; + } + case chcore::eTaskState_Paused: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_PAUSED_STRING); + strStatusText += _T("/"); + break; + } + case chcore::eTaskState_Finished: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_FINISHED_STRING); + strStatusText += _T("/"); + break; + } + case chcore::eTaskState_Waiting: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_WAITING_STRING); + strStatusText += _T("/"); + break; + } + case chcore::eTaskState_Cancelled: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_CANCELLED_STRING); + strStatusText += _T("/"); + break; + } + case chcore::eTaskState_None: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_INITIALIZING_STRING); + strStatusText += _T("/"); + break; + } + case chcore::eTaskState_Processing: + break; + default: + BOOST_ASSERT(false); // not implemented state + } + + // second part + chcore::ESubOperationType eSubOperationType = chcore::eSubOperation_None; + chcore::TSubTaskStatsSnapshotPtr spSubtaskStats = spTaskStats->GetSubTasksStats().GetCurrentSubTaskSnapshot(); + if(spSubtaskStats) + eSubOperationType = spSubtaskStats->GetSubOperationType(); + + if(eSubOperationType == chcore::eSubOperation_Deleting) + strStatusText += GetResManager().LoadString(IDS_STATUS_DELETING_STRING); + else if(eSubOperationType == chcore::eSubOperation_Scanning) + strStatusText += GetResManager().LoadString(IDS_STATUS_SEARCHING_STRING); + else if(eSubOperationType == chcore::eSubOperation_FastMove) + strStatusText += GetResManager().LoadString(IDS_STATUS_FASTMOVE_STRING); + else if(spTaskStats->GetOperationType() == chcore::eOperation_Copy) + strStatusText += GetResManager().LoadString(IDS_STATUS_COPYING_STRING); + else if(spTaskStats->GetOperationType() == chcore::eOperation_Move) + strStatusText += GetResManager().LoadString(IDS_STATUS_MOVING_STRING); + else + strStatusText += GetResManager().LoadString(IDS_STATUS_UNKNOWN_STRING); + + if(!spTaskStats->GetFilters().IsEmpty()) + strStatusText += GetResManager().LoadString(IDS_FILTERING_STRING); + + // third part + if(spTaskStats->GetIgnoreDirectories()) + { + strStatusText += _T("/"); + strStatusText += GetResManager().LoadString(IDS_STATUS_ONLY_FILES_STRING); + } + if(spTaskStats->GetCreateEmptyFiles()) + { + strStatusText += _T("/"); + strStatusText += GetResManager().LoadString(IDS_STATUS_WITHOUT_CONTENTS_STRING); + } + + return strStatusText; +} + +CString CStatusDlg::GetSubtaskName(chcore::ESubOperationType eSubtask) const +{ + if(eSubtask == chcore::eSubOperation_Deleting) + return GetResManager().LoadString(IDS_STATUS_DELETING_STRING); + else if(eSubtask == chcore::eSubOperation_Scanning) + return GetResManager().LoadString(IDS_STATUS_SEARCHING_STRING); + else if(eSubtask == chcore::eSubOperation_FastMove) + return GetResManager().LoadString(IDS_STATUS_FASTMOVE_STRING); + else if(eSubtask == chcore::eSubOperation_Copying) + return GetResManager().LoadString(IDS_STATUS_COPYING_STRING); + else + return GetResManager().LoadString(IDS_STATUS_UNKNOWN_STRING); +} + +void CStatusDlg::SetTaskListEntry(size_t stPos, const chcore::TTaskStatsSnapshotPtr& spTaskStats) +{ + // index subitem + CString strStatusText = GetStatusString(spTaskStats); + LVITEM lvi; + lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; + lvi.iItem = boost::numeric_cast(stPos); + lvi.iSubItem = 0; + lvi.pszText = (PTSTR)(PCTSTR)strStatusText; + lvi.cchTextMax = lstrlen(lvi.pszText); + lvi.lParam = boost::numeric_cast(spTaskStats->GetTaskID()); + lvi.iImage = GetImageFromStatus(spTaskStats->GetTaskState()); + if(boost::numeric_cast(stPos) < m_ctlStatusList.GetItemCount()) + m_ctlStatusList.SetItem(&lvi); + else + m_ctlStatusList.InsertItem(&lvi); + + chcore::TString strCurrentPath = spTaskStats->GetSourcePath(); + + // input file + lvi.mask=LVIF_TEXT; + lvi.iSubItem = 1; + if(strCurrentPath.IsEmpty()) + strCurrentPath = GetResManager().LoadString(IDS_NONEINPUTFILE_STRING); + + lvi.pszText = (PTSTR)strCurrentPath.c_str();; + lvi.cchTextMax = lstrlen(lvi.pszText); + m_ctlStatusList.SetItem(&lvi); + + // destination path + lvi.iSubItem = 2; + chcore::TString strDestinationPath = spTaskStats->GetDestinationPath(); + lvi.pszText = (PTSTR)strDestinationPath.c_str(); + lvi.cchTextMax = lstrlen(lvi.pszText); + m_ctlStatusList.SetItem(&lvi); + + // insert dest subitem + lvi.iSubItem=3; + + CString strFmt; + strFmt.Format(_T("%.1f %%"), spTaskStats->GetCombinedProgress() * 100.0); + + lvi.pszText = (PTSTR)(PCTSTR)strFmt; + lvi.cchTextMax = lstrlen(lvi.pszText); + m_ctlStatusList.SetItem(&lvi); +} + +CString CStatusDlg::GetProcessedText(unsigned long long ullProcessedCount, unsigned long long ullTotalCount, unsigned long long ullProcessedSize, unsigned long long ullTotalSize) +{ + CString strProcessedText; + strProcessedText.Format(_T("%I64u/%I64u ("), ullProcessedCount, ullTotalCount); + + strProcessedText += GetSizeString(ullProcessedSize) + _T("/"); + strProcessedText += GetSizeString(ullTotalSize) + _T(")"); + + return strProcessedText; +} + +CString CStatusDlg::GetSpeedString(double dSizeSpeed, double dAvgSizeSpeed, double dCountSpeed, double dAvgCountSpeed) const +{ + CString strSpeedText = GetSizeString(dSizeSpeed); // last avg + CString strAvgSpeedText = GetSizeString(dAvgSizeSpeed); // last avg + + CString strAvgWord = GetResManager().LoadString(IDS_AVERAGEWORD_STRING); + + // avg transfer + CString strFmt; + strFmt.Format(_T("%s/s (%s%s/s); %.0f/s (%s%.0f/s)"), (PCTSTR)strSpeedText, (PCTSTR)strAvgWord, (PCTSTR)strAvgSpeedText, + dCountSpeed, (PCTSTR)strAvgWord, dAvgCountSpeed); + + return strFmt; +} + +void CStatusDlg::UpdateTaskStatsDetails(const chcore::TTaskStatsSnapshotPtr& spTaskStats) +{ + unsigned long long timeTotalEstimated = 0; + unsigned long long timeElapsed = 0; + unsigned long long timeRemaining = 0; + + chcore::TSubTaskStatsSnapshotPtr spSubTaskStats = spTaskStats->GetSubTasksStats().GetCurrentSubTaskSnapshot(); + if(spSubTaskStats) + { + // text progress + CString strProcessedText = GetProcessedText(spSubTaskStats->GetProcessedCount(), spSubTaskStats->GetTotalCount(), spSubTaskStats->GetProcessedSize(), spSubTaskStats->GetTotalSize()); + GetDlgItem(IDC_SUBTASKPROCESSED_STATIC)->SetWindowText(strProcessedText); + + // progress bars + m_ctlCurrentObjectProgress.SetProgress(spSubTaskStats->GetCurrentItemProcessedSize(), spSubTaskStats->GetCurrentItemTotalSize()); + m_ctlSubTaskCountProgress.SetProgress(spSubTaskStats->GetProcessedCount(), spSubTaskStats->GetTotalCount()); + m_ctlSubTaskSizeProgress.SetProgress(spSubTaskStats->GetProcessedSize(), spSubTaskStats->GetTotalSize()); + + // time information + timeTotalEstimated = spSubTaskStats->GetEstimatedTotalTime(); + timeElapsed = spSubTaskStats->GetTimeElapsed(); + timeRemaining = timeTotalEstimated - timeElapsed; + + CString strTime1 = FormatTimeMiliseconds(timeElapsed); + CString strTime2 = FormatTimeMiliseconds(timeTotalEstimated); + CString strTime3 = FormatTimeMiliseconds(timeRemaining); + + CString strTime; + strTime.Format(_T("%s / %s (%s)"), (PCTSTR)strTime1, (PCTSTR)strTime2, (PCTSTR)strTime3); + GetDlgItem(IDC_SUBTASKTIME_STATIC)->SetWindowText(strTime); + + // speed information + CString strSpeed = GetSpeedString(spSubTaskStats->GetSizeSpeed(), spSubTaskStats->GetAvgSizeSpeed(), spSubTaskStats->GetCountSpeed(), spSubTaskStats->GetAvgCountSpeed()); + GetDlgItem(IDC_SUBTASKTRANSFER_STATIC)->SetWindowText(strSpeed); + + // subtask name + chcore::ESubOperationType eSubOperationType = spSubTaskStats->GetSubOperationType(); + CString strSubtaskName = GetSubtaskName(eSubOperationType); + GetDlgItem(IDC_SUBTASKNAME_STATIC)->SetWindowText(strSubtaskName); + + // current path + chcore::TString strPath = spSubTaskStats->GetCurrentPath(); + if(strPath.IsEmpty()) + strPath = GetResManager().LoadString(IDS_NONEINPUTFILE_STRING); + + SetBufferSizesString(spTaskStats->GetCurrentBufferSize(), spSubTaskStats->GetCurrentBufferIndex()); + } + else + { + m_ctlCurrentObjectProgress.SetProgress(0, 100); + m_ctlSubTaskCountProgress.SetProgress(0, 100); + m_ctlSubTaskSizeProgress.SetProgress(0, 100); + + GetDlgItem(IDC_SUBTASKNAME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYSUBTASKNAME_STRING)); + GetDlgItem(IDC_SUBTASKPROCESSED_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPROCESSEDTEXT_STRING)); + GetDlgItem(IDC_SUBTASKTIME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTIMETEXT_STRING)); + GetDlgItem(IDC_SUBTASKTRANSFER_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTRANSFERTEXT_STRING)); + GetDlgItem(IDC_BUFFERSIZE_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYBUFFERSIZETEXT_STRING)); + } + + ////////////////////////////////////////////////////// + // data that can be changed by a thread + CString strStatusText = GetStatusString(spTaskStats); + GetDlgItem(IDC_OPERATION_STATIC)->SetWindowText(strStatusText); // operation + + CString strSrcPath = spTaskStats->GetSourcePath().c_str(); + if(strSrcPath.IsEmpty()) + strSrcPath = GetResManager().LoadString(IDS_EMPTYSOURCETEXT_STRING); + + GetDlgItem(IDC_SOURCEOBJECT_STATIC)->SetWindowText(spTaskStats->GetSourcePath().c_str()); // src object + + // count of processed data/overall count of data + CString strProcessedText = GetProcessedText(spTaskStats->GetProcessedCount(), spTaskStats->GetTotalCount(), + spTaskStats->GetProcessedSize(), spTaskStats->GetTotalSize()); + GetDlgItem(IDC_TASKPROCESSED_STATIC)->SetWindowText(strProcessedText); + + // transfer + CString strTaskSpeed = GetSpeedString(spTaskStats->GetSizeSpeed(), spTaskStats->GetAvgSizeSpeed(), spTaskStats->GetCountSpeed(), spTaskStats->GetAvgCountSpeed()); + GetDlgItem(IDC_TASKTRANSFER_STATIC)->SetWindowText(strTaskSpeed); + + // elapsed time / estimated total time (estimated time left) + timeTotalEstimated = spTaskStats->GetEstimatedTotalTime(); + timeElapsed = spTaskStats->GetTimeElapsed(); + timeRemaining = timeTotalEstimated - timeElapsed; + + CString strTime1 = FormatTimeMiliseconds(timeElapsed); + CString strTime2 = FormatTimeMiliseconds(timeTotalEstimated); + CString strTime3 = FormatTimeMiliseconds(timeRemaining); + + CString strTime; + strTime.Format(_T("%s / %s (%s)"), (PCTSTR)strTime1, (PCTSTR)strTime2, (PCTSTR)strTime3); + GetDlgItem(IDC_TASKTIME_STATIC)->SetWindowText(strTime); + + // set progress + m_ctlTaskCountProgress.SetProgress(spTaskStats->GetProcessedCount(), spTaskStats->GetTotalCount()); + m_ctlTaskSizeProgress.SetProgress(spTaskStats->GetProcessedSize(), spTaskStats->GetTotalSize()); + + GetDlgItem(IDC_DESTINATIONOBJECT_STATIC)->SetWindowText(spTaskStats->GetDestinationPath().c_str()); + GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING + PriorityToIndex(spTaskStats->GetThreadPriority()))); + GetDlgItem(IDC_TASKID_STATIC)->SetWindowText(spTaskStats->GetTaskName().c_str()); +} + +void CStatusDlg::SetWindowTitle(PCTSTR pszText) +{ + CString strCurrentTitle; + GetWindowText(strCurrentTitle); + if(strCurrentTitle != CString(pszText)) + SetWindowText(pszText); +} + +CString CStatusDlg::GetProgressWindowTitleText() const +{ + CString strTitleText; + + if(m_spTaskMgrStats->GetTaskStatsCount() != 0) + strTitleText.Format(_T("%s [%.1f %%]"), GetResManager().LoadString(IDS_STATUSTITLE_STRING), m_spTaskMgrStats->GetCombinedProgress() * 100.0); + else + strTitleText = GetResManager().LoadString(IDS_STATUSTITLE_STRING); + + return strTitleText; +}