2 * @file DirCompProgressBar.cpp
4 * @brief Implementation file for Directory compare state dialog
8 #include "DirCompProgressBar.h"
9 #include "CompareStats.h"
10 #include "DiffContext.h"
17 /** @brief ID for timer updating UI. */
18 static const UINT IDT_UPDATE = 1;
20 /** @brief Interval (in milliseconds) for UI updates. */
21 static const UINT UPDATE_INTERVAL = 600;
23 /** @brief Reset all UI fields to zero. */
24 void DirCompProgressBar::ClearStat()
26 CProgressCtrl *pProg = (CProgressCtrl*) GetDlgItem(IDC_PROGRESSCOMPARE);
29 SetDlgItemInt(IDC_ITEMSCOMPARED, 0);
30 SetDlgItemInt(IDC_ITEMSTOTAL, 0);
32 m_prevState = CompareStats::STATE_IDLE;
37 * @param [in] pParent Parent window for progress dialog.
39 DirCompProgressBar::DirCompProgressBar()
40 : m_bCompareReady(false)
41 , m_prevState(CompareStats::STATE_IDLE)
42 , m_pCompareStats(nullptr)
43 #ifdef __ITaskbarList3_INTERFACE_DEFINED__
44 , m_pTaskbarList(nullptr)
49 DirCompProgressBar::~DirCompProgressBar()
51 #ifdef __ITaskbarList3_INTERFACE_DEFINED__
52 if (m_pTaskbarList != nullptr)
54 m_pTaskbarList->SetProgressState(AfxGetMainWnd()->m_hWnd, TBPF_NOPROGRESS);
55 m_pTaskbarList->Release();
60 BEGIN_MESSAGE_MAP(DirCompProgressBar, CTrDialogBar)
61 //{{AFX_MSG_MAP(DirCompProgressBar)
62 ON_WM_WINDOWPOSCHANGING()
67 /////////////////////////////////////////////////////////////////////////////
70 * @brief Initialize the dialog.
71 * Center the dialog to main window.
72 * @return TRUE (see the comment inside function).
74 BOOL DirCompProgressBar::Create(CWnd* pParentWnd)
76 if (! CTrDialogBar::Create(pParentWnd, DirCompProgressBar::IDD,
77 CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY, DirCompProgressBar::IDD))
80 #ifdef __ITaskbarList3_INTERFACE_DEFINED__
81 CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_ALL, IID_ITaskbarList3, (void**)&m_pTaskbarList);
82 if (m_pTaskbarList != nullptr)
83 m_pTaskbarList->SetProgressState(AfxGetMainWnd()->m_hWnd, TBPF_INDETERMINATE);
86 return TRUE; // return TRUE unless you set the focus to a control
87 // EXCEPTION: OCX Property Pages should return FALSE
90 void DirCompProgressBar::SetProgressState(int comparedItems, int totalItems)
92 CProgressCtrl *pProg = (CProgressCtrl*) GetDlgItem(IDC_PROGRESSCOMPARE);
93 SetDlgItemInt(IDC_ITEMSTOTAL, totalItems);
94 SetDlgItemInt(IDC_ITEMSCOMPARED, comparedItems);
95 pProg->SetPos(comparedItems);
96 pProg->SetRange32(0, totalItems);
98 #ifdef __ITaskbarList3_INTERFACE_DEFINED__
99 if (m_pTaskbarList != nullptr)
100 m_pTaskbarList->SetProgressValue(AfxGetMainWnd()->m_hWnd, comparedItems, totalItems);
105 * @brief Timer message received.
106 * Handle timer messages. When timer fires, update the dialog.
107 * @param [in] nIDEvent ID of the timer that fired.
109 void DirCompProgressBar::OnTimer(UINT_PTR nIDEvent)
111 if (nIDEvent == IDT_UPDATE)
113 const CompareStats::CMP_STATE state = m_pCompareStats->GetCompareState();
115 // New compare started
116 if (m_prevState == CompareStats::STATE_IDLE &&
117 state == CompareStats::STATE_START)
119 m_prevState = CompareStats::STATE_START;
121 // Collecting items to compare
122 else if (m_prevState == CompareStats::STATE_START &&
123 state == CompareStats::STATE_START)
125 SetProgressState(0, m_pCompareStats->GetTotalItems());
127 // Started comparing items
128 else if ((m_prevState == CompareStats::STATE_START ||
129 m_prevState == CompareStats::STATE_IDLE) &&
130 state == CompareStats::STATE_COMPARE)
132 // Start comparing, init progressDlg
133 SetProgressState(m_pCompareStats->GetComparedItems(), m_pCompareStats->GetTotalItems());
134 m_prevState = CompareStats::STATE_COMPARE;
137 else if (m_prevState == CompareStats::STATE_COMPARE &&
138 state == CompareStats::STATE_COMPARE)
140 SetProgressState(m_pCompareStats->GetComparedItems(), m_pCompareStats->GetTotalItems());
141 const DIFFITEM *pdi = m_pCompareStats->GetCurDiffItem();
143 SetDlgItemText(IDC_PATH_COMPARING, pdi->diffFileInfo[0].GetFile());
146 // Update total items too since we might get only this one state
147 // when compare is fast.
148 else if (state == CompareStats::STATE_IDLE &&
149 !m_bCompareReady && m_pCompareStats->IsCompareDone() )
151 SetProgressState(m_pCompareStats->GetComparedItems(), m_pCompareStats->GetTotalItems());
153 m_prevState = CompareStats::STATE_COMPARE;
154 m_bCompareReady = true;
158 CDialogBar::OnTimer(nIDEvent);
162 * @brief Start timer for UI updating.
164 void DirCompProgressBar::StartUpdating()
167 SetTimer(IDT_UPDATE, UPDATE_INTERVAL, nullptr);
171 * @brief Stop timer updating UI.
173 void DirCompProgressBar::EndUpdating()
175 KillTimer(IDT_UPDATE);
178 void DirCompProgressBar::SetPaused(bool paused)
180 GetDlgItem(IDC_COMPARISON_PAUSE)->ShowWindow(paused ? SW_HIDE : SW_SHOW);
181 GetDlgItem(IDC_COMPARISON_CONTINUE)->ShowWindow(paused ? SW_SHOW : SW_HIDE);