Clone
ixen <ixen@copyhandler.com>
committed
on 16 Jun 13
Changed the design of status dialog to make place for more information (mostly subtask stats) (CH-65)
LoggerImprovements + 5 more
src/ch/StatusDlg.cpp (+264 -173)
44 44         : ictranslate::CLanguageDialog(CStatusDlg::IDD, pParent, &m_bLock)
45 45 {
46 46         //{{AFX_DATA_INIT(CStatusDlg)
47 47         //}}AFX_DATA_INIT
48 48         m_i64LastProcessed=0;
49 49         m_i64LastAllTasksProcessed=0;
50 50         m_pTasks=pTasks;
51 51         m_dwLastUpdate=0;
52 52
53 53         RegisterStaticExControl(AfxGetInstanceHandle());
54 54 }
55 55
56 56 CStatusDlg::~CStatusDlg()
57 57 {
58 58
59 59 }
60 60
61 61 void CStatusDlg::DoDataExchange(CDataExchange* pDX)
62 62 {
63 63         CLanguageDialog::DoDataExchange(pDX);
64           //{{AFX_DATA_MAP(CStatusDlg)
65           DDX_Control(pDX, IDC_TASK_PROGRESS, m_ctlCurrentProgress);
  64         DDX_Control(pDX, IDC_TASKCOUNT_PROGRESS, m_ctlTaskCountProgress);
  65         DDX_Control(pDX, IDC_TASKSIZE_PROGRESS, m_ctlTaskSizeProgress);
  66         DDX_Control(pDX, IDC_CURRENTOBJECT_PROGRESS, m_ctlCurrentObjectProgress);
  67         DDX_Control(pDX, IDC_SUBTASKCOUNT_PROGRESS, m_ctlSubTaskCountProgress);
  68         DDX_Control(pDX, IDC_SUBTASKSIZE_PROGRESS, m_ctlSubTaskSizeProgress);
  69         DDX_Control(pDX, IDC_GLOBAL_PROGRESS, m_ctlProgressAll);
66 70         DDX_Control(pDX, IDC_STATUS_LIST, m_ctlStatusList);
67           DDX_Control(pDX, IDC_ALL_PROGRESS, m_ctlProgressAll);
68           //}}AFX_DATA_MAP
69 71 }
70 72
71 73 BEGIN_MESSAGE_MAP(CStatusDlg,ictranslate::CLanguageDialog)
72 74         //{{AFX_MSG_MAP(CStatusDlg)
73 75         ON_WM_TIMER()
74 76         ON_BN_CLICKED(IDC_PAUSE_BUTTON, OnPauseButton)
75 77         ON_BN_CLICKED(IDC_CANCEL_BUTTON, OnCancelButton)
76 78         ON_BN_CLICKED(IDC_SET_PRIORITY_BUTTON, OnSetPriorityButton)
77 79         ON_BN_CLICKED(IDC_SET_BUFFERSIZE_BUTTON, OnSetBuffersizeButton)
78 80         ON_BN_CLICKED(IDC_START_ALL_BUTTON, OnStartAllButton)
79 81         ON_BN_CLICKED(IDC_RESTART_BUTTON, OnRestartButton)
80 82         ON_BN_CLICKED(IDC_DELETE_BUTTON, OnDeleteButton)
81 83         ON_BN_CLICKED(IDC_PAUSE_ALL_BUTTON, OnPauseAllButton)
82 84         ON_BN_CLICKED(IDC_RESTART_ALL_BUTTON, OnRestartAllButton)
83 85         ON_BN_CLICKED(IDC_CANCEL_ALL_BUTTON, OnCancelAllButton)
84 86         ON_BN_CLICKED(IDC_REMOVE_FINISHED_BUTTON, OnRemoveFinishedButton)
85 87         ON_NOTIFY(LVN_KEYDOWN, IDC_STATUS_LIST, OnKeydownStatusList)
86 88         ON_NOTIFY(LVN_CHANGEDSELECTION, IDC_STATUS_LIST, OnSelectionChanged)
87 89         ON_BN_CLICKED(IDC_SHOW_LOG_BUTTON, OnShowLogButton)
88 90         ON_BN_CLICKED(IDC_STICK_BUTTON, OnStickButton)
 
131 133         m_ctlStatusList.InsertColumn(3, &lvc);
132 134
133 135         lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNPROGRESS_STRING);/*_T("Progress");*/
134 136         lvc.cchTextMax = lstrlen(lvc.pszText);
135 137         lvc.cx = static_cast<int>(0.15*iWidth);
136 138         lvc.iSubItem=2;
137 139         m_ctlStatusList.InsertColumn(4, &lvc);
138 140
139 141         // images
140 142         m_images.Create(16, 16, ILC_COLOR16 | ILC_MASK, 0, 3);
141 143         m_images.Add(AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_WORKING_ICON)));
142 144         m_images.Add(AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_ERROR_ICON)));
143 145         m_images.Add(AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_PAUSED_ICON)));
144 146         m_images.Add(AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_FINISHED_ICON)));
145 147         m_images.Add(AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_CANCELLED_ICON)));
146 148         m_images.Add(AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_WAITING_ICON)));
147 149
148 150         m_ctlStatusList.SetImageList(&m_images, LVSIL_SMALL);
149 151
150 152         // set fixed progresses ranges
151           m_ctlCurrentProgress.SetRange32(0, 100);
  153         m_ctlTaskCountProgress.SetRange32(0, 100);
152 154         m_ctlProgressAll.SetRange32(0, 100);
153 155
154 156         // change the size of a dialog
155 157         StickDialogToScreenEdge();
156 158 //      ApplyButtonsState();
157 159 //      EnableControls(false);
158 160
159 161         // refresh data
160 162         RefreshStatus();
161 163
162 164         // select needed element
163 165         size_t stIndex = 0;
164 166         while(stIndex < m_pTasks->GetSize())
165 167         {
166 168                 if(m_pTasks->GetAt(stIndex) == m_spInitialSelection)
167 169                 {
168 170                         m_ctlStatusList.SetItemState(boost::numeric_cast<int>(stIndex), LVIS_SELECTED, LVIS_SELECTED);
169 171                         break;
170 172                 }
171 173
172 174                 stIndex++;
173 175         }
174 176
175 177         // refresh data timer
176 178         SetTimer(777, GetPropValue<PP_STATUSREFRESHINTERVAL>(GetConfig()), NULL);
177 179
178 180         return TRUE;
179 181 }
180 182
181 183 void CStatusDlg::EnableControls(bool bEnable)
182 184 {
183 185         // enable/disable controls
184 186         GetDlgItem(IDC_SET_BUFFERSIZE_BUTTON)->EnableWindow(bEnable);
185 187         GetDlgItem(IDC_SET_PRIORITY_BUTTON)->EnableWindow(bEnable);
186 188
187 189         if (!bEnable)
188 190         {
189                   // get rid of text id disabling
  191                 GetDlgItem(IDC_TASKID_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTASKID_STRING));
  192
190 193                 GetDlgItem(IDC_OPERATION_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYOPERATIONTEXT_STRING));
191                   GetDlgItem(IDC_SOURCE_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYSOURCETEXT_STRING));
192                   GetDlgItem(IDC_DESTINATION_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYDESTINATIONTEXT_STRING));
  194                 GetDlgItem(IDC_SOURCEOBJECT_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYSOURCETEXT_STRING));
  195                 GetDlgItem(IDC_DESTINATIONOBJECT_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYDESTINATIONTEXT_STRING));
193 196                 GetDlgItem(IDC_BUFFERSIZE_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYBUFFERSIZETEXT_STRING));
194                   GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPRIORITYTEXT_STRING));
  197                 GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPRIORITYTEXT_STRING));
195 198                 
196                   GetDlgItem(IDC_PROGRESS_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPROCESSEDTEXT_STRING));
197                   GetDlgItem(IDC_TRANSFER_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTRANSFERTEXT_STRING));
198                   GetDlgItem(IDC_TIME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTIMETEXT_STRING));
199                   GetDlgItem(IDC_ASSOCIATEDFILES__STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYASSOCFILE_STRING));
  199                 // subtask
  200                 GetDlgItem(IDC_SUBTASKNAME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYSUBTASKNAME_STRING));
  201                 GetDlgItem(IDC_SUBTASKPROCESSED_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPROCESSEDTEXT_STRING));
  202                 GetDlgItem(IDC_SUBTASKTIME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTIMETEXT_STRING));
  203                 GetDlgItem(IDC_SUBTASKTRANSFER_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTRANSFERTEXT_STRING));
200 204
201                   m_ctlCurrentProgress.SetPos(0);
  205                 GetDlgItem(IDC_TASKPROCESSED_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYPROCESSEDTEXT_STRING));
  206                 GetDlgItem(IDC_TASKTRANSFER_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTRANSFERTEXT_STRING));
  207                 GetDlgItem(IDC_TASKTIME_STATIC)->SetWindowText(GetResManager().LoadString(IDS_EMPTYTIMETEXT_STRING));
  208
  209                 m_ctlTaskCountProgress.SetPos(0);
202 210         }
203 211 }
204 212
205 213 void CStatusDlg::OnTimer(UINT_PTR nIDEvent)
206 214 {
207 215         if (nIDEvent == 777)    // refreshing data
208 216         {
209 217                 // turn off timer for some time
210 218                 KillTimer(777);
211 219
212 220                 RefreshStatus();
213 221
214 222                 // reenable
215 223                 SetTimer(777, GetPropValue<PP_STATUSREFRESHINTERVAL>(GetConfig()), NULL);
216 224         }
217 225
218 226         CLanguageDialog::OnTimer(nIDEvent);
219 227 }
220 228
221 229 void CStatusDlg::AddTaskInfo(int nPos, const chcore::TTaskPtr& spTask, DWORD dwCurrentTime)
222 230 {
223 231         _ASSERTE(spTask != NULL);
224 232         if(spTask == NULL)
225 233                 return;
226 234
227           // index to string
228           _itot(nPos, m_szData, 10);
229  
230 235         // get data snapshot from task
231 236         chcore::TASK_DISPLAY_DATA td;
232 237         spTask->GetSnapshot(&td);
233 238
234           // index subitem
235           CString strStatusText = GetStatusString(td);
236           CString strTemp;
237           LVITEM lvi;
238           lvi.mask=LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
239           lvi.iItem=nPos;
240           lvi.iSubItem=0;
241           lvi.pszText = (PTSTR)(PCTSTR)strStatusText;
242           lvi.cchTextMax = lstrlen(lvi.pszText);
243           lvi.lParam = spTask->GetSessionUniqueID();
244           lvi.iImage=GetImageFromStatus(td.m_eTaskState);
245           if (nPos < m_ctlStatusList.GetItemCount())
246                   m_ctlStatusList.SetItem(&lvi);
247           else
248                   m_ctlStatusList.InsertItem(&lvi);
  239         // set (update/add new) entry in the task list (on the left)
  240         SetTaskListEntry(td, nPos, spTask);
249 241
250           // status subitem
251           lvi.mask=LVIF_TEXT;
252           lvi.iSubItem=1;
253           if(td.m_strFileName.IsEmpty())
254                   strTemp = GetResManager().LoadString(IDS_NONEINPUTFILE_STRING);
255           else
256                   strTemp = td.m_strFileName;
257           lvi.pszText=strTemp.GetBuffer(0);
258           strTemp.ReleaseBuffer();
259           lvi.cchTextMax=lstrlen(lvi.pszText);
260           m_ctlStatusList.SetItem(&lvi);
261  
262           // insert 'file' subitem
263           lvi.iSubItem=2;
264           strTemp = td.m_pathDstPath.ToString();
265           lvi.pszText=strTemp.GetBuffer(0);
266           strTemp.ReleaseBuffer();
267           lvi.cchTextMax=lstrlen(lvi.pszText);
268           m_ctlStatusList.SetItem(&lvi);
269  
270           // insert dest subitem
271           lvi.iSubItem=3;
272           _itot(boost::numeric_cast<int>(td.m_dPercent), m_szData, 10);
273           _tcscat(m_szData, _T(" %"));
274           lvi.pszText=m_szData;
275           lvi.cchTextMax=lstrlen(lvi.pszText);
276           m_ctlStatusList.SetItem(&lvi);
277  
278 242         // right side update
279 243         if(spTask == m_spSelectedItem)
280           {
281                   // data that can be changed by a thread
282                   GetDlgItem(IDC_OPERATION_STATIC)->SetWindowText(strStatusText); // operation
283  
284                   if(td.m_strFullFilePath.IsEmpty())
285                           GetDlgItem(IDC_SOURCE_STATIC)->SetWindowText(GetResManager().LoadString(IDS_NONEINPUTFILE_STRING));
286                   else
287                           GetDlgItem(IDC_SOURCE_STATIC)->SetWindowText(td.m_strFullFilePath);     // src object
288                   
289                   // count of processed data/overall count of data
290                   _sntprintf(m_szData, _MAX_PATH, _T("%d/%d ("), td.m_stIndex, td.m_stSize);
291                   strTemp=CString(m_szData);
292                   strTemp+=GetSizeString(td.m_ullProcessedSize, m_szData, _MAX_PATH)+CString(_T("/"));
293                   strTemp+=GetSizeString(td.m_ullSizeAll, m_szData, _MAX_PATH)+CString(_T(")"));
294                   GetDlgItem(IDC_PROGRESS_STATIC)->SetWindowText(strTemp);
295                   
296                   // transfer
297                   if (m_i64LastProcessed == 0)    // if first time - show average
298                           strTemp=GetSizeString( td.m_timeElapsed ? td.m_ullProcessedSize/td.m_timeElapsed : 0, m_szData, _MAX_PATH);     // last avg
299                   else
300                           if ( (dwCurrentTime-m_dwLastUpdate) != 0)
301                                   strTemp=GetSizeString( (static_cast<double>(td.m_ullProcessedSize) - static_cast<double>(m_i64LastProcessed))/(static_cast<double>(dwCurrentTime-m_dwLastUpdate)/1000.0), m_szData, _MAX_PATH);
302                           else
303                                   strTemp=GetSizeString( 0ULL, m_szData, _MAX_PATH);
304  
305                   // avg transfer
306                   GetDlgItem(IDC_TRANSFER_STATIC)->SetWindowText(strTemp+_T("/s (")+CString(GetResManager().LoadString(IDS_AVERAGEWORD_STRING))
307                           +CString(GetSizeString(td.m_timeElapsed ? td.m_ullProcessedSize/td.m_timeElapsed : 0, m_szData, _MAX_PATH))+_T("/s )")
308                           );
309                   
310                   // elapsed time / estimated total time (estimated time left)
311                   FormatTime(td.m_timeElapsed, m_szTimeBuffer1, 40);
312                   time_t timeTotal = (td.m_ullProcessedSize == 0) ? 0 : (long)(td.m_ullSizeAll * td.m_timeElapsed / td.m_ullProcessedSize);
313                   FormatTime(timeTotal, m_szTimeBuffer2, 40);
314                   FormatTime(std::max((time_t)0l, timeTotal - td.m_timeElapsed), m_szTimeBuffer3, 40);
315  
316                   _sntprintf(m_szData, _MAX_PATH, _T("%s / %s (%s)"), m_szTimeBuffer1, m_szTimeBuffer2, m_szTimeBuffer3);
317                   GetDlgItem(IDC_TIME_STATIC)->SetWindowText(m_szData);
318  
319                   // remember current processed data (used for calculating transfer)
320                   m_i64LastProcessed=td.m_ullProcessedSize;
321  
322                   // set progress
323                   m_ctlCurrentProgress.SetPos(boost::numeric_cast<int>(td.m_dPercent));
324  
325                   SetBufferSizesString(td.m_iCurrentBufferSize, td.m_iCurrentBufferIndex);
326  
327                   // data that can be changed only by user from outside the thread
328                   // refresh only when there are new selected item
329   //              if (spTask != m_spLastSelected)
330                   {
331                           GetDlgItem(IDC_DESTINATION_STATIC)->SetWindowText(td.m_pathDstPath.ToString());
332                           GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(td.m_nPriority)));
333                           GetDlgItem(IDC_ASSOCIATEDFILES__STATIC)->SetWindowText(td.m_strUniqueName);
  244                 UpdateTaskStatsDetails(td, dwCurrentTime);
334 245 }
335 246
336                   // refresh m_spLastSelected
337                   m_spLastSelected = spTask;
338           }
339   }
340  
341 247 void CStatusDlg::OnSetBuffersizeButton()
342 248 {
343 249         chcore::TTaskPtr spTask = GetSelectedItemPointer();
344 250         if(!spTask)
345 251                 return;
346 252
347 253         CBufferSizeDlg dlg;
348 254         chcore::TTaskStatsSnapshot tTaskStats;
349 255         spTask->GetTaskStats(tTaskStats);
350 256
351 257         spTask->GetBufferSizes(dlg.m_bsSizes);
352 258         dlg.m_iActiveIndex = tTaskStats.GetCurrentSubTaskStats().GetCurrentBufferIndex();
353 259         if(dlg.DoModal() == IDOK)
354 260                 spTask->SetBufferSizes(dlg.m_bsSizes);
355 261 }
356 262
357 263 chcore::TTaskPtr CStatusDlg::GetSelectedItemPointer()
358 264 {
359 265         // returns ptr to a TTask for a given element in listview
360 266         if(m_ctlStatusList.GetSelectedCount() == 1)
 
447 353                 GetDlgItem(IDC_SET_PRIORITY_BUTTON)->GetWindowRect(&rect);
448 354
449 355                 pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rect.right+1, rect.top, this);
450 356         }
451 357 }
452 358
453 359 BOOL CStatusDlg::OnCommand(WPARAM wParam, LPARAM lParam)
454 360 {
455 361         if (HIWORD(wParam) == 0)
456 362         {
457 363                 if (LOWORD(wParam) >= ID_POPUP_TIME_CRITICAL && LOWORD(wParam) <= ID_POPUP_IDLE)
458 364                 {
459 365                         // processing priority
460 366                         if ( (m_spSelectedItem=GetSelectedItemPointer()) == NULL )
461 367                                 return ictranslate::CLanguageDialog::OnCommand(wParam, lParam);
462 368                         
463 369                         switch (LOWORD(wParam))
464 370                         {
465 371                         case ID_POPUP_TIME_CRITICAL:
466 372                                 m_spSelectedItem->SetPriority(THREAD_PRIORITY_TIME_CRITICAL);
467                                   GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_TIME_CRITICAL)));
  373                                 GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_TIME_CRITICAL)));
468 374                                 break;
469 375                         case ID_POPUP_HIGHEST:
470 376                                 m_spSelectedItem->SetPriority(THREAD_PRIORITY_HIGHEST);
471                                   GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_HIGHEST)));
  377                                 GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_HIGHEST)));
472 378                                 break;
473 379                         case ID_POPUP_ABOVE_NORMAL:
474 380                                 m_spSelectedItem->SetPriority(THREAD_PRIORITY_ABOVE_NORMAL);
475                                   GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_ABOVE_NORMAL)));
  381                                 GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_ABOVE_NORMAL)));
476 382                                 break;
477 383                         case ID_POPUP_NORMAL:
478 384                                 m_spSelectedItem->SetPriority(THREAD_PRIORITY_NORMAL);
479                                   GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_NORMAL)));
  385                                 GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_NORMAL)));
480 386                                 break;
481 387                         case ID_POPUP_BELOW_NORMAL:
482 388                                 m_spSelectedItem->SetPriority(THREAD_PRIORITY_BELOW_NORMAL);
483                                   GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_BELOW_NORMAL)));
  389                                 GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_BELOW_NORMAL)));
484 390                                 break;
485 391                         case ID_POPUP_LOWEST:
486 392                                 m_spSelectedItem->SetPriority(THREAD_PRIORITY_LOWEST);
487                                   GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_LOWEST)));
  393                                 GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_LOWEST)));
488 394                                 break;
489 395                         case ID_POPUP_IDLE:
490 396                                 m_spSelectedItem->SetPriority(THREAD_PRIORITY_IDLE);
491                                   GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_IDLE)));
  397                                 GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(THREAD_PRIORITY_IDLE)));
492 398                                 break;
493 399                         }
494 400                 }
495 401         }
496 402         return ictranslate::CLanguageDialog::OnCommand(wParam, lParam);
497 403 }
498 404
499 405 void CStatusDlg::OnPauseButton()
500 406 {
501 407         chcore::TTaskPtr spTask = GetSelectedItemPointer();
502 408         if(spTask)
503 409         {
504 410                 TRACE("PauseProcessing call...\n");
505 411                 spTask->PauseProcessing();
506 412
507 413                 RefreshStatus();
508 414         }
509 415 }
510 416
511 417 void CStatusDlg::OnResumeButton()
 
648 554         long lDays = boost::numeric_cast<long>(timeSeconds/86400);
649 555         timeSeconds %= 86400;
650 556         long lHours = boost::numeric_cast<long>(timeSeconds/3600);
651 557         timeSeconds %= 3600;
652 558         long lMinutes = boost::numeric_cast<long>(timeSeconds/60);
653 559         timeSeconds %= 60;
654 560
655 561         if(lDays != 0)
656 562                 _sntprintf(lpszBuffer, stMaxBufferSize, _T("%02d:%02d:%02d:%02d"), lDays, lHours, lMinutes, timeSeconds);
657 563         else
658 564         {
659 565                 if (lHours != 0)
660 566                         _sntprintf(lpszBuffer, stMaxBufferSize, _T("%02d:%02d:%02d"), lHours, lMinutes, timeSeconds);
661 567                 else
662 568                         _sntprintf(lpszBuffer, stMaxBufferSize, _T("%02d:%02d"), lMinutes, timeSeconds);
663 569         }
664 570
665 571         return lpszBuffer;
666 572 }
667 573
  574 LPTSTR CStatusDlg::FormatTimeMiliseconds(unsigned long long timeMiliSeconds, LPTSTR lpszBuffer, size_t stMaxBufferSize)
  575 {
  576         time_t timeSeconds = timeMiliSeconds / 1000;
  577         return FormatTime(timeSeconds, lpszBuffer, stMaxBufferSize);
  578 }
  579
668 580 void CStatusDlg::RefreshStatus()
669 581 {
670 582         // remember address of a current selection
671 583         m_spSelectedItem=GetSelectedItemPointer();
672 584
673 585         // current time
674 586         DWORD dwCurrentTime=GetTickCount();
675 587
676 588         // get rid of item after the current part
677 589         m_ctlStatusList.LimitItems(boost::numeric_cast<int>(m_pTasks->GetSize()));
678 590
679 591         // add task info
680 592         for(size_t stIndex = 0; stIndex < m_pTasks->GetSize(); ++stIndex)
681 593         {
682 594                 AddTaskInfo(boost::numeric_cast<int>(stIndex), m_pTasks->GetAt(stIndex), dwCurrentTime);
683 595         }
684 596
685 597         // percent
686 598         chcore::TTaskManagerStatsSnapshot tTMStats;
687 599         m_pTasks->GetStatsSnapshot(tTMStats);
688 600
689 601         // set title
690 602         if (m_pTasks->GetSize() != 0)
691 603                 _sntprintf(m_szData, _MAX_PATH, _T("%s [%.0f %%]"), GetResManager().LoadString(IDS_STATUSTITLE_STRING), tTMStats.GetGlobalProgressInPercent());
692 604         else
693 605                 _sntprintf(m_szData, _MAX_PATH, _T("%s"), GetResManager().LoadString(IDS_STATUSTITLE_STRING));
694 606         
695 607         // if changed
696 608         CString strTemp;
697 609         GetWindowText(strTemp);
698 610         if (strTemp != CString(m_szData))
699 611                 SetWindowText(m_szData);
700 612         
701 613         // refresh overall progress
702 614         m_ctlProgressAll.SetPos(boost::numeric_cast<int>(tTMStats.GetGlobalProgressInPercent()));
703 615         
704 616         // progress - count of processed data/count of data
705 617         strTemp=GetSizeString(tTMStats.GetProcessedSize(), m_szData, _MAX_PATH)+CString(_T("/"));
706 618         strTemp+=GetSizeString(tTMStats.GetTotalSize(), m_szData, _MAX_PATH);
707           GetDlgItem(IDC_OVERALL_PROGRESS_STATIC)->SetWindowText(strTemp);
  619         GetDlgItem(IDC_GLOBALPROCESSED_STATIC)->SetWindowText(strTemp);
708 620         
709 621         // transfer
710 622         if (m_i64LastAllTasksProcessed == 0)
711 623                 m_i64LastAllTasksProcessed=tTMStats.GetProcessedSize();
712 624         
713 625         if (dwCurrentTime-m_dwLastUpdate != 0)
714 626                 strTemp=GetSizeString( (static_cast<double>(tTMStats.GetProcessedSize()) - static_cast<double>(m_i64LastAllTasksProcessed))/static_cast<double>(static_cast<double>(dwCurrentTime-m_dwLastUpdate)/1000.0), m_szData, _MAX_PATH);
715 627         else
716 628                 strTemp=GetSizeString( 0ULL, m_szData, _MAX_PATH);
717 629         
718           GetDlgItem(IDC_OVERALL_TRANSFER_STATIC)->SetWindowText(strTemp+_T("/s"));
  630         GetDlgItem(IDC_GLOBALTRANSFER_STATIC)->SetWindowText(strTemp+_T("/s"));
719 631         m_i64LastAllTasksProcessed=tTMStats.GetProcessedSize();
720 632         m_dwLastUpdate=dwCurrentTime;
721 633
722 634         // if selection's missing - hide controls
723 635         if (m_ctlStatusList.GetSelectedCount() == 0)
724 636         {
725 637                 EnableControls(false);
726                   m_spLastSelected.reset();
727 638                 m_i64LastProcessed=0;
728 639         }
729 640         else
730 641                 EnableControls();               // enable controls
731 642         
732 643         // apply state of the resume, cancel, ... buttons
733 644         ApplyButtonsState();
734 645 }
735 646
736 647 void CStatusDlg::OnSelectionChanged(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/)
737 648 {
738 649         TRACE("Received LVN_CHANGEDSELECTION\n");
739 650         RefreshStatus();
740 651 }
741 652
742 653 void CStatusDlg::OnCancel()
743 654 {
744 655         PostCloseMessage();
745 656         CLanguageDialog::OnCancel();
746 657 }
 
851 762
852 763         lvc.pszText=(PTSTR)GetResManager().LoadString(IDS_COLUMNPROGRESS_STRING);/*_T("Progress");*/
853 764         lvc.cchTextMax = lstrlen(lvc.pszText);
854 765         lvc.cx = static_cast<int>(0.15*iWidth);
855 766         lvc.iSubItem=2;
856 767         m_ctlStatusList.InsertColumn(4, &lvc);
857 768
858 769         RefreshStatus();
859 770 }
860 771
861 772 // ============================================================================
862 773 /// CStatusDlg::PrepareResizableControls
863 774 /// @date 2009/04/18
864 775 ///
865 776 /// @brief     Prepares the resizable controls.
866 777 // ============================================================================
867 778 void CStatusDlg::PrepareResizableControls()
868 779 {
869 780         ClearResizableControls();
870 781
871           AddResizableControl(IDC_001_STATIC, 0, 0, 0.5, 0.0);
  782         // left part of dialog (task list)
  783         AddResizableControl(IDC_TASKLIST_LABEL_STATIC, 0, 0, 0.5, 0.0);
872 784         AddResizableControl(IDC_STATUS_LIST, 0, 0, 0.5, 1.0);
873           AddResizableControl(IDC_ROLL_UNROLL_BUTTON, 0.5, 0, 0, 0);
874 785
  786         // left part of dialog (buttons under the task list)
875 787         AddResizableControl(IDC_PAUSE_BUTTON, 0, 1.0, 0, 0);
876 788         AddResizableControl(IDC_RESTART_BUTTON, 0, 1.0, 0, 0);
877 789         AddResizableControl(IDC_RESUME_BUTTON, 0, 1.0, 0, 0);
878 790         AddResizableControl(IDC_CANCEL_BUTTON, 0, 1.0, 0, 0);
879 791         AddResizableControl(IDC_DELETE_BUTTON, 0, 1.0, 0, 0);
880 792         AddResizableControl(IDC_PAUSE_ALL_BUTTON, 0, 1.0, 0, 0);
881 793         AddResizableControl(IDC_START_ALL_BUTTON, 0, 1.0, 0, 0);
882 794         AddResizableControl(IDC_CANCEL_ALL_BUTTON, 0, 1.0, 0, 0);
883 795         AddResizableControl(IDC_REMOVE_FINISHED_BUTTON, 0, 1.0, 0, 0);
884 796         AddResizableControl(IDC_RESTART_ALL_BUTTON, 0, 1.0, 0, 0);
885 797
886           AddResizableControl(IDC_STICK_BUTTON, 1.0, 1.0, 0, 0);
  798         // left part of dialog (global stats)
  799         AddResizableControl(IDC_GLOBAL_GROUP_STATIC, 0.0, 1.0, 0.5, 0);
887 800
888           // sections separators
889           AddResizableControl(IDC_014_STATIC, 0.5, 0.0, 0.0, 0);
890           AddResizableControl(IDC_015_STATIC, 0.5, 0.0, 0.0, 0);
  801         AddResizableControl(IDC_GLOBALPROCESSED_LABEL_STATIC, 0.0, 1.0, 0.0, 0.0);
  802         AddResizableControl(IDC_GLOBALPROCESSED_STATIC, 0.0, 1.0, 0.5, 0);
  803         AddResizableControl(IDC_GLOBALTRANSFER_LABEL_STATIC, 0.0, 1.0, 0.0, 0.0);
  804         AddResizableControl(IDC_GLOBALTRANSFER_STATIC, 0.0, 1.0, 0.5, 0);
  805         AddResizableControl(IDC_GLOBALPROGRESS_LABEL_STATIC, 0.0, 1.0, 0.0, 0.0);
  806         AddResizableControl(IDC_GLOBAL_PROGRESS, 0.0, 1.0, 0.5, 0.0);
891 807
892           AddResizableControl(IDC_018_STATIC, 0.5, 0.0, 0.25, 0);
893           AddResizableControl(IDC_019_STATIC, 0.5, 0.0, 0.25, 0);
894           AddResizableControl(IDC_016_STATIC, 0.75, 0.0, 0.25, 0);
895           AddResizableControl(IDC_017_STATIC, 0.75, 0.0, 0.25, 0);
  808         // right part of dialog  (task info)
  809         AddResizableControl(IDC_TASKINFORMATION_GROUP_STATIC, 0.5, 0.0, 0.5, 0);
896 810
897           // left part of right column
898           AddResizableControl(IDC_002_STATIC, 0.5, 0.0, 0.0, 0);
899           AddResizableControl(IDC_003_STATIC, 0.5, 0.0, 0.0, 0);
900           AddResizableControl(IDC_004_STATIC, 0.5, 0.0, 0.0, 0);
901           AddResizableControl(IDC_005_STATIC, 0.5, 0.0, 0.0, 0);
902           AddResizableControl(IDC_006_STATIC, 0.5, 0.0, 0.0, 0);
903           AddResizableControl(IDC_007_STATIC, 0.5, 0.0, 0.0, 0);
904           AddResizableControl(IDC_009_STATIC, 0.5, 0.0, 0.0, 0);
905           AddResizableControl(IDC_010_STATIC, 0.5, 0.0, 0.0, 0);
906           AddResizableControl(IDC_011_STATIC, 0.5, 0.0, 0.0, 0);
907           AddResizableControl(IDC_012_STATIC, 0.5, 0.0, 0.0, 0);
908           AddResizableControl(IDC_013_STATIC, 0.5, 0.0, 0.0, 0);
909           AddResizableControl(IDC_020_STATIC, 0.5, 0.0, 0.0, 0);
910           AddResizableControl(IDC_021_STATIC, 0.5, 0.0, 0.0, 0);
911           AddResizableControl(IDC_SHOW_LOG_BUTTON, 0.5, 0.0, 0.5, 0);
912           AddResizableControl(IDC_SHOW_LOG_BUTTON, 0.5, 0.0, 0.0, 0.0);
  811         // right part of dialog (subsequent entries)
  812         AddResizableControl(IDC_TASKID_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  813         AddResizableControl(IDC_TASKID_STATIC, 0.5, 0.0, 0.5, 0);
913 814
914           // full length right column
915           AddResizableControl(IDC_ALL_PROGRESS, 0.5, 0.0, 0.5, 0);
916           AddResizableControl(IDC_TASK_PROGRESS, 0.5, 0.0, 0.5, 0);
917  
918           // right part of right column
919           AddResizableControl(IDC_ASSOCIATEDFILES__STATIC, 0.5, 0.0, 0.5, 0);
  815         AddResizableControl(IDC_OPERATION_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
920 816         AddResizableControl(IDC_OPERATION_STATIC, 0.5, 0.0, 0.5, 0);
921           AddResizableControl(IDC_SOURCE_STATIC, 0.5, 0.0, 0.5, 0);
922           AddResizableControl(IDC_DESTINATION_STATIC, 0.5, 0.0, 0.5, 0);
923           AddResizableControl(IDC_PROGRESS_STATIC, 0.5, 0.0, 0.5, 0);
924           AddResizableControl(IDC_TIME_STATIC, 0.5, 0.0, 0.5, 0);
925           AddResizableControl(IDC_TRANSFER_STATIC, 0.5, 0.0, 0.5, 0);
926           AddResizableControl(IDC_OVERALL_PROGRESS_STATIC, 0.5, 0.0, 0.5, 0);
927           AddResizableControl(IDC_OVERALL_TRANSFER_STATIC, 0.5, 0.0, 0.5, 0);
928           AddResizableControl(IDC_BUFFERSIZE_STATIC, 0.5, 0.0, 0.5, 0);
929           AddResizableControl(IDC_PRIORITY_STATIC, 0.5, 0.0, 0.5, 0);
930 817
  818         AddResizableControl(IDC_SOURCEOBJECT_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  819         AddResizableControl(IDC_SOURCEOBJECT_STATIC, 0.5, 0.0, 0.5, 0);
  820
  821         AddResizableControl(IDC_DESTINATIONOBJECT_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  822         AddResizableControl(IDC_DESTINATIONOBJECT_STATIC, 0.5, 0.0, 0.5, 0);
  823
  824         AddResizableControl(IDC_BUFFERSIZE_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  825         AddResizableControl(IDC_BUFFERSIZE_STATIC, 0.5, 0.0, 0.5, 0);
931 826         AddResizableControl(IDC_SET_BUFFERSIZE_BUTTON, 1.0, 0.0, 0.0, 0.0);
  827
  828         AddResizableControl(IDC_THREADPRIORITY_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  829         AddResizableControl(IDC_THREADPRIORITY_STATIC, 0.5, 0.0, 0.5, 0);
932 830         AddResizableControl(IDC_SET_PRIORITY_BUTTON, 1.0, 0.0, 0.0, 0.0);
933 831
  832         // right part of the dialog (subtask stats)
  833         AddResizableControl(IDC_CURRENTPHASE_GROUP_STATIC, 0.5, 0.0, 0.5, 0);
  834
  835         AddResizableControl(IDC_SUBTASKNAME_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  836         AddResizableControl(IDC_SUBTASKNAME_STATIC, 0.5, 0.0, 0.5, 0);
  837
  838         AddResizableControl(IDC_SUBTASKPROCESSED_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  839         AddResizableControl(IDC_SUBTASKPROCESSED_STATIC, 0.5, 0.0, 0.5, 0);
  840
  841         AddResizableControl(IDC_SUBTASKTIME_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  842         AddResizableControl(IDC_SUBTASKTIME_STATIC, 0.5, 0.0, 0.5, 0);
  843
  844         AddResizableControl(IDC_SUBTASKTRANSFER_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  845         AddResizableControl(IDC_SUBTASKTRANSFER_STATIC, 0.5, 0.0, 0.5, 0);
  846
  847         AddResizableControl(IDC_CURRENTOBJECT_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  848         AddResizableControl(IDC_CURRENTOBJECT_PROGRESS, 0.5, 0.0, 0.5, 0);
  849
  850         AddResizableControl(IDC_SUBTASKCOUNT_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  851         AddResizableControl(IDC_SUBTASKCOUNT_PROGRESS, 0.5, 0.0, 0.5, 0);
  852
  853         AddResizableControl(IDC_SUBTASKSIZE_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  854         AddResizableControl(IDC_SUBTASKSIZE_PROGRESS, 0.5, 0.0, 0.5, 0);
  855
  856         // right part of the dialog (task stats)
  857         AddResizableControl(IDC_ENTIRETASK_GROUP_STATIC, 0.5, 0.0, 0.5, 0);
  858
  859         AddResizableControl(IDC_TASKPROCESSED_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  860         AddResizableControl(IDC_TASKPROCESSED_STATIC, 0.5, 0.0, 0.5, 0);
  861
  862         AddResizableControl(IDC_TASKTIME_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  863         AddResizableControl(IDC_TASKTIME_STATIC, 0.5, 0.0, 0.5, 0);
  864
  865         AddResizableControl(IDC_TASKTRANSFER_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  866         AddResizableControl(IDC_TASKTRANSFER_STATIC, 0.5, 0.0, 0.5, 0);
  867
  868         AddResizableControl(IDC_TASKCOUNT_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  869         AddResizableControl(IDC_TASKCOUNT_PROGRESS, 0.5, 0.0, 0.5, 0);
  870
  871         AddResizableControl(IDC_TASKSIZE_LABEL_STATIC, 0.5, 0.0, 0.0, 0);
  872         AddResizableControl(IDC_TASKSIZE_PROGRESS, 0.5, 0.0, 0.5, 0);
  873
  874         AddResizableControl(IDC_SHOW_LOG_BUTTON, 1.0, 0.0, 0.0, 0);
  875         AddResizableControl(IDC_STICK_BUTTON, 1.0, 1.0, 0, 0);
  876
934 877         InitializeResizableControls();
935 878 }
936 879
937 880 CString CStatusDlg::GetStatusString(const chcore::TASK_DISPLAY_DATA& rTaskDisplayData)
938 881 {
939 882         CString strStatusText;
940 883         // status string
941 884         // first
942 885         switch(rTaskDisplayData.m_eTaskState)
943 886         {
944 887         case chcore::eTaskState_Error:
945 888                 {
946 889                         strStatusText = GetResManager().LoadString(IDS_STATUS_ERROR_STRING);
947 890                         strStatusText += _T("/");
948 891                         break;
949 892                 }
950 893         case chcore::eTaskState_Paused:
951 894                 {
952 895                         strStatusText = GetResManager().LoadString(IDS_STATUS_PAUSED_STRING);
953 896                         strStatusText += _T("/");
 
998 941         else
999 942                 strStatusText += GetResManager().LoadString(IDS_STATUS_UNKNOWN_STRING);
1000 943
1001 944         if(rTaskDisplayData.m_pafFilters && !rTaskDisplayData.m_pafFilters->IsEmpty())
1002 945                 strStatusText += GetResManager().LoadString(IDS_FILTERING_STRING);
1003 946
1004 947         // third part
1005 948         if(rTaskDisplayData.m_bIgnoreDirectories)
1006 949         {
1007 950                 strStatusText += _T("/");
1008 951                 strStatusText += GetResManager().LoadString(IDS_STATUS_ONLY_FILES_STRING);
1009 952         }
1010 953         if(rTaskDisplayData.m_bCreateEmptyFiles)
1011 954         {
1012 955                 strStatusText += _T("/");
1013 956                 strStatusText += GetResManager().LoadString(IDS_STATUS_WITHOUT_CONTENTS_STRING);
1014 957         }
1015 958
1016 959         return strStatusText;
1017 960 }
  961
  962 void CStatusDlg::SetTaskListEntry(const chcore::TASK_DISPLAY_DATA &td, int nPos, const chcore::TTaskPtr& spTask)
  963 {
  964         // index subitem
  965         CString strStatusText = GetStatusString(td);
  966         CString strTemp;
  967         LVITEM lvi;
  968         lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
  969         lvi.iItem = nPos;
  970         lvi.iSubItem = 0;
  971         lvi.pszText = (PTSTR)(PCTSTR)strStatusText;
  972         lvi.cchTextMax = lstrlen(lvi.pszText);
  973         lvi.lParam = spTask->GetSessionUniqueID();
  974         lvi.iImage = GetImageFromStatus(td.m_eTaskState);
  975         if (nPos < m_ctlStatusList.GetItemCount())
  976                 m_ctlStatusList.SetItem(&lvi);
  977         else
  978                 m_ctlStatusList.InsertItem(&lvi);
  979
  980         // status subitem
  981         lvi.mask=LVIF_TEXT;
  982         lvi.iSubItem=1;
  983         if(td.m_strFileName.IsEmpty())
  984                 strTemp = GetResManager().LoadString(IDS_NONEINPUTFILE_STRING);
  985         else
  986                 strTemp = td.m_strFileName;
  987         lvi.pszText=strTemp.GetBuffer(0);
  988         strTemp.ReleaseBuffer();
  989         lvi.cchTextMax=lstrlen(lvi.pszText);
  990         m_ctlStatusList.SetItem(&lvi);
  991
  992         // insert 'file' subitem
  993         lvi.iSubItem=2;
  994         strTemp = td.m_pathDstPath.ToString();
  995         lvi.pszText=strTemp.GetBuffer(0);
  996         strTemp.ReleaseBuffer();
  997         lvi.cchTextMax=lstrlen(lvi.pszText);
  998         m_ctlStatusList.SetItem(&lvi);
  999
  1000         // insert dest subitem
  1001         lvi.iSubItem=3;
  1002         _itot(boost::numeric_cast<int>(td.m_dPercent), m_szData, 10);
  1003         _tcscat(m_szData, _T(" %"));
  1004         lvi.pszText=m_szData;
  1005         lvi.cchTextMax=lstrlen(lvi.pszText);
  1006         m_ctlStatusList.SetItem(&lvi);
  1007 }
  1008
  1009 CString CStatusDlg::GetProcessedText(unsigned long long ullProcessedCount, unsigned long long ullTotalCount, unsigned long long ullProcessedSize, unsigned long long ullTotalSize)
  1010 {
  1011         CString strTemp;
  1012         _sntprintf(m_szData, _MAX_PATH, _T("%ld/%ld ("), ullProcessedCount, ullTotalCount);
  1013         strTemp = CString(m_szData);
  1014         strTemp += GetSizeString(ullProcessedSize, m_szData, _MAX_PATH) + CString(_T("/"));
  1015         strTemp += GetSizeString(ullTotalSize, m_szData, _MAX_PATH) + CString(_T(")"));
  1016         return strTemp;
  1017 }
  1018
  1019 void CStatusDlg::UpdateTaskStatsDetails(chcore::TASK_DISPLAY_DATA &td, DWORD dwCurrentTime)
  1020 {
  1021         chcore::TSubTaskStatsSnapshot& tSubTaskStats = td.m_tTaskSnapshot.GetCurrentSubTaskStats();
  1022
  1023         // text progress
  1024         CString strProcessedText = GetProcessedText(tSubTaskStats.GetProcessedCount(), tSubTaskStats.GetTotalCount(), tSubTaskStats.GetProcessedSize(), tSubTaskStats.GetTotalSize());
  1025         GetDlgItem(IDC_SUBTASKPROCESSED_STATIC)->SetWindowText(strProcessedText);
  1026
  1027         // progress bars
  1028         m_ctlCurrentObjectProgress.SetProgress(tSubTaskStats.GetCurrentItemProcessedSize(), tSubTaskStats.GetCurrentItemTotalSize());
  1029         m_ctlSubTaskCountProgress.SetProgress(tSubTaskStats.GetProcessedCount(), tSubTaskStats.GetTotalCount());
  1030         m_ctlSubTaskSizeProgress.SetProgress(tSubTaskStats.GetProcessedSize(), tSubTaskStats.GetTotalSize());
  1031
  1032         // time information
  1033         unsigned long long timeTotalEstimated = tSubTaskStats.GetEstimatedTotalTime();
  1034         unsigned long long timeElapsed = tSubTaskStats.GetTimeElapsed();
  1035         unsigned long long timeRemaining = timeTotalEstimated - timeElapsed;
  1036
  1037         FormatTimeMiliseconds(timeElapsed, m_szTimeBuffer1, 40);
  1038         FormatTimeMiliseconds(timeTotalEstimated, m_szTimeBuffer2, 40);
  1039         FormatTimeMiliseconds(timeRemaining, m_szTimeBuffer3, 40);
  1040
  1041         _sntprintf(m_szData, _MAX_PATH, _T("%s / %s (%s)"), m_szTimeBuffer1, m_szTimeBuffer2, m_szTimeBuffer3);
  1042
  1043         GetDlgItem(IDC_SUBTASKTIME_STATIC)->SetWindowText(m_szData);
  1044
  1045         // speed information
  1046         CString strSizeSpeed;
  1047         CString strCountSpeed;
  1048
  1049         GetSizeString(tSubTaskStats.GetSizeSpeed(), m_szData, _MAX_PATH);
  1050         strSizeSpeed = m_szData;
  1051         GetSizeString(tSubTaskStats.GetAvgSizeSpeed(), m_szData, _MAX_PATH);
  1052         strSizeSpeed.AppendFormat(_T("/s (a: %s/s)"), m_szData);
  1053
  1054         strCountSpeed.Format(_T("%.2f/s (a: %.2f/s)"), tSubTaskStats.GetCountSpeed(), tSubTaskStats.GetAvgCountSpeed());
  1055         GetDlgItem(IDC_SUBTASKTRANSFER_STATIC)->SetWindowText(strSizeSpeed + _T("; ") + strCountSpeed);
  1056
  1057         //////////////////////////////////////////////////////
  1058         // data that can be changed by a thread
  1059         CString strStatusText = GetStatusString(td);
  1060         GetDlgItem(IDC_OPERATION_STATIC)->SetWindowText(strStatusText); // operation
  1061
  1062         if(td.m_strFullFilePath.IsEmpty())
  1063                 GetDlgItem(IDC_SOURCEOBJECT_STATIC)->SetWindowText(GetResManager().LoadString(IDS_NONEINPUTFILE_STRING));
  1064         else
  1065                 GetDlgItem(IDC_SOURCEOBJECT_STATIC)->SetWindowText(td.m_strFullFilePath);       // src object
  1066
  1067         // count of processed data/overall count of data
  1068         strProcessedText = GetProcessedText(td.m_stIndex, td.m_stSize, td.m_ullProcessedSize, td.m_ullSizeAll);
  1069         GetDlgItem(IDC_TASKPROCESSED_STATIC)->SetWindowText(strProcessedText);
  1070
  1071         // transfer
  1072         CString strSpeedText;
  1073         if (m_i64LastProcessed == 0)    // if first time - show average
  1074                 strSpeedText=GetSizeString( td.m_timeElapsed ? td.m_ullProcessedSize/td.m_timeElapsed : 0, m_szData, _MAX_PATH);        // last avg
  1075         else
  1076         {
  1077                 if ( (dwCurrentTime-m_dwLastUpdate) != 0)
  1078                         strSpeedText=GetSizeString( (static_cast<double>(td.m_ullProcessedSize) - static_cast<double>(m_i64LastProcessed))/(static_cast<double>(dwCurrentTime-m_dwLastUpdate)/1000.0), m_szData, _MAX_PATH);
  1079                 else
  1080                         strSpeedText=GetSizeString( 0ULL, m_szData, _MAX_PATH);
  1081         }
  1082
  1083         // avg transfer
  1084         GetDlgItem(IDC_TASKTRANSFER_STATIC)->SetWindowText(strSpeedText+_T("/s (")+CString(GetResManager().LoadString(IDS_AVERAGEWORD_STRING))
  1085                 +CString(GetSizeString(td.m_timeElapsed ? td.m_ullProcessedSize/td.m_timeElapsed : 0, m_szData, _MAX_PATH))+_T("/s )")
  1086                 );
  1087
  1088         // elapsed time / estimated total time (estimated time left)
  1089         FormatTime(td.m_timeElapsed, m_szTimeBuffer1, 40);
  1090         time_t timeTotal = (td.m_ullProcessedSize == 0) ? 0 : (long)(td.m_ullSizeAll * td.m_timeElapsed / td.m_ullProcessedSize);
  1091         FormatTime(timeTotal, m_szTimeBuffer2, 40);
  1092         FormatTime(std::max((time_t)0l, timeTotal - td.m_timeElapsed), m_szTimeBuffer3, 40);
  1093
  1094         _sntprintf(m_szData, _MAX_PATH, _T("%s / %s (%s)"), m_szTimeBuffer1, m_szTimeBuffer2, m_szTimeBuffer3);
  1095         GetDlgItem(IDC_TASKTIME_STATIC)->SetWindowText(m_szData);
  1096
  1097         // remember current processed data (used for calculating transfer)
  1098         m_i64LastProcessed=td.m_ullProcessedSize;
  1099
  1100         // set progress
  1101         m_ctlTaskCountProgress.SetPos(boost::numeric_cast<int>(td.m_dPercent));
  1102
  1103         SetBufferSizesString(td.m_iCurrentBufferSize, td.m_iCurrentBufferIndex);
  1104
  1105         GetDlgItem(IDC_DESTINATIONOBJECT_STATIC)->SetWindowText(td.m_pathDstPath.ToString());
  1106         GetDlgItem(IDC_THREADPRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(td.m_nPriority)));
  1107         GetDlgItem(IDC_TASKID_STATIC)->SetWindowText(td.m_strUniqueName);
  1108 }