00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "plugins.h"
00008 #include "FdmApp.h"
00009 #include "SitesWnd.h"
00010 #include "fsSitesMgr.h"
00011 #include "MainFrm.h"
00012 #include "SitesSheet.h"
00013 #include "DownloadsWnd.h"
00014 #include "mfchelp.h"
00015 #include "plugincmds.h"
00016
00017 #ifdef _DEBUG
00018 #define new DEBUG_NEW
00019 #undef THIS_FILE
00020 static char THIS_FILE[] = __FILE__;
00021 #endif
00022
00023 extern CDownloadsWnd *_pwndDownloads;
00024
00025 CSitesWnd *_pwndSites = NULL;
00026
00027 CSitesWnd::CSitesWnd()
00028 {
00029 _SitesMgr.SetEventsFunc (_SitesMgrEvents, this);
00030 }
00031
00032 CSitesWnd::~CSitesWnd()
00033 {
00034 }
00035
00036 BEGIN_MESSAGE_MAP(CSitesWnd, CListCtrlEx)
00037
00038 ON_WM_RBUTTONDOWN()
00039 ON_WM_DRAWITEM()
00040 ON_WM_MEASUREITEM()
00041 ON_COMMAND(ID_SITES_DELETE, OnSitesDelete)
00042 ON_COMMAND(ID_SITES_PROPERTIES, OnSitesProperties)
00043 ON_COMMAND(ID_SITES_TEMPRORARY, OnSitesTemprorary)
00044 ON_WM_LBUTTONDBLCLK()
00045 ON_COMMAND(ID_SITES_ADD, OnSitesAdd)
00046
00047
00048
00049 ON_MESSAGE (WM_WGP_SHUTDOWN, OnAppExit)
00050 ON_MESSAGE (WM_WGP_READYTOSHUTDOWN, OnAppQueryExit)
00051 ON_MESSAGE (WM_WGP_UPDATE_MENUMAIN, OnUpdateMenu)
00052 ON_MESSAGE (WM_WGP_UPDATE_MENUVIEW, OnUpdateMenuView)
00053 ON_MESSAGE (WM_WGP_UPDATE_CMDITEM, OnUpdateToolBar)
00054 ON_MESSAGE (WM_WGP_INSERT, OnInsert)
00055
00056 ON_COMMAND_RANGE(ID_SITES_1, ID_SITES_4, OnSitesListShowCol)
00057
00058 END_MESSAGE_MAP()
00059
00060 BOOL CSitesWnd::Create(CWnd *pWndParent)
00061 {
00062 CRect rc (0, 0, 50, 50);
00063
00064 if (FALSE == CListCtrlEx::Create (LVS_REPORT|LVS_OWNERDRAWFIXED|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS,
00065 rc, pWndParent, 0x53459))
00066 return FALSE;
00067
00068 SetExtendedStyle (LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_INFOTIP);
00069
00070 m_images.Create (16, 17, ILC_COLOR24 | ILC_MASK, 4, 1);
00071 CBitmap bmp;
00072 bmp.Attach (SBMP (IDB_SITELIST));
00073 m_images.Add (&bmp, RGB (255, 0, 255));
00074 SetImageList (&m_images, LVSIL_SMALL);
00075
00076 m_selImages.Create (16, 17, ILC_COLOR24 | ILC_MASK, 4, 1);
00077 CBitmap bmp1;
00078 bmp1.Attach (SBMP (IDB_SITELIST_SEL));
00079 m_selImages.Add (&bmp1, RGB (255, 0, 255));
00080 SetSelectedImages (&m_selImages);
00081
00082 InsertColumn (0, LS (L_SITENAME), LVCFMT_LEFT, 200, 0);
00083 InsertColumn (1, LS (L_CONNS), LVCFMT_LEFT, 80, 0);
00084 InsertColumn (2, LS (L_LOGIN), LVCFMT_LEFT, 100, 0);
00085 InsertColumn (3, LS (L_GROUP2), LVCFMT_LEFT, 100, 0);
00086
00087 ReadState ("SitesList");
00088
00089 ShowWindow (SW_SHOW);
00090
00091 LoadSites ();
00092
00093 return TRUE;
00094 }
00095
00096 HWND CSitesWnd::Plugin_CreateMainWindow(HWND hWndParent)
00097 {
00098 fsnew1 (_pwndSites, CSitesWnd);
00099
00100 _pwndSites->Create (CWnd::FromHandle (hWndParent));
00101
00102 return _pwndSites->m_hWnd;
00103 }
00104
00105 void CSitesWnd::Plugin_GetToolBarInfo(wgTButtonInfo **ppButtons, int *pcButtons)
00106 {
00107 static wgTButtonInfo btns [] =
00108 {
00109 wgTButtonInfo (ID_SITES_ADD, TBSTYLE_BUTTON, ""),
00110 wgTButtonInfo (ID_SITES_PROPERTIES, TBSTYLE_BUTTON, ""),
00111 };
00112
00113 btns [0].pszToolTip = LS (L_ADDSITE);
00114 btns [1].pszToolTip = LS (L_SITEPROP);
00115
00116 *ppButtons = btns;
00117 *pcButtons = sizeof (btns) / sizeof (wgTButtonInfo);
00118 }
00119
00120 void CSitesWnd::Plugin_GetMenuImages(fsSetImage **ppImages, int *pcImages)
00121 {
00122 static fsSetImage images [] =
00123 {
00124 fsSetImage (ID_SITES_ADD, 0),
00125 fsSetImage (ID_SITES_PROPERTIES, 1),
00126 fsSetImage (ID_SITES_DELETE, 2),
00127 };
00128
00129 *ppImages = images;
00130 *pcImages = sizeof (images) / sizeof (fsSetImage);
00131 }
00132
00133 LRESULT CSitesWnd::OnAppExit(WPARAM, LPARAM)
00134 {
00135 SaveSites ();
00136 return 0;
00137 }
00138
00139 LRESULT CSitesWnd::OnAppQueryExit(WPARAM, LPARAM)
00140 {
00141 return 0;
00142 }
00143
00144 LRESULT CSitesWnd::OnUpdateMenu(WPARAM, LPARAM lp)
00145 {
00146 UpdateMenu (CMenu::FromHandle (*((HMENU*)lp)));
00147 return 0;
00148 }
00149
00150 LRESULT CSitesWnd::OnUpdateToolBar(WPARAM wp, LPARAM)
00151 {
00152 return UpdateToolBar (wp);
00153 }
00154
00155 void CSitesWnd::UpdateMenu(CMenu *pMenu)
00156 {
00157 int cSelected = GetSelectedCount ();
00158
00159 if (cSelected == 0)
00160 {
00161 pMenu->EnableMenuItem (ID_SITES_DELETE, MF_BYCOMMAND | MF_GRAYED);
00162 pMenu->EnableMenuItem (ID_SITES_TEMPRORARY, MF_BYCOMMAND | MF_GRAYED);
00163 }
00164 else
00165 {
00166 POSITION pos = GetFirstSelectedItemPosition ();
00167 m_bSelectedIsTemp = TRUE;
00168 while (pos)
00169 {
00170 int iItem = GetNextSelectedItem (pos);
00171 fsSiteInfo *pSite = (fsSiteInfo*) GetItemData (iItem);
00172 if (pSite->bTemp == FALSE)
00173 {
00174 m_bSelectedIsTemp = FALSE;
00175 break;
00176 }
00177 }
00178
00179 if (m_bSelectedIsTemp)
00180 pMenu->CheckMenuItem (ID_SITES_TEMPRORARY, MF_BYCOMMAND | MF_CHECKED);
00181 }
00182
00183 if (cSelected != 1)
00184 pMenu->EnableMenuItem (ID_SITES_PROPERTIES, MF_BYCOMMAND | MF_GRAYED);
00185
00186 pMenu->SetDefaultItem (ID_SITES_PROPERTIES);
00187 }
00188
00189 int CSitesWnd::UpdateToolBar(UINT nID)
00190 {
00191 BOOL bEnabled = TRUE;
00192 int cSelected = GetSelectedCount ();
00193
00194 switch (nID)
00195 {
00196 case ID_SITES_ADD:
00197 break;
00198
00199 case ID_SITES_DELETE:
00200 case ID_SITES_TEMPRORARY:
00201 bEnabled = cSelected > 0;
00202 break;
00203
00204 case ID_SITES_PROPERTIES:
00205 bEnabled = cSelected == 1;
00206 break;
00207 }
00208
00209 return bEnabled ? WGP_CMDITEMSTATE_ENABLED : WGP_CMDITEMSTATE_DISABLED;
00210 }
00211
00212 void CSitesWnd::OnRClick()
00213 {
00214 CMenu menu;
00215 menu.LoadMenu (IDM_SITES);
00216 ApplyLanguageToMenu (&menu);
00217 CMenu *pPopup = menu.GetSubMenu (0);
00218
00219 UpdateMenu (pPopup);
00220
00221 ClientToScreen (&m_rbPt);
00222
00223 m_odmenu.Attach (&menu, FALSE);
00224
00225 m_odmenu.SetImageList (&((CMainFrame*)AfxGetApp ()->m_pMainWnd)->m_imgsMenu, &((CMainFrame*)AfxGetApp ()->m_pMainWnd)->m_dimgsMenu);
00226 fsSetImage *pImages;
00227 int cImages;
00228 CSitesWnd::Plugin_GetMenuImages (&pImages, &cImages);
00229 m_odmenu.SetImages (pImages, cImages);
00230
00231 pPopup->TrackPopupMenu (TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_LEFTALIGN, m_rbPt.x, m_rbPt.y, this);
00232 m_odmenu.Detach ();
00233
00234 menu.DestroyMenu ();
00235 }
00236
00237 void CSitesWnd::OnRButtonDown(UINT nFlags, CPoint point)
00238 {
00239 m_rbPt = point;
00240 CListCtrlEx::OnRButtonDown(nFlags, point);
00241 }
00242
00243 void CSitesWnd::OnDrawItem(int , LPDRAWITEMSTRUCT lpDrawItemStruct)
00244 {
00245 m_odmenu.OnDrawItem (lpDrawItemStruct);
00246 }
00247
00248 void CSitesWnd::OnMeasureItem(int , LPMEASUREITEMSTRUCT lpMeasureItemStruct)
00249 {
00250 m_odmenu.OnMeasureItem (lpMeasureItemStruct);
00251 }
00252
00253 void CSitesWnd::OnSitesAdd()
00254 {
00255 fsSiteInfo site;
00256
00257 site.dwFtpFlags = 0;
00258 site.bTemp = FALSE;
00259 site.cMaxConns = UINT_MAX;
00260 site.strName = NULL;
00261 site.strPassword = NULL;
00262 site.strUser = NULL;
00263 site.cConnsNow = 0;
00264 site.dwValidFor = SITE_VALIDFOR_HTTP | SITE_VALIDFOR_HTTPS | SITE_VALIDFOR_FTP | SITE_VALIDFOR_SUBDOMAINS;
00265
00266 CSitesSheet sheet (LS (L_ADDSITE), this);
00267 _DlgMgr.OnDoModal (&sheet);
00268 sheet.Init (&site, -1);
00269 UINT nRet = sheet.DoModal ();
00270 _DlgMgr.OnEndDialog (&sheet);
00271
00272 if (nRet == IDOK)
00273 {
00274 _SitesMgr.AddSite (site);
00275 }
00276
00277 SetFocus ();
00278 }
00279
00280 void CSitesWnd::OnSitesDelete()
00281 {
00282 fs::list <int> vItems;
00283 POSITION pos = GetFirstSelectedItemPosition ();
00284
00285 if (pos == NULL)
00286 return;
00287
00288 if (IDNO == MessageBox (LS (L_AREYOUSURE), LS (L_CONFIRMATION), MB_YESNO))
00289 {
00290 SetFocus ();
00291 return;
00292 }
00293
00294 SetFocus ();
00295
00296 pos = GetFirstSelectedItemPosition ();
00297
00298 while (pos)
00299 {
00300 int iItem = GetNextSelectedItem (pos);
00301 vItems.add (iItem);
00302 }
00303
00304 if (vItems.size () == 0)
00305 return;
00306
00307 for (int i = vItems.size () - 1; i >= 0; i--)
00308 {
00309 fsSiteInfo *pSite = (fsSiteInfo*) GetItemData (vItems [i]);
00310 _SitesMgr.DeleteSite (pSite);
00311 }
00312 }
00313
00314 void CSitesWnd::OnSitesProperties()
00315 {
00316 POSITION pos = GetFirstSelectedItemPosition ();
00317 if (pos == NULL) return;
00318 int iItem = GetNextSelectedItem (pos);
00319 fsSiteInfo *pSite = (fsSiteInfo*) GetItemData (iItem);
00320
00321 CSitesSheet sheet (LS (L_SITEPROP), this);
00322 _DlgMgr.OnDoModal (&sheet);
00323 sheet.Init (pSite, _SitesMgr.FindSite (pSite->strName, pSite->dwValidFor));
00324 UINT nRet = sheet.DoModal ();
00325 _DlgMgr.OnEndDialog (&sheet);
00326
00327 SetFocus ();
00328
00329 if (nRet == IDOK)
00330 UpdateSite (pSite);
00331 }
00332
00333 void CSitesWnd::OnSitesTemprorary()
00334 {
00335 POSITION pos = GetFirstSelectedItemPosition ();
00336 while (pos)
00337 {
00338 int iItem = GetNextSelectedItem (pos);
00339 fsSiteInfo *pSite = (fsSiteInfo*) GetItemData (iItem);
00340 pSite->bTemp = !m_bSelectedIsTemp;
00341 UpdateSite (pSite);
00342 }
00343 }
00344
00345 void CSitesWnd::AddSiteToList(fsSiteInfo *pSite)
00346 {
00347 int iItem = AddItem ("", GetSysColor (COLOR_WINDOW), GetSysColor (COLOR_WINDOWTEXT));
00348 SetItemData (iItem, (DWORD)pSite);
00349 UpdateSite (pSite);
00350 }
00351
00352 void CSitesWnd::UpdateSite(fsSiteInfo *pSite)
00353 {
00354 LVFINDINFO fi;
00355 fi.flags = LVFI_PARAM;
00356 fi.lParam = (LPARAM)pSite;
00357 int iItem = FindItem (&fi);
00358 if (iItem == -1)
00359 return;
00360
00361 SetItemText (iItem, 0, pSite->strName);
00362
00363 CString str, strConn;
00364 if (pSite->cMaxConns != UINT_MAX)
00365 str.Format ("%d", pSite->cMaxConns);
00366 else
00367 str = "+";
00368 strConn.Format ("%d/%s", pSite->cConnsNow, str);
00369 SetItemText (iItem, 1, strConn);
00370
00371 SetItemText (iItem, 2, pSite->strUser == NULL ? "" : pSite->strUser);
00372
00373 if (pSite->pGroup)
00374 {
00375 if (pSite->pGroup->nId == GRP_OTHER_ID)
00376 SetItemText (iItem, 3, LS (L_OTHER));
00377 else
00378 SetItemText (iItem, 3, pSite->pGroup->strName);
00379 }
00380 else
00381 SetItemText (iItem, 3, "");
00382
00383 SetItemImage (iItem, pSite->bTemp ? 1 : 0);
00384 }
00385
00386 void CSitesWnd::OnLButtonDblClk(UINT nFlags, CPoint point)
00387 {
00388 CListCtrlEx::OnLButtonDblClk(nFlags, point);
00389 OnSitesProperties ();
00390 }
00391
00392 void CSitesWnd::_SitesMgrEvents(fsSitesMgrEvent ev, fsSiteInfo *site, LPVOID lp)
00393 {
00394 CSitesWnd *pThis = (CSitesWnd*) lp;
00395
00396 switch (ev)
00397 {
00398 case SM_SITEADDED:
00399 pThis->AddSiteToList (site);
00400 break;
00401
00402 case SM_SITEDELETED:
00403 {
00404 LVFINDINFO fi;
00405 fi.flags = LVFI_PARAM;
00406 fi.lParam = (LPARAM)site;
00407 int iItem = pThis->FindItem (&fi);
00408 if (iItem != -1)
00409 pThis->DeleteItem (iItem);
00410 }
00411 break;
00412
00413 case SM_SITEUPDATED:
00414 pThis->UpdateSite (site);
00415 break;
00416 }
00417 }
00418
00419 void CSitesWnd::LoadSites()
00420 {
00421 CString strFile = fsGetDataFilePath ("sites.sav");
00422
00423 if (GetFileAttributes (strFile) == DWORD (-1))
00424 {
00425 _DldsMgr.RebuildServerList ();
00426 return;
00427 }
00428
00429 HANDLE hFile = CreateFile (strFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
00430
00431 BOOL bOk = hFile != INVALID_HANDLE_VALUE;
00432
00433 try {
00434
00435 if (bOk)
00436 bOk = _SitesMgr.LoadFromFile (hFile);
00437
00438 } catch (...) {ASSERT (FALSE); bOk = FALSE;}
00439
00440 if (hFile != INVALID_HANDLE_VALUE)
00441 CloseHandle (hFile);
00442
00443 if (bOk == FALSE)
00444 {
00445
00446
00447 }
00448
00449 _DldsMgr.RebuildServerList ();
00450 }
00451
00452 void CSitesWnd::SaveSites()
00453 {
00454 CString strFile = fsGetDataFilePath ("sites.sav");
00455
00456 HANDLE hFile = CreateFile (strFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
00457 FILE_ATTRIBUTE_HIDDEN, NULL);
00458
00459 BOOL bOk = TRUE;
00460
00461 if (hFile == INVALID_HANDLE_VALUE)
00462 bOk = FALSE;
00463 else
00464 bOk = _SitesMgr.SaveToFile (hFile);
00465
00466 if (hFile != INVALID_HANDLE_VALUE)
00467 CloseHandle (hFile);
00468
00469
00470 }
00471
00472 void CSitesWnd::Plugin_GetMenuViewItems(wgMenuViewItem **ppItems, int* )
00473 {
00474 *ppItems = NULL;
00475 }
00476
00477 void CSitesWnd::SaveAll()
00478 {
00479 SaveSites ();
00480 SaveState ("SitesList");
00481 }
00482
00483 void CSitesWnd::Plugin_GetPluginNames(LPCSTR *ppszLong, LPCSTR *ppszShort)
00484 {
00485 static CString strName;
00486 strName = LSNP (L_SITESMGR);
00487 *ppszLong = *ppszShort = strName;
00488 }
00489
00490 void CSitesWnd::ApplyLanguageToMenu(CMenu* menu)
00491 {
00492 menu->ModifyMenu (0, MF_BYPOSITION|MF_STRING, 0, LS (L_SITESMGR));
00493
00494 CString str = LS (L_ADDSITE); str += "\tCtrl+I";
00495 menu->ModifyMenu (ID_SITES_ADD, MF_BYCOMMAND|MF_STRING, ID_SITES_ADD, str);
00496
00497 str = LS (L_DELETESITE); str += "\tDel";
00498 menu->ModifyMenu (ID_SITES_DELETE, MF_BYCOMMAND|MF_STRING, ID_SITES_DELETE, str);
00499
00500 menu->ModifyMenu (ID_SITES_TEMPRORARY, MF_BYCOMMAND|MF_STRING, ID_SITES_TEMPRORARY, LS (L_TEMPENTRY));
00501
00502 str = LS (L_SITEPROP); str += "\tEnter";
00503 menu->ModifyMenu (ID_SITES_PROPERTIES, MF_BYCOMMAND|MF_STRING, ID_SITES_PROPERTIES, str);
00504 }
00505
00506 void CSitesWnd::OnKeyDown(WORD wVK)
00507 {
00508 switch (wVK)
00509 {
00510 case VK_DELETE:
00511 OnSitesDelete ();
00512 break;
00513
00514 case VK_RETURN:
00515 OnSitesProperties ();
00516 break;
00517
00518 case VK_APPS:
00519 CalcCoordsForCurSel ();
00520 OnRClick ();
00521 break;
00522 }
00523 }
00524
00525 void CSitesWnd::ApplyLanguage()
00526 {
00527 SetColumnText (0, LS (L_SITENAME));
00528 SetColumnText (1, LS (L_CONNS));
00529 SetColumnText (2, LS (L_LOGIN));
00530 SetColumnText (3, LS (L_GROUP2));
00531 }
00532
00533 void CSitesWnd::CalcCoordsForCurSel()
00534 {
00535 int iCurSel = GetSelectionMark ();
00536 if (iCurSel == -1)
00537 {
00538 POSITION pos = GetFirstSelectedItemPosition ();
00539 if (pos)
00540 iCurSel = GetNextSelectedItem (pos);
00541 }
00542
00543 if (iCurSel != -1)
00544 {
00545 RECT rc;
00546 GetItemRect (iCurSel, &rc, LVIR_BOUNDS);
00547 m_rbPt.x = rc.left + 30;
00548 m_rbPt.y = rc.top;
00549 }
00550 else
00551 m_rbPt.x = m_rbPt.y = 30;
00552 }
00553
00554 void CSitesWnd::Plugin_SetLanguage(wgLanguage, HMENU hMenuMain, HMENU hMenuView)
00555 {
00556 CMenu *menu = CMenu::FromHandle (hMenuMain);
00557 _pwndSites->ApplyLanguageToMenu (menu);
00558 _pwndSites->ApplyLanguage ();
00559 _pwndSites->ApplyLanguageToMenuView (CMenu::FromHandle (hMenuView));
00560 }
00561
00562 void CSitesWnd::OnForceUpdate()
00563 {
00564 DeleteAllItems ();
00565 int cSites = _SitesMgr.GetSiteCount ();
00566 for (int i = 0; i < cSites; i++)
00567 AddSiteToList (_SitesMgr.GetSite (i));
00568 }
00569
00570 void CSitesWnd::ApplyLanguageToMenuView(CMenu *menu)
00571 {
00572 menu->ModifyMenu (0, MF_BYPOSITION | MF_STRING, 0, LS (L_LISTOFSITES));
00573
00574 UINT aCmds [] = {ID_SITES_1, ID_SITES_2, ID_SITES_3, ID_SITES_4};
00575 LPCSTR apszCmds [] = {LS (L_SITENAME), LS (L_CONNS), LS (L_LOGIN), LS (L_GROUP2)};
00576
00577 for (int i = 0; i < sizeof (aCmds) / sizeof (UINT); i++)
00578 menu->ModifyMenu (aCmds [i], MF_BYCOMMAND|MF_STRING, aCmds [i], apszCmds [i]);
00579 }
00580
00581 LRESULT CSitesWnd::OnUpdateMenuView(WPARAM, LPARAM lp)
00582 {
00583 HMENU* pMenus = (HMENU*) lp;
00584 UpdateSitesListColMenu (CMenu::FromHandle (pMenus [0]));
00585 return 0;
00586 }
00587
00588 void CSitesWnd::UpdateSitesListColMenu(CMenu *menu)
00589 {
00590 BOOL bEn = GetHeaderCtrl ()->GetItemCount () > 1;
00591 for (int i = 0; i < 4; i++)
00592 {
00593 if (IsColumnShown (i))
00594 {
00595 menu->CheckMenuItem (ID_SITES_1+i, MF_CHECKED);
00596 if (bEn == FALSE)
00597 menu->EnableMenuItem (ID_SITES_1+i, MF_GRAYED);
00598 }
00599 }
00600 }
00601
00602 void CSitesWnd::OnSitesListShowCol(UINT uCmd)
00603 {
00604 int iCol = uCmd - ID_SITES_1;
00605 ChangeColumnVisibility (iCol);
00606 }
00607
00608 LRESULT CSitesWnd::OnInsert(WPARAM, LPARAM)
00609 {
00610 OnSitesAdd ();
00611 return 0;
00612 }
00613
00614 HMENU CSitesWnd::Plugin_GetMainMenu()
00615 {
00616 return LoadMenu (AfxGetInstanceHandle (), MAKEINTRESOURCE (IDM_SITES));
00617 }
00618
00619 HMENU CSitesWnd::Plugin_GetViewMenu()
00620 {
00621 return LoadMenu (AfxGetInstanceHandle (), MAKEINTRESOURCE (IDM_SITES_VIEW));
00622 }