1
0

SynchronizeProgress.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //---------------------------------------------------------------------------
  2. #include <FormsPCH.h>
  3. #pragma hdrstop
  4. #include "SynchronizeProgress.h"
  5. #include <Progress.h>
  6. //---------------------------------------------------------------------------
  7. #pragma package(smart_init)
  8. #pragma link "PathLabel"
  9. #pragma link "PngImageList"
  10. #pragma link "TB2Dock"
  11. #pragma link "TB2Item"
  12. #pragma link "TB2Toolbar"
  13. #pragma link "TBX"
  14. #pragma resource "*.dfm"
  15. //---------------------------------------------------------------------------
  16. // Used for comparing only
  17. __fastcall TSynchronizeProgressForm::TSynchronizeProgressForm(TComponent * Owner, bool AllowMinimize, int Files)
  18. : TForm(Owner)
  19. {
  20. FStarted = false;
  21. FCanceled = false;
  22. FShowAsModalStorage = NULL;
  23. FMinimizedByMe = false;
  24. bool KnowsTotalFiles = (Files >= 0);
  25. OperationProgress->Style = (KnowsTotalFiles ? pbstNormal : pbstMarquee);
  26. OperationProgress->Max = (KnowsTotalFiles ? Files : 1);
  27. TimeLeftLabelLabel->Visible = KnowsTotalFiles;
  28. TimeLeftLabel->Visible = KnowsTotalFiles;
  29. StartTimeLabelLabel->Visible = !KnowsTotalFiles;
  30. StartTimeLabel->Visible = !KnowsTotalFiles;
  31. UseSystemSettings(this);
  32. HideComponentsPanel(this);
  33. SelectScaledImageList(ImageList);
  34. if (!AllowMinimize)
  35. {
  36. MinimizeItem->Visible = false;
  37. }
  38. else
  39. {
  40. SetGlobalMinimizeHandler(this, GlobalMinimize);
  41. }
  42. FFrameAnimation.Init(AnimationPaintBox, L"SynchronizeDirectories");
  43. }
  44. //---------------------------------------------------------------------------
  45. __fastcall TSynchronizeProgressForm::~TSynchronizeProgressForm()
  46. {
  47. ClearGlobalMinimizeHandler(GlobalMinimize);
  48. ReleaseAsModal(this, FShowAsModalStorage);
  49. UnhookFormActivation(this);
  50. if (IsApplicationMinimized() && FMinimizedByMe)
  51. {
  52. ShowNotification(
  53. NULL, MainInstructions(LoadStr(BALLOON_OPERATION_COMPLETE)),
  54. qtInformation);
  55. }
  56. }
  57. //---------------------------------------------------------------------------
  58. void __fastcall TSynchronizeProgressForm::Start()
  59. {
  60. FStarted = true;
  61. FStartTime = Now();
  62. UpdateTimer->Enabled = true;
  63. StartTimeLabel->Caption = FStartTime.TimeString();
  64. OperationProgress->Position = OperationProgress->Min;
  65. UpdateControls();
  66. if (!IsApplicationMinimized())
  67. {
  68. // Do not show the progress when the application is minimized,
  69. // otherwise the form popups up unminimized.
  70. // Quick and dirty hack: with this form, we do not support showing it
  71. // once the application restores,
  72. // otherwise we would have to synchronize it somehow with the TProgressForm,
  73. // not to show it over the TProgressForm
  74. // See solution in TMessageForm::CMShowingChanged.
  75. ShowAsModal(this, FShowAsModalStorage);
  76. HookFormActivation(this);
  77. }
  78. FFrameAnimation.Start();
  79. }
  80. //---------------------------------------------------------------------------
  81. int __fastcall TSynchronizeProgressForm::SetData(
  82. const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory, int Progress, bool & Continue)
  83. {
  84. DebugAssert(FStarted);
  85. LocalDirectoryLabel->Caption = LocalDirectory;
  86. RemoteDirectoryLabel->Caption = RemoteDirectory;
  87. OperationProgress->Position = Progress;
  88. Continue = !FCanceled;
  89. UpdateControls();
  90. Application->ProcessMessages();
  91. return CalculateProgress();
  92. }
  93. //---------------------------------------------------------------------------
  94. int __fastcall TSynchronizeProgressForm::CalculateProgress()
  95. {
  96. return (((OperationProgress->Style == pbstMarquee) || (OperationProgress->Max == 0)) ? -1 : ((OperationProgress->Position * 100) / OperationProgress->Max));
  97. }
  98. //---------------------------------------------------------------------------
  99. void __fastcall TSynchronizeProgressForm::UpdateControls()
  100. {
  101. TDateTime Elapsed;
  102. UnicodeString ACaption = FormatFormCaption(this, LoadStr(SYNCHRONIZE_PROGRESS_COMPARE));
  103. if (FStarted)
  104. {
  105. Elapsed = Now() - FStartTime;
  106. int Progress = CalculateProgress();
  107. if (Progress >= 0)
  108. {
  109. ACaption = FORMAT(L"%d%% %s", (Progress, ACaption));
  110. }
  111. }
  112. else
  113. {
  114. Elapsed = EncodeTimeVerbose(0, 0, 0, 0);
  115. }
  116. Caption = ACaption;
  117. TimeElapsedLabel->Caption = FormatDateTimeSpan(Elapsed);
  118. UnicodeString TimeLeftCaption;
  119. int Position = OperationProgress->Position;
  120. if (FStarted && CanShowTimeEstimate(FStartTime) && (Position > 0))
  121. {
  122. TDateTime TimeLeft = TDateTime(double(double(Elapsed) * (OperationProgress->Max - Position) / Position));
  123. TimeLeftCaption = FormatDateTimeSpan(TimeLeft);
  124. }
  125. else
  126. {
  127. TimeLeftCaption = LoadStr(PROGRESS_TIME_LEFT_CALCULATING);
  128. }
  129. TimeLeftLabel->Caption = TimeLeftCaption;
  130. CancelItem->Enabled = !FCanceled;
  131. TProgressForm::SizeToolbar(this, Toolbar, Dock, ToolbarPanel);
  132. }
  133. //---------------------------------------------------------------------------
  134. void __fastcall TSynchronizeProgressForm::CancelOperation()
  135. {
  136. FCanceled = true;
  137. UpdateControls();
  138. }
  139. //---------------------------------------------------------------------------
  140. void __fastcall TSynchronizeProgressForm::UpdateTimerTimer(TObject * /*Sender*/)
  141. {
  142. UpdateControls();
  143. }
  144. //---------------------------------------------------------------------------
  145. void __fastcall TSynchronizeProgressForm::GlobalMinimize(TObject * /*Sender*/)
  146. {
  147. ApplicationMinimize();
  148. FMinimizedByMe = true;
  149. }
  150. //---------------------------------------------------------------------------
  151. void __fastcall TSynchronizeProgressForm::CMDialogKey(TCMDialogKey & Message)
  152. {
  153. if (Message.CharCode == VK_TAB)
  154. {
  155. Toolbar->KeyboardOpen(L'\0', false);
  156. Message.Result = 1;
  157. }
  158. else
  159. {
  160. TForm::Dispatch(&Message);
  161. }
  162. }
  163. //---------------------------------------------------------------------------
  164. void __fastcall TSynchronizeProgressForm::Dispatch(void * AMessage)
  165. {
  166. TMessage & Message = *reinterpret_cast<TMessage *>(AMessage);
  167. if (Message.Msg == WM_CLOSE)
  168. {
  169. CancelOperation();
  170. }
  171. else if (Message.Msg == CM_DIALOGKEY)
  172. {
  173. CMDialogKey(reinterpret_cast<TCMDialogKey &>(Message));
  174. }
  175. else
  176. {
  177. TForm::Dispatch(AMessage);
  178. }
  179. }
  180. //---------------------------------------------------------------------------
  181. void __fastcall TSynchronizeProgressForm::CancelItemClick(TObject * /*Sender*/)
  182. {
  183. CancelOperation();
  184. }
  185. //---------------------------------------------------------------------------
  186. void __fastcall TSynchronizeProgressForm::MinimizeItemClick(TObject * Sender)
  187. {
  188. CallGlobalMinimizeHandler(Sender);
  189. }
  190. //---------------------------------------------------------------------------