00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "Sheduler_Tasks.h"
00009 #include "ShedulerWnd.h"
00010 #include "plugincmds.h"
00011 #include "DownloadsWnd.h"
00012 #include "MainFrm.h"
00013 #include "SpiderWnd.h"
00014
00015 #ifdef _DEBUG
00016 #define new DEBUG_NEW
00017 #undef THIS_FILE
00018 static char THIS_FILE[] = __FILE__;
00019 #endif
00020
00021 extern CShedulerWnd* _pwndScheduler;
00022 extern CDownloadsWnd* _pwndDownloads;
00023 extern CSpiderWnd* _pwndSpider;
00024
00025 CSheduler_Tasks::CSheduler_Tasks()
00026 {
00027 }
00028
00029 CSheduler_Tasks::~CSheduler_Tasks()
00030 {
00031 }
00032
00033 BEGIN_MESSAGE_MAP(CSheduler_Tasks, CListCtrlEx)
00034
00035 ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
00036 ON_WM_RBUTTONDOWN()
00037 ON_COMMAND(ID_TASKS_DELETETASK, OnTasksDeletetask)
00038 ON_COMMAND(ID_CREATENEWTASK, OnCreatenewtask)
00039 ON_COMMAND(ID_TASKS_PROPERTIES, OnTasksProperties)
00040 ON_COMMAND(ID_TASKS_DISABLE, OnTasksDisable)
00041 ON_COMMAND(ID_TASKS_ENABLE, OnTasksEnable)
00042 ON_WM_DRAWITEM()
00043 ON_WM_MEASUREITEM()
00044
00045 END_MESSAGE_MAP()
00046
00047 BOOL CSheduler_Tasks::Create(CWnd *pParent)
00048 {
00049 CRect rc (0, 0, 50, 50);
00050
00051 if (FALSE == CListCtrl::Create (LVS_REPORT|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS|LVS_OWNERDRAWFIXED, rc, pParent, 0x7645329))
00052 return FALSE;
00053
00054 SetExtendedStyle (LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_INFOTIP);
00055
00056 m_images.Create (16, 17, ILC_COLOR24 | ILC_MASK, 2, 1);
00057 CBitmap bmp;
00058 bmp.Attach (SBMP (IDB_SHEDULER));
00059 m_images.Add (&bmp, RGB (255, 0, 255));
00060 SetImageList (&m_images, LVSIL_SMALL);
00061
00062 m_selImages.Create (16, 17, ILC_COLOR24 | ILC_MASK, 2, 1);
00063 CBitmap bmp1;
00064 bmp1.Attach (SBMP (IDB_SCHEDULER_SEL));
00065 m_selImages.Add (&bmp1, RGB (255, 0, 255));
00066 SetSelectedImages (&m_selImages);
00067
00068 InsertColumn (0, LS (L_WTS), LVCFMT_LEFT, 250, 0);
00069 InsertColumn (1, LS (L_HTS), LVCFMT_LEFT, 150, 0);
00070 InsertColumn (2, LS (L_NEXTSTART), LVCFMT_LEFT, 100, 0);
00071 InsertColumn (3, LS (L_LASTSTART), LVCFMT_LEFT, 100, 0);
00072
00073 ReadState ("SchedulerTasks");
00074
00075 ShowWindow (SW_SHOW);
00076
00077 return TRUE;
00078 }
00079
00080 void CSheduler_Tasks::AddTask(fsSchedule *task)
00081 {
00082 int iItem = AddItem (fsScheduleMgr::WTSToStr (task), GetSysColor (COLOR_WINDOW),
00083 GetSysColor (COLOR_WINDOWTEXT), GetTaskImage (task));
00084
00085 SetItemData (iItem, DWORD (task));
00086
00087 UpdateTask (task);
00088 }
00089
00090 void CSheduler_Tasks::UpdateTask(fsSchedule *task)
00091 {
00092 int iItem = FindTask (task);
00093
00094 if (iItem != -1)
00095 UpdateTask (iItem);
00096 }
00097
00098 int CSheduler_Tasks::FindTask(fsSchedule *task)
00099 {
00100 int cItems = GetItemCount ();
00101
00102 for (int i = 0; i < cItems; i++)
00103 if (GetItemData (i) == (DWORD) task)
00104 return i;
00105
00106 return -1;
00107 }
00108
00109 void CSheduler_Tasks::OnDblclk(NMHDR* , LRESULT* pResult)
00110 {
00111 OnTasksProperties ();
00112
00113 *pResult = 0;
00114 }
00115
00116 void CSheduler_Tasks::OnRClick()
00117 {
00118 CMenu menu;
00119 menu.LoadMenu (IDM_TASKS);
00120 ApplyLanguageToMenu (&menu);
00121 CMenu *pPopup = menu.GetSubMenu (0);
00122
00123 UpdateMenu (pPopup);
00124
00125 ClientToScreen (&m_rbPt);
00126
00127 m_odmenu.Attach (&menu, FALSE);
00128
00129 m_odmenu.SetImageList (&((CMainFrame*)AfxGetApp ()->m_pMainWnd)->m_imgsMenu, &((CMainFrame*)AfxGetApp ()->m_pMainWnd)->m_dimgsMenu);
00130 fsSetImage *pImages;
00131 int cImages;
00132 CShedulerWnd::Plugin_GetMenuImages (&pImages, &cImages);
00133 m_odmenu.SetImages (pImages, cImages);
00134
00135 pPopup->TrackPopupMenu (TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_LEFTALIGN, m_rbPt.x, m_rbPt.y, this);
00136 m_odmenu.Detach ();
00137
00138 menu.DestroyMenu ();
00139 }
00140
00141 void CSheduler_Tasks::OnRButtonDown(UINT nFlags, CPoint point)
00142 {
00143 m_rbPt = point;
00144
00145 CListCtrlEx::OnRButtonDown(nFlags, point);
00146 }
00147
00148 void CSheduler_Tasks::OnTasksDeletetask()
00149 {
00150 POSITION pos = GetFirstSelectedItemPosition ();
00151
00152 if (pos == NULL)
00153 return;
00154
00155 if (MessageBox (LS (L_AREYOUSURE), LS (L_CONFIRMATION), MB_YESNO | MB_ICONQUESTION) == IDNO)
00156 {
00157 SetFocus ();
00158 return;
00159 }
00160
00161 SetFocus ();
00162
00163 fs::list <int> vItems;
00164
00165 while (pos)
00166 vItems.add (GetNextSelectedItem (pos));
00167
00168 fsScheduleMgr *mgr = _pwndScheduler->GetMgr ();
00169
00170 for (int i = vItems.size () - 1; i >= 0; i--)
00171 {
00172 int iItem = vItems [i];
00173 fsSchedule *task = (fsSchedule*) GetItemData (iItem);
00174 mgr->DeleteTask (task);
00175 }
00176
00177
00178 _pwndSpider->UpdateTasksIcons ();
00179 }
00180
00181 void CSheduler_Tasks::OnCreatenewtask()
00182 {
00183 _pwndScheduler->OnCreatenewtask ();
00184 SetFocus ();
00185 }
00186
00187 void CSheduler_Tasks::OnTasksProperties()
00188 {
00189 POSITION pos = GetFirstSelectedItemPosition ();
00190
00191 if (pos == NULL)
00192 return;
00193
00194 int iItem = GetNextSelectedItem (pos);
00195
00196 if (pos)
00197 return;
00198
00199 fsSchedule *task = (fsSchedule*) GetItemData (iItem);
00200
00201 _pwndScheduler->OnProperties (task);
00202
00203 _pwndScheduler->GetMgr ()->OnTaskUpdated (task);
00204
00205 SetFocus ();
00206 }
00207
00208 void CSheduler_Tasks::OnKeyDown(WORD wVK)
00209 {
00210 switch (wVK)
00211 {
00212 case VK_DELETE:
00213 OnTasksDeletetask ();
00214 break;
00215
00216 case VK_RETURN:
00217 OnTasksProperties ();
00218 break;
00219
00220 case VK_APPS:
00221 CalcCoordsForCurSel ();
00222 OnRClick ();
00223 break;
00224 }
00225 }
00226
00227 void CSheduler_Tasks::OnTasksDisable()
00228 {
00229 POSITION pos = GetFirstSelectedItemPosition ();
00230
00231 while (pos)
00232 {
00233 int iItem = GetNextSelectedItem (pos);
00234 fsSchedule *task = (fsSchedule*) GetItemData (iItem);
00235 task->dwFlags &= ~ SCHEDULE_ENABLED;
00236 _pwndScheduler->GetMgr ()->OnTaskUpdated (task);
00237 }
00238 }
00239
00240 void CSheduler_Tasks::OnTasksEnable()
00241 {
00242 POSITION pos = GetFirstSelectedItemPosition ();
00243
00244 while (pos)
00245 {
00246 int iItem = GetNextSelectedItem (pos);
00247 fsSchedule *task = (fsSchedule*) GetItemData (iItem);
00248 task->dwFlags |= SCHEDULE_ENABLED;
00249 _pwndScheduler->GetMgr ()->RepairNextTime (task);
00250 _pwndScheduler->GetMgr ()->OnTaskUpdated (task);
00251 }
00252 }
00253
00254 int CSheduler_Tasks::GetTaskImage(fsSchedule *task)
00255 {
00256 int iImage;
00257
00258 if (task->dwFlags & SCHEDULE_ENABLED)
00259 iImage = 0;
00260 else
00261 iImage = 1;
00262
00263 return iImage;
00264 }
00265
00266 void CSheduler_Tasks::UpdateMenu(CMenu *pPopup)
00267 {
00268 pPopup->SetDefaultItem (ID_TASKS_PROPERTIES);
00269
00270 int cItems = GetSelectedCount ();
00271
00272 if (cItems == 0)
00273 {
00274 pPopup->EnableMenuItem (ID_TASKS_ENABLE, MF_BYCOMMAND | MF_GRAYED);
00275 pPopup->EnableMenuItem (ID_TASKS_DISABLE, MF_BYCOMMAND | MF_GRAYED);
00276 pPopup->EnableMenuItem (ID_TASKS_DELETETASK, MF_BYCOMMAND | MF_GRAYED);
00277 pPopup->EnableMenuItem (ID_TASKS_PROPERTIES, MF_BYCOMMAND | MF_GRAYED);
00278 }
00279 else
00280 {
00281 POSITION pos = GetFirstSelectedItemPosition ();
00282 while (pos)
00283 {
00284 int iItem = GetNextSelectedItem (pos);
00285 fsSchedule *task = (fsSchedule*) GetItemData (iItem);
00286 if (task->dwFlags & SCHEDULE_ENABLED)
00287 pPopup->EnableMenuItem (ID_TASKS_ENABLE, MF_BYCOMMAND | MF_GRAYED);
00288 else
00289 pPopup->EnableMenuItem (ID_TASKS_DISABLE, MF_BYCOMMAND | MF_GRAYED);
00290 }
00291
00292 if (cItems > 1)
00293 pPopup->EnableMenuItem (ID_TASKS_PROPERTIES, MF_BYCOMMAND | MF_GRAYED);
00294 }
00295 }
00296
00297 int CSheduler_Tasks::OnUpdateToolBar(UINT nID)
00298 {
00299 int cItems = GetSelectedCount ();
00300 BOOL bEnabled = TRUE;
00301
00302 if (cItems == 0)
00303 {
00304 switch (nID)
00305 {
00306 case ID_TASKS_ENABLE:
00307 case ID_TASKS_DISABLE:
00308 case ID_TASKS_DELETETASK:
00309 case ID_TASKS_PROPERTIES:
00310 bEnabled = FALSE;
00311 break;
00312 }
00313 }
00314 else
00315 {
00316 POSITION pos = GetFirstSelectedItemPosition ();
00317 while (pos)
00318 {
00319 int iItem = GetNextSelectedItem (pos);
00320 fsSchedule *task = (fsSchedule*) GetItemData (iItem);
00321
00322 switch (nID)
00323 {
00324 case ID_TASKS_ENABLE:
00325 if (task->dwFlags & SCHEDULE_ENABLED)
00326 bEnabled = FALSE;
00327 break;
00328
00329 case ID_TASKS_DISABLE:
00330 if ((task->dwFlags & SCHEDULE_ENABLED) == 0)
00331 bEnabled = FALSE;
00332 break;
00333 }
00334 }
00335
00336 if (cItems > 1 && nID == ID_TASKS_PROPERTIES)
00337 bEnabled = FALSE;
00338 }
00339
00340 return bEnabled ? WGP_CMDITEMSTATE_ENABLED : WGP_CMDITEMSTATE_DISABLED;
00341 }
00342
00343 void CSheduler_Tasks::OnDrawItem(int , LPDRAWITEMSTRUCT lpDrawItemStruct)
00344 {
00345 m_odmenu.OnDrawItem (lpDrawItemStruct);
00346 }
00347
00348 void CSheduler_Tasks::OnMeasureItem(int , LPMEASUREITEMSTRUCT lpMeasureItemStruct)
00349 {
00350 m_odmenu.OnMeasureItem (lpMeasureItemStruct);
00351 }
00352
00353 void CSheduler_Tasks::ApplyLanguageToMenu(CMenu *menu)
00354 {
00355 menu->ModifyMenu (0, MF_BYPOSITION|MF_STRING, 0, LS (L_SCHEDULER));
00356
00357 CString str = LS (L_NEWTASK); str += "\tCtrl+T";
00358 menu->ModifyMenu (ID_CREATENEWTASK, MF_BYCOMMAND|MF_STRING, ID_CREATENEWTASK, str);
00359
00360 menu->ModifyMenu (ID_TASKS_ENABLE, MF_BYCOMMAND|MF_STRING, ID_TASKS_ENABLE, LS (L_ENABLETASK));
00361 menu->ModifyMenu (ID_TASKS_DISABLE, MF_BYCOMMAND|MF_STRING, ID_TASKS_DISABLE, LS (L_DISABLETASK));
00362
00363 str = LS (L_DELETETASK); str += "\tDel";
00364 menu->ModifyMenu (ID_TASKS_DELETETASK, MF_BYCOMMAND|MF_STRING, ID_TASKS_DELETETASK, str);
00365
00366 str = LS (L_TASKPROP); str += "\tEnter";
00367 menu->ModifyMenu (ID_TASKS_PROPERTIES, MF_BYCOMMAND|MF_STRING, ID_TASKS_PROPERTIES, str);
00368 }
00369
00370 void CSheduler_Tasks::ApplyLanguage()
00371 {
00372 SetColumnText (0, LS (L_WTS));
00373 SetColumnText (1, LS (L_HTS));
00374 SetColumnText (2, LS (L_NEXTSTART));
00375 SetColumnText (3, LS (L_LASTSTART));
00376
00377 UpdateAllTasks ();
00378 }
00379
00380 void CSheduler_Tasks::UpdateTask(int iItem)
00381 {
00382 fsSchedule *task = (fsSchedule*) GetItemData (iItem);
00383 SetItemText (iItem, 0, fsScheduleMgr::WTSToStr (task));
00384 SetItemText (iItem, 1, fsScheduleMgr::HTSToStr (task));
00385 SetItemText (iItem, 2, fsScheduleMgr::NextTimeToStr (task));
00386 SetItemText (iItem, 3, fsScheduleMgr::LastTimeToStr (task));
00387 SetItemImage (FindTask (task), GetTaskImage (task));
00388 }
00389
00390 void CSheduler_Tasks::UpdateAllTasks()
00391 {
00392 int cItems = GetItemCount ();
00393 while (cItems--)
00394 UpdateTask (cItems);
00395 }
00396
00397 void CSheduler_Tasks::CalcCoordsForCurSel()
00398 {
00399 int iCurSel = GetSelectionMark ();
00400 if (iCurSel == -1)
00401 {
00402 POSITION pos = GetFirstSelectedItemPosition ();
00403 if (pos)
00404 iCurSel = GetNextSelectedItem (pos);
00405 }
00406
00407 if (iCurSel != -1)
00408 {
00409 RECT rc;
00410 GetItemRect (iCurSel, &rc, LVIR_BOUNDS);
00411 m_rbPt.x = rc.left + 30;
00412 m_rbPt.y = rc.top;
00413 }
00414 else
00415 m_rbPt.x = m_rbPt.y = 30;
00416 }
00417
00418 void CSheduler_Tasks::OnForceUpdate()
00419 {
00420 UpdateAllTasks ();
00421 }
00422
00423 void CSheduler_Tasks::DeleteTaskFromList(fsSchedule *task)
00424 {
00425 int iTask = FindTask (task);
00426 if (iTask != -1)
00427 DeleteItem (iTask);
00428 }