GfxOutBarCtrl.cpp
上传用户:guangzhiyw
上传日期:2007-01-09
资源大小:495k
文件大小:59k
源码类别:

ICQ/即时通讯

开发平台:

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