GfxOutBarCtrl.cpp
上传用户:hysujiao87
上传日期:2007-12-02
资源大小:156k
文件大小:54k
源码类别:

ICQ/即时通讯

开发平台:

C/C++

  1. // Copyright (c) Iuri Apollonio 1998
  2. // Use & modify as you want & need, and leave those 3 lines.
  3. // http://www.codeguru.com
  4. // GfxOutBarCtrl.cpp : implementation file
  5. //
  6. #include "stdafx.h"
  7. #include "resource.h"//"OutWAts1.h"
  8. #include "GfxOutBarCtrl.h"
  9. #include "GfxGroupEdit.h"
  10. #include "GfxPopupMenu.h"
  11. #define _ID_GFX_SMALLICON "小图标方式"
  12. #define _ID_GFX_LARGEICON "大图标方式"
  13. #define _ID_GFX_ADDAGROUP   "添加组"
  14. #define _ID_GFX_FONTCOLOR   "改变字体颜色"
  15. #define _ID_GFX_BACKCOLOR   "改变背景颜色"
  16. #define _ID_GFX_REMOVEITEM "从该组中删除"
  17. #define _ID_GFX_RENAMEITEM "改名"
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CGfxOutBarCtrl
  25. IMPLEMENT_DYNCREATE(CGfxOutBarCtrl, CWnd)
  26. CGfxOutBarCtrl::CGfxOutBarCtrl()
  27. {
  28. crBackGroundColor = GetSysColor(COLOR_BACKGROUND);//RGB(0,128,128);//
  29. crBackGroundColor1 = GetSysColor(COLOR_BACKGROUND);
  30. crTextColor = GetSysColor(COLOR_WINDOW);
  31. cr3dFace = GetSysColor(COLOR_3DFACE);
  32. crLightBorder = GetSysColor(COLOR_3DLIGHT);
  33. crHilightBorder = GetSysColor(COLOR_3DHILIGHT);
  34. crShadowBorder = GetSysColor(COLOR_3DSHADOW);
  35. crDkShadowBorder = GetSysColor(COLOR_3DDKSHADOW);
  36. pBlackPen = new CPen(PS_SOLID, 1, RGB(0,0,0));
  37. iFolderHeight = 22;
  38. dwFlags = fDragItems|fEditGroups|fEditItems|fRemoveGroups|fRemoveItems|fAddGroups|fAnimation|fSelHighlight;
  39. iSelFolder = 1;
  40. iLastFolderHighlighted = -1;
  41. iLastSelectedFolder = -1;
  42. pLargeImageList = NULL;
  43. pSmallImageList = NULL;
  44. iFirstItem = 0;
  45. xSmallIconLabelOffset = 4;
  46. yLargeIconLabelOffset = 3;
  47. ySmallIconSpacing = 10;
  48. yLargeIconSpacing = 8;
  49. xLeftMargin = 5;
  50. yTopMargin = 5;
  51. bUpArrow = bDownArrow = false;
  52. // hHandCursor = AfxGetApp()->LoadCursor(IDC_HANDCUR);
  53. rcUpArrow = rcDownArrow = CRect(0,0,0,0);
  54. bUpPressed = bDownPressed = false;
  55. bLooping = false;
  56. iLastItemHighlighted = -1;
  57. bPressedHighlight = false;
  58. iLastDragItemDraw = -1;
  59. lAnimationTickCount = 10;
  60. // hDragCursor = AfxGetApp()->LoadCursor(IDC_DRAGGING);
  61. // hNoDragCursor = AfxGetApp()->LoadCursor(IDC_NODRAGGING);
  62. iLastSel = -1;
  63. iSelAnimCount = 0;
  64. iSelAnimTiming = 0;
  65. }
  66. CGfxOutBarCtrl::~CGfxOutBarCtrl()
  67. {
  68. for (int t = 0; t < arFolder.GetSize(); t++)
  69. {
  70. if (arFolder.GetAt(t)) delete (CBarFolder*) arFolder.GetAt(t);
  71. }
  72. arFolder.RemoveAll();
  73. delete pBlackPen;
  74. }
  75. BEGIN_MESSAGE_MAP(CGfxOutBarCtrl, CWnd)
  76. //{{AFX_MSG_MAP(CGfxOutBarCtrl)
  77. ON_WM_CREATE()
  78. ON_WM_TIMER()
  79. ON_WM_PAINT()
  80. ON_WM_ERASEBKGND()
  81. ON_WM_MOUSEMOVE()
  82. ON_WM_LBUTTONDOWN()
  83. ON_WM_SETCURSOR()
  84. ON_WM_SIZE()
  85. ON_WM_RBUTTONDOWN()
  86. /* ON_COMMAND(ID_GFX_LARGEICON, OnGfxLargeicon)
  87. ON_UPDATE_COMMAND_UI(ID_GFX_LARGEICON, OnUpdateGfxLargeicon)
  88. ON_COMMAND(ID_GFX_SMALLICON, OnGfxSmallicon)
  89. ON_UPDATE_COMMAND_UI(ID_GFX_SMALLICON, OnUpdateGfxSmallicon)
  90. ON_COMMAND(ID_GFX_REMOVEITEM, OnGfxRemoveitem)
  91. ON_UPDATE_COMMAND_UI(ID_GFX_REMOVEITEM, OnUpdateGfxRemoveitem)
  92. ON_COMMAND(ID_GFX_RENAMEITEM, OnGfxRenameitem)
  93. ON_UPDATE_COMMAND_UI(ID_GFX_RENAMEITEM, OnUpdateGfxRenameitem)*/
  94. //}}AFX_MSG_MAP
  95. ON_MESSAGE(WM_OUTBAR_NOTIFY, OnEndLabelEdit)
  96. END_MESSAGE_MAP()
  97. /////////////////////////////////////////////////////////////////////////////
  98. // CGfxOutBarCtrl message handlers
  99. long CGfxOutBarCtrl::OnEndLabelEdit(WPARAM wParam, LPARAM lParam)
  100. {
  101. if (wParam == NM_OB_ONGROUPENDEDIT)
  102. {
  103. CGfxGroupEdit * pEdit = (CGfxGroupEdit *) lParam;
  104. OUTBAR_INFO ob;
  105. ob.index = pEdit->iIndex;
  106. ob.cText = pEdit->text;
  107. if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_ONGROUPENDEDIT, (LPARAM) &ob))
  108. {
  109. SetFolderText(pEdit->iIndex, pEdit->text);
  110. CRect rc;
  111. GetFolderRect(pEdit->iIndex, rc);
  112. InvalidateRect(rc, false);
  113. }
  114. }
  115. if (wParam == NM_OB_ONLABELENDEDIT)
  116. {
  117. CGfxGroupEdit * pEdit = (CGfxGroupEdit *) lParam;
  118. OUTBAR_INFO ob;
  119. ob.index = pEdit->iIndex;
  120. ob.cText = pEdit->text;
  121. if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_ONLABELENDEDIT, (LPARAM) &ob))
  122. {
  123. SetItemText(pEdit->iIndex, pEdit->text);
  124. CRect rc;
  125. GetInsideRect(rc);
  126. InvalidateRect(rc, true);
  127. }
  128. }
  129. return 0;
  130. }
  131. void CGfxOutBarCtrl::SetFolderText(const int index, const char * text)
  132. {
  133. ASSERT(index >= 0 && index < GetFolderCount());
  134. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
  135. if (pbf->cName) 
  136. {
  137. delete [] pbf->cName;
  138. pbf->cName = NULL;
  139. }
  140. pbf->cName = new char [lstrlen(text)+1];
  141. lstrcpy(pbf->cName, text);
  142. }
  143. void CGfxOutBarCtrl::SetItemText(const int index, const char * text)
  144. {
  145. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  146. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  147. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  148. if (pi->cItem) 
  149. {
  150. delete [] pi->cItem;
  151. pi->cItem = NULL;
  152. }
  153. pi->cItem = new char [lstrlen(text)+1];
  154. lstrcpy(pi->cItem, text);
  155. }
  156. BOOL CGfxOutBarCtrl::Create(DWORD dwStyle, const RECT & rect, CWnd * pParentWnd, UINT nID, const DWORD dwFlag)
  157. {
  158. dwFlags = dwFlag;
  159. return CWnd::CreateEx(WS_EX_STATICEDGE, NULL, NULL, dwStyle|WS_CHILD, rect, pParentWnd, nID);
  160. //GFXOUTBARCTRL_CLASSNAME
  161. }
  162. bool CGfxOutBarCtrl::IsSmallIconView() const
  163. {
  164. return dwFlags&fSmallIcon;
  165. }
  166. void CGfxOutBarCtrl::SetSmallIconView(const bool bSet)
  167. {
  168. iFirstItem = 0;
  169. if (bSet)
  170. {
  171. if (!IsSmallIconView()) 
  172. {
  173. dwFlags |= fSmallIcon;
  174. CRect rc;
  175. GetInsideRect(rc);
  176. InvalidateRect(rc, false);
  177. }
  178. }
  179. else
  180. {
  181. if (IsSmallIconView()) 
  182. {
  183. dwFlags &= ~fSmallIcon;
  184. CRect rc;
  185. GetInsideRect(rc);
  186. InvalidateRect(rc, false);
  187. }
  188. }
  189. }
  190. DWORD CGfxOutBarCtrl::GetFlag() const
  191. {
  192. return dwFlags;
  193. }
  194. void CGfxOutBarCtrl::ModifyFlag(const DWORD & dwRemove, const DWORD & dwAdd, const UINT redraw)
  195. {
  196. if (dwRemove) dwFlags &= ~(dwRemove);
  197. if (dwAdd) dwFlags |= dwAdd;
  198. if (GetSafeHwnd())
  199. {
  200. if (redraw != 0) SetWindowPos(0,0,0,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|redraw);
  201. else Invalidate();
  202. }
  203. }
  204. int CGfxOutBarCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  205. {
  206. if (CWnd::OnCreate(lpCreateStruct) == -1)
  207. return -1;
  208. // TODO: Add your specialized creation code here
  209. return 0;
  210. }
  211. void CGfxOutBarCtrl::OnTimer(UINT nIDEvent) 
  212. {
  213. if (nIDEvent == 1)
  214. {
  215. CPoint pt(GetMessagePos());
  216. ScreenToClient(&pt);
  217. CRect rc;
  218. GetClientRect(&rc);
  219. if (!(rc.PtInRect(pt)))
  220. {
  221. HighlightFolder(-1);
  222. HighlightItem(-1);
  223. KillTimer(1);
  224. }
  225. }
  226. else
  227. {
  228. if (nIDEvent == 3 && iLastSel >= 0)
  229. {
  230. iSelAnimCount ++;
  231. if (iSelAnimCount > 10) iSelAnimCount = -1;
  232. if (iSelAnimCount == 0)
  233. DrawAnimItem(-1, 1, iLastSel);
  234. if (iSelAnimCount == 1)
  235. DrawAnimItem(0, 0, iLastSel);
  236. if (iSelAnimCount == 2)
  237. DrawAnimItem(1, 1, iLastSel);
  238. if (iSelAnimCount == 3)
  239. DrawAnimItem(0, 0, iLastSel);
  240. }
  241. }
  242. CWnd::OnTimer(nIDEvent);
  243. }
  244. void CGfxOutBarCtrl::DrawAnimItem(const int xoffset, const int yoffset, const int index)
  245. {
  246. CImageList * ima = GetFolderImageList(iSelFolder, IsSmallIconView());
  247. CRect rc, irc;
  248. GetInsideRect(irc);
  249. GetItemRect(iSelFolder, iLastSel, rc);
  250. if (iLastSel >= iFirstItem && irc.bottom > rc.bottom && irc.top < rc.top)
  251. {
  252. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  253. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  254. ASSERT(index >= 0 && index < pbf->GetItemCount());
  255. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  256. ASSERT(pi && ima);
  257. CClientDC dc(this);
  258. if (IsSmallIconView())
  259. {
  260. if (ima)
  261. {
  262. IMAGEINFO ii;
  263. ima->GetImageInfo(pi->iImageIndex, &ii);
  264. CSize szImage = CRect(ii.rcImage).Size();
  265. CPoint pt;
  266. pt.x = rc.left + 2;
  267. pt.y = rc.top + (rc.Height() - szImage.cy) / 2;
  268. CRect rcBck(pt.x-1, pt.y-1, pt.x + szImage.cx+2, pt.y + szImage.cy+2);
  269. dc.FillSolidRect(rcBck, crBackGroundColor);
  270. pt.x += xoffset;
  271. pt.y += yoffset;
  272. ima->Draw(&dc, pi->iImageIndex, pt, ILD_NORMAL);
  273. }
  274. }
  275. else
  276. {
  277. if (ima)
  278. {
  279. IMAGEINFO ii;
  280. ima->GetImageInfo(pi->iImageIndex, &ii);
  281. CSize szImage = CRect(ii.rcImage).Size();
  282. CPoint pt;
  283. pt.x = rc.left + (rc.Width() - szImage.cx) / 2;
  284. pt.y = rc.top;
  285. CRect rcBck(pt.x-1, pt.y-1, pt.x + szImage.cx+2, pt.y + szImage.cy+2);
  286. dc.FillSolidRect(rcBck, crBackGroundColor);
  287. pt.x += xoffset;
  288. pt.y += yoffset;
  289. ima->Draw(&dc, pi->iImageIndex, pt, ILD_NORMAL);
  290. }
  291. }
  292. }
  293. }
  294. void CGfxOutBarCtrl::OnPaint() 
  295. {
  296. CRect clientRc;
  297. GetClientRect(&clientRc);
  298. CPaintDC dc(this);
  299. CDC memDC;
  300. memDC.CreateCompatibleDC(&dc);
  301. CBitmap bmp;
  302. bmp.CreateCompatibleBitmap(&dc, clientRc.Width(), clientRc.Height());
  303. CBitmap * obmp = memDC.SelectObject(&bmp);
  304. CDC * pDC = &memDC;
  305. CRect rc;
  306. GetInsideRect(rc);
  307. if (!GetFolderChild()) pDC->FillSolidRect(rc, crBackGroundColor);
  308. int max = arFolder.GetSize();
  309. CRect frc;
  310. for (int t = 0; t < max; t++)
  311. {
  312. GetFolderRect(t, frc);
  313. DrawFolder(pDC, t, frc, false);
  314. }
  315. if (!GetFolderChild())
  316. {
  317. int f,l;
  318. GetVisibleRange(iSelFolder, f,l);
  319. rcUpArrow.SetRect(0,0,GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CXVSCROLL));
  320. rcDownArrow = rcUpArrow;
  321. rcUpArrow.OffsetRect(rc.right - 5 - GetSystemMetrics(SM_CXVSCROLL), rc.top +5);
  322. rcDownArrow.OffsetRect(rc.right - 5 - GetSystemMetrics(SM_CXVSCROLL), rc.bottom - 5 - GetSystemMetrics(SM_CXVSCROLL));
  323. if (f > 0)
  324. {
  325. if (bUpPressed) pDC->DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED);
  326. else pDC->DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP);
  327. bUpArrow = true;
  328. pDC->ExcludeClipRect(rcUpArrow);
  329. }
  330. else bUpArrow = false;
  331. if (l < GetItemCount() - 1)
  332. {
  333. if (bDownPressed) pDC->DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED);
  334. else pDC->DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN);
  335. bDownArrow = true;
  336. pDC->ExcludeClipRect(rcDownArrow);
  337. }
  338. else bDownArrow = false;
  339. PaintItems(pDC, iSelFolder, rc);
  340. }
  341. dc.BitBlt(clientRc.left, clientRc.top, clientRc.Width(), clientRc.Height(), &memDC, 0,0, SRCCOPY);
  342. memDC.SelectObject(obmp);
  343. if (iLastFolderHighlighted >= 0)
  344. {
  345. int i = iLastFolderHighlighted;
  346. iLastFolderHighlighted = -1;
  347. HighlightFolder(i);
  348. }
  349. if (iLastItemHighlighted >= 0)
  350. {
  351. int i = iLastItemHighlighted;
  352. iLastItemHighlighted = -1;
  353. HighlightItem(i, bPressedHighlight);
  354. }
  355. }
  356. BOOL CGfxOutBarCtrl::OnEraseBkgnd(CDC* pDC) 
  357. {
  358. return true;
  359. }
  360. bool CGfxOutBarCtrl::GetFolderRect(const int iIndex, CRect & rect) const
  361. {
  362. int max = arFolder.GetSize();
  363. ASSERT(iIndex >= 0 && iIndex < max);
  364. if (iIndex >= 0 && iIndex < max)
  365. {
  366. CRect rc;
  367. GetClientRect(rc);
  368. if (iIndex > iSelFolder)
  369. rect.SetRect(rc.left, rc.bottom - ((max - iIndex)) * iFolderHeight, rc.right, 
  370. rc.bottom - (max - iIndex - 1) * iFolderHeight);
  371. else 
  372. rect.SetRect(rc.left, rc.top + iIndex * iFolderHeight - 1, rc.right, 
  373. rc.top + (1 + iIndex) * iFolderHeight - 1);
  374. return true;
  375. }
  376. return false;
  377. }
  378. void CGfxOutBarCtrl::GetItemRect(const int iFolder, const int iIndex, CRect & rect)
  379. {
  380. CRect rc;
  381. GetInsideRect(rc);
  382. int top = rc.top;
  383. CSize sz(0,0);
  384. int y = 0;
  385. for (int t = 0; t < iIndex; t++)
  386. {
  387. sz = GetItemSize(iFolder, t, ircAll);
  388. top += sz.cy;
  389. if (IsSmallIconView()) 
  390. {
  391. top += ySmallIconSpacing; 
  392. }
  393. else 
  394. {
  395. top += yLargeIconSpacing;
  396. }
  397. if (t == iFirstItem - 1) y = top - rc.top;
  398. }
  399. sz = GetItemSize(iFolder, iIndex, ircAll);
  400. rect.SetRect(rc.left, top, rc.left + sz.cx, top + sz.cy);
  401. rect.top -= y;
  402. rect.bottom -= y;
  403. rect.left += xLeftMargin;
  404. rect.top  += yTopMargin;
  405. rect.bottom += yTopMargin;
  406. if (!IsSmallIconView()) 
  407. {
  408. rect.left = rc.left;
  409. rect.right = rc.right;
  410. }
  411. }
  412. void CGfxOutBarCtrl::DrawFolder(CDC * pDC, const int iIdx, CRect rect, const bool bSelected)
  413. {
  414. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iIdx);
  415. if (!bSelected)
  416. {
  417. CPen pn1(PS_SOLID, 1, crBackGroundColor1);
  418. CPen * op = pDC->SelectObject(&pn1);
  419. pDC->MoveTo(rect.left, rect.top);
  420. pDC->LineTo(rect.right, rect.top);
  421. pDC->SelectObject(op);
  422. rect.top ++;
  423. pDC->Draw3dRect(rect, crHilightBorder, crBackGroundColor1);
  424. rect.InflateRect(-1,-1);
  425. pDC->FillSolidRect(rect, cr3dFace);
  426. int obk = pDC->SetBkMode(TRANSPARENT);
  427. CFont * of = pDC->SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  428. pDC->DrawText(CString(pbf->cName), rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  429. pDC->SetBkMode(obk);
  430. pDC->SelectObject(of);
  431. }
  432. else
  433. {
  434. CPen pn1(PS_SOLID, 1, crBackGroundColor1);
  435. CPen * op = pDC->SelectObject(&pn1);
  436. pDC->MoveTo(rect.left+1, rect.top);
  437. pDC->LineTo(rect.right, rect.top);
  438. pDC->SelectObject(op);
  439. rect.top ++;
  440. pDC->Draw3dRect(rect, crDkShadowBorder, crHilightBorder);
  441. rect.InflateRect(-1,-1);
  442. pDC->Draw3dRect(rect, crBackGroundColor1, cr3dFace);
  443. rect.InflateRect(-1,-1);
  444. pDC->FillSolidRect(rect, cr3dFace);
  445. int obk = pDC->SetBkMode(TRANSPARENT);
  446. CFont * of = pDC->SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  447. pDC->DrawText(CString(pbf->cName), rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  448. pDC->SetBkMode(obk);
  449. pDC->SelectObject(of);
  450. }
  451. }
  452. int CGfxOutBarCtrl::AddFolder(const char * cFolderName, const DWORD exData)
  453. {
  454. CBarFolder * pbf = new CBarFolder(cFolderName, exData);
  455. ASSERT(pbf);
  456. arFolder.Add((void *)pbf);
  457. return arFolder.GetSize() - 1;
  458. }
  459. CGfxOutBarCtrl::CBarFolder::CBarFolder(const char * name, DWORD exData)
  460. {
  461. cName = NULL;
  462. dwData = exData;
  463. if (name)
  464. {
  465. cName = new char[lstrlen(name)+1];
  466. ASSERT(cName);
  467. lstrcpy(cName, name);
  468. }
  469. pLargeImageList = NULL;
  470. pSmallImageList = NULL;
  471. pChild = NULL;
  472. }
  473. CGfxOutBarCtrl::CBarFolder::~CBarFolder()
  474. {
  475. if (cName) delete [] cName;
  476. for (int t = 0; t < arItems.GetSize(); t++)
  477. if (arItems.GetAt(t)) delete (CBarFolder*) arItems.GetAt(t);
  478. arItems.RemoveAll();
  479. }
  480. void CGfxOutBarCtrl::GetInsideRect(CRect & rect) const
  481. {
  482. GetClientRect(rect);
  483. if (arFolder.GetSize() > 0)
  484. {
  485. int max = arFolder.GetSize();
  486. rect.top += iFolderHeight * (iSelFolder + 1) - 1;//+ 2;
  487. rect.bottom -= (max - iSelFolder - 1)*iFolderHeight;
  488. return;
  489. }
  490. }
  491. void CGfxOutBarCtrl::OnMouseMove(UINT nFlags, CPoint point) 
  492. {
  493. int index, ht = HitTestEx(point, index);
  494. if (ht != htFolder && iLastFolderHighlighted >= 0) HighlightFolder(-1);
  495. if (ht != htItem   && iLastItemHighlighted   >= 0) HighlightItem(-1);
  496. if (ht == htFolder)
  497. {
  498. HighlightFolder(index);
  499. SetTimer(1,100,NULL);
  500. }
  501. else if (ht == htItem)
  502. {
  503. HighlightItem(index);
  504. SetTimer(1,100,NULL);
  505. }
  506. CWnd::OnMouseMove(nFlags, point);
  507. }
  508. int CGfxOutBarCtrl::HitTestEx(const CPoint & point, int &index)
  509. {
  510. if (bUpArrow && rcUpArrow.PtInRect(point)) return htUpScroll;
  511. if (bDownArrow && rcDownArrow.PtInRect(point)) return htDownScroll;
  512. int max = arFolder.GetSize(), t;
  513. CRect rc;
  514. for (t = 0; t < max; t++)
  515. {
  516. GetFolderRect(t, rc);
  517. if (rc.PtInRect(point)) 
  518. {
  519. index = t;
  520. return htFolder;
  521. }
  522. }
  523. GetInsideRect(rc);
  524. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  525. max = pbf->GetItemCount();
  526. for (t = iFirstItem; t < max; t++)
  527. {
  528. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(t);
  529. CRect itemRc;
  530. if (!IsSmallIconView()) 
  531. {
  532. GetIconRect(iSelFolder, t, itemRc);
  533. if (itemRc.PtInRect(point))
  534. {
  535. index = t;
  536. return htItem;
  537. }
  538. else if (itemRc.top > rc.bottom) break;
  539. GetLabelRect(iSelFolder, t, itemRc);
  540. itemRc.top -= yLargeIconLabelOffset;
  541. if (itemRc.PtInRect(point))
  542. {
  543. index = t;
  544. return htItem;
  545. }
  546. else if (itemRc.top > rc.bottom) break;
  547. }
  548. else
  549. {
  550. GetItemRect(iSelFolder, t, itemRc);
  551. if (itemRc.PtInRect(point))
  552. {
  553. index = t;
  554. return htItem;
  555. }
  556. else if (itemRc.top > rc.bottom) break;
  557. }
  558. }
  559. return htNothing;
  560. }
  561. void CGfxOutBarCtrl::HighlightFolder(const int index)
  562. {
  563. CWnd * pf = GetFocus();
  564. if (pf != NULL && pf != this && IsChild(pf)) return;
  565. if (iLastFolderHighlighted == index) return;
  566. if (iLastFolderHighlighted >= 0)
  567. {
  568. CRect rc;
  569. if (GetFolderRect(iLastFolderHighlighted, rc))
  570. {
  571. CClientDC dc(this);
  572. CPen pn(PS_SOLID, 1, crBackGroundColor1);//crShadowBorder);
  573. CPen * op = dc.SelectObject(&pn);
  574. dc.MoveTo(rc.left, rc.bottom-1);
  575. dc.LineTo(rc.right-1, rc.bottom-1);
  576. dc.LineTo(rc.right-1, rc.top);
  577. CPen pn1(PS_SOLID, 1, cr3dFace);
  578. dc.SelectObject(&pn1);
  579. dc.MoveTo(rc.left+1, rc.bottom-2);
  580. dc.LineTo(rc.right-2, rc.bottom-2);
  581. dc.LineTo(rc.right-2, rc.top+1);
  582. dc.SelectObject(op);
  583. }
  584. }
  585. iLastFolderHighlighted = index;
  586. if (iLastFolderHighlighted >= 0)
  587. {
  588. CRect rc;
  589. if (GetFolderRect(iLastFolderHighlighted, rc))
  590. {
  591. CClientDC dc(this);
  592. CPen pn(PS_SOLID, 1, crDkShadowBorder);
  593. CPen * op = dc.SelectObject(&pn);
  594. dc.MoveTo(rc.left, rc.bottom-1);
  595. dc.LineTo(rc.right-1, rc.bottom-1);
  596. dc.LineTo(rc.right-1, rc.top);
  597. CPen pn1(PS_SOLID, 1, crBackGroundColor1);
  598. dc.SelectObject(&pn1);
  599. dc.MoveTo(rc.left+1, rc.bottom-2);
  600. dc.LineTo(rc.right-2, rc.bottom-2);
  601. dc.LineTo(rc.right-2, rc.top+1);
  602. dc.SelectObject(op);
  603. }
  604. }
  605. }
  606. void CGfxOutBarCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  607. {
  608. if (GetFocus() != this) SetFocus();
  609. int index, ht = HitTestEx(point, index);
  610. iLastDragItemDrawType = -1;
  611. CRect inRc;
  612. GetInsideRect(inRc);
  613. if (ht == htFolder)
  614. {
  615. bool bHigh = true;
  616. CRect rc;
  617. GetFolderRect(index, rc);
  618. if (::GetCapture() == NULL)
  619. {
  620. SetCapture();
  621. ASSERT(this == GetCapture());
  622. CClientDC dc(this);
  623. DrawFolder(&dc, index, rc, true);
  624. AfxLockTempMaps();
  625. for (;;)
  626. {
  627. MSG msg;
  628. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  629. if (CWnd::GetCapture() != this) break;
  630. switch (msg.message)
  631. {
  632. case WM_MOUSEMOVE:
  633. {
  634. CPoint pt(msg.lParam);
  635. int idx, ht1 = HitTestEx(pt, idx);
  636. if (ht1 == htFolder && idx == index)
  637. {
  638. if (!bHigh)
  639. {
  640. DrawFolder(&dc, index, rc, true);
  641. bHigh = true;
  642. }
  643. }
  644. else
  645. {
  646. if (bHigh)
  647. {
  648. DrawFolder(&dc, index, rc, false);
  649. bHigh = false;
  650. }
  651. }
  652. }
  653. break;
  654. case WM_LBUTTONUP:
  655. {
  656. if (bHigh)
  657. {
  658. DrawFolder(&dc, index, rc, false);
  659. bHigh = false;
  660. }
  661. CPoint pt(msg.lParam);
  662. int idx, ht1 = HitTestEx(pt, idx);
  663. if (ht1 == htFolder && idx != iSelFolder)
  664. SetSelFolder(idx);
  665. }
  666. goto ExitLoop2;
  667. case WM_KEYDOWN:
  668. if (msg.wParam != VK_ESCAPE) 
  669. break;
  670. default:
  671. DispatchMessage(&msg);
  672. break;
  673. }
  674. }
  675. ExitLoop2:
  676. ReleaseCapture();
  677. AfxUnlockTempMaps(FALSE);
  678. }
  679. if (bHigh) InvalidateRect(rc, false);
  680. }
  681. else iLastSelectedFolder = -1;
  682. if (ht == htItem)
  683. {
  684. iLastDragItemDraw = -1;
  685. bool bHigh = true, bDragging = false;
  686. CRect rc;
  687. GetItemRect(iSelFolder, index, rc);
  688. HCURSOR hCur = GetCursor();
  689. if (::GetCapture() == NULL)
  690. {
  691. SetCapture();
  692. ASSERT(this == GetCapture());
  693. CClientDC dc(this);
  694. HighlightItem(index, true);
  695. AfxLockTempMaps();
  696. for (;;)
  697. {
  698. MSG msg;
  699. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  700. if (CWnd::GetCapture() != this) break;
  701. switch (msg.message)
  702. {
  703. case WM_MOUSEMOVE:
  704. {
  705. CPoint pt(msg.lParam);
  706. int idx;
  707. int ht1 = HitTestEx(pt, idx);
  708. if (bDragging)
  709. {
  710. if (ht1 == htItem) 
  711. {
  712. DrawDragArrow(&dc, index, idx);
  713. SetCursor(hDragCursor);
  714. hCur = hDragCursor;
  715. }
  716. else 
  717. {
  718. CRect rcItem;
  719. GetItemRect(iSelFolder, GetItemCount() - 1, rcItem);
  720. if (pt.y > rcItem.bottom && pt.y < inRc.bottom)
  721. {
  722. DrawDragArrow(&dc, index, GetItemCount());
  723. SetCursor(hDragCursor);
  724. hCur = hDragCursor;
  725. }
  726. else
  727. {
  728. DrawDragArrow(&dc, index, -1);
  729. SetCursor(hNoDragCursor);
  730. hCur = hNoDragCursor;
  731. }
  732. }
  733. }
  734. else
  735. {
  736. if (ht1 == htItem && idx == index)
  737. {
  738. if (!bHigh)
  739. {
  740. HighlightItem(index, true);
  741. bHigh = true;
  742. bPressedHighlight = true;
  743. }
  744. }
  745. else 
  746. {
  747. if (ht1 == htItem)
  748. {
  749. if (bHigh)
  750. {
  751. HighlightItem(index, false);
  752. bHigh = false;
  753. bPressedHighlight = false;
  754. }
  755. }
  756. else
  757. {
  758. if (dwFlags&fDragItems)
  759. {
  760. HighlightItem(index, true);
  761. bHigh = true;
  762. bDragging = true;
  763. SetCursor(hDragCursor);
  764. hCur = hDragCursor;
  765. bPressedHighlight = true;
  766. }
  767. }
  768. }
  769. }
  770. }
  771. break;
  772. case WM_SETCURSOR:
  773. SetCursor(hCur);
  774. break;
  775. case WM_LBUTTONUP:
  776. {
  777. if (bHigh)
  778. {
  779. HighlightItem(-1);
  780. bHigh = false;
  781. }
  782. CPoint pt(msg.lParam);
  783. int idx, ht1 = HitTestEx(pt, idx);
  784. if (!bDragging)
  785. {
  786. if (ht1 == htItem && idx == index) 
  787. {
  788. if (iSelAnimTiming > 0 && index != iLastSel && iLastSel >= 0)
  789. {
  790. DrawAnimItem(0, 0, iLastSel);
  791. }
  792. if (dwFlags&fSelHighlight && iLastSel >= 0)
  793. {
  794. CRect rc;
  795. GetIconRect(iSelFolder, iLastSel, rc);
  796. rc.InflateRect(1,1);
  797. InvalidateRect(rc);
  798. }
  799. iLastSel = index;
  800. if (dwFlags&fSelHighlight && iLastSel >= 0)
  801. {
  802. CRect rc;
  803. GetIconRect(iSelFolder, iLastSel, rc);
  804. rc.InflateRect(1,1);
  805. InvalidateRect(rc);
  806. }
  807. GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_ITEMCLICK, idx);
  808. }
  809. }
  810. else
  811. {
  812. if (ht1 == htItem)
  813. {
  814. if (idx != index)
  815. {
  816. OUTBAR_INFO ob;
  817. ob.iDragFrom = iSelFolder;
  818. ob.iDragTo = index;
  819. if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_DRAGITEM, (LPARAM) &ob))
  820. {
  821. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  822. CBarItem * piFrom = (CBarItem *) pbf->arItems.GetAt(index);
  823. pbf->arItems.RemoveAt(index);
  824. if (idx > index) idx --;
  825. pbf->arItems.InsertAt(idx, piFrom);
  826. }
  827. }
  828. }
  829. else
  830. {
  831. CRect rcItem;
  832. GetItemRect(iSelFolder, GetItemCount() - 1, rcItem);
  833. if (pt.y > rcItem.bottom && pt.y < inRc.bottom)
  834. {
  835. OUTBAR_INFO ob;
  836. ob.iDragFrom = iSelFolder;
  837. ob.iDragTo = index;
  838. if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_DRAGITEM, (LPARAM) &ob))
  839. {
  840. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  841. CBarItem * piFrom = (CBarItem *) pbf->arItems.GetAt(index);
  842. pbf->arItems.RemoveAt(index);
  843. pbf->arItems.Add((void *) piFrom);
  844. }
  845. }
  846. }
  847. }
  848. }
  849. goto ExitLoop4;
  850. default:
  851. DispatchMessage(&msg);
  852. break;
  853. }
  854. }
  855. ExitLoop4:
  856. ReleaseCapture();
  857. AfxUnlockTempMaps(FALSE);
  858. if (bDragging) 
  859. {
  860. Invalidate();
  861. }
  862. }
  863. bPressedHighlight = false;
  864. if (bHigh) InvalidateRect(rc, false);
  865. }
  866. else iLastItemHighlighted = -1;
  867. if (ht == htDownScroll)
  868. {
  869. bLooping = true;
  870. bool bHigh = true;
  871. if (::GetCapture() == NULL)
  872. {
  873. SetCapture();
  874. ASSERT(this == GetCapture());
  875. CClientDC dc(this);
  876. dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED);
  877. SetTimer(2,300,NULL);
  878. AfxLockTempMaps();
  879. for (;;)
  880. {
  881. MSG msg;
  882. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  883. if (CWnd::GetCapture() != this) break;
  884. switch (msg.message)
  885. {
  886. case WM_MOUSEMOVE:
  887. {
  888. CPoint pt(msg.lParam);
  889. if (rcDownArrow.PtInRect(pt))
  890. {
  891. if (bHigh == false)
  892. {
  893. dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED);
  894. bHigh = true;
  895. bDownArrow = true;
  896. bDownPressed = true;
  897. }
  898. }
  899. else
  900. {
  901. if (bHigh == true)
  902. {
  903. dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN);
  904. bHigh = false;
  905. bDownArrow = false;
  906. bDownPressed = false;
  907. }
  908. }
  909. }
  910. break;
  911. case WM_LBUTTONUP:
  912. {
  913. if (bHigh)
  914. {
  915. dc.DrawFrameControl(rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN);
  916. bHigh = false;
  917. }
  918. bDownArrow = false;
  919. CPoint pt(msg.lParam);
  920. if (rcDownArrow.PtInRect(pt))
  921. {
  922. CRect itrc;
  923. int itemCount = GetItemCount();
  924.                             if (itemCount > 0)
  925. {
  926. GetItemRect(iSelFolder, GetItemCount() - 1, itrc);
  927. CRect crc;
  928. GetInsideRect(crc);
  929. if (itrc.bottom > crc.bottom)
  930. {
  931. iFirstItem ++;
  932. InvalidateRect(crc, true);
  933. }
  934. }
  935. }
  936. }
  937. goto ExitLoop3;
  938. case WM_TIMER:
  939. {
  940. if (msg.wParam == 2)
  941. {
  942. if (bHigh)
  943. {
  944. CPoint pt(msg.pt);
  945. ScreenToClient(&pt);
  946. if (rcDownArrow.PtInRect(pt))
  947. {
  948. bDownPressed = true;
  949. CRect itrc;
  950. GetItemRect(iSelFolder, GetItemCount() - 1, itrc);
  951. CRect crc;
  952. GetInsideRect(crc);
  953. if (itrc.bottom > crc.bottom)
  954. {
  955. iFirstItem ++;
  956. InvalidateRect(crc, true);
  957. }
  958. else goto ExitLoop3;
  959. }
  960. else bDownPressed = false;
  961. }
  962. }
  963. break;
  964. }
  965. case WM_KEYDOWN:
  966. if (msg.wParam != VK_ESCAPE) 
  967. break;
  968. default:
  969. DispatchMessage(&msg);
  970. break;
  971. }
  972. }
  973. ExitLoop3:
  974. KillTimer(2);
  975. ReleaseCapture();
  976. AfxUnlockTempMaps(FALSE);
  977. bLooping = false;
  978. bDownPressed = false;
  979. bDownArrow = false;
  980. CRect crc;
  981. GetInsideRect(crc);
  982. InvalidateRect(crc, true);
  983. }
  984. }
  985. if (ht == htUpScroll)
  986. {
  987. bLooping = true;
  988. bool bHigh = true;
  989. if (::GetCapture() == NULL)
  990. {
  991. SetCapture();
  992. ASSERT(this == GetCapture());
  993. CClientDC dc(this);
  994. dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED);
  995. SetTimer(2,300,NULL);
  996. AfxLockTempMaps();
  997. for (;;)
  998. {
  999. MSG msg;
  1000. VERIFY(::GetMessage(&msg, NULL, 0, 0));
  1001. if (CWnd::GetCapture() != this) break;
  1002. switch (msg.message)
  1003. {
  1004. case WM_MOUSEMOVE:
  1005. {
  1006. CPoint pt(msg.lParam);
  1007. if (rcUpArrow.PtInRect(pt))
  1008. {
  1009. if (bHigh == false)
  1010. {
  1011. dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED);
  1012. bHigh = true;
  1013. bUpArrow = true;
  1014. bUpPressed = true;
  1015. }
  1016. }
  1017. else
  1018. {
  1019. if (bHigh == true)
  1020. {
  1021. dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP);
  1022. bHigh = false;
  1023. bUpArrow = false;
  1024. bUpPressed = false;
  1025. }
  1026. }
  1027. }
  1028. break;
  1029. case WM_LBUTTONUP:
  1030. {
  1031. if (bHigh)
  1032. {
  1033. dc.DrawFrameControl(rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP);
  1034. bHigh = false;
  1035. }
  1036. bUpArrow = false;
  1037. CPoint pt(msg.lParam);
  1038. if (rcUpArrow.PtInRect(pt))
  1039. {
  1040. if (iFirstItem > 0 ) 
  1041. {
  1042. iFirstItem --;
  1043. CRect crc;
  1044. GetInsideRect(crc);
  1045. InvalidateRect(crc, true);
  1046. }
  1047. }
  1048. }
  1049. goto ExitLoop;
  1050. case WM_TIMER:
  1051. {
  1052. if (msg.wParam == 2)
  1053. {
  1054. if (bHigh)
  1055. {
  1056. CPoint pt(msg.pt);
  1057. ScreenToClient(&pt);
  1058. if (rcUpArrow.PtInRect(pt))
  1059. {
  1060. bUpPressed = true;
  1061. if (iFirstItem > 0) 
  1062. {
  1063. iFirstItem --;
  1064. CRect crc;
  1065. GetInsideRect(crc);
  1066. InvalidateRect(crc, true);
  1067. }
  1068. else goto ExitLoop;
  1069. }
  1070. else bUpPressed = false;
  1071. }
  1072. }
  1073. break;
  1074. }
  1075. case WM_KEYDOWN:
  1076. if (msg.wParam != VK_ESCAPE) break;
  1077. default:
  1078. DispatchMessage(&msg);
  1079. break;
  1080. }
  1081. }
  1082. ExitLoop:
  1083. KillTimer(2);
  1084. ReleaseCapture();
  1085. AfxUnlockTempMaps(FALSE);
  1086. bLooping = false;
  1087. bUpPressed = false;
  1088. bUpArrow = false;
  1089. CRect crc;
  1090. GetInsideRect(crc);
  1091. InvalidateRect(crc, true);
  1092. }
  1093. }
  1094. CWnd::OnLButtonDown(nFlags, point);
  1095. }
  1096. int CGfxOutBarCtrl::InsertItem(const int folder, const int index, const char * text, const int image, const DWORD exData)
  1097. {
  1098. ASSERT(folder >= 0 && folder < GetFolderCount());
  1099. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(folder);
  1100. return pbf->InsertItem(index, text, image, exData);
  1101. }
  1102. int CGfxOutBarCtrl::GetItemCount() const
  1103. {
  1104. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1105. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1106. return  pbf->GetItemCount();
  1107. }
  1108. void CGfxOutBarCtrl::SetSelFolder(const int index)
  1109. {
  1110. ASSERT(index >= 0 && index < GetFolderCount());
  1111. // if (index == iSelFolder) return;
  1112. CWnd * pc = GetFolderChild();
  1113. if (pc) pc->ShowWindow(SW_HIDE);
  1114. if (index != iSelFolder)
  1115. {
  1116. if (dwFlags&fAnimation && lAnimationTickCount >= 0) AnimateFolderScroll(iSelFolder, index);
  1117. }
  1118. iSelFolder = index;
  1119. iFirstItem = 0;
  1120. iLastSel = -1;
  1121. pc = GetFolderChild();
  1122. if (pc)
  1123. {
  1124. CRect rc;
  1125. GetInsideRect(rc);
  1126. pc->MoveWindow(rc);
  1127. pc->ShowWindow(SW_SHOW);
  1128. }
  1129. GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_FOLDERCHANGE, (LPARAM) iSelFolder);
  1130. Invalidate();
  1131. }
  1132. int CGfxOutBarCtrl::GetFolderCount() const
  1133. {
  1134. return arFolder.GetSize();
  1135. }
  1136. int CGfxOutBarCtrl::GetSelFolder() const
  1137. {
  1138. return iSelFolder;
  1139. }
  1140. void CGfxOutBarCtrl::RemoveFolder(const int index)
  1141. {
  1142. ASSERT(index >= 0 && index < GetFolderCount());
  1143. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
  1144. delete pbf;
  1145. arFolder.RemoveAt(index);
  1146. if (iSelFolder >= index) iSelFolder = index - 1;
  1147. if (iSelFolder < 0 && GetFolderCount() > 0) iSelFolder = 0;
  1148. Invalidate();
  1149. }
  1150. int CGfxOutBarCtrl::CBarFolder::InsertItem(int index, const char * text, const int image, const DWORD exData)
  1151. {
  1152. if (index < 0 || index > GetItemCount()) index = GetItemCount();
  1153. int c = GetItemCount();
  1154. CBarItem * pbf = new CBarItem(text, image, exData);
  1155. ASSERT(pbf);
  1156. if (index < GetItemCount()) 
  1157. arItems.InsertAt(index, (void *) pbf);
  1158. else 
  1159. arItems.Add((void *) pbf);
  1160. c = GetItemCount();
  1161. return index;
  1162. }
  1163. int CGfxOutBarCtrl::GetCountPerPage() const
  1164. {
  1165. return 0;
  1166. }
  1167. CImageList * CGfxOutBarCtrl::SetImageList(CImageList * pImageList, int nImageList)
  1168. {
  1169. CImageList * o = NULL;
  1170. if (nImageList == fSmallIcon)
  1171. {
  1172. o = pSmallImageList;
  1173. pSmallImageList = pImageList;
  1174. }
  1175. else if (nImageList == fLargeIcon)
  1176. {
  1177. o = pLargeImageList;
  1178. pLargeImageList = pImageList;
  1179. }
  1180. return o;
  1181. }
  1182. CImageList * CGfxOutBarCtrl::GetImageList(CImageList * pImageList, int nImageList)
  1183. {
  1184. if (nImageList == fSmallIcon) return pSmallImageList;
  1185. else if (nImageList == fLargeIcon) return pLargeImageList;
  1186. return NULL;
  1187. }
  1188. CImageList * CGfxOutBarCtrl::SetFolderImageList(const int folder, CImageList * pImageList, int nImageList)
  1189. {
  1190. ASSERT(folder >= 0 && folder < GetFolderCount());
  1191. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(folder);
  1192. CImageList * o = NULL;
  1193. if (nImageList == fSmallIcon)
  1194. {
  1195. o = pbf->pSmallImageList;
  1196. pbf->pSmallImageList = pImageList;
  1197. }
  1198. else if (nImageList == fLargeIcon)
  1199. {
  1200. o = pbf->pLargeImageList;
  1201. pbf->pLargeImageList = pImageList;
  1202. }
  1203. return o;
  1204. }
  1205. CGfxOutBarCtrl::CBarItem::CBarItem(const char * name, const int image, DWORD exData)
  1206. {
  1207. cItem = NULL;
  1208. iImageIndex = image;
  1209. dwData = exData;
  1210. if (name)
  1211. {
  1212. cItem = new char[lstrlen(name)+1];
  1213. ASSERT(cItem);
  1214. lstrcpy(cItem, name);
  1215. }
  1216. }
  1217. CGfxOutBarCtrl::CBarItem::~CBarItem()
  1218. {
  1219. if (cItem) delete [] cItem;
  1220. }
  1221. int CGfxOutBarCtrl::CBarFolder::GetItemCount()
  1222. {
  1223. return arItems.GetSize();
  1224. }
  1225. void CGfxOutBarCtrl::PaintItems(CDC * pDC, const int iFolder, CRect rc)
  1226. {
  1227. ASSERT(iFolder >= 0 && iFolder < GetFolderCount());
  1228. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1229. int max = pbf->GetItemCount(), t;
  1230. CRect irc;
  1231. GetInsideRect(irc);
  1232. int isdc = pDC->SaveDC();
  1233. CRgn itemRegion;
  1234. itemRegion.CreateRectRgnIndirect(&irc);
  1235. pDC->SelectClipRgn(&itemRegion);
  1236. itemRegion.DeleteObject();
  1237. for (t = iFirstItem; t < max; t++)
  1238. {
  1239. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(t);
  1240. CRect itemRc;
  1241. GetItemRect(iFolder, t, itemRc);
  1242. if (itemRc.top > rc.bottom) break;
  1243. else DrawItem(pDC, iFolder, itemRc, t);
  1244. }
  1245. pDC->RestoreDC(isdc);
  1246. }
  1247. CSize CGfxOutBarCtrl::GetItemSize(const int iFolder, const int index, const int type)
  1248. {
  1249. ASSERT(iFolder >= 0 && iFolder < GetFolderCount());
  1250. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1251. ASSERT(index >= 0 && index < pbf->GetItemCount());
  1252. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  1253. CSize szImage(0,0);
  1254. CSize szLabel(0,0);
  1255. CSize szAll(0,0);
  1256. if (pi->iImageIndex >= 0)
  1257. {
  1258. if (type != ircLabel)
  1259. {
  1260. CImageList * il = GetFolderImageList(iFolder, IsSmallIconView());
  1261. ASSERT(il);
  1262. if (il)
  1263. {
  1264. IMAGEINFO ii;
  1265. il->GetImageInfo(pi->iImageIndex, &ii);
  1266. szImage = CRect(ii.rcImage).Size();
  1267. }
  1268. }
  1269. }
  1270. if (pi->cItem)
  1271. {
  1272. if (type != ircIcon)
  1273. {
  1274. CClientDC dc(this);
  1275. CFont * oft = (CFont *) dc.SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  1276. if (IsSmallIconView())
  1277. {
  1278. szLabel = dc.GetTextExtent(pi->cItem, lstrlen(pi->cItem));
  1279. }
  1280. else
  1281. {
  1282. CRect rc;
  1283. GetInsideRect(rc);
  1284. rc.bottom = rc.top;
  1285. dc.DrawText(pi->cItem, lstrlen(pi->cItem), rc, DT_CALCRECT|DT_CENTER|DT_WORDBREAK);
  1286. szLabel = rc.Size();
  1287. }
  1288. dc.SelectObject(oft);
  1289. }
  1290. }
  1291. if (IsSmallIconView())
  1292. {
  1293. if (type == ircIcon) szAll = szImage;
  1294. else if (type == ircLabel) szAll = szLabel;
  1295. else if (type == ircAll) szAll = CSize(szImage.cx + szLabel.cx + xSmallIconLabelOffset, szImage.cy > szLabel.cy ? szImage.cy : szLabel.cy);
  1296. }
  1297. else
  1298. {
  1299. if (type == ircIcon) szAll = szImage;
  1300. else if (type == ircLabel) szAll = szLabel;
  1301. else if (type == ircAll) 
  1302. {
  1303. szAll = CSize(szImage.cx > szLabel.cx ? szImage.cx : szLabel.cx, szLabel.cy + szImage.cy + yLargeIconLabelOffset + yLargeIconSpacing);
  1304. }
  1305. }
  1306. return szAll;
  1307. }
  1308. CImageList * CGfxOutBarCtrl::GetFolderImageList(const int index, const bool bSmall) const
  1309. {
  1310. ASSERT(index >= 0 && index < GetFolderCount());
  1311. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
  1312. if (bSmall)
  1313. {
  1314. if (pbf->pSmallImageList) return pbf->pSmallImageList; else return pSmallImageList;
  1315. }
  1316. if (pbf->pLargeImageList) 
  1317. return pbf->pLargeImageList; 
  1318. else 
  1319. return pLargeImageList;
  1320. }
  1321. void CGfxOutBarCtrl::DrawItem(CDC * pDC, const int iFolder, CRect rc, const int index, const bool bOnlyImage)
  1322. {
  1323. CImageList * ima = GetFolderImageList(iFolder, IsSmallIconView());
  1324. ASSERT(iFolder >= 0 && iFolder < GetFolderCount());
  1325. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1326. ASSERT(index >= 0 && index < pbf->GetItemCount());
  1327. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  1328. ASSERT(pi && ima);
  1329. CFont * oft = (CFont *) pDC->SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  1330. COLORREF ocr = pDC->SetTextColor(crTextColor);
  1331. int obk = pDC->SetBkMode(TRANSPARENT);
  1332. if (IsSmallIconView())
  1333. {
  1334. if (ima)
  1335. {
  1336. IMAGEINFO ii;
  1337. ima->GetImageInfo(pi->iImageIndex, &ii);
  1338. CSize szImage = CRect(ii.rcImage).Size();
  1339. CPoint pt;
  1340. pt.x = rc.left + 2;
  1341. pt.y = rc.top + (rc.Height() - szImage.cy) / 2;
  1342. ima->Draw(pDC, pi->iImageIndex, pt, ILD_NORMAL);
  1343. if (!bOnlyImage)
  1344. {
  1345. rc.left += szImage.cx + xSmallIconLabelOffset;
  1346. pDC->TextOut(rc.left, rc.top, CString(pi->cItem));
  1347. }
  1348. }
  1349. }
  1350. else
  1351. {
  1352. if (ima)
  1353. {
  1354. IMAGEINFO ii;
  1355. ima->GetImageInfo(pi->iImageIndex, &ii);
  1356. CSize szImage = CRect(ii.rcImage).Size();
  1357. CPoint pt;
  1358. pt.x = rc.left + (rc.Width() - szImage.cx) / 2;
  1359. pt.y = rc.top;// + (rc.Height() - szImage.cy) / 2;
  1360. ima->Draw(pDC, pi->iImageIndex, pt, ILD_NORMAL);
  1361. if (!bOnlyImage)
  1362. {
  1363. rc.top += szImage.cy + yLargeIconLabelOffset;
  1364. pDC->DrawText(pi->cItem, lstrlen(pi->cItem), rc, DT_CENTER|DT_WORDBREAK);
  1365. }
  1366. }
  1367. }
  1368. if (dwFlags&fSelHighlight && iLastSel == index && iLastSel >= 0)
  1369. {
  1370. CRect rc;
  1371. GetIconRect(iSelFolder, iLastSel, rc);
  1372. rc.InflateRect(1,1);
  1373. pDC->Draw3dRect(rc, crDkShadowBorder, cr3dFace);
  1374. }
  1375. pDC->SetTextColor(ocr);
  1376. pDC->SelectObject(oft);
  1377. pDC->SetBkMode(obk);
  1378. }
  1379. BOOL CGfxOutBarCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  1380. {
  1381. CPoint pt(GetMessagePos());
  1382. ScreenToClient(&pt);
  1383. int index, ht = HitTestEx(pt, index);
  1384. if (ht == htFolder)
  1385. {
  1386. SetCursor(hHandCursor);
  1387. return true;
  1388. }
  1389. return CWnd::OnSetCursor(pWnd, nHitTest, message);
  1390. }
  1391. void CGfxOutBarCtrl::GetVisibleRange(const int iFolder, int & first, int & last)
  1392. {
  1393. first = iFirstItem;
  1394. CRect rc;
  1395. GetInsideRect(rc);
  1396. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1397. int max = pbf->GetItemCount(), t;
  1398. for (t = iFirstItem; t < max; t++)
  1399. {
  1400. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(t);
  1401. CRect itemRc;
  1402. GetItemRect(iFolder, t, itemRc);
  1403. if (itemRc.bottom > rc.bottom) 
  1404. {
  1405. last = t - 1;
  1406. break;
  1407. }
  1408. else last = t;
  1409. }
  1410. }
  1411. void CGfxOutBarCtrl::OnSize(UINT nType, int cx, int cy) 
  1412. {
  1413. bUpArrow = bDownArrow = false;
  1414. CWnd::OnSize(nType, cx, cy);
  1415. int t, max = GetFolderCount();
  1416. CRect rc;
  1417. GetInsideRect(rc);
  1418. for (t = 0; t < max; t++)
  1419. {
  1420. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(t);
  1421. CWnd * pc = GetFolderChild(t);
  1422. if (pc) pc->SetWindowPos(0, rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER);
  1423. }
  1424. }
  1425. void CGfxOutBarCtrl::HighlightItem(const int index, const bool bPressed)
  1426. {
  1427. CWnd * pf = GetFocus();
  1428. if (pf != NULL && pf != this && IsChild(pf)) return;
  1429. static bool bOldPressed = false;
  1430. if (iLastItemHighlighted == index && bOldPressed == bPressed) return;
  1431. bOldPressed = bPressed;
  1432. CClientDC dc(this);
  1433. CRect irc;
  1434. GetInsideRect(irc);
  1435. int isdc = dc.SaveDC();
  1436. CRgn itemRegion;
  1437. itemRegion.CreateRectRgnIndirect(&irc);
  1438. dc.SelectClipRgn(&itemRegion);
  1439. itemRegion.DeleteObject();
  1440. if (iLastItemHighlighted >= 0 && IsValidItem(iLastItemHighlighted))
  1441. {
  1442. CRect rc;
  1443. GetIconRect(iSelFolder, iLastItemHighlighted, rc);
  1444. rc.InflateRect(1,1);
  1445. dc.Draw3dRect(rc, crBackGroundColor, crBackGroundColor);
  1446. }
  1447. if (iSelAnimTiming > 0 && index == iLastSel)
  1448. {
  1449. iLastItemHighlighted = -1;
  1450. return;
  1451. }
  1452. if (dwFlags&fSelHighlight && iLastSel == index)
  1453. {
  1454. iLastItemHighlighted = -1;
  1455. return;
  1456. }
  1457. iLastItemHighlighted = index;
  1458. if (iLastItemHighlighted >= 0 && IsValidItem(iLastItemHighlighted))
  1459. {
  1460. CRect rc;
  1461. GetIconRect(iSelFolder, iLastItemHighlighted, rc);
  1462. rc.InflateRect(1,1);
  1463. if (bPressed)
  1464. dc.Draw3dRect(rc, crDkShadowBorder, cr3dFace);
  1465. else
  1466. dc.Draw3dRect(rc, cr3dFace, crDkShadowBorder);
  1467. }
  1468. dc.RestoreDC(isdc);
  1469. }
  1470. void CGfxOutBarCtrl::GetIconRect(const int iFolder, const int iIndex, CRect & rect)
  1471. {
  1472. CRect rc;
  1473. GetInsideRect(rc);
  1474. int top = rc.top;
  1475. CSize sz(0,0);
  1476. int y = 0;
  1477. int spacing = IsSmallIconView() ? ySmallIconSpacing : yLargeIconSpacing;
  1478. for (int t = 0; t < iIndex; t++)
  1479. {
  1480. sz = GetItemSize(iFolder, t, ircAll);
  1481. top += sz.cy;
  1482. top += spacing;
  1483. if (t == iFirstItem - 1) y = top - rc.top;
  1484. }
  1485. top += spacing;
  1486. sz = GetItemSize(iFolder, iIndex, ircIcon);
  1487. if (IsSmallIconView())
  1488. {
  1489. rect.SetRect(rc.left, top, rc.left + sz.cx, top + sz.cy);
  1490. rect.left += xLeftMargin + 2;
  1491. rect.right += xLeftMargin + 2;
  1492. rect.top -= yTopMargin;
  1493. rect.bottom -= yTopMargin;
  1494. rect.top -= y;
  1495. rect.bottom -= y;
  1496. }
  1497. else
  1498. {
  1499. rect.SetRect(rc.left + (rc.Width() - sz.cx)/2, top, rc.left + (rc.Width() - sz.cx)/2 + sz.cx, top + sz.cy);
  1500. rect.top -= y + 3;
  1501. rect.bottom -= y + 2;
  1502. }
  1503. }
  1504. void CGfxOutBarCtrl::GetLabelRect(const int iFolder, const int iIndex, CRect & rect)
  1505. {
  1506. CRect rc;
  1507. GetInsideRect(rc);
  1508. int top = rc.top;
  1509. CSize sz(0,0);
  1510. int y = 0;
  1511. int spacing = IsSmallIconView() ? ySmallIconSpacing : yLargeIconSpacing;
  1512. for (int t = 0; t < iIndex; t++)
  1513. {
  1514. sz = GetItemSize(iFolder, t, ircAll);
  1515. top += sz.cy;
  1516. top += spacing;
  1517. if (t == iFirstItem - 1) y = top - rc.top;
  1518. }
  1519. top += spacing;
  1520. sz = GetItemSize(iFolder, iIndex, ircAll);
  1521. CSize szLabel = GetItemSize(iFolder, iIndex, ircLabel);
  1522. if (IsSmallIconView())
  1523. {
  1524. rect.SetRect(rc.left, top, rc.left + sz.cx, top + sz.cy);
  1525. rect.left += xLeftMargin + 2;
  1526. rect.right += xLeftMargin + 2;
  1527. rect.top  += yTopMargin - 5;
  1528. rect.bottom += yTopMargin - 5;
  1529. }
  1530. else
  1531. {
  1532. rect.SetRect(rc.left + (rc.Width() - sz.cx)/2, top, rc.left + (rc.Width() - sz.cx)/2 + sz.cx, top + sz.cy);
  1533. rect.top -= y + 3;
  1534. rect.bottom -= y + 2;
  1535. rect.bottom -=  yLargeIconSpacing;
  1536. rect.top    = rect.bottom - szLabel.cy;
  1537. }
  1538. }
  1539. void CGfxOutBarCtrl::StartGroupEdit(const int index)
  1540. {
  1541. CGfxGroupEdit * pEdit = new CGfxGroupEdit;
  1542. pEdit->iIndex = index;
  1543. CRect rc;
  1544. GetFolderRect(index, rc);
  1545. rc.InflateRect(-2,-2);
  1546. pEdit->Create(WS_CHILD|WS_VISIBLE|ES_CENTER|ES_MULTILINE,rc,this,1);
  1547. pEdit->msgSend = NM_OB_ONGROUPENDEDIT;
  1548. pEdit->ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED);
  1549. ASSERT(index >= 0 && index < GetFolderCount());
  1550. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
  1551. pEdit->SetWindowText(pbf->cName);
  1552. pEdit->SetFocus();
  1553. }
  1554. void CGfxOutBarCtrl::StartItemEdit(const int index)
  1555. {
  1556. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1557. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1558. ASSERT(index >= 0 && index < pbf->GetItemCount());
  1559. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  1560. CGfxGroupEdit * pEdit = new CGfxGroupEdit;
  1561. pEdit->iIndex = index;
  1562. CRect rc, crc;
  1563. GetLabelRect(iSelFolder, index, rc);
  1564. GetInsideRect(crc);
  1565. DWORD dwFlag = WS_CHILD|WS_VISIBLE|WS_BORDER;
  1566. if (!IsSmallIconView())
  1567. {
  1568. rc.left = crc.left + 5;
  1569. rc.right = crc.right - 5;
  1570. rc.bottom += 5;
  1571. dwFlag |= ES_CENTER|ES_MULTILINE;
  1572. }
  1573. else 
  1574. {
  1575. CRect irc;
  1576. GetIconRect(iSelFolder, index, irc);
  1577. dwFlag |= ES_AUTOHSCROLL;
  1578. rc.OffsetRect(irc.Width()+1, -6);
  1579. pEdit->bNoDown = true;
  1580. }
  1581. pEdit->Create(dwFlag, rc, this, 1);
  1582. pEdit->msgSend = NM_OB_ONLABELENDEDIT;
  1583. pEdit->SetWindowText(pi->cItem);
  1584. pEdit->SetFocus();
  1585. }
  1586. void CGfxOutBarCtrl::OnRButtonDown(UINT nFlags, CPoint point) 
  1587. {
  1588. iHitInternal1 = HitTestEx(point, iHitInternal2);
  1589. CGfxPopupMenu cMenu;
  1590. cMenu.CreatePopupMenu();
  1591. /* cMenu.AppendMenu(MF_STRING, ID_GFX_SMALLICON, _ID_GFX_SMALLICON);
  1592. cMenu.AppendMenu(MF_STRING, ID_GFX_LARGEICON, _ID_GFX_LARGEICON);
  1593. cMenu.AppendMenu(MF_STRING, ID_GFX_GROUPICON, _ID_GFX_ADDAGROUP);
  1594. cMenu.AppendMenu(MF_STRING, ID_GFX_FONTCICON, _ID_GFX_FONTCOLOR);
  1595. cMenu.AppendMenu(MF_STRING, ID_GFX_BACKCICON, _ID_GFX_BACKCOLOR);
  1596. if (iHitInternal1 == htItem)
  1597. {
  1598. if (dwFlags&fRemoveItems || dwFlags&fEditItems)
  1599. {
  1600. cMenu.AppendMenu(MF_SEPARATOR);
  1601. if (dwFlags&fRemoveItems)
  1602. cMenu.AppendMenu(MF_STRING, ID_GFX_REMOVEITEM, _ID_GFX_REMOVEITEM);
  1603. if (dwFlags&fEditItems)
  1604. cMenu.AppendMenu(MF_STRING, ID_GFX_RENAMEITEM, _ID_GFX_RENAMEITEM);
  1605. }
  1606. }
  1607. else if (iHitInternal1 == htFolder)
  1608. {
  1609. if (dwFlags&fRemoveGroups || dwFlags&fEditGroups)
  1610. {
  1611. cMenu.AppendMenu(MF_SEPARATOR);
  1612. if (dwFlags&fRemoveGroups)
  1613. cMenu.AppendMenu(MF_STRING, ID_GFX_REMOVEITEM, _ID_GFX_REMOVEITEM);
  1614. if (dwFlags&fEditGroups)
  1615. cMenu.AppendMenu(MF_STRING, ID_GFX_RENAMEITEM, _ID_GFX_RENAMEITEM);
  1616. }
  1617. }*/
  1618. cMenu.LoadToolBarResource(IDR_MAINFRAME);
  1619. cMenu.RemapMenu(&cMenu);
  1620. cMenu.EnableMenuItems(&cMenu, this);
  1621. CPoint pt(point);
  1622. ClientToScreen(&pt);
  1623. cMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, this);
  1624. cMenu.DestroyMenu();
  1625. CWnd::OnRButtonDown(nFlags, point);
  1626. }
  1627. void CGfxOutBarCtrl::OnGfxLargeicon() 
  1628. {
  1629. SetSmallIconView(false);
  1630. Invalidate();
  1631. }
  1632. void CGfxOutBarCtrl::OnUpdateGfxLargeicon(CCmdUI* pCmdUI) 
  1633. {
  1634. pCmdUI->Enable(IsSmallIconView());
  1635. }
  1636. void CGfxOutBarCtrl::OnGfxSmallicon() 
  1637. {
  1638. SetSmallIconView(true);
  1639. Invalidate();
  1640. }
  1641. void CGfxOutBarCtrl::OnUpdateGfxSmallicon(CCmdUI* pCmdUI) 
  1642. {
  1643. pCmdUI->Enable(!IsSmallIconView());
  1644. }
  1645. void CGfxOutBarCtrl::OnGfxRemoveitem() 
  1646. {
  1647. if (iHitInternal1 == htFolder)
  1648. {
  1649. RemoveFolder(iHitInternal2);
  1650. }
  1651. else if (iHitInternal1 == htItem)
  1652. {
  1653. RemoveItem(iHitInternal2);
  1654. }
  1655. }
  1656. void CGfxOutBarCtrl::OnUpdateGfxRemoveitem(CCmdUI* pCmdUI) 
  1657. {
  1658. }
  1659. void CGfxOutBarCtrl::OnGfxRenameitem() 
  1660. {
  1661. if (iHitInternal1 == htFolder)
  1662. {
  1663. StartGroupEdit(iHitInternal2);
  1664. }
  1665. else if (iHitInternal1 == htItem)
  1666. {
  1667. StartItemEdit(iHitInternal2);
  1668. }
  1669. }
  1670. void CGfxOutBarCtrl::OnUpdateGfxRenameitem(CCmdUI* pCmdUI) 
  1671. {
  1672. }
  1673. void CGfxOutBarCtrl::RemoveItem(const int index)
  1674. {
  1675. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1676. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1677. ASSERT(index >= 0 && index < pbf->GetItemCount());
  1678. if (IsValidItem(index))
  1679. {
  1680. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1681. delete i;
  1682. pbf->arItems.RemoveAt(index);
  1683. CRect rc;
  1684. GetInsideRect(rc);
  1685. InvalidateRect(rc);
  1686. }
  1687. }
  1688. bool CGfxOutBarCtrl::IsValidItem(const int index) const
  1689. {
  1690. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1691. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1692. return (index >= 0 && index < pbf->GetItemCount());
  1693. }
  1694. DWORD CGfxOutBarCtrl::GetItemData(const int index) const
  1695. {
  1696. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1697. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1698. if (IsValidItem(index))
  1699. {
  1700. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1701. return i->dwData;
  1702. }
  1703. return 0;
  1704. }
  1705. int CGfxOutBarCtrl::GetItemImage(const int index) const
  1706. {
  1707. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1708. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1709. if (IsValidItem(index))
  1710. {
  1711. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1712. return i->iImageIndex;
  1713. }
  1714. return 0;
  1715. }
  1716. void CGfxOutBarCtrl::SetItemData(const int index, const DWORD dwData)
  1717. {
  1718. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1719. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1720. if (IsValidItem(index))
  1721. {
  1722. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1723. i->dwData = dwData;
  1724. }
  1725. }
  1726. void CGfxOutBarCtrl::SetItemImage(const int index, const int iImage)
  1727. {
  1728. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1729. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1730. if (IsValidItem(index))
  1731. {
  1732. CBarItem * i = (CBarItem *) pbf->arItems.GetAt(index);
  1733. i->iImageIndex = iImage;
  1734. }
  1735. }
  1736. void CGfxOutBarCtrl::DrawDragArrow(CDC * pDC, const int iFrom, const int iTo)
  1737. {
  1738. if (iTo == iLastDragItemDraw) return;
  1739. CRect rc1;
  1740. if (iLastDragItemDraw >= 0)
  1741. {
  1742. GetDragItemRect(iLastDragItemDraw, rc1);
  1743. if (iLastDragItemDrawType == 0) rc1.bottom = rc1.top + 5;
  1744. else if (iLastDragItemDrawType == 1) { rc1.top -= 4; rc1.bottom = rc1.top + 9; }
  1745. else if (iLastDragItemDrawType == 2) { rc1.top -= 4; rc1.bottom = rc1.top + 5; }
  1746. InvalidateRect(rc1, true);
  1747. UpdateWindow();
  1748. }
  1749. iLastDragItemDraw = iTo;
  1750. if (iLastDragItemDraw >= 0)
  1751. {
  1752. iLastDragItemDrawType = GetDragItemRect(iLastDragItemDraw, rc1);
  1753. CPen * op = pDC->SelectObject(pBlackPen);
  1754. pDC->MoveTo(rc1.left, rc1.top);
  1755. pDC->LineTo(rc1.right, rc1.top);
  1756. if (iLastDragItemDrawType != 2)
  1757. {
  1758. pDC->MoveTo(rc1.left, rc1.top+1);
  1759. pDC->LineTo(rc1.left + 7, rc1.top+1);
  1760. pDC->MoveTo(rc1.left, rc1.top+2);
  1761. pDC->LineTo(rc1.left + 5, rc1.top+2);
  1762. pDC->MoveTo(rc1.left, rc1.top+3);
  1763. pDC->LineTo(rc1.left + 3, rc1.top+3);
  1764. pDC->MoveTo(rc1.left, rc1.top+4);
  1765. pDC->LineTo(rc1.left + 1, rc1.top+4);
  1766. pDC->MoveTo(rc1.right-1, rc1.top+1);
  1767. pDC->LineTo(rc1.right - 7, rc1.top+1);
  1768. pDC->MoveTo(rc1.right-1, rc1.top+2);
  1769. pDC->LineTo(rc1.right - 5, rc1.top+2);
  1770. pDC->MoveTo(rc1.right-1, rc1.top+3);
  1771. pDC->LineTo(rc1.right - 3, rc1.top+3);
  1772. }
  1773. if (iLastDragItemDrawType != 0)
  1774. {
  1775. pDC->MoveTo(rc1.left, rc1.top-1);
  1776. pDC->LineTo(rc1.left + 7, rc1.top-1);
  1777. pDC->MoveTo(rc1.left, rc1.top-2);
  1778. pDC->LineTo(rc1.left + 5, rc1.top-2);
  1779. pDC->MoveTo(rc1.left, rc1.top-3);
  1780. pDC->LineTo(rc1.left + 3, rc1.top-3);
  1781. pDC->MoveTo(rc1.left, rc1.top-4);
  1782. pDC->LineTo(rc1.left + 1, rc1.top-4);
  1783. pDC->MoveTo(rc1.right-1, rc1.top-1);
  1784. pDC->LineTo(rc1.right - 7, rc1.top-1);
  1785. pDC->MoveTo(rc1.right-1, rc1.top-2);
  1786. pDC->LineTo(rc1.right - 5, rc1.top-2);
  1787. pDC->MoveTo(rc1.right-1, rc1.top-3);
  1788. pDC->LineTo(rc1.right - 3, rc1.top-3);
  1789. pDC->MoveTo(rc1.right-1, rc1.top-4);
  1790. pDC->LineTo(rc1.right - 1, rc1.top-4);
  1791. }
  1792. pDC->SelectObject(op);
  1793. }
  1794. }
  1795. int CGfxOutBarCtrl::GetDragItemRect(const int index, CRect & rect)
  1796. {
  1797. CRect rc, crc;
  1798. GetInsideRect(crc);
  1799. crc.InflateRect(-2, 0);
  1800. GetItemRect(iSelFolder, index < GetItemCount() ? index : index - 1, rc);
  1801. int line = 0;
  1802. if (index < GetItemCount())
  1803. {
  1804. line = rc.top - 4;
  1805. }
  1806. else
  1807. {
  1808. line = rc.bottom + 6;
  1809. }
  1810. int tpe;
  1811. if (index == 0)
  1812. {
  1813. rect.SetRect(crc.left, line+2, crc.right, line + 7);
  1814. tpe = 0;
  1815. }
  1816. else if (index < GetItemCount())
  1817. {
  1818. rect.SetRect(crc.left, line - 9, crc.right, line);
  1819. tpe = 1;
  1820. if (IsSmallIconView()) 
  1821. {
  1822. rect.top += 8;
  1823. rect.bottom += 8;
  1824. }
  1825. }
  1826. else
  1827. {
  1828. rect.SetRect(crc.left, line, crc.right, line + 5);
  1829. tpe = 2;
  1830. }
  1831. return tpe;
  1832. }
  1833. void CGfxOutBarCtrl::AnimateFolderScroll(const int iFrom, const int iTo)
  1834. {
  1835. ASSERT(iFrom >= 0 && iFrom < GetFolderCount());
  1836. ASSERT(iTo >= 0 && iTo < GetFolderCount());
  1837. CRect rc, rc1, frc, frc1;
  1838. GetInsideRect(rc);
  1839. rc1.SetRect(0,0,rc.Width(),rc.Height());
  1840. GetFolderRect(iTo, frc);
  1841. frc1 = frc;
  1842. CClientDC dc(this);
  1843. CDC memDC;
  1844. memDC.CreateCompatibleDC(&dc);
  1845. CBitmap bmpFrom, bmpTo;
  1846. bmpFrom.CreateCompatibleBitmap(&dc, rc1.Width(), rc1.Height() + frc.Height() * 2);
  1847. bmpTo.CreateCompatibleBitmap(&dc, rc1.Width(), rc1.Height() + frc.Height() * 2);
  1848. CDC * pDC = &memDC;
  1849. CWnd * pWnd1 = GetFolderChild(iFrom);
  1850. CWnd * pWnd2 = GetFolderChild(iTo);
  1851. CBitmap * obmp = pDC->SelectObject(&bmpFrom);
  1852. if (iTo > iFrom)
  1853. {
  1854. rc1.bottom += frc.Height() * 2;
  1855. pDC->FillSolidRect(rc1, crBackGroundColor);
  1856. if (pWnd1) 
  1857. {
  1858. BOOL bPrev = pWnd1->ShowWindow(SW_SHOW);
  1859. pWnd1->SendMessage(WM_ERASEBKGND, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1860. pWnd1->SendMessage(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1861. if (!bPrev) pWnd1->ShowWindow(SW_HIDE);
  1862. }
  1863. else PaintItems(pDC, iFrom, rc1);
  1864. pDC->SelectObject(&bmpTo);
  1865. frc.SetRect(0,0,frc.Width(),frc.Height());
  1866. rc1.SetRect(0,frc.Height(),rc.Width(), rc.Height()+frc.Height() * 2);
  1867. pDC->FillSolidRect(rc1, crBackGroundColor);
  1868. if (pWnd2) 
  1869. {
  1870. CPoint ovpt = pDC->SetViewportOrg(0, frc.Height());
  1871. BOOL bPrev = pWnd2->ShowWindow(SW_SHOW);
  1872. pWnd2->SendMessage(WM_ERASEBKGND, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1873. pWnd2->SendMessage(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1874. if (!bPrev) pWnd2->ShowWindow(SW_HIDE);
  1875. pDC->SetViewportOrg(ovpt);
  1876. }
  1877. else PaintItems(pDC, iTo, rc1);
  1878. DrawFolder(pDC, iTo, frc, false);
  1879. }
  1880. else
  1881. {
  1882. frc.SetRect(0,0,frc.Width(),frc.Height());
  1883. rc1.top += frc.Height();
  1884. rc1.bottom += frc.Height() * 2;
  1885. pDC->FillSolidRect(rc1, crBackGroundColor);
  1886. if (pWnd1) 
  1887. {
  1888. CPoint ovpt = pDC->SetViewportOrg(0, frc.Height());
  1889. BOOL bPrev = pWnd1->ShowWindow(SW_SHOW);
  1890. pWnd1->SendMessage(WM_ERASEBKGND, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1891. pWnd1->SendMessage(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1892. if (!bPrev) pWnd1->ShowWindow(SW_HIDE);
  1893. pDC->SetViewportOrg(ovpt);
  1894. }
  1895. else PaintItems(pDC, iFrom, rc1);
  1896. DrawFolder(pDC, iFrom, frc, false);
  1897. pDC->SelectObject(&bmpTo);
  1898. rc1.SetRect(0,0,rc.Width(), rc.Height() + frc.Height() * 2);
  1899. pDC->FillSolidRect(rc1, crBackGroundColor);
  1900. if (pWnd2) 
  1901. {
  1902. BOOL bPrev = pWnd2->ShowWindow(SW_SHOW);
  1903. pWnd2->SendMessage(WM_ERASEBKGND, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1904. pWnd2->SendMessage(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), (LPARAM) 0);
  1905. if (!bPrev) pWnd2->ShowWindow(SW_HIDE);
  1906. }
  1907. else PaintItems(pDC, iTo, rc1);
  1908. }
  1909. if (iTo > iFrom)
  1910. {
  1911. CRect rcFrom, rcTo;
  1912. GetFolderRect(iFrom, rcFrom);
  1913. GetFolderRect(iTo, rcTo);
  1914. int fh = rcFrom.Height();
  1915. for (int y = rcTo.top - fh; y > rcFrom.bottom; y -= fh)
  1916. {
  1917. pDC->SelectObject(&bmpFrom);
  1918. dc.BitBlt(rc.left, rcFrom.bottom + 1, rc.Width(), y - rcFrom.bottom - 1, pDC, 0,fh, SRCCOPY);
  1919. pDC->SelectObject(&bmpTo);
  1920. dc.BitBlt(rc.left, y, rc.Width(), rc.bottom - y + fh, pDC, 0,0, SRCCOPY);
  1921. Sleep(lAnimationTickCount);
  1922. }
  1923. }
  1924. else
  1925. {
  1926. CRect rcFrom, rcTo;
  1927. GetFolderRect(iFrom, rcFrom);
  1928. int fh = rcFrom.Height();
  1929. rcTo.SetRect(rc.left, rc.bottom, rc.right, rc.bottom - fh);
  1930. for (int y = rcFrom.top + 1; y < rcTo.top - fh; y += fh)
  1931. {
  1932. pDC->SelectObject(&bmpTo);
  1933. dc.BitBlt(rc.left, rcFrom.top, rc.Width(), y - rcFrom.top - 1, pDC, 0, fh*2, SRCCOPY);
  1934. pDC->SelectObject(&bmpFrom);
  1935. dc.BitBlt(rc.left, y, rc.Width(), rc.bottom - y, pDC, 0,0, SRCCOPY);
  1936. Sleep(lAnimationTickCount);
  1937. }
  1938. }
  1939. pDC->SelectObject(obmp);
  1940. }
  1941. CString CGfxOutBarCtrl::GetItemText(const int index)
  1942. {
  1943. CString item;
  1944. ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
  1945. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
  1946. if (IsValidItem(index))
  1947. {
  1948. CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
  1949. if (pi->cItem) item = pi->cItem;
  1950. }
  1951. return item;
  1952. }
  1953. int CGfxOutBarCtrl::AddFolderBar(const char * pFolder, CWnd * pSon, const DWORD exData)
  1954. {
  1955. CBarFolder * pbf = new CBarFolder(pFolder, exData);
  1956. ASSERT(pbf);
  1957. pbf->pChild = pSon;
  1958. arFolder.Add((void *)pbf);
  1959. return arFolder.GetSize() - 1;
  1960. }
  1961. CWnd * CGfxOutBarCtrl::GetFolderChild(int iFolder)
  1962. {
  1963. if (GetFolderCount())
  1964. {
  1965. if (iFolder < 0) iFolder = iSelFolder;
  1966. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1967. return pbf->pChild;
  1968. }
  1969. return NULL;
  1970. }
  1971. DWORD CGfxOutBarCtrl::GetFolderData(int iFolder)
  1972. {
  1973. if (iFolder < 0) iFolder = iSelFolder;
  1974. CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iFolder);
  1975. return pbf->dwData;
  1976. }
  1977. void CGfxOutBarCtrl::SetAnimSelHighlight(const int iTime)
  1978. {
  1979. if (iTime <= 0) KillTimer(3);
  1980. else SetTimer(3, iTime, NULL);
  1981. iSelAnimTiming = iTime;
  1982. }