Index: src/ch/StatusDlg.cpp =================================================================== diff -u -rd5c3edd0d167db9b5d47d04248820fda49499a5e -rdb26c9ac6945d5c754c3460dd55bd6d53e2c9e7e --- src/ch/StatusDlg.cpp (.../StatusDlg.cpp) (revision d5c3edd0d167db9b5d47d04248820fda49499a5e) +++ src/ch/StatusDlg.cpp (.../StatusDlg.cpp) (revision db26c9ac6945d5c754c3460dd55bd6d53e2c9e7e) @@ -1,5 +1,5 @@ /*************************************************************************** -* Copyright (C) 2001-2008 by J�zef Starosczyk * +* Copyright (C) 2001-2008 by Jozef Starosczyk * * ixen@copyhandler.com * * * * This program is free software; you can redistribute it and/or modify * @@ -21,9 +21,12 @@ #include "resource.h" #include "StatusDlg.h" #include "BufferSizeDlg.h" -#include "ReplacePathsDlg.h" #include "StringHelpers.h" #include "StaticEx.h" +#include "Structs.h" +#include "CfgProperties.h" +#include "../libchengine/TTaskManager.h" +#include "../libchengine/TLocalFilesystem.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -36,42 +39,37 @@ ///////////////////////////////////////////////////////////////////////////// // CStatusDlg dialog -CStatusDlg::CStatusDlg(CTaskArray* pTasks, CWnd* pParent /*=NULL*/) - : ictranslate::CLanguageDialog(CStatusDlg::IDD, pParent, &m_bLock) +CStatusDlg::CStatusDlg(chengine::TTaskManager* pTasks, CWnd* pParent /*=nullptr*/) + : ictranslate::CLanguageDialog(IDD_STATUS_DIALOG, pParent, &m_bLock), + m_pTasks(pTasks), + m_spTaskMgrStats(new chengine::TTaskManagerStatsSnapshot) { - //{{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_ERRORS_EDIT, m_ctlErrors); - 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 +80,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) @@ -96,7 +92,13 @@ BOOL CStatusDlg::OnInitDialog() { CLanguageDialog::OnInitDialog(); - + + PrepareResizableControls(); + + // set dialog icon + HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); + SetIcon(hIcon, FALSE); + // get size of list ctrl CRect rcList; m_ctlStatusList.GetWindowRect(&rcList); @@ -110,27 +112,27 @@ lvc.mask=LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; lvc.fmt=LVCFMT_LEFT; - lvc.pszText=(PTSTR)GetResManager()->LoadString(IDS_COLUMNSTATUS_STRING); /*_T("Status")*/; - lvc.cchTextMax = lstrlen(lvc.pszText); - lvc.cx = static_cast(0.27*iWidth); + lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNSTATUS_STRING); + lvc.cchTextMax = lstrlen(lvc.pszText); + lvc.cx = static_cast(0.27*iWidth); lvc.iSubItem=-1; m_ctlStatusList.InsertColumn(1, &lvc); - lvc.pszText=(PTSTR)GetResManager()->LoadString(IDS_COLUMNSOURCE_STRING);/*_T("File");*/ - lvc.cchTextMax = lstrlen(lvc.pszText); - lvc.cx = static_cast(0.3*iWidth); + lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNSOURCE_STRING); + lvc.cchTextMax = lstrlen(lvc.pszText); + lvc.cx = static_cast(0.3*iWidth); lvc.iSubItem=0; m_ctlStatusList.InsertColumn(2, &lvc); - lvc.pszText=(PTSTR)GetResManager()->LoadString(IDS_COLUMNDESTINATION_STRING);/*_T("To:");*/ - lvc.cchTextMax = lstrlen(lvc.pszText); - lvc.cx = static_cast(0.27*iWidth); + lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNDESTINATION_STRING); + lvc.cchTextMax = lstrlen(lvc.pszText); + lvc.cx = static_cast(0.27*iWidth); lvc.iSubItem=1; m_ctlStatusList.InsertColumn(3, &lvc); - lvc.pszText=(PTSTR)GetResManager()->LoadString(IDS_COLUMNPROGRESS_STRING);/*_T("Progress");*/ - lvc.cchTextMax = lstrlen(lvc.pszText); - lvc.cx = static_cast(0.15*iWidth); + lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNPROGRESS_STRING); + lvc.cchTextMax = lstrlen(lvc.pszText); + lvc.cx = static_cast(0.15*iWidth); lvc.iSubItem=2; m_ctlStatusList.InsertColumn(4, &lvc); @@ -146,62 +148,94 @@ 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); // refresh data RefreshStatus(); // select needed element - int i=0; - while (i < m_pTasks->GetSize()) + SelectInitialTask(); + + // refresh data timer + SetTimer(777, GetPropValue(GetConfig()), nullptr); + + return TRUE; +} + +void CStatusDlg::SelectInitialTask() +{ + size_t stIndex = 0; + bool bSelected = false; + while(stIndex < m_pTasks->GetSize()) { - if (m_pTasks->GetAt(i) == m_pInitialSelection) + chengine::TTaskPtr spTask = m_pTasks->GetAt(stIndex); + if(m_spInitialSelection) { - m_ctlStatusList.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); - break; + if(spTask == m_spInitialSelection) + { + m_ctlStatusList.SetItemState(boost::numeric_cast(stIndex), LVIS_SELECTED, LVIS_SELECTED); + bSelected = true; + break; + } } + else + { + if(spTask->IsRunning()) + { + m_ctlStatusList.SetItemState(boost::numeric_cast(stIndex), LVIS_SELECTED, LVIS_SELECTED); + bSelected = true; + break; + } + } - i++; - }; + stIndex++; + } - // refresh data timer - SetTimer(777, (UINT)GetConfig()->get_signed_num(PP_STATUSREFRESHINTERVAL), NULL); - - return TRUE; + if(!bSelected && m_pTasks->GetSize() > 0) + { + stIndex = m_pTasks->GetSize() - 1; + m_ctlStatusList.SetItemState(boost::numeric_cast(stIndex), LVIS_SELECTED, LVIS_SELECTED); + } } void CStatusDlg::EnableControls(bool bEnable) { // 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_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_BUFFERSIZE_STATIC)->SetWindowText(GetResManager()->LoadString(IDS_EMPTYBUFFERSIZETEXT_STRING)); - GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager()->LoadString(IDS_EMPTYPRIORITYTEXT_STRING)); + GetDlgItem(IDC_TASKID_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTASKID_STRING)); + + GetDlgItem(IDC_OPERATION_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYOPERATIONTEXT_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_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPRIORITYTEXT_STRING)); - const TCHAR *pszText=GetResManager()->LoadString(IDS_EMPTYERRORTEXT_STRING); - m_ctlErrors.GetWindowText(m_strTemp); - if (m_strTemp != pszText) - m_ctlErrors.SetWindowText(pszText); - - 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); } } @@ -215,258 +249,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, CTask *pTask, DWORD dwCurrentTime) +void CStatusDlg::OnSetBuffersizeButton() { - // index to string - _itot(nPos, m_szData, 10); + chengine::TTaskPtr spTask = GetSelectedItemPointer(); + if(!spTask) + return; - // get data snapshot from task - pTask->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=reinterpret_cast(pTask); - 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; // zmie� mask� - lvi.iSubItem=1; - m_strTemp=td.m_fi.GetFileName(); - 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 (pTask == pSelectedItem && GetConfig()->get_bool(PP_STATUSSHOWDETAILS)) + int iCurrentBufferIndex = 0; + chengine::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_fi.GetFullFilePath()); // src object - - // error message - if ( (td.m_uiStatus & ST_WORKING_MASK) == ST_ERROR ) - { - m_ctlErrors.GetWindowText(m_strTemp); - if (m_strTemp != td.m_strErrorDesc) - m_ctlErrors.SetWindowText(td.m_strErrorDesc); - } - else - { - const TCHAR *pszText=GetResManager()->LoadString(IDS_EMPTYERRORTEXT_STRING); - - m_ctlErrors.GetWindowText(m_strTemp2); - if (m_strTemp2 != pszText) - m_ctlErrors.SetWindowText(pszText); - } + chengine::TSubTaskStatsSnapshotPtr spSubTaskStats = spTaskStats->GetSubTasksStats().GetCurrentSubTaskSnapshot(); + if(spSubTaskStats) + iCurrentBufferIndex = spSubTaskStats->GetCurrentBufferIndex(); + } - // count of processed data/overall count of data - _sntprintf(m_szData, _MAX_PATH, _T("%d/%d ("), td.m_iIndex, td.m_iSize); - 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_lTimeElapsed ? td.m_ullProcessedSize/td.m_lTimeElapsed : 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); + chengine::TBufferSizes tBufferSizes; + spTask->GetBufferSizes(tBufferSizes); - // avg transfer - GetDlgItem(IDC_TRANSFER_STATIC)->SetWindowText(m_strTemp+_T("/s (")+CString(GetResManager()->LoadString(IDS_AVERAGEWORD_STRING)) - +CString(GetSizeString(td.m_lTimeElapsed ? td.m_ullProcessedSize/td.m_lTimeElapsed : 0, m_szData, _MAX_PATH))+_T("/s )") - ); - - // elapsed time/estimated time - FormatTime(td.m_lTimeElapsed, m_szTimeBuffer1, 40); - FormatTime( (td.m_ullProcessedSize == 0) ? 0 : static_cast((static_cast<__int64>(td.m_ullSizeAll)*static_cast<__int64>(td.m_lTimeElapsed))/td.m_ullProcessedSize), m_szTimeBuffer2, 40); - - _sntprintf(m_szData, _MAX_PATH, _T("%s / %s"), m_szTimeBuffer1, m_szTimeBuffer2); - 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 (pTask != m_pLastSelected) - { - 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_pLastSelected - m_pLastSelected=pTask; - } + CBufferSizeDlg dlg(&tBufferSizes, (chengine::TBufferSizes::EBufferType)iCurrentBufferIndex); + if(dlg.DoModal() == IDOK) + spTask->SetBufferSizes(dlg.GetBufferSizes()); } -void CStatusDlg::OnSetBuffersizeButton() +chengine::TTaskPtr CStatusDlg::GetSelectedItemPointer() { - CTask* pTask; - if ( (pTask=GetSelectedItemPointer()) == NULL ) - return; - - CBufferSizeDlg dlg; - dlg.m_bsSizes=*pTask->GetBufferSizes(); - dlg.m_iActiveIndex=pTask->GetCurrentBufferIndex(); - if (dlg.DoModal() == IDOK) + // returns ptr to a TTask for a given element in listview + if(m_ctlStatusList.GetSelectedCount() == 1) { - // if the task has been deleted - skip - if ( pTask != GetSelectedItemPointer() ) - { - TRACE("Task were finished and deleted when trying to change buffer sizes"); - return; - } - - TRACE("bOnlyDefault=%d\n", dlg.m_bsSizes.m_bOnlyDefault); - pTask->SetBufferSizes(&dlg.m_bsSizes); + POSITION pos = m_ctlStatusList.GetFirstSelectedItemPosition(); + int nPos = m_ctlStatusList.GetNextSelectedItem(pos); + return m_pTasks->GetTaskByTaskID(boost::numeric_cast(m_ctlStatusList.GetItemData(nPos))); } + + return chengine::TTaskPtr(); } -CTask* CStatusDlg::GetSelectedItemPointer() +size_t CStatusDlg::GetSelectedItemSessionUniqueID() { -// TRACE("inside GetSelectedItemPointer()\n"); - // returns ptr to a CTask for a given element in listview - if (m_ctlStatusList.GetSelectedCount() == 1) + // 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); - CTask* pSelectedItem=reinterpret_cast(m_ctlStatusList.GetItemData(nPos)); -// if (AfxIsValidAddress(pSelectedItem, sizeof(CTask))) - return pSelectedItem; + POSITION pos = m_ctlStatusList.GetFirstSelectedItemPosition(); + int nPos = m_ctlStatusList.GetNextSelectedItem(pos); + return m_ctlStatusList.GetItemData(nPos); } -// TRACE("exiting GetSelectedItemPointer()\n"); - return NULL; + return std::numeric_limits::max(); } -void CStatusDlg::OnRollUnrollButton() +void CStatusDlg::StickDialogToScreenEdge() { - // change settings in config dialog - GetConfig()->set_bool(PP_STATUSSHOWDETAILS, !GetConfig()->get_bool(PP_STATUSSHOWDETAILS)); - - ApplyDisplayDetails(); -} - -void CStatusDlg::ApplyDisplayDetails(bool bInitial) -{ // 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 - pSelectedItem=GetSelectedItemPointer(); - bool bShowLog=GetConfig()->get_bool(PP_CMCREATELOG); + // remember ptr to TTask + chengine::TTaskPtr spSelectedTask = GetSelectedItemPointer(); // set status of buttons pause/resume/cancel - if (pSelectedItem != NULL) + if (spSelectedTask != nullptr) { - GetDlgItem(IDC_RESTART_BUTTON)->EnableWindow(true); - GetDlgItem(IDC_SHOW_LOG_BUTTON)->EnableWindow(bShowLog); - GetDlgItem(IDC_DELETE_BUTTON)->EnableWindow(true); - - if (pSelectedItem->GetStatus(ST_STEP_MASK) == ST_FINISHED - || pSelectedItem->GetStatus(ST_STEP_MASK) == ST_CANCELLED) + if(spSelectedTask->GetTaskState() == chengine::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 (pSelectedItem->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() == chengine::eTaskState_Finished || spSelectedTask->GetTaskState() == chengine::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 (pSelectedItem->GetStatus(ST_WAITING_MASK) & ST_WAITING) + // pause/resume + if (spSelectedTask->GetTaskState() == chengine::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() == chengine::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 @@ -483,15 +380,15 @@ void CStatusDlg::OnSetPriorityButton() { CMenu menu; - HMENU hMenu=GetResManager()->LoadMenu(MAKEINTRESOURCE(IDR_PRIORITY_MENU)); + HMENU hMenu=GetResManager().LoadMenu(MAKEINTRESOURCE(IDR_PRIORITY_MENU)); if (!menu.Attach(hMenu)) { DestroyMenu(hMenu); return; } CMenu* pPopup = menu.GetSubMenu(0); - ASSERT(pPopup != NULL); + ASSERT(pPopup != nullptr); if(pPopup) { // set point in which to set menu @@ -502,131 +399,156 @@ } } +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 ( (pSelectedItem=GetSelectedItemPointer()) == NULL ) + chengine::TTaskPtr spSelectedTask = GetSelectedItemPointer(); + + if(spSelectedTask == nullptr) return ictranslate::CLanguageDialog::OnCommand(wParam, lParam); switch (LOWORD(wParam)) { case ID_POPUP_TIME_CRITICAL: - pSelectedItem->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: - pSelectedItem->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: - pSelectedItem->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: - pSelectedItem->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: - pSelectedItem->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: - pSelectedItem->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: - pSelectedItem->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 + chengine::TTaskPtr spSelectedTask = GetSelectedItemPointer(); + + if(spSelectedTask == nullptr) + return ictranslate::CLanguageDialog::OnCommand(wParam, lParam); + + spSelectedTask->RestoreFeedbackDefaults(); + } } return ictranslate::CLanguageDialog::OnCommand(wParam, lParam); } void CStatusDlg::OnPauseButton() { - CTask* pTask; - if ( (pTask=GetSelectedItemPointer()) == NULL ) - return; + chengine::TTaskPtr spTask = GetSelectedItemPointer(); + if(spTask) + { + TRACE("PauseProcessing call...\n"); + spTask->PauseProcessing(); - TRACE("PauseProcessing call...\n"); - pTask->PauseProcessing(); - - RefreshStatus(); + RefreshStatus(); + } } void CStatusDlg::OnResumeButton() { - CTask* pTask; - if ( (pTask=GetSelectedItemPointer()) == NULL ) - return; - - TRACE("ResumeProcessing call "); - if (pTask->GetStatus(ST_WAITING_MASK) & ST_WAITING) + chengine::TTaskPtr spTask = GetSelectedItemPointer(); + if(spTask) { - TRACE("by setting force flag\n"); - pTask->SetForceFlag(); - } - else - { - TRACE("by function ResumeProcessing\n"); - pTask->ResumeProcessing(); - } + if(spTask->GetTaskState() == chengine::eTaskState_Waiting) + spTask->SetForceFlag(); + else + spTask->ResumeProcessing(); - RefreshStatus(); + RefreshStatus(); + } } void CStatusDlg::OnCancelButton() { - CTask* pTask; - if ( (pTask=GetSelectedItemPointer()) != NULL ) + chengine::TTaskPtr spTask = GetSelectedItemPointer(); + if(spTask) { - TRACE("CancelProcessing call...\n"); - pTask->CancelProcessing(); + spTask->CancelProcessing(); + RefreshStatus(); } - RefreshStatus(); } void CStatusDlg::OnRestartButton() { - CTask* pTask; - if ( (pTask=GetSelectedItemPointer()) == NULL ) - return; - - TRACE("RestartProcessing call...\n"); - pTask->RestartProcessing(); - RefreshStatus(); + chengine::TTaskPtr spTask = GetSelectedItemPointer(); + if(spTask) + { + spTask->RestartProcessing(); + RefreshStatus(); + } } void CStatusDlg::OnDeleteButton() { - CTask* pTask; - if ( (pTask=GetSelectedItemPointer()) == NULL ) - return; - - UINT uiStatus=pTask->GetStatus(ST_STEP_MASK); - if ( (uiStatus & ST_STEP_MASK) != ST_FINISHED && (uiStatus & ST_STEP_MASK) != ST_CANCELLED ) + chengine::TTaskPtr spTask = GetSelectedItemPointer(); + if(spTask) { - // ask if cancel - if (MsgBox(IDS_CONFIRMCANCEL_STRING, MB_OKCANCEL | MB_ICONQUESTION) == IDOK) + chengine::ETaskCurrentState eTaskState = spTask->GetTaskState(); + switch(eTaskState) { - // cancel - if ( (pTask=GetSelectedItemPointer()) == NULL ) - return; + case chengine::eTaskState_Finished: + case chengine::eTaskState_Cancelled: + case chengine::eTaskState_LoadError: + break; // allow processing as-is - pTask->CancelProcessing(); + default: + // ask to cancel + if(MsgBox(IDS_CONFIRMCANCEL_STRING, MB_OKCANCEL | MB_ICONQUESTION) == IDOK) + spTask->CancelProcessing(); + else + return; } - else - return; - } - m_pTasks->RemoveFinished(&pTask); - RefreshStatus(); + m_pTasks->RemoveFinished(spTask); + RefreshStatus(); + } } void CStatusDlg::OnPauseAllButton() @@ -673,11 +595,11 @@ break; case VK_SPACE: { - CTask* pTask; - if ( (pTask=GetSelectedItemPointer()) == NULL ) + chengine::TTaskPtr spTask = GetSelectedItemPointer(); + if (!spTask) return; - if (pTask->GetStatus(ST_WORKING_MASK) & ST_PAUSED) + if(spTask->GetTaskState() == chengine::eTaskState_Paused) OnResumeButton(); else OnPauseButton(); @@ -688,106 +610,109 @@ *pResult = 0; } -int CStatusDlg::GetImageFromStatus(UINT nStatus) +int CStatusDlg::GetImageFromStatus(chengine::ETaskCurrentState eState) { - if ( (nStatus & ST_STEP_MASK) == ST_CANCELLED ) + switch(eState) + { + case chengine::eTaskState_Cancelled: return 4; - if ( (nStatus & ST_STEP_MASK) == ST_FINISHED ) + case chengine::eTaskState_Finished: return 3; - if ( (nStatus & ST_WAITING_MASK) == ST_WAITING ) + case chengine::eTaskState_Waiting: return 5; - if ( (nStatus & ST_WORKING_MASK) == ST_PAUSED ) + case chengine::eTaskState_Paused: return 2; - if ( (nStatus & ST_WORKING_MASK) == ST_ERROR ) + case chengine::eTaskState_Error: + case chengine::eTaskState_LoadError: return 1; - return 0; + default: + return 0; + } } -LPTSTR CStatusDlg::FormatTime(long lSeconds, LPTSTR lpszBuffer, size_t stMaxBufferSize) +CString CStatusDlg::FormatTime(unsigned long long timeSeconds) { - long lDays=lSeconds/86400; - lSeconds%=86400; - long lHours=lSeconds/3600; - lSeconds%=3600; - long lMinutes=lSeconds/60; - lSeconds%=60; + if(timeSeconds > 30*24*3600) // more than 30 days + return L"\u221E"; // infinity character - if (lDays != 0) - _sntprintf(lpszBuffer, stMaxBufferSize, _T("%02d:%02d:%02d:%02d"), lDays, lHours, lMinutes, lSeconds); + 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) + strResult.Format(_T("%02ld:%02ld:%02ld:%02I64u"), lDays, lHours, lMinutes, timeSeconds); else + { if (lHours != 0) - _sntprintf(lpszBuffer, stMaxBufferSize, _T("%02d:%02d:%02d"), lHours, lMinutes, lSeconds); + strResult.Format(_T("%02ld:%02ld:%02I64u"), lHours, lMinutes, timeSeconds); else - _sntprintf(lpszBuffer, stMaxBufferSize, _T("%02d:%02d"), lMinutes, lSeconds); + 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 - pSelectedItem=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(m_pTasks->GetSize()); - + m_ctlStatusList.LimitItems(boost::numeric_cast(m_spTaskMgrStats->GetTaskStatsCount())); + // add task info - for (int i=0;iGetSize();i++) - AddTaskInfo(i, m_pTasks->GetAt(i), dwCurrentTime); - - // percent - int nPercent=m_pTasks->GetPercent(); - + for(size_t stIndex = 0; stIndex < m_spTaskMgrStats->GetTaskStatsCount(); ++stIndex) + { + chengine::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); + } + // 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_pLastSelected=NULL; - m_i64LastProcessed=0; - } else EnableControls(); // enable controls // apply state of the resume, cancel, ... buttons ApplyButtonsState(); + + // update taskbar progress + UpdateTaskBarProgress(); } void CStatusDlg::OnSelectionChanged(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/) @@ -802,83 +727,28 @@ CLanguageDialog::OnCancel(); } -void CStatusDlg::OnAdvancedButton() +void CStatusDlg::OnShowLogButton() { - CMenu menu; - HMENU hMenu=GetResManager()->LoadMenu(MAKEINTRESOURCE(IDR_ADVANCED_MENU)); - if (!menu.Attach(hMenu)) - { - DestroyMenu(hMenu); + // show log + chengine::TTaskPtr spTask = GetSelectedItemPointer(); + if(!spTask) 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 ( (pSelectedItem=GetSelectedItemPointer()) != NULL ) + chcore::TSmartPath logPath = spTask->GetLogPath(); + chengine::TLocalFilesystem localFilesystem(GetLogFileData()); + if(!localFilesystem.PathExist(logPath)) { - if (pSelectedItem->GetStatus(ST_WORKING_MASK) & ST_PAUSED) - { - bool bContinue=false; - if (pSelectedItem->GetStatus(ST_WORKING_MASK) == ST_ERROR) - { - pSelectedItem->PauseProcessing(); - bContinue=true; - } - - // assuming here that there's selection and task is paused - CReplacePathsDlg dlg; - dlg.m_pTask=pSelectedItem; - if (dlg.DoModal() == IDOK) - { - // change 'no case' - int iClipboard=pSelectedItem->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) - pSelectedItem->ResumeProcessing(); - } - else - MsgBox(IDS_TASKNOTPAUSED_STRING); + MsgBox(IDS_LOGFILEEMPTY_STRING, MB_OK | MB_ICONINFORMATION); + return; } - else - MsgBox(IDS_TASKNOTSELECTED_STRING); -} -void CStatusDlg::OnShowLogButton() -{ - // show log - CTask* pTask; - if ( (pTask=GetSelectedItemPointer()) == NULL || !GetConfig()->get_bool(PP_CMCREATELOG)) - return; - - // call what's needed - unsigned long lResult=(unsigned long)(ShellExecute(this->m_hWnd, _T("open"), _T("notepad.exe"), - CString(pTask->GetTaskPath())+pTask->GetUniqueName()+_T(".log"), NULL, SW_SHOWNORMAL)); - if (lResult < 32) + ULONG_PTR hResult = (ULONG_PTR)ShellExecute(this->m_hWnd, _T("open"), _T("notepad.exe"), logPath.ToString(), nullptr, SW_SHOWNORMAL); + if(hResult < 32) { - CString str=CString(pTask->GetTaskPath())+pTask->GetUniqueName()+_T(".log"); - ictranslate::CFormat fmt(GetResManager()->LoadString(IDS_SHELLEXECUTEERROR_STRING)); - fmt.SetParam(_t("%errno"), lResult); - fmt.SetParam(_t("%path"), str); - AfxMessageBox(fmt); + ictranslate::CFormat fmt(GetResManager().LoadString(IDS_SHELLEXECUTEERROR_STRING)); + fmt.SetParam(_T("%errno"), hResult); + fmt.SetParam(_T("%path"), spTask->GetLogPath().ToString()); + AfxMessageBox(fmt.ToString()); } } @@ -894,37 +764,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 chengine::TBufferSizes::eBuffer_Default: + strResult = GetResManager().LoadString(IDS_BSDEFAULT_STRING); break; - case BI_ONEDISK: - GetResManager()->LoadStringCopy(IDS_BSONEDISK_STRING, szData, 256); + case chengine::TBufferSizes::eBuffer_OneDisk: + strResult = GetResManager().LoadString(IDS_BSONEDISK_STRING); break; - case BI_TWODISKS: - GetResManager()->LoadStringCopy(IDS_BSTWODISKS_STRING, szData, 256); + case chengine::TBufferSizes::eBuffer_TwoDisks: + strResult = GetResManager().LoadString(IDS_BSTWODISKS_STRING); break; - case BI_CD: - GetResManager()->LoadStringCopy(IDS_BSCD_STRING, szData, 256); + case chengine::TBufferSizes::eBuffer_CD: + strResult = GetResManager().LoadString(IDS_BSCD_STRING); break; - case BI_LAN: - GetResManager()->LoadStringCopy(IDS_BSLAN_STRING, szData, 256); + case chengine::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() @@ -951,29 +820,452 @@ lvc.mask=LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; lvc.fmt=LVCFMT_LEFT; - lvc.pszText=(PTSTR)GetResManager()->LoadString(IDS_COLUMNSTATUS_STRING); /*_T("Status")*/; - lvc.cchTextMax = lstrlen(lvc.pszText); - lvc.cx = static_cast(0.27*iWidth); + lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNSTATUS_STRING); + lvc.cchTextMax = lstrlen(lvc.pszText); + lvc.cx = static_cast(0.27*iWidth); lvc.iSubItem=-1; m_ctlStatusList.InsertColumn(1, &lvc); - lvc.pszText=(PTSTR)GetResManager()->LoadString(IDS_COLUMNSOURCE_STRING);/*_T("File");*/ - lvc.cchTextMax = lstrlen(lvc.pszText); - lvc.cx = static_cast(0.3*iWidth); + lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNSOURCE_STRING); + lvc.cchTextMax = lstrlen(lvc.pszText); + lvc.cx = static_cast(0.3*iWidth); lvc.iSubItem=0; m_ctlStatusList.InsertColumn(2, &lvc); - lvc.pszText=(PTSTR)GetResManager()->LoadString(IDS_COLUMNDESTINATION_STRING);/*_T("To:");*/ - lvc.cchTextMax = lstrlen(lvc.pszText); - lvc.cx = static_cast(0.27*iWidth); + lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNDESTINATION_STRING); + lvc.cchTextMax = lstrlen(lvc.pszText); + lvc.cx = static_cast(0.27*iWidth); lvc.iSubItem=1; m_ctlStatusList.InsertColumn(3, &lvc); - lvc.pszText=(PTSTR)GetResManager()->LoadString(IDS_COLUMNPROGRESS_STRING);/*_T("Progress");*/ - lvc.cchTextMax = lstrlen(lvc.pszText); - lvc.cx = static_cast(0.15*iWidth); + lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNPROGRESS_STRING); + lvc.cchTextMax = lstrlen(lvc.pszText); + lvc.cx = static_cast(0.15*iWidth); lvc.iSubItem=2; m_ctlStatusList.InsertColumn(4, &lvc); RefreshStatus(); } + +// ============================================================================ +/// CStatusDlg::PrepareResizableControls +/// @date 2009/04/18 +/// +/// @brief Prepares the resizable controls. +// ============================================================================ +void CStatusDlg::PrepareResizableControls() +{ + ClearResizableControls(); + + // 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); + + // 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); + AddResizableControl(IDC_CANCEL_BUTTON, 0, 1.0, 0, 0); + AddResizableControl(IDC_DELETE_BUTTON, 0, 1.0, 0, 0); + AddResizableControl(IDC_PAUSE_ALL_BUTTON, 0, 1.0, 0, 0); + AddResizableControl(IDC_START_ALL_BUTTON, 0, 1.0, 0, 0); + 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_TASK_ADVANCED_BUTTON, 0, 1.0, 0, 0); + + // left part of dialog (global stats) + AddResizableControl(IDC_GLOBAL_GROUP_STATIC, 0.0, 1.0, 0.5, 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); + + // right part of dialog (task info) + AddResizableControl(IDC_TASKINFORMATION_GROUP_STATIC, 0.5, 0.0, 0.5, 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); + + 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_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 chengine::TTaskStatsSnapshotPtr& spTaskStats) +{ + CString strStatusText; + // status string + // first + switch(spTaskStats->GetTaskState()) + { + case chengine::eTaskState_Error: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_ERROR_STRING); + strStatusText += _T("/"); + break; + } + case chengine::eTaskState_LoadError: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_LOADERROR_STRING); + strStatusText += _T("/"); + break; + } + case chengine::eTaskState_Paused: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_PAUSED_STRING); + strStatusText += _T("/"); + break; + } + case chengine::eTaskState_Finished: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_FINISHED_STRING); + strStatusText += _T("/"); + break; + } + case chengine::eTaskState_Waiting: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_WAITING_STRING); + strStatusText += _T("/"); + break; + } + case chengine::eTaskState_Cancelled: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_CANCELLED_STRING); + strStatusText += _T("/"); + break; + } + case chengine::eTaskState_None: + { + strStatusText = GetResManager().LoadString(IDS_STATUS_INITIALIZING_STRING); + strStatusText += _T("/"); + break; + } + case chengine::eTaskState_Processing: + break; + default: + BOOST_ASSERT(false); // not implemented state + } + + // second part + chengine::ESubOperationType eSubOperationType = chengine::eSubOperation_None; + chengine::TSubTaskStatsSnapshotPtr spSubtaskStats = spTaskStats->GetSubTasksStats().GetCurrentSubTaskSnapshot(); + if(spSubtaskStats) + eSubOperationType = spSubtaskStats->GetSubOperationType(); + + if(eSubOperationType == chengine::eSubOperation_Deleting) + strStatusText += GetResManager().LoadString(IDS_STATUS_DELETING_STRING); + else if(eSubOperationType == chengine::eSubOperation_Scanning) + strStatusText += GetResManager().LoadString(IDS_STATUS_SEARCHING_STRING); + else if(eSubOperationType == chengine::eSubOperation_FastMove) + strStatusText += GetResManager().LoadString(IDS_STATUS_FASTMOVE_STRING); + else if(spTaskStats->GetOperationType() == chengine::eOperation_Copy) + strStatusText += GetResManager().LoadString(IDS_STATUS_COPYING_STRING); + else if(spTaskStats->GetOperationType() == chengine::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(chengine::ESubOperationType eSubtask) const +{ + if(eSubtask == chengine::eSubOperation_Deleting) + return GetResManager().LoadString(IDS_STATUS_DELETING_STRING); + if(eSubtask == chengine::eSubOperation_Scanning) + return GetResManager().LoadString(IDS_STATUS_SEARCHING_STRING); + if(eSubtask == chengine::eSubOperation_FastMove) + return GetResManager().LoadString(IDS_STATUS_FASTMOVE_STRING); + if(eSubtask == chengine::eSubOperation_Copying) + return GetResManager().LoadString(IDS_STATUS_COPYING_STRING); + + return GetResManager().LoadString(IDS_STATUS_UNKNOWN_STRING); +} + +void CStatusDlg::SetTaskListEntry(size_t stPos, const chengine::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); + + string::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; + string::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 chengine::TTaskStatsSnapshotPtr& spTaskStats) +{ + unsigned long long timeTotalEstimated = 0; + unsigned long long timeElapsed = 0; + unsigned long long timeRemaining = 0; + + chengine::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 + chengine::ESubOperationType eSubOperationType = spSubTaskStats->GetSubOperationType(); + CString strSubtaskName = GetSubtaskName(eSubOperationType); + GetDlgItem(IDC_SUBTASKNAME_STATIC)->SetWindowText(strSubtaskName); + + // current path + string::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; +} + +void CStatusDlg::UpdateTaskBarProgress() const +{ + if(m_spTaskMgrStats->GetRunningTasks() != 0) + { + unsigned long long ullProgress = (unsigned long long)(m_spTaskMgrStats->GetCombinedProgress() * 100.0); + + m_taskBarProgress.SetState(m_hWnd, TBPF_NORMAL); + m_taskBarProgress.SetPosition(m_hWnd, ullProgress, 100); + } + else + m_taskBarProgress.SetState(m_hWnd, TBPF_NOPROGRESS); +}