xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/ProgressDialog.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ProgressDialog.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "resource.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "ProgressDialog.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker extern HINSTANCE g_hInstance;
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker static const UINT_PTR kTimerID = 3;
16*f6dc9357SAndroid Build Coastguard Worker static const UINT kTimerElapse = 100;
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
19*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
20*f6dc9357SAndroid Build Coastguard Worker #endif
21*f6dc9357SAndroid Build Coastguard Worker 
ProcessStopAndPause()22*f6dc9357SAndroid Build Coastguard Worker HRESULT CProgressSync::ProcessStopAndPause()
23*f6dc9357SAndroid Build Coastguard Worker {
24*f6dc9357SAndroid Build Coastguard Worker   for (;;)
25*f6dc9357SAndroid Build Coastguard Worker   {
26*f6dc9357SAndroid Build Coastguard Worker     if (GetStopped())
27*f6dc9357SAndroid Build Coastguard Worker       return E_ABORT;
28*f6dc9357SAndroid Build Coastguard Worker     if (!GetPaused())
29*f6dc9357SAndroid Build Coastguard Worker       break;
30*f6dc9357SAndroid Build Coastguard Worker     ::Sleep(100);
31*f6dc9357SAndroid Build Coastguard Worker   }
32*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
33*f6dc9357SAndroid Build Coastguard Worker }
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
~CProgressDialog()36*f6dc9357SAndroid Build Coastguard Worker CProgressDialog::~CProgressDialog()
37*f6dc9357SAndroid Build Coastguard Worker {
38*f6dc9357SAndroid Build Coastguard Worker   AddToTitle(L"");
39*f6dc9357SAndroid Build Coastguard Worker }
AddToTitle(LPCWSTR s)40*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::AddToTitle(LPCWSTR s)
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker   if (MainWindow != 0)
43*f6dc9357SAndroid Build Coastguard Worker     MySetWindowText(MainWindow, UString(s) + MainTitle);
44*f6dc9357SAndroid Build Coastguard Worker }
45*f6dc9357SAndroid Build Coastguard Worker #endif
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker #define UNDEFINED_VAL ((UInt64)(Int64)-1)
49*f6dc9357SAndroid Build Coastguard Worker 
OnInit()50*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnInit()
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker   _range = UNDEFINED_VAL;
53*f6dc9357SAndroid Build Coastguard Worker   _prevPercentValue = UNDEFINED_VAL;
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   _wasCreated = true;
56*f6dc9357SAndroid Build Coastguard Worker   _dialogCreatedEvent.Set();
57*f6dc9357SAndroid Build Coastguard Worker 
58*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_LANG
59*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems(*this, NULL, 0);
60*f6dc9357SAndroid Build Coastguard Worker   #endif
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker   m_ProgressBar.Attach(GetItem(IDC_PROGRESS1));
63*f6dc9357SAndroid Build Coastguard Worker 
64*f6dc9357SAndroid Build Coastguard Worker   if (IconID >= 0)
65*f6dc9357SAndroid Build Coastguard Worker   {
66*f6dc9357SAndroid Build Coastguard Worker     HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IconID));
67*f6dc9357SAndroid Build Coastguard Worker     SetIcon(ICON_BIG, icon);
68*f6dc9357SAndroid Build Coastguard Worker   }
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker   _timer = SetTimer(kTimerID, kTimerElapse);
71*f6dc9357SAndroid Build Coastguard Worker   SetText(_title);
72*f6dc9357SAndroid Build Coastguard Worker   CheckNeedClose();
73*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnInit();
74*f6dc9357SAndroid Build Coastguard Worker }
75*f6dc9357SAndroid Build Coastguard Worker 
OnCancel()76*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::OnCancel() { Sync.SetStopped(true); }
OnOK()77*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::OnOK() { }
78*f6dc9357SAndroid Build Coastguard Worker 
SetRange(UInt64 range)79*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetRange(UInt64 range)
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker   _range = range;
82*f6dc9357SAndroid Build Coastguard Worker   _peviousPos = (UInt64)(Int64)-1;
83*f6dc9357SAndroid Build Coastguard Worker   _converter.Init(range);
84*f6dc9357SAndroid Build Coastguard Worker   m_ProgressBar.SetRange32(0 , _converter.Count(range)); // Test it for 100%
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker 
SetPos(UInt64 pos)87*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetPos(UInt64 pos)
88*f6dc9357SAndroid Build Coastguard Worker {
89*f6dc9357SAndroid Build Coastguard Worker   bool redraw = true;
90*f6dc9357SAndroid Build Coastguard Worker   if (pos < _range && pos > _peviousPos)
91*f6dc9357SAndroid Build Coastguard Worker   {
92*f6dc9357SAndroid Build Coastguard Worker     UInt64 posDelta = pos - _peviousPos;
93*f6dc9357SAndroid Build Coastguard Worker     if (posDelta < (_range >> 10))
94*f6dc9357SAndroid Build Coastguard Worker       redraw = false;
95*f6dc9357SAndroid Build Coastguard Worker   }
96*f6dc9357SAndroid Build Coastguard Worker   if (redraw)
97*f6dc9357SAndroid Build Coastguard Worker   {
98*f6dc9357SAndroid Build Coastguard Worker     m_ProgressBar.SetPos(_converter.Count(pos));  // Test it for 100%
99*f6dc9357SAndroid Build Coastguard Worker     _peviousPos = pos;
100*f6dc9357SAndroid Build Coastguard Worker   }
101*f6dc9357SAndroid Build Coastguard Worker }
102*f6dc9357SAndroid Build Coastguard Worker 
OnTimer(WPARAM,LPARAM)103*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */)
104*f6dc9357SAndroid Build Coastguard Worker {
105*f6dc9357SAndroid Build Coastguard Worker   if (Sync.GetPaused())
106*f6dc9357SAndroid Build Coastguard Worker     return true;
107*f6dc9357SAndroid Build Coastguard Worker 
108*f6dc9357SAndroid Build Coastguard Worker   CheckNeedClose();
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker   UInt64 total, completed;
111*f6dc9357SAndroid Build Coastguard Worker   Sync.GetProgress(total, completed);
112*f6dc9357SAndroid Build Coastguard Worker   if (total != _range)
113*f6dc9357SAndroid Build Coastguard Worker     SetRange(total);
114*f6dc9357SAndroid Build Coastguard Worker   SetPos(completed);
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker   if (total == 0)
117*f6dc9357SAndroid Build Coastguard Worker     total = 1;
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker   const UInt64 percentValue = completed * 100 / total;
120*f6dc9357SAndroid Build Coastguard Worker   if (percentValue != _prevPercentValue)
121*f6dc9357SAndroid Build Coastguard Worker   {
122*f6dc9357SAndroid Build Coastguard Worker     wchar_t s[64];
123*f6dc9357SAndroid Build Coastguard Worker     ConvertUInt64ToString(percentValue, s);
124*f6dc9357SAndroid Build Coastguard Worker     UString title = s;
125*f6dc9357SAndroid Build Coastguard Worker     title += "% ";
126*f6dc9357SAndroid Build Coastguard Worker     SetText(title + _title);
127*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_SFX
128*f6dc9357SAndroid Build Coastguard Worker     AddToTitle(title + MainAddTitle);
129*f6dc9357SAndroid Build Coastguard Worker     #endif
130*f6dc9357SAndroid Build Coastguard Worker     _prevPercentValue = percentValue;
131*f6dc9357SAndroid Build Coastguard Worker   }
132*f6dc9357SAndroid Build Coastguard Worker   return true;
133*f6dc9357SAndroid Build Coastguard Worker }
134*f6dc9357SAndroid Build Coastguard Worker 
OnMessage(UINT message,WPARAM wParam,LPARAM lParam)135*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
136*f6dc9357SAndroid Build Coastguard Worker {
137*f6dc9357SAndroid Build Coastguard Worker   switch (message)
138*f6dc9357SAndroid Build Coastguard Worker   {
139*f6dc9357SAndroid Build Coastguard Worker     case kCloseMessage:
140*f6dc9357SAndroid Build Coastguard Worker     {
141*f6dc9357SAndroid Build Coastguard Worker       if (_timer)
142*f6dc9357SAndroid Build Coastguard Worker       {
143*f6dc9357SAndroid Build Coastguard Worker         KillTimer(kTimerID);
144*f6dc9357SAndroid Build Coastguard Worker         _timer = 0;
145*f6dc9357SAndroid Build Coastguard Worker       }
146*f6dc9357SAndroid Build Coastguard Worker       if (_inCancelMessageBox)
147*f6dc9357SAndroid Build Coastguard Worker       {
148*f6dc9357SAndroid Build Coastguard Worker         _externalCloseMessageWasReceived = true;
149*f6dc9357SAndroid Build Coastguard Worker         break;
150*f6dc9357SAndroid Build Coastguard Worker       }
151*f6dc9357SAndroid Build Coastguard Worker       return OnExternalCloseMessage();
152*f6dc9357SAndroid Build Coastguard Worker     }
153*f6dc9357SAndroid Build Coastguard Worker     /*
154*f6dc9357SAndroid Build Coastguard Worker     case WM_SETTEXT:
155*f6dc9357SAndroid Build Coastguard Worker     {
156*f6dc9357SAndroid Build Coastguard Worker       if (_timer == 0)
157*f6dc9357SAndroid Build Coastguard Worker         return true;
158*f6dc9357SAndroid Build Coastguard Worker     }
159*f6dc9357SAndroid Build Coastguard Worker     */
160*f6dc9357SAndroid Build Coastguard Worker   }
161*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnMessage(message, wParam, lParam);
162*f6dc9357SAndroid Build Coastguard Worker }
163*f6dc9357SAndroid Build Coastguard Worker 
OnButtonClicked(unsigned buttonID,HWND buttonHWND)164*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
165*f6dc9357SAndroid Build Coastguard Worker {
166*f6dc9357SAndroid Build Coastguard Worker   switch (buttonID)
167*f6dc9357SAndroid Build Coastguard Worker   {
168*f6dc9357SAndroid Build Coastguard Worker     case IDCANCEL:
169*f6dc9357SAndroid Build Coastguard Worker     {
170*f6dc9357SAndroid Build Coastguard Worker       bool paused = Sync.GetPaused();
171*f6dc9357SAndroid Build Coastguard Worker       Sync.SetPaused(true);
172*f6dc9357SAndroid Build Coastguard Worker       _inCancelMessageBox = true;
173*f6dc9357SAndroid Build Coastguard Worker       int res = ::MessageBoxW(*this, L"Are you sure you want to cancel?", _title, MB_YESNOCANCEL);
174*f6dc9357SAndroid Build Coastguard Worker       _inCancelMessageBox = false;
175*f6dc9357SAndroid Build Coastguard Worker       Sync.SetPaused(paused);
176*f6dc9357SAndroid Build Coastguard Worker       if (res == IDCANCEL || res == IDNO)
177*f6dc9357SAndroid Build Coastguard Worker       {
178*f6dc9357SAndroid Build Coastguard Worker         if (_externalCloseMessageWasReceived)
179*f6dc9357SAndroid Build Coastguard Worker           OnExternalCloseMessage();
180*f6dc9357SAndroid Build Coastguard Worker         return true;
181*f6dc9357SAndroid Build Coastguard Worker       }
182*f6dc9357SAndroid Build Coastguard Worker       break;
183*f6dc9357SAndroid Build Coastguard Worker     }
184*f6dc9357SAndroid Build Coastguard Worker   }
185*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
186*f6dc9357SAndroid Build Coastguard Worker }
187*f6dc9357SAndroid Build Coastguard Worker 
CheckNeedClose()188*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::CheckNeedClose()
189*f6dc9357SAndroid Build Coastguard Worker {
190*f6dc9357SAndroid Build Coastguard Worker   if (_needClose)
191*f6dc9357SAndroid Build Coastguard Worker   {
192*f6dc9357SAndroid Build Coastguard Worker     PostMsg(kCloseMessage);
193*f6dc9357SAndroid Build Coastguard Worker     _needClose = false;
194*f6dc9357SAndroid Build Coastguard Worker   }
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker 
OnExternalCloseMessage()197*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnExternalCloseMessage()
198*f6dc9357SAndroid Build Coastguard Worker {
199*f6dc9357SAndroid Build Coastguard Worker   End(0);
200*f6dc9357SAndroid Build Coastguard Worker   return true;
201*f6dc9357SAndroid Build Coastguard Worker }
202