QueueController.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <Common.h>
  5. #include <Queue.h>
  6. #include <TextsWin.h>
  7. #include <AssociatedStatusBar.hpp>
  8. #include "QueueController.h"
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. //---------------------------------------------------------------------------
  12. __fastcall TQueueController::TQueueController(TListView * ListView)
  13. {
  14. FListView = ListView;
  15. assert(FListView != NULL);
  16. assert(FListView->OnDblClick == NULL);
  17. FListView->OnDblClick = QueueViewDblClick;
  18. assert(FListView->OnKeyDown == NULL);
  19. FListView->OnKeyDown = QueueViewKeyDown;
  20. FQueueStatus = NULL;
  21. FOnChange = NULL;
  22. }
  23. //---------------------------------------------------------------------------
  24. __fastcall TQueueController::~TQueueController()
  25. {
  26. assert(FListView->OnDblClick == QueueViewDblClick);
  27. FListView->OnDblClick = NULL;
  28. assert(FListView->OnKeyDown == QueueViewKeyDown);
  29. FListView->OnKeyDown = NULL;
  30. }
  31. //---------------------------------------------------------------------------
  32. TQueueItemProxy * __fastcall TQueueController::QueueViewItemToQueueItem(
  33. TListItem * Item, bool * Detail)
  34. {
  35. assert(Item != NULL);
  36. bool ADetail = false;
  37. int Index = Item->Index;
  38. if (Index < FQueueStatus->ActiveCount * 2)
  39. {
  40. ADetail = ((Index % 2) > 0);
  41. Index /= 2;
  42. }
  43. else
  44. {
  45. Index -= FQueueStatus->ActiveCount;
  46. }
  47. if (Detail != NULL)
  48. {
  49. *Detail = ADetail;
  50. }
  51. return FQueueStatus->Items[Index];
  52. }
  53. //---------------------------------------------------------------------------
  54. TQueueOperation __fastcall TQueueController::DefaultOperation()
  55. {
  56. TQueueItemProxy * QueueItem;
  57. if (FListView->ItemFocused != NULL)
  58. {
  59. QueueItem = QueueViewItemToQueueItem(FListView->ItemFocused);
  60. switch (QueueItem->Status)
  61. {
  62. case TQueueItem::qsPending:
  63. return qoItemExecute;
  64. case TQueueItem::qsQuery:
  65. return qoItemQuery;
  66. case TQueueItem::qsError:
  67. return qoItemError;
  68. case TQueueItem::qsPrompt:
  69. return qoItemPrompt;
  70. }
  71. }
  72. return qoNone;
  73. }
  74. //---------------------------------------------------------------------------
  75. bool __fastcall TQueueController::AllowOperation(
  76. TQueueOperation Operation)
  77. {
  78. TQueueItemProxy * QueueItem = NULL;
  79. if (FListView->ItemFocused != NULL)
  80. {
  81. QueueItem = QueueViewItemToQueueItem(FListView->ItemFocused);
  82. }
  83. switch (Operation)
  84. {
  85. case qoItemUserAction:
  86. return (QueueItem != NULL) && TQueueItem::IsUserActionStatus(QueueItem->Status);
  87. case qoItemQuery:
  88. return (QueueItem != NULL) && (QueueItem->Status == TQueueItem::qsQuery);
  89. case qoItemError:
  90. return (QueueItem != NULL) && (QueueItem->Status == TQueueItem::qsError);
  91. case qoItemPrompt:
  92. return (QueueItem != NULL) && (QueueItem->Status == TQueueItem::qsPrompt);
  93. case qoItemDelete:
  94. return (QueueItem != NULL) && (QueueItem->Status != TQueueItem::qsDone) &&
  95. !TQueueItem::IsUserActionStatus(QueueItem->Status);
  96. case qoItemExecute:
  97. return (QueueItem != NULL) && (QueueItem->Status == TQueueItem::qsPending);
  98. case qoItemUp:
  99. return (QueueItem != NULL) &&
  100. (QueueItem->Status == TQueueItem::qsPending) &&
  101. (FListView->ItemFocused->Index > (FQueueStatus->ActiveCount * 2));
  102. case qoItemDown:
  103. return (QueueItem != NULL) &&
  104. (QueueItem->Status == TQueueItem::qsPending) &&
  105. (FListView->ItemFocused->Index < (FListView->Items->Count - 1));
  106. default:
  107. assert(false);
  108. return false;
  109. }
  110. }
  111. //---------------------------------------------------------------------------
  112. void __fastcall TQueueController::ExecuteOperation(TQueueOperation Operation)
  113. {
  114. TQueueItemProxy * QueueItem = NULL;
  115. if (FListView->ItemFocused != NULL)
  116. {
  117. QueueItem = QueueViewItemToQueueItem(FListView->ItemFocused);
  118. }
  119. if (QueueItem != NULL)
  120. {
  121. switch (Operation)
  122. {
  123. case qoItemUserAction:
  124. case qoItemQuery:
  125. case qoItemError:
  126. case qoItemPrompt:
  127. QueueItem->ProcessUserAction();
  128. break;
  129. case qoItemExecute:
  130. QueueItem->ExecuteNow();
  131. break;
  132. case qoItemUp:
  133. case qoItemDown:
  134. QueueItem->Move(Operation == qoItemUp);
  135. break;
  136. case qoItemDelete:
  137. QueueItem->Delete();
  138. break;
  139. default:
  140. assert(false);
  141. break;
  142. }
  143. }
  144. }
  145. //---------------------------------------------------------------------------
  146. void __fastcall TQueueController::FillQueueViewItem(TListItem * Item,
  147. TQueueItemProxy * QueueItem, bool Detail)
  148. {
  149. assert(!Detail || (QueueItem->Status != TQueueItem::qsPending));
  150. assert((Item->Data == NULL) || (Item->Data == QueueItem));
  151. Item->Data = QueueItem;
  152. AnsiString ProgressStr;
  153. int State = -1;
  154. switch (QueueItem->Status)
  155. {
  156. case TQueueItem::qsPending:
  157. ProgressStr = LoadStr(QUEUE_PENDING);
  158. break;
  159. case TQueueItem::qsConnecting:
  160. ProgressStr = LoadStr(QUEUE_CONNECTING);
  161. break;
  162. case TQueueItem::qsQuery:
  163. ProgressStr = LoadStr(QUEUE_QUERY);
  164. State = 4;
  165. break;
  166. case TQueueItem::qsError:
  167. ProgressStr = LoadStr(QUEUE_ERROR);
  168. State = 5;
  169. break;
  170. case TQueueItem::qsPrompt:
  171. ProgressStr = LoadStr(QUEUE_PROMPT);
  172. State = 6;
  173. break;
  174. }
  175. bool BlinkHide = TQueueItem::IsUserActionStatus(QueueItem->Status) &&
  176. !QueueItem->ProcessingUserAction &&
  177. ((GetTickCount() % 1000) >= 500);
  178. int Image = -1;
  179. AnsiString Values[4];
  180. TFileOperationProgressType * ProgressData = QueueItem->ProgressData;
  181. TQueueItem::TInfo * Info = QueueItem->Info;
  182. if (!Detail)
  183. {
  184. switch (Info->Operation)
  185. {
  186. case foCopy:
  187. Image = 2;
  188. break;
  189. case foMove:
  190. Image = 3;
  191. break;
  192. }
  193. State = ((Info->Side == osLocal) ? 1 : 0);
  194. Values[0] = Info->Source;
  195. Values[1] = Info->Destination;
  196. if (ProgressData != NULL)
  197. {
  198. Values[2] = FormatBytes(ProgressData->TotalTransfered);
  199. if (ProgressStr.IsEmpty())
  200. {
  201. ProgressStr = FORMAT("%d%%", (ProgressData->OverallProgress()));
  202. }
  203. }
  204. Values[3] = ProgressStr;
  205. }
  206. else
  207. {
  208. if (ProgressData != NULL)
  209. {
  210. Values[0] = ProgressData->FileName;
  211. Values[2] = FormatBytes(ProgressData->TransferedSize);
  212. Values[3] = FORMAT("%d%%", (ProgressData->TransferProgress()));
  213. }
  214. else
  215. {
  216. Values[0] = ProgressStr;
  217. }
  218. }
  219. Item->StateIndex = (!BlinkHide ? State : -1);
  220. Item->ImageIndex = (!BlinkHide ? Image : -1);
  221. for (int Index = 0; Index < LENOF(Values); Index++)
  222. {
  223. if (Index < Item->SubItems->Count)
  224. {
  225. Item->SubItems->Strings[Index] = Values[Index];
  226. }
  227. else
  228. {
  229. Item->SubItems->Add(Values[Index]);
  230. }
  231. }
  232. }
  233. //---------------------------------------------------------------------------
  234. void __fastcall TQueueController::UpdateQueueStatus(
  235. TTerminalQueueStatus * QueueStatus)
  236. {
  237. FQueueStatus = QueueStatus;
  238. if (FQueueStatus != NULL)
  239. {
  240. TQueueItemProxy * QueueItem;
  241. TListItem * Item;
  242. int Index = 0;
  243. for (int ItemIndex = 0; ItemIndex < FQueueStatus->Count; ItemIndex++)
  244. {
  245. QueueItem = FQueueStatus->Items[ItemIndex];
  246. int Index2 = Index;
  247. while ((Index2 < FListView->Items->Count) &&
  248. (FListView->Items->Item[Index2]->Data != QueueItem))
  249. {
  250. Index2++;
  251. }
  252. if (Index2 < FListView->Items->Count)
  253. {
  254. while (Index < Index2)
  255. {
  256. FListView->Items->Delete(Index);
  257. Index2--;
  258. }
  259. }
  260. if (Index == FListView->Items->Count)
  261. {
  262. Item = FListView->Items->Add();
  263. }
  264. else if (FListView->Items->Item[Index]->Data != QueueItem)
  265. {
  266. Item = FListView->Items->Insert(Index);
  267. }
  268. else
  269. {
  270. Item = FListView->Items->Item[Index];
  271. assert(Item->Data == QueueItem);
  272. }
  273. FillQueueViewItem(Item, QueueItem, false);
  274. Index++;
  275. assert((QueueItem->Status != TQueueItem::qsPending) ==
  276. (ItemIndex < FQueueStatus->ActiveCount));
  277. if (ItemIndex < FQueueStatus->ActiveCount)
  278. {
  279. if (Index == FListView->Items->Count)
  280. {
  281. Item = FListView->Items->Add();
  282. }
  283. else if (FListView->Items->Item[Index]->Data != QueueItem)
  284. {
  285. Item = FListView->Items->Insert(Index);
  286. }
  287. else
  288. {
  289. Item = FListView->Items->Item[Index];
  290. assert(Item->Data == QueueItem);
  291. }
  292. FillQueueViewItem(Item, QueueItem, true);
  293. Index++;
  294. }
  295. }
  296. while (Index < FListView->Items->Count)
  297. {
  298. FListView->Items->Delete(Index);
  299. }
  300. }
  301. else
  302. {
  303. FListView->Items->Clear();
  304. }
  305. DoChange();
  306. }
  307. //---------------------------------------------------------------------------
  308. void __fastcall TQueueController::RefreshQueueItem(TQueueItemProxy * QueueItem)
  309. {
  310. TListItem * NextListItem = NULL;
  311. TListItem * ListItem;
  312. ListItem = FListView->FindData(0, QueueItem, true, false);
  313. assert(ListItem != NULL);
  314. int ItemIndex = ListItem->Index;
  315. if (ItemIndex + 1 < FListView->Items->Count)
  316. {
  317. NextListItem = FListView->Items->Item[ItemIndex + 1];
  318. if (NextListItem->Data != QueueItem)
  319. {
  320. NextListItem = NULL;
  321. }
  322. }
  323. FillQueueViewItem(ListItem, QueueItem, false);
  324. if (NextListItem == NULL)
  325. {
  326. NextListItem = FListView->Items->Insert(ItemIndex + 1);
  327. }
  328. FillQueueViewItem(NextListItem, QueueItem, true);
  329. DoChange();
  330. }
  331. //---------------------------------------------------------------------------
  332. void __fastcall TQueueController::DoChange()
  333. {
  334. if (FOnChange != NULL)
  335. {
  336. FOnChange(NULL);
  337. }
  338. }
  339. //---------------------------------------------------------------------------
  340. void __fastcall TQueueController::QueueViewDblClick(TObject * /*Sender*/)
  341. {
  342. TQueueOperation Operation = DefaultOperation();
  343. if (Operation != qoNone)
  344. {
  345. ExecuteOperation(Operation);
  346. }
  347. }
  348. //---------------------------------------------------------------------------
  349. void __fastcall TQueueController::QueueViewKeyDown(TObject * /*Sender*/,
  350. WORD & Key, TShiftState /*Shift*/)
  351. {
  352. if (Key == VK_RETURN)
  353. {
  354. TQueueOperation Operation = DefaultOperation();
  355. if (Operation != qoNone)
  356. {
  357. ExecuteOperation(Operation);
  358. }
  359. Key = 0;
  360. }
  361. else if (Key == VK_DELETE)
  362. {
  363. ExecuteOperation(qoItemDelete);
  364. Key = 0;
  365. }
  366. }