XTPDockingPaneContext.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:50k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPDockingPaneContext.cpp : implementation of the CXTPDockingPaneContext class.
  2. //
  3. // This file is a part of the XTREME DOCKINGPANE MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "Common/XTPResourceManager.h"
  24. #include "TabManager/XTPTabManager.h"
  25. #include "XTPDockingPaneContext.h"
  26. #include "XTPDockingPane.h"
  27. #include "XTPDockingPaneManager.h"
  28. #include "XTPDockingPaneTabbedContainer.h"
  29. #include "XTPDockingPaneSplitterContainer.h"
  30. #include "XTPDockingPaneMiniWnd.h"
  31. #include "XTPDockingPaneSidePanel.h"
  32. #ifdef _DEBUG
  33. #define new DEBUG_NEW
  34. #undef THIS_FILE
  35. static char THIS_FILE[] = __FILE__;
  36. #endif
  37. void AFX_CDECL CXTPDockingPaneContext::AdjustRectangle(CRect& rect, CPoint pt)
  38. {
  39. int nXOffset = (pt.x < rect.left) ? (pt.x - rect.left - 6) :
  40. (pt.x > rect.right) ? (pt.x - rect.right + 6) : 0;
  41. int nYOffset = (pt.y < rect.top) ? (pt.y - rect.top - 6) :
  42. (pt.y > rect.bottom) ? (pt.y - rect.bottom + 6) : 0;
  43. rect.OffsetRect(nXOffset, nYOffset);
  44. }
  45. void AFX_CDECL CXTPDockingPaneContext::AdjustCursor(CPoint& pt)
  46. {
  47. CRect rc = XTPMultiMonitor()->GetWorkArea(pt);
  48. if (pt.x < rc.left) pt.x = rc.left;
  49. if (pt.x > rc.right) pt.x = rc.right;
  50. if (pt.y < rc.top) pt.y = rc.top;
  51. if (pt.y > rc.bottom) pt.y = rc.bottom;
  52. }
  53. typedef BOOL (WINAPI *PFNSETLAYEREDWINDOWATTRIBUTES) (HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
  54. #ifndef LWA_ALPHA
  55. #define LWA_ALPHA               0x00000002
  56. #endif
  57. #ifndef WS_EX_LAYERED
  58. #define WS_EX_LAYERED           0x00080000
  59. #endif
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CXTPDockingPaneContextAlphaWnd
  62. CXTPDockingPaneContextAlphaWnd::CXTPDockingPaneContextAlphaWnd()
  63. {
  64. }
  65. CXTPDockingPaneContextAlphaWnd::~CXTPDockingPaneContextAlphaWnd()
  66. {
  67. }
  68. BEGIN_MESSAGE_MAP(CXTPDockingPaneContextAlphaWnd, CWnd)
  69. //{{AFX_MSG_MAP(CXTPDockingPaneContextAlphaWnd)
  70. ON_WM_ERASEBKGND()
  71. ON_WM_PAINT()
  72. //}}AFX_MSG_MAP
  73. END_MESSAGE_MAP()
  74. /////////////////////////////////////////////////////////////////////////////
  75. // CXTPDockingPaneContextAlphaWnd message handlers
  76. BOOL CXTPDockingPaneContextAlphaWnd::OnEraseBkgnd(CDC* /*pDC*/)
  77. {
  78. return TRUE;
  79. }
  80. void CXTPDockingPaneContextAlphaWnd::OnPaint()
  81. {
  82. CPaintDC dc(this); // device context for painting
  83. CRect rc;
  84. GetClientRect(&rc);
  85. dc.FillSolidRect(rc, GetSysColor(COLOR_HIGHLIGHT));
  86. }
  87. //////////////////////////////////////////////////////////////////////////
  88. // CXTPDockingPaneContextStickerWnd
  89. CXTPDockingPaneContextStickerWnd::CXTPDockingPaneContextStickerWnd(CXTPDockingPaneContext* pContext)
  90. : m_pContext(pContext)
  91. {
  92. m_typeSticker = m_selectedSticker = xtpPaneStickerNone;
  93. }
  94. CXTPDockingPaneContextStickerWnd::~CXTPDockingPaneContextStickerWnd()
  95. {
  96. }
  97. BEGIN_MESSAGE_MAP(CXTPDockingPaneContextStickerWnd, CWnd)
  98. //{{AFX_MSG_MAP(CXTPDockingPaneContextStickerWnd)
  99. ON_WM_ERASEBKGND()
  100. ON_WM_PAINT()
  101. //}}AFX_MSG_MAP
  102. END_MESSAGE_MAP()
  103. /////////////////////////////////////////////////////////////////////////////
  104. // CXTPDockingPaneContextAlphaWnd message handlers
  105. BOOL CXTPDockingPaneContextStickerWnd::OnEraseBkgnd(CDC* /*pDC*/)
  106. {
  107. return TRUE;
  108. }
  109. struct CXTPDockingPaneContextStickerWnd::SPRITEINFO
  110. {
  111. SPRITEINFO(int x, int y, int left, int top, int cx, int cy)
  112. {
  113. ptDest = CPoint(x, y);
  114. rcSrc.SetRect(left, top, left + cx, top + cy);
  115. }
  116. CPoint ptDest;
  117. CRect rcSrc;
  118. };
  119. #define SPRITE_STICKER_TOP              0
  120. #define SPRITE_STICKER_LEFT             1
  121. #define SPRITE_STICKER_BOTTOM           2
  122. #define SPRITE_STICKER_RIGHT            3
  123. #define SPRITE_STICKER_TOP_SELECTED     4
  124. #define SPRITE_STICKER_LEFT_SELECTED    5
  125. #define SPRITE_STICKER_BOTTOM_SELECTED  6
  126. #define SPRITE_STICKER_RIGHT_SELECTED   7
  127. #define SPRITE_STICKER_CENTER           8
  128. #define SPRITE_STICKER_CENTER_SELECTED  9
  129. #define SPRITE_STICKER_CLIENT           10
  130. static CXTPDockingPaneContextStickerWnd::SPRITEINFO arrSpritesStyckerWidbey[] =
  131. {
  132. CXTPDockingPaneContextStickerWnd::SPRITEINFO(25, 0, 0, 0, 43, 30),
  133. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 25, 30, 33, 30, 43),
  134. CXTPDockingPaneContextStickerWnd::SPRITEINFO(25, 63, 43, 0, 43, 30),
  135. CXTPDockingPaneContextStickerWnd::SPRITEINFO(63, 25, 0, 33, 30, 43),
  136. CXTPDockingPaneContextStickerWnd::SPRITEINFO(25, 0, 0, 76, 43, 30),
  137. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 25, 90, 33, 30, 43),
  138. CXTPDockingPaneContextStickerWnd::SPRITEINFO(25, 63, 43, 76, 43, 30),
  139. CXTPDockingPaneContextStickerWnd::SPRITEINFO(63, 25, 60, 33, 30, 43),
  140. CXTPDockingPaneContextStickerWnd::SPRITEINFO(30, 30, 86, 0, 33, 33),
  141. CXTPDockingPaneContextStickerWnd::SPRITEINFO(30, 30, 86, 76, 33, 33),
  142. CXTPDockingPaneContextStickerWnd::SPRITEINFO(25, 25, 0, 0, 43, 43),
  143. };
  144. static CXTPDockingPaneContextStickerWnd::SPRITEINFO arrSpritesStyckerVisualStudio2005[] =
  145. {
  146. CXTPDockingPaneContextStickerWnd::SPRITEINFO(30, 0, 61, 29, 29, 30),
  147. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 30, 90, 30, 30, 29),
  148. CXTPDockingPaneContextStickerWnd::SPRITEINFO(30, 59, 91, 0, 29, 30),
  149. CXTPDockingPaneContextStickerWnd::SPRITEINFO(60, 30, 62, 0, 30, 29),
  150. CXTPDockingPaneContextStickerWnd::SPRITEINFO(30, 0, 61, 29 + 61, 29, 30),
  151. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 30, 90, 30 + 61, 30, 29),
  152. CXTPDockingPaneContextStickerWnd::SPRITEINFO(30, 59, 91, 0 + 61, 29, 30),
  153. CXTPDockingPaneContextStickerWnd::SPRITEINFO(60, 30, 62, 0 + 61, 30, 29),
  154. CXTPDockingPaneContextStickerWnd::SPRITEINFO(30, 30, 120, 82, 28, 29),
  155. CXTPDockingPaneContextStickerWnd::SPRITEINFO(24, 24, 120, 41, 41, 41),
  156. CXTPDockingPaneContextStickerWnd::SPRITEINFO(24, 24, 120, 0, 41, 41),
  157. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 0, 0, 29, 29, 32),
  158. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 0, 29, 32, 32, 29),
  159. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 0, 32, 0, 29, 32),
  160. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 0, 0, 0, 32, 29),
  161. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 0, 0, 29 + 61, 29, 32),
  162. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 0, 29, 32 + 61, 32, 29),
  163. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 0, 32, 0 + 61, 29, 32),
  164. CXTPDockingPaneContextStickerWnd::SPRITEINFO(0, 0, 0, 0 + 61, 32, 29),
  165. };
  166. void CXTPDockingPaneContextStickerWnd::DrawTransparent(CDC* pDC , const CPoint& ptDest, const CSize& sz, CBitmap* pBitmap)
  167. {
  168. CImageList il;
  169. il.Create(sz.cx, sz.cy, ILC_COLOR24 | ILC_MASK, 0, 1);
  170. il.Add(pBitmap, RGB(0, 0xFF, 0));
  171. il.Draw(pDC, 0, ptDest, ILD_NORMAL);
  172. }
  173. void CXTPDockingPaneContextStickerWnd::DrawSprite(CDC* pDC, UINT nID, SPRITEINFO* pSpriteInfo, BOOL bClientBitmap)
  174. {
  175. CBitmap bmp;
  176. VERIFY(XTPResourceManager()->LoadBitmap(&bmp, nID));
  177. CSize sz(pSpriteInfo->rcSrc.Width(), pSpriteInfo->rcSrc.Height());
  178. CBitmap bmpSprite;
  179. bmpSprite.CreateCompatibleBitmap(pDC, sz.cx, sz.cy);
  180. if (bmpSprite.GetSafeHandle())
  181. {
  182. CXTPCompatibleDC dcSprite(pDC, &bmpSprite);
  183. CXTPCompatibleDC dc(pDC, &bmp);
  184. dcSprite.BitBlt(0, 0, sz.cx, sz.cy, &dc, pSpriteInfo->rcSrc.left, pSpriteInfo->rcSrc.top, SRCCOPY);
  185. }
  186. CPoint ptDest = bClientBitmap ? pSpriteInfo->ptDest : CPoint(0, 0);
  187. DrawTransparent(pDC, ptDest, sz, &bmpSprite);
  188. }
  189. void CXTPDockingPaneContextStickerWnd::OnDraw(CDC* pDC)
  190. {
  191. XTPCurrentSystemTheme theme = XTPColorManager()->GetCurrentSystemTheme();
  192. BOOL bClient = (m_typeSticker & xtpPaneStickerClient) == xtpPaneStickerClient;
  193. if (m_pContext->GetStickerStyle() == xtpPaneStickerStyleWhidbey)
  194. {
  195. UINT nIDBitmap = theme == xtpSystemThemeOlive ? XTP_IDB_DOCKINGPANE_STICKERS_OLIVE :
  196. theme == xtpSystemThemeSilver ? XTP_IDB_DOCKINGPANE_STICKERS_SILVER : XTP_IDB_DOCKINGPANE_STICKERS_BLUE;
  197. SPRITEINFO* sprites = arrSpritesStyckerWidbey;
  198. if (bClient)
  199. DrawSprite(pDC, XTP_IDB_DOCKINGPANE_STICKER_CLIENT, &sprites[SPRITE_STICKER_CLIENT]);
  200. if (m_typeSticker & xtpPaneStickerTop)
  201. DrawSprite(pDC, nIDBitmap, &sprites[m_selectedSticker == xtpPaneStickerTop ? SPRITE_STICKER_TOP_SELECTED : SPRITE_STICKER_TOP], bClient);
  202. if (m_typeSticker & xtpPaneStickerLeft)
  203. DrawSprite(pDC, nIDBitmap, &sprites[m_selectedSticker == xtpPaneStickerLeft ? SPRITE_STICKER_LEFT_SELECTED : SPRITE_STICKER_LEFT], bClient);
  204. if (m_typeSticker & xtpPaneStickerBottom)
  205. DrawSprite(pDC, nIDBitmap, &sprites[m_selectedSticker == xtpPaneStickerBottom ? SPRITE_STICKER_BOTTOM_SELECTED : SPRITE_STICKER_BOTTOM], bClient);
  206. if (m_typeSticker & xtpPaneStickerRight)
  207. DrawSprite(pDC, nIDBitmap, &sprites[m_selectedSticker == xtpPaneStickerRight ? SPRITE_STICKER_RIGHT_SELECTED : SPRITE_STICKER_RIGHT], bClient);
  208. if (m_typeSticker & xtpPaneStickerCenter)
  209. DrawSprite(pDC, nIDBitmap, &sprites[m_selectedSticker == xtpPaneStickerCenter ? SPRITE_STICKER_CENTER_SELECTED : SPRITE_STICKER_CENTER]);
  210. }
  211. else
  212. {
  213. SPRITEINFO* sprites = arrSpritesStyckerVisualStudio2005;
  214. int nClientSprite = bClient ? 0 : 11;
  215. if (bClient)
  216. DrawSprite(pDC, XTP_IDB_DOCKINGPANE_STICKERS_2005, &sprites[m_selectedSticker == xtpPaneStickerCenter ? SPRITE_STICKER_CENTER_SELECTED : SPRITE_STICKER_CLIENT]);
  217. if (m_typeSticker & xtpPaneStickerTop)
  218. DrawSprite(pDC, XTP_IDB_DOCKINGPANE_STICKERS_2005, &sprites[nClientSprite + (m_selectedSticker == xtpPaneStickerTop ? SPRITE_STICKER_TOP_SELECTED : SPRITE_STICKER_TOP)], bClient);
  219. if (m_typeSticker & xtpPaneStickerLeft)
  220. DrawSprite(pDC, XTP_IDB_DOCKINGPANE_STICKERS_2005, &sprites[nClientSprite + (m_selectedSticker == xtpPaneStickerLeft ? SPRITE_STICKER_LEFT_SELECTED : SPRITE_STICKER_LEFT)], bClient);
  221. if (m_typeSticker & xtpPaneStickerBottom)
  222. DrawSprite(pDC, XTP_IDB_DOCKINGPANE_STICKERS_2005, &sprites[nClientSprite + (m_selectedSticker == xtpPaneStickerBottom ? SPRITE_STICKER_BOTTOM_SELECTED : SPRITE_STICKER_BOTTOM)], bClient);
  223. if (m_typeSticker & xtpPaneStickerRight)
  224. DrawSprite(pDC, XTP_IDB_DOCKINGPANE_STICKERS_2005, &sprites[nClientSprite + (m_selectedSticker == xtpPaneStickerRight ? SPRITE_STICKER_RIGHT_SELECTED : SPRITE_STICKER_RIGHT)], bClient);
  225. if (m_typeSticker & xtpPaneStickerCenter)
  226. DrawSprite(pDC, XTP_IDB_DOCKINGPANE_STICKERS_2005, &sprites[SPRITE_STICKER_CENTER]);
  227. }
  228. }
  229. void CXTPDockingPaneContextStickerWnd::OnPaint()
  230. {
  231. CPaintDC dcPaint(this); // device context for painting
  232. CXTPBufferDC dc(dcPaint, CXTPClientRect(this));
  233. OnDraw(&dc);
  234. }
  235. XTPDockingPaneStickerType CXTPDockingPaneContextStickerWnd::HitTest(CPoint pt)
  236. {
  237. CXTPClientRect rc(this);
  238. ScreenToClient(&pt);
  239. if (!rc.PtInRect(pt))
  240. return xtpPaneStickerNone;
  241. CClientDC dcClient(this);
  242. CBitmap bmp;
  243. bmp.CreateCompatibleBitmap(&dcClient, rc.Width(), rc.Height());
  244. CXTPCompatibleDC dc(&dcClient, &bmp);
  245. dc.FillSolidRect(rc, 0);
  246. UINT nIDBitmap = m_pContext->GetStickerStyle() == xtpPaneStickerStyleVisualStudio2005 ?
  247. XTP_IDB_DOCKINGPANE_STICKERS_2005 : XTP_IDB_DOCKINGPANE_STICKERS_BLUE;
  248. UINT nIDBitmapClient = m_pContext->GetStickerStyle() == xtpPaneStickerStyleVisualStudio2005 ?
  249. XTP_IDB_DOCKINGPANE_STICKERS_2005 : XTP_IDB_DOCKINGPANE_STICKER_CLIENT;
  250. BOOL bClient = (m_typeSticker & xtpPaneStickerClient) == xtpPaneStickerClient;
  251. SPRITEINFO* sprites = m_pContext->GetStickerStyle() == xtpPaneStickerStyleWhidbey ?
  252. arrSpritesStyckerWidbey : arrSpritesStyckerVisualStudio2005;
  253. if (m_typeSticker & xtpPaneStickerTop)
  254. {
  255. DrawSprite(&dc, nIDBitmap, &sprites[SPRITE_STICKER_TOP], bClient);
  256. if (dc.GetPixel(pt) != 0)
  257. return xtpPaneStickerTop;
  258. }
  259. if (m_typeSticker & xtpPaneStickerLeft)
  260. {
  261. DrawSprite(&dc, nIDBitmap, &sprites[SPRITE_STICKER_LEFT], bClient);
  262. if (dc.GetPixel(pt) != 0)
  263. return xtpPaneStickerLeft;
  264. }
  265. if (m_typeSticker & xtpPaneStickerBottom)
  266. {
  267. DrawSprite(&dc, nIDBitmap, &sprites[SPRITE_STICKER_BOTTOM], bClient);
  268. if (dc.GetPixel(pt) != 0)
  269. return xtpPaneStickerBottom;
  270. }
  271. if (m_typeSticker & xtpPaneStickerRight)
  272. {
  273. DrawSprite(&dc, nIDBitmap, &sprites[SPRITE_STICKER_RIGHT], bClient);
  274. if (dc.GetPixel(pt) != 0)
  275. return xtpPaneStickerRight;
  276. }
  277. if (m_typeSticker & xtpPaneStickerCenter)
  278. {
  279. DrawSprite(&dc, nIDBitmapClient, &sprites[SPRITE_STICKER_CLIENT]);
  280. if (dc.GetPixel(pt) != 0)
  281. return xtpPaneStickerCenter;
  282. }
  283. return xtpPaneStickerNone;
  284. }
  285. //////////////////////////////////////////////////////////////////////////
  286. // CXTPDockingPaneContext
  287. CXTPDockingPaneContext::CXTPDockingPaneContext()
  288. {
  289. m_bUseAlphaContext = FALSE;
  290. m_bUseDockingStickers = FALSE;
  291. m_bDragKeyboard = FALSE;
  292. m_pStickerPane = NULL;
  293. m_pLastStickerPane = NULL;
  294. m_pManager = NULL;
  295. m_pPane = NULL;
  296. m_pContainer = NULL;
  297. m_bAttachLast = FALSE;
  298. m_bSideDock = FALSE;
  299. m_bAttach = FALSE;
  300. m_bFloatable = TRUE;
  301. m_bDockable = TRUE;
  302. m_bDitherLast = FALSE;
  303. m_containDirection = (XTPDockingPaneDirection)-1;
  304. m_pDC = NULL;
  305. m_pfnSetLayeredWindowAttributes = NULL;
  306. HMODULE hLib = GetModuleHandle(_T("USER32"));
  307. if (hLib)
  308. {
  309. m_pfnSetLayeredWindowAttributes = (PVOID) ::GetProcAddress(hLib, "SetLayeredWindowAttributes");
  310. }
  311. m_bResetDC = FALSE;
  312. }
  313. CXTPDockingPaneContext::~CXTPDockingPaneContext()
  314. {
  315. }
  316. void CXTPDockingPaneContext::Drag(CXTPDockingPaneBase* pPane, CPoint point)
  317. {
  318. CRect rcPane = pPane->GetPaneWindowRect();
  319. CWnd* pSite = pPane->GetDockingSite();
  320. if (pSite && (pPane->GetType() == xtpPaneTypeDockingPane || pPane->GetType() == xtpPaneTypeTabbedContainer)
  321. && !pSite->IsKindOf(RUNTIME_CLASS(CXTPDockingPaneMiniWnd)))
  322. {
  323. CXTPDockingPane* pActivePane = pPane->GetType() == xtpPaneTypeTabbedContainer ?
  324. ((CXTPDockingPaneTabbedContainer*)pPane)->GetSelected() : (CXTPDockingPane*)pPane;
  325. if (pActivePane)
  326. {
  327. CXTPDockingPaneTabbedContainer* pHolder = (CXTPDockingPaneTabbedContainer*)m_pManager->_GetHolder(pActivePane, TRUE);
  328. pSite = pHolder ? pHolder->GetDockingSite() : NULL;
  329. if (pSite && pSite->IsKindOf(RUNTIME_CLASS(CXTPDockingPaneMiniWnd)))
  330. {
  331. CRect rcFloating = ((CXTPDockingPaneMiniWnd*)pSite)->GetPaneWindowRect();
  332. rcPane.right = rcPane.left + rcFloating.Width();
  333. rcPane.bottom = rcPane.top + rcFloating.Height();
  334. }
  335. }
  336. }
  337. Drag(pPane, point, rcPane);
  338. }
  339. void CXTPDockingPaneContext::Drag(CXTPDockingPaneBase* pPane, CPoint pt, CRect rect)
  340. {
  341. m_bDragKeyboard = (pt == CPoint(-1, -1));
  342. if (m_bDragKeyboard)
  343. {
  344. pt.x = rect.CenterPoint().x;
  345. pt.y = rect.top + 15;
  346. SetCursorPos(pt.x, pt.y);
  347. }
  348. m_ptSticky = m_ptLast = pt;
  349. AdjustRectangle(rect, pt);
  350. m_pPane = pPane;
  351. m_rectDragFrameScreen = m_rectDragFrame = rect;
  352. m_pDC = 0;
  353. m_pContainer = 0;
  354. m_bAttach = m_bAttachLast = FALSE;
  355. m_bFloatable = TRUE;
  356. m_bDockable = TRUE;
  357. m_bSideDock = FALSE;
  358. m_bUseAlphaContext = m_pManager->IsAlphaDockingContext() && (m_pfnSetLayeredWindowAttributes != NULL);
  359. m_bUseDockingStickers = m_pManager->IsShowDockingContextStickers() && m_bUseAlphaContext;
  360. CXTPDockingPaneBaseList lst;
  361. pPane->FindPane(xtpPaneTypeDockingPane, &lst);
  362. POSITION pos = lst.GetHeadPosition();
  363. while (pos)
  364. {
  365. CXTPDockingPane* pListPane = (CXTPDockingPane*)lst.GetNext(pos);
  366. if (m_pManager->NotifyAction(xtpPaneActionFloating, pListPane))
  367. m_bFloatable = FALSE;
  368. if (pListPane->GetOptions() & xtpPaneNoFloatable)
  369. m_bFloatable = FALSE;
  370. if (pListPane->GetOptions() & xtpPaneNoDockable)
  371. m_bDockable = FALSE;
  372. }
  373. if (m_pManager->m_bShowSizeCursorWhileDragging)
  374. {
  375. SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEALL));
  376. }
  377. InitLoop();
  378. Track();
  379. }
  380. void CXTPDockingPaneContext::InitLoop()
  381. {
  382. m_rectLast.SetRectEmpty();
  383. m_sizeLast.cx = m_sizeLast.cy = 0;
  384. m_bDitherLast = FALSE;
  385. m_rectStickerPane.SetRectEmpty();
  386. m_pStickerPane = NULL;
  387. m_pLastStickerPane = NULL;
  388. m_bResetDC = FALSE;
  389. if (!m_bUseAlphaContext)
  390. {
  391. // handle pending WM_PAINT messages
  392. MSG msg;
  393. while (::PeekMessage(&msg, NULL, WM_PAINT, WM_PAINT, PM_NOREMOVE))
  394. {
  395. if (!GetMessage(&msg, NULL, WM_PAINT, WM_PAINT))
  396. return;
  397. DispatchMessage(&msg);
  398. }
  399. // lock window update while dragging
  400. ASSERT(m_pDC == NULL);
  401. CWnd* pWnd = CWnd::GetDesktopWindow();
  402. if (pWnd->LockWindowUpdate())
  403. m_pDC = pWnd->GetDCEx(NULL, DCX_WINDOW | DCX_CACHE | DCX_LOCKWINDOWUPDATE);
  404. else
  405. m_pDC = pWnd->GetDCEx(NULL, DCX_WINDOW | DCX_CACHE);
  406. ASSERT(m_pDC != NULL);
  407. }
  408. }
  409. void CXTPDockingPaneContext::CancelLoop()
  410. {
  411. ReleaseCapture();
  412. if (m_bUseAlphaContext)
  413. {
  414. m_wndContext.DestroyWindow();
  415. m_wndAttachedTab.DestroyWindow();
  416. DestroyDockingStickers();
  417. POSITION pos = m_rgnStickers.GetStartPosition();
  418. while (pos)
  419. {
  420. UINT nKey;
  421. CRgn* pRgn;
  422. m_rgnStickers.GetNextAssoc(pos, nKey, pRgn);
  423. delete pRgn;
  424. }
  425. m_rgnStickers.RemoveAll();
  426. }
  427. else
  428. {
  429. DrawFocusRect(TRUE);    // gets rid of focus rect
  430. CWnd* pWnd = CWnd::GetDesktopWindow();
  431. pWnd->UnlockWindowUpdate();
  432. if (m_pDC != NULL)
  433. {
  434. pWnd->ReleaseDC(m_pDC);
  435. m_pDC = NULL;
  436. }
  437. }
  438. }
  439. void CXTPDockingPaneContext::_CreateRectangleRgn(CRgn& rgnResult, CRect rc)
  440. {
  441. CRgn rgnOutside, rgnInside;
  442. rgnOutside.CreateRectRgnIndirect(&rc);
  443. CRect rect = rc;
  444. rect.DeflateRect(4, 4);
  445. rect.IntersectRect(rect, rc);
  446. rgnInside.CreateRectRgnIndirect(rect);
  447. rgnResult.CreateRectRgn(0, 0, 0, 0);
  448. rgnResult.CombineRgn(&rgnOutside, &rgnInside, RGN_XOR);
  449. }
  450. void CXTPDockingPaneContext::_CreateRgn(CRgn& rgnResult, CRect rc, BOOL bTabbedRgn, BOOL bRemove)
  451. {
  452. if (bRemove)
  453. {
  454. rgnResult.CreateRectRgn(0, 0, 0, 0);
  455. return;
  456. }
  457. if (bTabbedRgn)
  458. {
  459. CSize szTab(min(50, rc.Width() - 5), min(20, rc.Height() / 2));
  460. CRect rcIntersect, rcTop(rc.left, rc.top, rc.right, rc.bottom - szTab.cy),
  461. rcBottom(rc.left + 5, rc.bottom - szTab.cy - 4, rc.left + 5 + szTab.cx, rc.bottom);
  462. CRgn rgnTop, rgnBottom, rgnIntersect;
  463. rcIntersect.IntersectRect(rcTop, rcBottom);
  464. rcIntersect.DeflateRect(4, 0);
  465. _CreateRectangleRgn(rgnTop, rcTop);
  466. _CreateRectangleRgn(rgnBottom, rcBottom);
  467. _CreateRectangleRgn(rgnIntersect, rcIntersect);
  468. rgnResult.CreateRectRgn(0, 0, 0, 0);
  469. rgnResult.CombineRgn(&rgnBottom, &rgnTop, RGN_OR);
  470. rgnResult.CombineRgn(&rgnResult, &rgnIntersect, RGN_XOR);
  471. }
  472. else
  473. {
  474. _CreateRectangleRgn(rgnResult, rc);
  475. }
  476. }
  477. void CXTPDockingPaneContext::DrawFocusRect(BOOL bRemoveRect)
  478. {
  479. if (m_pManager->m_bShowContentsWhileDragging && m_pContainer == NULL &&
  480. m_bFloatable && !m_bAttach && !m_rectDragFrame.IsRectEmpty())
  481. {
  482. CRect rect = m_rectDragFrame;
  483. m_wndAttachedTab.DestroyWindow();
  484. m_wndContext.DestroyWindow();
  485. if (!m_bUseAlphaContext && !m_bResetDC)
  486. {
  487. ASSERT(m_pDC != NULL);
  488. // determine new rect and size
  489. rect.SetRectEmpty();
  490. // first, determine the update region and select it
  491. CRgn rgnNew, rgnLast, rgnUpdate;
  492. _CreateRgn(rgnNew, rect, m_bAttach, TRUE);
  493. _CreateRgn(rgnLast, m_rectLast, m_bAttachLast);
  494. rgnUpdate.CreateRectRgn(0, 0, 0, 0);
  495. rgnUpdate.CombineRgn(&rgnLast, &rgnNew, RGN_XOR);
  496. // draw into the update/new region
  497. m_pDC->SelectClipRgn(&rgnUpdate);
  498. m_pDC->GetClipBox(&rect);
  499. CBrush* pBrushOld = m_pDC->SelectObject(CDC::GetHalftoneBrush());
  500. m_pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATINVERT);
  501. // cleanup DC
  502. if (pBrushOld != NULL)
  503. m_pDC->SelectObject(pBrushOld);
  504. m_pDC->SelectClipRgn(NULL);
  505. CWnd* pWnd = CWnd::GetDesktopWindow();
  506. pWnd->UnlockWindowUpdate();
  507. if (m_pDC != NULL)
  508. {
  509. pWnd->ReleaseDC(m_pDC);
  510. m_pDC = NULL;
  511. }
  512. m_bResetDC = TRUE;
  513. }
  514. if (m_pPane->GetType() == xtpPaneTypeSplitterContainer)
  515. {
  516. if (m_rectDragFrame != m_rectLast)
  517. {
  518. m_pPane->GetDockingSite()->MoveWindow(m_rectDragFrame);
  519. }
  520. }
  521. else if (!bRemoveRect)
  522. {
  523. XTPDockingPaneAction actionNotify = xtpPaneActionFloated;
  524. CXTPDockingPaneBaseList lst;
  525. m_pPane->FindPane(xtpPaneTypeDockingPane, &lst);
  526. if (m_rectDragFrame.top < 0)
  527. m_rectDragFrame.OffsetRect(0, -m_rectDragFrame.top);
  528. CXTPDockingPaneMiniWnd* pMiniWnd = m_pManager->FloatPane(m_pPane, m_rectDragFrame);
  529. m_pManager->RecalcFrameLayout(m_pPane);
  530. SAFE_CALLPTR(pMiniWnd, RecalcLayout());
  531. m_pPane = pMiniWnd->GetTopPane();
  532. POSITION pos = lst.GetHeadPosition();
  533. while (pos)
  534. {
  535. CXTPDockingPane* pPane = (CXTPDockingPane*)lst.GetNext(pos);
  536. m_pManager->NotifyAction(actionNotify, pPane);
  537. }
  538. AfxGetThread()->PumpMessage();
  539. AfxGetThread()->OnIdle(0);
  540. }
  541. m_rectLast = rect;
  542. m_bAttachLast = FALSE;
  543. return;
  544. }
  545. if (m_bResetDC)
  546. {
  547. ASSERT(m_pDC == NULL);
  548. ASSERT(m_bUseAlphaContext == FALSE);
  549. // handle pending WM_PAINT messages
  550. MSG msg;
  551. while (::PeekMessage(&msg, NULL, WM_PAINT, WM_PAINT, PM_NOREMOVE))
  552. {
  553. if (!GetMessage(&msg, NULL, WM_PAINT, WM_PAINT))
  554. return;
  555. DispatchMessage(&msg);
  556. }
  557. // lock window update while dragging
  558. CWnd* pWnd = CWnd::GetDesktopWindow();
  559. if (pWnd->LockWindowUpdate())
  560. m_pDC = pWnd->GetDCEx(NULL, DCX_WINDOW | DCX_CACHE | DCX_LOCKWINDOWUPDATE);
  561. else
  562. m_pDC = pWnd->GetDCEx(NULL, DCX_WINDOW | DCX_CACHE);
  563. ASSERT(m_pDC != NULL);
  564. m_bResetDC = FALSE;
  565. m_sizeLast.cx = m_sizeLast.cy = 0;
  566. m_bDitherLast = FALSE;
  567. m_rectLast.SetRectEmpty();
  568. }
  569. if (m_bUseAlphaContext)
  570. {
  571. ASSERT(bRemoveRect == FALSE);
  572. CRect rect = (m_pContainer == 0) ? m_rectDragFrame : m_rectContainer;
  573. m_rectLast = rect;
  574. if (!m_bFloatable && m_pContainer == 0)
  575. {
  576. rect.SetRectEmpty();
  577. }
  578. if (m_bAttach != m_bAttachLast)
  579. {
  580. m_bAttachLast = m_bAttach;
  581. if (m_bAttach)
  582. CreateContextWindow(&m_wndAttachedTab);
  583. else
  584. m_wndAttachedTab.DestroyWindow();
  585. }
  586. if (m_bAttach)
  587. {
  588. CSize szTab(min(50, rect.Width() - 5), min(20, rect.Height() / 2));
  589. CRect rcTab;
  590. if (m_pManager->GetPaintManager()->GetTabPaintManager()->GetPosition() == xtpTabPositionTop
  591. && m_pContainer && m_pContainer->GetType() == xtpPaneTypeTabbedContainer)
  592. {
  593. if (((CXTPDockingPaneTabbedContainer*)m_pContainer)->IsTitleVisible())
  594. {
  595. rect.top += m_pManager->GetPaintManager()->GetCaptionHeight() + 3;
  596. }
  597. rect.top += szTab.cy;
  598. rcTab = CRect(rect.left + 5, rect.top - szTab.cy, rect.left + 5 + szTab.cx, rect.top);
  599. }
  600. else
  601. {
  602. rect.bottom -= szTab.cy;
  603. rcTab = CRect(rect.left + 5, rect.bottom, rect.left + 5 + szTab.cx, rect.bottom + szTab.cy);
  604. }
  605. m_wndAttachedTab.SetWindowPos(0, rcTab.left, rcTab.top, rcTab.Width(), rcTab.Height(), SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW);
  606. }
  607. if (m_wndContext.GetSafeHwnd() == 0 || CXTPWindowRect(&m_wndContext).Size() != rect.Size())
  608. {
  609. m_wndContext.DestroyWindow();
  610. CreateContextWindow(&m_wndContext);
  611. }
  612. m_wndContext.SetWindowPos(0, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW);
  613. }
  614. else
  615. {
  616. ASSERT(m_pDC != NULL);
  617. // determine new rect and size
  618. CRect rect = (m_pContainer == 0) ? m_rectDragFrame : m_rectContainer;
  619. if (!m_bFloatable && m_pContainer == 0)
  620. rect.SetRectEmpty();
  621. // first, determine the update region and select it
  622. CRgn rgnNew, rgnLast, rgnUpdate;
  623. _CreateRgn(rgnNew, rect, m_bAttach, bRemoveRect);
  624. _CreateRgn(rgnLast, m_rectLast, m_bAttachLast);
  625. rgnUpdate.CreateRectRgn(0, 0, 0, 0);
  626. rgnUpdate.CombineRgn(&rgnLast, &rgnNew, RGN_XOR);
  627. m_rectLast = rect;
  628. m_bAttachLast = m_bAttach;
  629. // draw into the update/new region
  630. m_pDC->SelectClipRgn(&rgnUpdate);
  631. m_pDC->GetClipBox(&rect);
  632. CBrush* pBrushOld = m_pDC->SelectObject(CDC::GetHalftoneBrush());
  633. m_pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATINVERT);
  634. // cleanup DC
  635. if (pBrushOld != NULL)
  636. m_pDC->SelectObject(pBrushOld);
  637. m_pDC->SelectClipRgn(NULL);
  638. }
  639. }
  640. BOOL CXTPDockingPaneContext::CanSideDock(CXTPDockingPaneBase* pPane, CRect rcFrame)
  641. {
  642. CRect rc = pPane->GetPaneWindowRect();
  643. rc.DeflateRect(m_pManager->GetSideDockingMargin());
  644. int dSize = 10;
  645. if (rc.Height() == 0 || rc.Width() == 0 || rcFrame.Height() == 0 || rcFrame.Width() == 0)
  646. return FALSE;
  647. if (!CRect().IntersectRect(rc, rcFrame))
  648. return FALSE;
  649. m_rectContainer.SetRectEmpty();
  650. if (abs(rcFrame.top - rc.top) < dSize)
  651. {
  652. m_containDirection = xtpPaneDockTop;
  653. m_rectContainer = CRect(rcFrame.left, rc.top, rcFrame.right, rc.top + rcFrame.Height());
  654. dSize = abs(rcFrame.top - rc.top);
  655. }
  656. if (abs(rc.bottom - rcFrame.bottom) < dSize)
  657. {
  658. m_containDirection = xtpPaneDockBottom;
  659. m_rectContainer = CRect(rcFrame.left, rc.bottom - rcFrame.Height(), rcFrame.right, rc.bottom);
  660. dSize = abs(rc.bottom - rcFrame.bottom);
  661. }
  662. if (abs(rcFrame.left - rc.left) < dSize)
  663. {
  664. m_containDirection = xtpPaneDockLeft;
  665. m_rectContainer = CRect(rc.left, rcFrame.top, rc.left + rcFrame.Width(), rcFrame.bottom);
  666. dSize = abs(rcFrame.left - rc.left);
  667. }
  668. if (abs(rc.right - rcFrame.right) < dSize)
  669. {
  670. m_containDirection = xtpPaneDockRight;
  671. m_rectContainer = CRect(rc.right - rcFrame.Width(), rcFrame.top, rc.right, rcFrame.bottom);
  672. }
  673. if (!m_rectContainer.IsRectEmpty())
  674. {
  675. if (!IsAllowDockingTo(pPane, m_containDirection))
  676. return FALSE;
  677. m_pContainer = pPane;
  678. return TRUE;
  679. }
  680. return FALSE;
  681. }
  682. BOOL CXTPDockingPaneContext::CanDock(CRect rc, CPoint pt, CXTPDockingPaneBase* pPane, BOOL bInside)
  683. {
  684. double dSize = 20.0;
  685. double dRatio = 1.0;
  686. if (bInside && !m_bFloatable)
  687. {
  688. if (rc.Width() > 1 && rc.Height() > 1) dRatio = (double)rc.Height() / (double)rc.Width();
  689. dSize = 32000.0;
  690. }
  691. if (rc.Height() == 0 || rc.Width() == 0)
  692. return FALSE;
  693. if (bInside && !rc.PtInRect(pt))
  694. return FALSE;
  695. if (!bInside && !CRect(rc.left - 20, rc.top - 20, rc.right + 20, rc.bottom + 20).PtInRect(pt))
  696. return FALSE;
  697. int nInside = bInside ? 1 : -1;
  698. BOOL bFound = FALSE;
  699. if ((double)abs(pt.y - rc.top) < dSize && nInside * (pt.y - rc.top) >= 0)
  700. {
  701. m_containDirection = xtpPaneDockTop;
  702. dSize = (double)abs(pt.y - rc.top);
  703. bFound = TRUE;
  704. }
  705. if ((double)abs(rc.bottom - pt.y) < dSize && nInside * (rc.bottom - pt.y) >= 0)
  706. {
  707. m_containDirection = xtpPaneDockBottom;
  708. dSize = (double)abs(rc.bottom - pt.y);
  709. bFound = TRUE;
  710. }
  711. if ((double)abs(pt.x - rc.left) * dRatio < dSize && nInside * (pt.x - rc.left) >= 0)
  712. {
  713. m_containDirection = xtpPaneDockLeft;
  714. dSize = (double)abs(pt.x - rc.left) * dRatio;
  715. bFound = TRUE;
  716. }
  717. if ((double)abs(rc.right - pt.x) * dRatio < dSize && nInside * (rc.right- pt.x) >= 0)
  718. {
  719. m_containDirection = xtpPaneDockRight;
  720. bFound = TRUE;
  721. }
  722. if (bFound)
  723. {
  724. if (!IsAllowDockingTo(pPane, m_containDirection))
  725. return FALSE;
  726. m_rectContainer = m_pManager->_CalculateResultDockingRect(m_pPane, m_containDirection, pPane);
  727. m_pContainer = pPane;
  728. }
  729. return bFound;
  730. }
  731. BOOL CXTPDockingPaneContext::IsAllowDockingTo(CXTPDockingPaneBase* pPane, XTPDockingPaneDirection direction)
  732. {
  733. CXTPDockingPaneBaseList lst;
  734. m_pPane->FindPane(xtpPaneTypeDockingPane, &lst);
  735. POSITION pos = lst.GetHeadPosition();
  736. while (pos)
  737. {
  738. CXTPDockingPane* p = (CXTPDockingPane*)lst.GetNext(pos);
  739. if (m_pManager->NotifyAction(xtpPaneActionDocking, p, pPane, direction))
  740. {
  741. return FALSE;
  742. }
  743. }
  744. return TRUE;
  745. }
  746. BOOL CXTPDockingPaneContext::IsAllowAttachTo(CXTPDockingPaneBase* pPane)
  747. {
  748. CXTPDockingPaneBaseList lst;
  749. m_pPane->FindPane(xtpPaneTypeDockingPane, &lst);
  750. POSITION pos = lst.GetHeadPosition();
  751. while (pos)
  752. {
  753. CXTPDockingPane* p = (CXTPDockingPane*)lst.GetNext(pos);
  754. if (m_pManager->NotifyAction(xtpPaneActionAttaching, p, pPane))
  755. {
  756. return FALSE;
  757. }
  758. }
  759. return TRUE;
  760. }
  761. BOOL CXTPDockingPaneContext::IsBehind(CXTPDockingPaneBase* pPaneBase, CXTPDockingPaneBase* pPaneTest)
  762. {
  763. CWnd* pFrameBase = pPaneBase->GetDockingSite();
  764. if (!pFrameBase || !pFrameBase->IsKindOf(RUNTIME_CLASS(CXTPDockingPaneMiniWnd)))
  765. return TRUE;
  766. CWnd* pFrameTest = pPaneTest->GetDockingSite();
  767. if (!pFrameTest || !pFrameTest->IsKindOf(RUNTIME_CLASS(CXTPDockingPaneMiniWnd)))
  768. return FALSE;
  769. HWND hWndNext = ::GetWindow(pFrameBase->GetSafeHwnd(), GW_HWNDNEXT);
  770. while (hWndNext)
  771. {
  772. if (hWndNext == pFrameTest->GetSafeHwnd())
  773. return FALSE;
  774. hWndNext = ::GetWindow(hWndNext, GW_HWNDNEXT);
  775. }
  776. return TRUE;
  777. }
  778. void CXTPDockingPaneContext::FindContainer(CPoint pt)
  779. {
  780. CXTPDockingPaneInfoList* pList = &m_pManager->GetPaneList();
  781. CXTPDockingPaneBase* pFloatingPane = NULL;
  782. POSITION pos = pList->GetHeadPosition();
  783. while (pos)
  784. {
  785. CXTPDockingPane* pNextPane = pList->GetNext(pos);
  786. CXTPDockingPaneBase* pPane = pNextPane->GetContainer();
  787. if (pPane == NULL)
  788. continue;
  789. ASSERT(pPane->GetType() == xtpPaneTypeTabbedContainer);
  790. if (pPane->GetContainer() == 0 || pPane->GetContainer()->GetType() != xtpPaneTypeSplitterContainer)
  791. continue;
  792. if (! (::GetWindowLong(((CXTPDockingPaneTabbedContainer*)pPane)->GetSafeHwnd(), GWL_STYLE) & WS_VISIBLE))
  793. continue;
  794. if (m_pPane->ContainPane(pPane))
  795. continue;
  796. CRect rcClient = pPane->GetPaneWindowRect();
  797. if (rcClient.PtInRect(pt) && pNextPane->IsFloating())
  798. {
  799. if (pFloatingPane == NULL || IsBehind(pFloatingPane, pPane))
  800. {
  801. pFloatingPane = pPane;
  802. }
  803. }
  804. }
  805. pos = pList->GetHeadPosition();
  806. while (pos)
  807. {
  808. CXTPDockingPane* pNextPane = pList->GetNext(pos);
  809. if (pNextPane->GetOptions() & xtpPaneNoDockable)
  810. continue;
  811. CXTPDockingPaneBase* pPane = pNextPane->GetContainer();
  812. if (pPane == NULL)
  813. continue;
  814. if (pFloatingPane != NULL && pFloatingPane != pPane)
  815. continue;
  816. ASSERT(pPane->GetType() == xtpPaneTypeTabbedContainer);
  817. if (pPane->GetContainer() == 0 || (pPane->GetContainer()->GetType() != xtpPaneTypeSplitterContainer && pPane->GetContainer()->GetType() != xtpPaneTypeSidePanel))
  818. continue;
  819. if (! (::GetWindowLong(((CXTPDockingPaneTabbedContainer*)pPane)->GetSafeHwnd(), GWL_STYLE) & WS_VISIBLE))
  820. continue;
  821. CRect rcClient = m_rectContainer = pPane->GetPaneWindowRect();
  822. if (m_pPane->ContainPane(pPane))
  823. continue;
  824. if (((CXTPDockingPaneTabbedContainer*)pPane)->CanAttach(rcClient, pt))
  825. {
  826. if (IsAllowAttachTo(pPane))
  827. {
  828. m_pContainer = pPane;
  829. m_bAttach = TRUE;
  830. m_pStickerPane = 0;
  831. m_rectStickerPane.SetRectEmpty();
  832. return;
  833. }
  834. else
  835. {
  836. rcClient = m_rectContainer;
  837. }
  838. }
  839. if (pPane->GetContainer()->GetType() == xtpPaneTypeSidePanel)
  840. continue;
  841. if (m_bUseDockingStickers)
  842. {
  843. if (rcClient.PtInRect(pt))
  844. {
  845. if (m_pStickerPane == NULL || IsBehind(m_pStickerPane, pPane))
  846. {
  847. m_rectStickerPane = m_rectContainer;
  848. m_pStickerPane = pPane;
  849. }
  850. }
  851. }
  852. else
  853. {
  854. if (CanDock(rcClient, pt, pPane))
  855. return;
  856. }
  857. }
  858. if (pFloatingPane)
  859. return;
  860. if (m_pManager->IsSideDockingEnabled())
  861. {
  862. if (CanSideDock(m_pManager->GetClientPane(), m_rectDragFrame))
  863. {
  864. m_bSideDock = TRUE;
  865. return;
  866. }
  867. }
  868. if (m_bUseDockingStickers)
  869. {
  870. if (m_pStickerPane)
  871. {
  872. return;
  873. }
  874. if (m_rectStickerPane.IsRectEmpty())
  875. {
  876. CXTPDockingPaneBase* pPane = m_pManager->GetClientPane();
  877. if (pPane->GetPaneWindowRect().PtInRect(pt))
  878. {
  879. m_rectStickerPane = pPane->GetPaneWindowRect();
  880. m_pStickerPane = pPane;
  881. return;
  882. }
  883. pPane = m_pManager->GetTopPane();
  884. if (pPane->GetPaneWindowRect().PtInRect(pt))
  885. {
  886. m_rectStickerPane = pPane->GetPaneWindowRect();
  887. }
  888. }
  889. }
  890. else
  891. {
  892. CXTPDockingPaneBase* pPane;
  893. pPane = m_pManager->GetClientPane();
  894. m_rectContainer = pPane->GetPaneWindowRect();
  895. if (CanDock(pPane->GetPaneWindowRect(), pt, pPane))
  896. return;
  897. pPane = m_pManager->GetTopPane();
  898. m_rectContainer = pPane->GetPaneWindowRect();
  899. if (CanDock(pPane->GetPaneWindowRect(), pt, pPane, FALSE))
  900. return;
  901. }
  902. }
  903. void CXTPDockingPaneContext::EnsureVisible(CRect& rectDragFrame)
  904. {
  905. CRect rcWork = XTPMultiMonitor()->GetWorkArea(rectDragFrame);
  906. int nGap = 10;
  907. if (rcWork.bottom - rectDragFrame.top < nGap)
  908. {
  909. rectDragFrame.OffsetRect(0, rcWork.bottom - rectDragFrame.top - nGap);
  910. }
  911. if (rectDragFrame.bottom - rcWork.top < nGap)
  912. {
  913. rectDragFrame.OffsetRect(0, rcWork.top - rectDragFrame.bottom + nGap);
  914. }
  915. if (rcWork.right - rectDragFrame.left < nGap)
  916. {
  917. rectDragFrame.OffsetRect(rcWork.right - rectDragFrame.left - nGap, 0);
  918. }
  919. if (rectDragFrame.right - rcWork.left < nGap)
  920. {
  921. rectDragFrame.OffsetRect(rcWork.left - rectDragFrame.right + nGap, 0);
  922. }
  923. }
  924. void CXTPDockingPaneContext::UpdateStickyFrame(CRect& rectDragFrame, CWnd* pHost)
  925. {
  926. int nGap = m_pManager->m_nStickyGap;
  927. CXTPWindowRect rcWork(pHost);
  928. if (rectDragFrame.bottom < rcWork.top - nGap || rectDragFrame.top > rcWork.bottom + nGap)
  929. return;
  930. if (rectDragFrame.right < rcWork.left - nGap || rectDragFrame.left > rcWork.right + nGap)
  931. return;
  932. if (abs(rcWork.bottom - rectDragFrame.top) < nGap)
  933. {
  934. rectDragFrame.OffsetRect(0, rcWork.bottom - rectDragFrame.top);
  935. }
  936. if (abs(rectDragFrame.bottom - rcWork.top) < nGap)
  937. {
  938. rectDragFrame.OffsetRect(0, rcWork.top - rectDragFrame.bottom);
  939. }
  940. if (abs(rcWork.left - rectDragFrame.right) < nGap)
  941. {
  942. rectDragFrame.OffsetRect(rcWork.left - rectDragFrame.right, 0);
  943. }
  944. if (abs(rectDragFrame.left - rcWork.right) < nGap)
  945. {
  946. rectDragFrame.OffsetRect(rcWork.right - rectDragFrame.left, 0);
  947. }
  948. if (abs(rectDragFrame.left - rcWork.left) < nGap)
  949. {
  950. rectDragFrame.OffsetRect(rcWork.left - rectDragFrame.left, 0);
  951. }
  952. if (abs(rectDragFrame.right - rcWork.right) < nGap)
  953. {
  954. rectDragFrame.OffsetRect(rcWork.right - rectDragFrame.right, 0);
  955. }
  956. if (abs(rectDragFrame.bottom - rcWork.bottom) < nGap)
  957. {
  958. rectDragFrame.OffsetRect(0, rcWork.bottom - rectDragFrame.bottom);
  959. }
  960. if (abs(rectDragFrame.top - rcWork.top) < nGap)
  961. {
  962. rectDragFrame.OffsetRect(0, rcWork.top - rectDragFrame.top);
  963. }
  964. }
  965. void CXTPDockingPaneContext::UpdateStickyFrame(CRect& rectDragFrame)
  966. {
  967. CRect rcWork = XTPMultiMonitor()->GetWorkArea(rectDragFrame);
  968. int nGap = m_pManager->m_nStickyGap;
  969. if (abs(rcWork.top - rectDragFrame.top) < nGap)
  970. {
  971. rectDragFrame.OffsetRect(0, rcWork.top - rectDragFrame.top);
  972. }
  973. if (abs(rectDragFrame.bottom - rcWork.bottom) < nGap)
  974. {
  975. rectDragFrame.OffsetRect(0, rcWork.bottom - rectDragFrame.bottom);
  976. }
  977. if (abs(rcWork.right - rectDragFrame.right) < nGap)
  978. {
  979. rectDragFrame.OffsetRect(rcWork.right - rectDragFrame.right, 0);
  980. }
  981. if (abs(rectDragFrame.left - rcWork.left) < nGap)
  982. {
  983. rectDragFrame.OffsetRect(rcWork.left - rectDragFrame.left, 0);
  984. }
  985. if ((m_pManager->GetSite()->GetStyle() & (WS_MAXIMIZE | WS_MINIMIZE)) == 0)
  986. UpdateStickyFrame(rectDragFrame, m_pManager->GetSite());
  987. CXTPDockingPaneBaseList* pList = &m_pManager->GetPaneStack();
  988. POSITION pos = pList->GetHeadPosition();
  989. while (pos)
  990. {
  991. CXTPDockingPaneBase* pNextPane = pList->GetNext(pos);
  992. if (pNextPane->GetType() != xtpPaneTypeMiniWnd)
  993. continue;
  994. CXTPDockingPaneMiniWnd* pWnd = (CXTPDockingPaneMiniWnd*)pNextPane;
  995. if (pWnd->GetSafeHwnd() && pWnd->IsWindowVisible() && m_pPane->GetDockingSite() != pWnd)
  996. {
  997. UpdateStickyFrame(rectDragFrame, pWnd);
  998. }
  999. }
  1000. }
  1001. void CXTPDockingPaneContext::UpdateSizingStickyFrame(UINT nSide, CRect& rectDragFrame, CWnd* pHost)
  1002. {
  1003. int nGap = m_pManager->m_nStickyGap;
  1004. CXTPWindowRect rcWork(pHost);
  1005. if (rectDragFrame.bottom < rcWork.top - nGap || rectDragFrame.top > rcWork.bottom + nGap)
  1006. return;
  1007. if (rectDragFrame.right < rcWork.left - nGap || rectDragFrame.left > rcWork.right + nGap)
  1008. return;
  1009. if (abs(rectDragFrame.top - rcWork.bottom) < nGap && (nSide == WMSZ_TOP || nSide == WMSZ_TOPLEFT || nSide == WMSZ_TOPRIGHT))
  1010. {
  1011. rectDragFrame.top = rcWork.bottom;
  1012. }
  1013. if (abs(rectDragFrame.bottom - rcWork.top) < nGap && (nSide == WMSZ_BOTTOM || nSide == WMSZ_BOTTOMLEFT || nSide == WMSZ_BOTTOMRIGHT))
  1014. {
  1015. rectDragFrame.bottom = rcWork.top;
  1016. }
  1017. if (abs(rectDragFrame.left - rcWork.left) < nGap && (nSide == WMSZ_LEFT || nSide == WMSZ_TOPLEFT || nSide == WMSZ_BOTTOMLEFT))
  1018. {
  1019. rectDragFrame.left = rcWork.left;
  1020. }
  1021. if (abs(rectDragFrame.left - rcWork.right) < nGap && (nSide == WMSZ_LEFT || nSide == WMSZ_TOPLEFT || nSide == WMSZ_BOTTOMLEFT))
  1022. {
  1023. rectDragFrame.left = rcWork.right;
  1024. }
  1025. if (abs(rectDragFrame.right - rcWork.left) < nGap  && (nSide == WMSZ_RIGHT || nSide == WMSZ_TOPRIGHT|| nSide == WMSZ_BOTTOMRIGHT))
  1026. {
  1027. rectDragFrame.right = rcWork.left;
  1028. }
  1029. if (abs(rectDragFrame.right - rcWork.right) < nGap  && (nSide == WMSZ_RIGHT || nSide == WMSZ_TOPRIGHT|| nSide == WMSZ_BOTTOMRIGHT))
  1030. {
  1031. rectDragFrame.right = rcWork.right;
  1032. }
  1033. }
  1034. void CXTPDockingPaneContext::OnSizingFloatingFrame(CXTPDockingPaneMiniWnd* pMiniWnd, UINT nSide, LPRECT lpRect)
  1035. {
  1036. if (!m_pManager->IsStickyFloatingFrames())
  1037. return;
  1038. CRect rectDragFrame(lpRect);
  1039. if ((m_pManager->GetSite()->GetStyle() & (WS_MAXIMIZE | WS_MINIMIZE)) == 0)
  1040. UpdateSizingStickyFrame(nSide, rectDragFrame, m_pManager->GetSite());
  1041. CXTPDockingPaneBaseList* pList = &m_pManager->GetPaneStack();
  1042. POSITION pos = pList->GetHeadPosition();
  1043. while (pos)
  1044. {
  1045. CXTPDockingPaneBase* pNextPane = pList->GetNext(pos);
  1046. if (pNextPane->GetType() != xtpPaneTypeMiniWnd)
  1047. continue;
  1048. CXTPDockingPaneMiniWnd* pWnd = (CXTPDockingPaneMiniWnd*)pNextPane;
  1049. if (pWnd->GetSafeHwnd() && pWnd->IsWindowVisible() && pMiniWnd != pWnd)
  1050. {
  1051. UpdateSizingStickyFrame(nSide, rectDragFrame, pWnd);
  1052. }
  1053. }
  1054. *lpRect = rectDragFrame;
  1055. }
  1056. void CXTPDockingPaneContext::Move(CPoint pt)
  1057. {
  1058. CPoint ptOffset = pt - m_ptLast;
  1059. m_rectDragFrameScreen.OffsetRect(ptOffset);
  1060. if (CRect().IntersectRect(m_rectDragFrameScreen, XTPMultiMonitor()->GetWorkArea(m_rectDragFrame)))
  1061. {
  1062. m_rectDragFrame = m_rectDragFrameScreen;
  1063. }
  1064. EnsureVisible(m_rectDragFrame);
  1065. if (!m_rectDragFrame.IsRectEmpty() && m_pManager->m_bStickyFloatingFrames)
  1066. {
  1067. UpdateStickyFrame(m_rectDragFrame);
  1068. }
  1069. m_pContainer = 0;
  1070. m_bAttach = FALSE;
  1071. m_rectStickerPane.SetRectEmpty();
  1072. m_pStickerPane = NULL;
  1073. m_bSideDock = FALSE;
  1074. if (GetKeyState(VK_CONTROL) >= 0 && m_bDockable)
  1075. {
  1076. FindContainer(pt);
  1077. }
  1078. m_ptLast = pt;
  1079. if (m_bUseDockingStickers)
  1080. {
  1081. UpdateDockingStickers();
  1082. BOOL bFound = FALSE;
  1083. POSITION pos = m_lstStickers.GetTailPosition();
  1084. while (pos)
  1085. {
  1086. CXTPDockingPaneContextStickerWnd* pSticker = m_lstStickers.GetPrev(pos);
  1087. XTPDockingPaneStickerType selectedSticker = xtpPaneStickerNone;
  1088. if (!bFound)
  1089. {
  1090. XTPDockingPaneStickerType ht = pSticker->HitTest(pt);
  1091. if (ht != xtpPaneStickerNone)
  1092. {
  1093. if ((pSticker->m_typeSticker & xtpPaneStickerClient) == xtpPaneStickerClient)
  1094. {
  1095. m_pContainer = m_pStickerPane;
  1096. m_rectContainer = m_rectStickerPane;
  1097. }
  1098. else
  1099. {
  1100. m_pContainer = m_pManager->GetTopPane();
  1101. m_rectContainer = m_pContainer->GetPaneWindowRect();
  1102. }
  1103. switch (ht)
  1104. {
  1105. case xtpPaneStickerTop:
  1106. m_rectContainer.bottom = m_rectContainer.CenterPoint().y;
  1107. m_containDirection = xtpPaneDockTop;
  1108. break;
  1109. case xtpPaneStickerBottom:
  1110. m_rectContainer.top = m_rectContainer.CenterPoint().y;
  1111. m_containDirection = xtpPaneDockBottom;
  1112. break;
  1113. case xtpPaneStickerLeft:
  1114. m_rectContainer.right = m_rectContainer.CenterPoint().x;
  1115. m_containDirection = xtpPaneDockLeft;
  1116. break;
  1117. case xtpPaneStickerRight:
  1118. m_rectContainer.left = m_rectContainer.CenterPoint().x;
  1119. m_containDirection = xtpPaneDockRight;
  1120. break;
  1121. case xtpPaneStickerCenter:
  1122. m_bAttach = TRUE;
  1123. break;
  1124. }
  1125. BOOL bAllow = TRUE;
  1126. if ((ht != xtpPaneStickerCenter) && !IsAllowDockingTo(m_pContainer, m_containDirection))
  1127. {
  1128. m_pContainer = NULL;
  1129. bAllow = FALSE;
  1130. }
  1131. if ((ht == xtpPaneStickerCenter) && !IsAllowAttachTo(m_pContainer))
  1132. {
  1133. m_pContainer = NULL;
  1134. m_bAttach = FALSE;
  1135. bAllow = FALSE;
  1136. }
  1137. if (bAllow)
  1138. {
  1139. if (ht != xtpPaneStickerCenter)
  1140. m_rectContainer = m_pManager->_CalculateResultDockingRect(m_pPane, m_containDirection, m_pContainer);
  1141. selectedSticker = ht;
  1142. }
  1143. bFound = TRUE;
  1144. }
  1145. }
  1146. if (pSticker->m_selectedSticker != selectedSticker)
  1147. {
  1148. pSticker->m_selectedSticker = selectedSticker;
  1149. pSticker->Invalidate(FALSE);
  1150. }
  1151. }
  1152. }
  1153. DrawFocusRect();
  1154. }
  1155. void CXTPDockingPaneContext::Track()
  1156. {
  1157. // don't handle if capture already set
  1158. if (::GetCapture() != NULL)
  1159. return;
  1160. CWnd* pCapture = m_pManager->GetSite();
  1161. ASSERT(pCapture);
  1162. if (!pCapture)
  1163. return;
  1164. // set capture to the window which received this message
  1165. pCapture->SetCapture();
  1166. ASSERT(pCapture == CWnd::GetCapture());
  1167. BOOL bAccept = FALSE;
  1168. // get messages until capture lost or cancelled/accepted
  1169. while (CWnd::GetCapture() == pCapture)
  1170. {
  1171. MSG msg;
  1172. // handle pending WM_PAINT messages
  1173. while (::PeekMessage(&msg, NULL, WM_PAINT, WM_PAINT, PM_NOREMOVE))
  1174. {
  1175. if (!GetMessage(&msg, NULL, WM_PAINT, WM_PAINT))
  1176. return;
  1177. DispatchMessage(&msg);
  1178. continue;
  1179. }
  1180. if (!::GetMessage(&msg, NULL, 0, 0))
  1181. {
  1182. AfxPostQuitMessage((int)msg.wParam);
  1183. break;
  1184. }
  1185. if (msg.message == WM_LBUTTONUP)
  1186. {
  1187. bAccept = TRUE;
  1188. break;
  1189. }
  1190. else if (msg.message == WM_MOUSEMOVE)
  1191. {
  1192. CSize sz = m_ptSticky - CPoint(msg.pt);
  1193. if (abs(sz.cx) > 4 || abs(sz.cy) > 4)
  1194. {
  1195. Move(msg.pt);
  1196. m_ptSticky = CPoint(0, 0);
  1197. }
  1198. }
  1199. else if (msg.message == WM_KEYDOWN || msg.message == WM_KEYUP)
  1200. {
  1201. if (m_bDragKeyboard && msg.message == WM_KEYDOWN)
  1202. {
  1203. if (msg.wParam == VK_RETURN)
  1204. {
  1205. bAccept = TRUE;
  1206. break;
  1207. }
  1208. if (msg.wParam >= VK_LEFT && msg.wParam <= VK_DOWN)
  1209. {
  1210. CPoint pt(m_ptLast);
  1211. if (msg.wParam == VK_LEFT)
  1212. pt.x -= 10;
  1213. else if (msg.wParam == VK_RIGHT)
  1214. pt.x += 10;
  1215. else if (msg.wParam == VK_UP)
  1216. pt.y -= 10;
  1217. else if (msg.wParam == VK_DOWN)
  1218. pt.y += 10;
  1219. AdjustCursor(pt);
  1220. SetCursorPos(pt.x, pt.y);
  1221. Move(pt);
  1222. m_ptSticky = CPoint(0, 0);
  1223. }
  1224. }
  1225. if (msg.wParam == VK_CONTROL)
  1226. {
  1227. Move(m_ptLast);
  1228. m_ptSticky = CPoint(0, 0);
  1229. }
  1230. if (msg.wParam == VK_ESCAPE)
  1231. {
  1232. break;
  1233. }
  1234. }
  1235. else
  1236. DispatchMessage(&msg);
  1237. }
  1238. CancelLoop();
  1239. if (bAccept && m_ptSticky == CPoint(0, 0))
  1240. {
  1241. XTPDockingPaneAction actionNotify = xtpPaneActionFloated;
  1242. CXTPDockingPaneBaseList lst;
  1243. m_pPane->FindPane(xtpPaneTypeDockingPane, &lst);
  1244. if (m_bAttach)
  1245. {
  1246. ASSERT(m_pContainer->GetType() == xtpPaneTypeTabbedContainer);
  1247. m_pManager->AttachPane(m_pPane, m_pContainer);
  1248. actionNotify = xtpPaneActionAttached;
  1249. }
  1250. else if (m_bSideDock && m_pContainer && m_pContainer == m_pManager->GetClientPane())
  1251. {
  1252. CRect rectSide(m_rectContainer);
  1253. rectSide.OffsetRect(-m_pContainer->GetPaneWindowRect().TopLeft());
  1254. if (m_pPane->GetContainer() && m_pPane->GetContainer()->GetType() == xtpPaneTypeSidePanel)
  1255. ((CXTPDockingPaneSidePanel*)m_pPane->GetContainer())->MovePanel(m_containDirection, rectSide);
  1256. else
  1257. m_pManager->DockSidePane(m_pPane, m_containDirection, rectSide);
  1258. actionNotify = xtpPaneActionDocked;
  1259. }
  1260. else if (m_pContainer)
  1261. {
  1262. m_pManager->DockPane(m_pPane, m_pManager->GetRTLDirection(m_containDirection), m_pContainer);
  1263. m_pManager->EnsureVisible(m_pContainer);
  1264. actionNotify = xtpPaneActionDocked;
  1265. }
  1266. else if (m_bFloatable)
  1267. {
  1268. CRect rcWork = XTPMultiMonitor()->GetWorkArea(m_rectDragFrame);
  1269. if (m_rectDragFrame.top < rcWork.top)
  1270. m_rectDragFrame.OffsetRect(0, rcWork.top - m_rectDragFrame.top);
  1271. if (m_pPane->GetType() == xtpPaneTypeSplitterContainer)
  1272. m_pPane->GetDockingSite()->MoveWindow(m_rectDragFrame);
  1273. else
  1274. m_pManager->FloatPane(m_pPane, m_rectDragFrame);
  1275. }
  1276. else
  1277. {
  1278. bAccept = FALSE;
  1279. }
  1280. if (bAccept)
  1281. {
  1282. POSITION pos = lst.GetHeadPosition();
  1283. while (pos)
  1284. {
  1285. CXTPDockingPane* pPane = (CXTPDockingPane*)lst.GetNext(pos);
  1286. m_pManager->NotifyAction(actionNotify, pPane, m_pContainer, m_containDirection);
  1287. }
  1288. }
  1289. }
  1290. }
  1291. void CXTPDockingPaneContext::DestroyDockingStickers()
  1292. {
  1293. while (!m_lstStickers.IsEmpty())
  1294. {
  1295. CWnd* pWnd = m_lstStickers.RemoveHead();
  1296. pWnd->DestroyWindow();
  1297. delete pWnd;
  1298. }
  1299. }
  1300. void CXTPDockingPaneContext::IncludeRgnPart(CRgn* pRgn, int x1, int y, int x2)
  1301. {
  1302. if (x1 < x2)
  1303. {
  1304. CRgn rgnExclude;
  1305. rgnExclude.CreateRectRgn(x1, y, x2, y + 1);
  1306. pRgn->CombineRgn(pRgn, &rgnExclude, RGN_OR);
  1307. }
  1308. }
  1309. void CXTPDockingPaneContext::RegionFromBitmap(CRgn* pRgn, CDC* pDC, CRect rc)
  1310. {
  1311. CSize sz = rc.Size();
  1312. pRgn->CreateRectRgn(0, 0, 0, 0);
  1313. for (int y = 0; y < sz.cy; y++)
  1314. {
  1315. int nStart = 0, x = 0;
  1316. BOOL bTransparent = TRUE;
  1317. while (x < sz.cx)
  1318. {
  1319. BOOL bTransparentPixel = pDC->GetPixel(x, y) == 0;
  1320. if (bTransparent && !bTransparentPixel)
  1321. {
  1322. nStart = x;
  1323. bTransparent = FALSE;
  1324. }
  1325. else if (!bTransparent && bTransparentPixel)
  1326. {
  1327. IncludeRgnPart(pRgn, nStart, y, x);
  1328. bTransparent = TRUE;
  1329. }
  1330. x++;
  1331. }
  1332. if (!bTransparent)
  1333. {
  1334. IncludeRgnPart(pRgn, nStart, y, x);
  1335. }
  1336. }
  1337. }
  1338. CXTPDockingPaneContextStickerWnd* CXTPDockingPaneContext::CreateNewSticker(CRect rc, XTPDockingPaneStickerType typeSticker)
  1339. {
  1340. if (typeSticker == xtpPaneStickerNone || typeSticker == xtpPaneStickerClient)
  1341. return NULL;
  1342. CXTPDockingPaneContextStickerWnd* pWnd = new CXTPDockingPaneContextStickerWnd(this);
  1343. m_lstStickers.AddTail(pWnd);
  1344. pWnd->CreateEx(WS_EX_TOOLWINDOW, AfxRegisterWndClass(NULL, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
  1345. 0, WS_POPUP, CRect(0, 0, 0, 0), m_pManager->GetSite(), 0);
  1346. pWnd->m_typeSticker = typeSticker;
  1347. CRgn* pRgn = NULL;
  1348. if (!m_rgnStickers.Lookup(typeSticker, pRgn))
  1349. {
  1350. pRgn = new CRgn;
  1351. m_rgnStickers.SetAt(typeSticker, pRgn);
  1352. }
  1353. ASSERT(pRgn != NULL);
  1354. if (!pRgn)
  1355. return NULL;
  1356. if (!pRgn->GetSafeHandle())
  1357. {
  1358. CClientDC dcClient(pWnd);
  1359. CBitmap bmp;
  1360. bmp.CreateCompatibleBitmap(&dcClient, rc.Width(), rc.Height());
  1361. if (bmp.GetSafeHandle())
  1362. {
  1363. CXTPCompatibleDC dc(&dcClient, &bmp);
  1364. dc.FillSolidRect(rc, RGB(0, 0, 0));
  1365. pWnd->OnDraw(&dc);
  1366. RegionFromBitmap(pRgn, &dc, rc);
  1367. }
  1368. }
  1369. HRGN hRgn = ::CreateRectRgn(0, 0, 0, 0);
  1370. ::CombineRgn(hRgn, (HRGN)pRgn->GetSafeHandle(), NULL, RGN_COPY);
  1371. pWnd->SetWindowRgn(hRgn, FALSE);
  1372. pWnd->SetWindowPos(0, rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW);
  1373. return pWnd;
  1374. }
  1375. CSize CXTPDockingPaneContext::GetStickerSize(XTPDockingPaneStickerType type) const
  1376. {
  1377. if (GetStickerStyle() == xtpPaneStickerStyleVisualStudio2005)
  1378. {
  1379. if (type == xtpPaneStickerTop) return CSize(29, 32);
  1380. if (type == xtpPaneStickerLeft) return CSize(32, 29);
  1381. if (type == xtpPaneStickerBottom) return CSize(29, 32);
  1382. if (type == xtpPaneStickerRight) return CSize(32, 29);
  1383. return CSize(89, 89);
  1384. }
  1385. else
  1386. {
  1387. if (type == xtpPaneStickerTop) return CSize(43, 30);
  1388. if (type == xtpPaneStickerLeft) return CSize(30, 43);
  1389. if (type == xtpPaneStickerBottom) return CSize(43, 30);
  1390. if (type == xtpPaneStickerRight) return CSize(30, 43);
  1391. return CSize(93, 93);
  1392. }
  1393. }
  1394. XTPDockingContextStickerStyle CXTPDockingPaneContext::GetStickerStyle() const
  1395. {
  1396. return m_pManager->GetDockingContextStickerStyle();
  1397. }
  1398. void CXTPDockingPaneContext::UpdateDockingStickers()
  1399. {
  1400. if (m_rectStickerPane.IsRectEmpty())
  1401. {
  1402. m_pLastStickerPane = NULL;
  1403. DestroyDockingStickers();
  1404. return;
  1405. }
  1406. CSize sz(GetStickerSize(xtpPaneStickerClient));
  1407. CRect rc(m_rectStickerPane.CenterPoint(), sz);
  1408. rc.OffsetRect(- sz.cx / 2, - sz.cy / 2);
  1409. if (m_pLastStickerPane != m_pStickerPane || m_lstStickers.IsEmpty())
  1410. {
  1411. DestroyDockingStickers();
  1412. if (m_pStickerPane)
  1413. {
  1414. UINT allowStickers = xtpPaneStickerNone;
  1415. if (IsAllowDockingTo(m_pStickerPane, xtpPaneDockLeft)) allowStickers = allowStickers + xtpPaneStickerLeft;
  1416. if (IsAllowDockingTo(m_pStickerPane, xtpPaneDockRight)) allowStickers = allowStickers + xtpPaneStickerRight;
  1417. if (IsAllowDockingTo(m_pStickerPane, xtpPaneDockBottom)) allowStickers = allowStickers + xtpPaneStickerBottom;
  1418. if (IsAllowDockingTo(m_pStickerPane, xtpPaneDockTop)) allowStickers = allowStickers + xtpPaneStickerTop;
  1419. CreateNewSticker(rc, m_pStickerPane == m_pManager->GetClientPane() || !IsAllowAttachTo(m_pStickerPane) ? XTPDockingPaneStickerType(xtpPaneStickerClient + allowStickers) : XTPDockingPaneStickerType(xtpPaneStickerClient + allowStickers + xtpPaneStickerCenter));
  1420. }
  1421. CXTPDockingPaneBase* pTopPane = m_pManager->GetTopPane();
  1422. CRect rcWindow = pTopPane->GetPaneWindowRect();
  1423. if (IsAllowDockingTo(pTopPane, xtpPaneDockTop))
  1424. CreateNewSticker(CRect(CPoint(rcWindow.CenterPoint().x - GetStickerSize(xtpPaneStickerTop).cx / 2, rcWindow.top + 16), GetStickerSize(xtpPaneStickerTop)), xtpPaneStickerTop);
  1425. if (IsAllowDockingTo(pTopPane, xtpPaneDockLeft))
  1426. CreateNewSticker(CRect(CPoint(rcWindow.left + 16, rcWindow.CenterPoint().y - GetStickerSize(xtpPaneStickerLeft).cy/ 2), GetStickerSize(xtpPaneStickerLeft)), xtpPaneStickerLeft);
  1427. if (IsAllowDockingTo(pTopPane, xtpPaneDockBottom))
  1428. CreateNewSticker(CRect(CPoint(rcWindow.CenterPoint().x - GetStickerSize(xtpPaneStickerBottom).cx / 2, rcWindow.bottom - 16 - GetStickerSize(xtpPaneStickerBottom).cy), GetStickerSize(xtpPaneStickerBottom)), xtpPaneStickerBottom);
  1429. if (IsAllowDockingTo(pTopPane, xtpPaneDockRight))
  1430. CreateNewSticker(CRect(CPoint(rcWindow.right - GetStickerSize(xtpPaneStickerRight).cx - 16, rcWindow.CenterPoint().y - GetStickerSize(xtpPaneStickerRight).cy/ 2), GetStickerSize(xtpPaneStickerRight)), xtpPaneStickerRight);
  1431. m_pLastStickerPane = m_pStickerPane;
  1432. }
  1433. ASSERT(m_lstStickers.GetCount() < 6);
  1434. }
  1435. void CXTPDockingPaneContext::CreateContextWindow(CXTPDockingPaneContextAlphaWnd* pWnd)
  1436. {
  1437. ASSERT(m_bUseAlphaContext);
  1438. if (pWnd->GetSafeHwnd())
  1439. return;
  1440. pWnd->CreateEx(WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW, AfxRegisterWndClass(NULL, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
  1441. 0, WS_POPUP, CRect(0, 0, 0, 0), m_pManager->GetSite(), 0);
  1442. if (m_pfnSetLayeredWindowAttributes)
  1443. {
  1444. ((PFNSETLAYEREDWINDOWATTRIBUTES)m_pfnSetLayeredWindowAttributes)
  1445. (pWnd->m_hWnd, 0, 100, LWA_ALPHA);
  1446. }
  1447. }