OSDN Git Service

Webpage Compare: Add support for generating report files (#1941)
[winmerge-jp/winmerge-jp.git] / Src / DirCompProgressBar.cpp
1 /** 
2  * @file  DirCompProgressBar.cpp
3  *
4  * @brief Implementation file for Directory compare state dialog
5  */
6
7 #include "stdafx.h"
8 #include "DirCompProgressBar.h"
9 #include "CompareStats.h"
10 #include "DiffContext.h"
11 #include "paths.h"
12
13 #ifdef _DEBUG
14 #define new DEBUG_NEW
15 #endif
16
17 /** @brief ID for timer updating UI. */
18 static const UINT IDT_UPDATE = 1;
19
20 /** @brief Interval (in milliseconds) for UI updates. */
21 static const UINT UPDATE_INTERVAL = 600;
22
23 /** @brief Reset all UI fields to zero. */
24 void DirCompProgressBar::ClearStat()
25 {
26         CProgressCtrl *pProg = (CProgressCtrl*) GetDlgItem(IDC_PROGRESSCOMPARE);
27         pProg->SetPos(0);
28
29         SetDlgItemInt(IDC_ITEMSCOMPARED, 0);
30         SetDlgItemInt(IDC_ITEMSTOTAL, 0);
31
32         m_prevState = CompareStats::STATE_IDLE;
33 }
34
35 /**
36  * @brief Constructor.
37  * @param [in] pParent Parent window for progress dialog.
38  */
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)
45 #endif
46 {
47 }
48
49 DirCompProgressBar::~DirCompProgressBar()
50 {
51 #ifdef __ITaskbarList3_INTERFACE_DEFINED__
52         if (m_pTaskbarList != nullptr)
53         {
54                 m_pTaskbarList->SetProgressState(AfxGetMainWnd()->m_hWnd, TBPF_NOPROGRESS);
55                 m_pTaskbarList->Release();
56         }
57 #endif
58 }
59
60 BEGIN_MESSAGE_MAP(DirCompProgressBar, CTrDialogBar)
61         //{{AFX_MSG_MAP(DirCompProgressBar)
62         ON_WM_WINDOWPOSCHANGING()
63         ON_WM_TIMER()
64         //}}AFX_MSG_MAP
65 END_MESSAGE_MAP()
66
67 /////////////////////////////////////////////////////////////////////////////
68
69 /**
70  * @brief Initialize the dialog.
71  * Center the dialog to main window.
72  * @return TRUE (see the comment inside function).
73  */
74 BOOL DirCompProgressBar::Create(CWnd* pParentWnd)
75 {
76         if (! CTrDialogBar::Create(pParentWnd, DirCompProgressBar::IDD, 
77                         CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY, DirCompProgressBar::IDD))
78                 return FALSE; 
79
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);
84 #endif
85
86         return TRUE;  // return TRUE unless you set the focus to a control
87                       // EXCEPTION: OCX Property Pages should return FALSE
88 }
89
90 void DirCompProgressBar::SetProgressState(int comparedItems, int totalItems)
91 {
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);
97
98 #ifdef __ITaskbarList3_INTERFACE_DEFINED__
99         if (m_pTaskbarList != nullptr)
100                 m_pTaskbarList->SetProgressValue(AfxGetMainWnd()->m_hWnd, comparedItems, totalItems);
101 #endif
102 }
103
104 /**
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.
108  */
109 void DirCompProgressBar::OnTimer(UINT_PTR nIDEvent)
110 {
111         if (nIDEvent == IDT_UPDATE)
112         {
113                 const CompareStats::CMP_STATE state = m_pCompareStats->GetCompareState();
114                 
115                 // New compare started
116                 if (m_prevState == CompareStats::STATE_IDLE &&
117                         state == CompareStats::STATE_START)
118                 {
119                         m_prevState = CompareStats::STATE_START;
120                 }
121                 // Collecting items to compare
122                 else if (m_prevState == CompareStats::STATE_START &&
123                         state == CompareStats::STATE_START)
124                 {
125                         SetProgressState(0, m_pCompareStats->GetTotalItems());
126                 }
127                 // Started comparing items
128                 else if ((m_prevState == CompareStats::STATE_START ||
129                                 m_prevState == CompareStats::STATE_IDLE) &&
130                                 state == CompareStats::STATE_COMPARE)
131                 {
132                         // Start comparing, init progressDlg
133                         SetProgressState(m_pCompareStats->GetComparedItems(), m_pCompareStats->GetTotalItems());
134                         m_prevState = CompareStats::STATE_COMPARE;
135                 }
136                 // Comparing items
137                 else if (m_prevState == CompareStats::STATE_COMPARE &&
138                                 state == CompareStats::STATE_COMPARE)
139                 {
140                         SetProgressState(m_pCompareStats->GetComparedItems(), m_pCompareStats->GetTotalItems());
141                         const DIFFITEM *pdi = m_pCompareStats->GetCurDiffItem();
142                         if (pdi != nullptr)
143                                 SetDlgItemText(IDC_PATH_COMPARING, pdi->diffFileInfo[0].GetFile());
144                 }
145                 // Compare is ready
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() )
150                 {
151                         SetProgressState(m_pCompareStats->GetComparedItems(), m_pCompareStats->GetTotalItems());
152                         EndUpdating();
153                         m_prevState = CompareStats::STATE_COMPARE;
154                         m_bCompareReady = true;
155                 }
156         }
157         else
158                 CDialogBar::OnTimer(nIDEvent);
159 }
160
161 /**
162  * @brief Start timer for UI updating.
163  */
164 void DirCompProgressBar::StartUpdating()
165 {
166         ClearStat();
167         SetTimer(IDT_UPDATE, UPDATE_INTERVAL, nullptr);
168 }
169
170 /**
171  * @brief Stop timer updating UI.
172  */
173 void DirCompProgressBar::EndUpdating()
174 {
175         KillTimer(IDT_UPDATE);
176 }
177
178 void DirCompProgressBar::SetPaused(bool paused)
179 {
180         GetDlgItem(IDC_COMPARISON_PAUSE)->ShowWindow(paused ? SW_HIDE : SW_SHOW);
181         GetDlgItem(IDC_COMPARISON_CONTINUE)->ShowWindow(paused ? SW_SHOW : SW_HIDE);
182 }