Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2735 lines
69 KiB

  1. //
  2. // cuicand.cpp - ui frame object for candidate UI
  3. //
  4. #include "private.h"
  5. #include "cuilib.h"
  6. #include "cuicand.h"
  7. #include "candutil.h"
  8. #include "wcand.h"
  9. //
  10. //
  11. //
  12. /*=============================================================================*/
  13. /* */
  14. /* C U I F S M A R T S C R O L L B U T T O N */
  15. /* */
  16. /*=============================================================================*/
  17. //
  18. // CUIFSmartScrollButton
  19. //
  20. /* C U I F S M A R T S C R O L L B U T T O N */
  21. /*------------------------------------------------------------------------------
  22. Constructor of CUIFSmartScrollButton
  23. ------------------------------------------------------------------------------*/
  24. CUIFSmartScrollButton::CUIFSmartScrollButton( CUIFScroll *pUIScroll, const RECT *prc, DWORD dwStyle ) : CUIFScrollButton( pUIScroll, prc, dwStyle )
  25. {
  26. SetActiveTheme(L"scrollbar", SBP_ARROWBTN);
  27. }
  28. /* ~ C U I F S M A R T S C R O L L B U T T O N */
  29. /*------------------------------------------------------------------------------
  30. Destructor of CUIFSmartScrollButton
  31. ------------------------------------------------------------------------------*/
  32. CUIFSmartScrollButton::~CUIFSmartScrollButton( void )
  33. {
  34. }
  35. /* O N P A I N T N O T H E M E */
  36. /*------------------------------------------------------------------------------
  37. Paint procedure of smart scoll button object (default)
  38. ------------------------------------------------------------------------------*/
  39. void CUIFSmartScrollButton::OnPaintNoTheme( HDC hDC )
  40. {
  41. UINT uState = 0;
  42. switch (m_dwStyle & UISCROLLBUTTON_DIRMASK) {
  43. case UISCROLLBUTTON_LEFT: {
  44. uState = DFCS_SCROLLLEFT;
  45. break;
  46. }
  47. case UISCROLLBUTTON_UP: {
  48. uState = DFCS_SCROLLUP;
  49. break;
  50. }
  51. case UISCROLLBUTTON_RIGHT: {
  52. uState = DFCS_SCROLLRIGHT;
  53. break;
  54. }
  55. case UISCROLLBUTTON_DOWN: {
  56. uState = DFCS_SCROLLDOWN;
  57. break;
  58. }
  59. }
  60. //
  61. uState |= ((m_dwStatus == UIBUTTON_DOWN) ? DFCS_PUSHED | DFCS_FLAT : 0);
  62. uState |= ((!IsEnabled()) ? DFCS_INACTIVE : 0);
  63. RECT rc = GetRectRef();
  64. DrawFrameControl( hDC, &rc, DFC_SCROLL, uState | DFCS_FLAT );
  65. DrawEdge( hDC, &rc, (m_dwStatus == UIBUTTON_DOWN) ? BDR_SUNKENINNER : BDR_RAISEDINNER, BF_RECT );
  66. }
  67. /* O N P A I N T T H E M E */
  68. /*------------------------------------------------------------------------------
  69. Paint procedure of smart scoll button object (Whistler)
  70. ------------------------------------------------------------------------------*/
  71. BOOL CUIFSmartScrollButton::OnPaintTheme( HDC hDC )
  72. {
  73. BOOL fRet = FALSE;
  74. if (!IsThemeActive()) {
  75. return FALSE;
  76. }
  77. if (SUCCEEDED(EnsureThemeData( GetUIWnd()->GetWnd()))) {
  78. int iStateID;
  79. switch (m_dwStyle & UISCROLLBUTTON_DIRMASK) {
  80. case UISCROLLBUTTON_LEFT: {
  81. iStateID = ABS_LEFTNORMAL;
  82. break;
  83. }
  84. case UISCROLLBUTTON_UP: {
  85. iStateID = ABS_UPNORMAL;
  86. break;
  87. }
  88. case UISCROLLBUTTON_RIGHT: {
  89. iStateID = ABS_RIGHTNORMAL;
  90. break;
  91. }
  92. case UISCROLLBUTTON_DOWN: {
  93. iStateID = ABS_DOWNNORMAL;
  94. break;
  95. }
  96. }
  97. if (!IsEnabled()) {
  98. iStateID += 3;
  99. }
  100. else if (m_dwStatus == UIBUTTON_DOWN) {
  101. iStateID += 2;
  102. }
  103. // else if (m_dwStatus != UIBUTTON_NORMAL) {
  104. // iStateID += 1;
  105. // }
  106. fRet = SUCCEEDED(DrawThemeBackground(hDC, iStateID, &GetRectRef(), 0));
  107. }
  108. return fRet;
  109. }
  110. /*=============================================================================*/
  111. /* */
  112. /* C U I F S M A R T S C R O L L T H U M B */
  113. /* */
  114. /*=============================================================================*/
  115. //
  116. // CUIFSmartScrollThumb
  117. //
  118. /* C U I F S M A R T S C R O L L T H U M B */
  119. /*------------------------------------------------------------------------------
  120. Constructor of CUIFSmartScrollThumb
  121. ------------------------------------------------------------------------------*/
  122. CUIFSmartScrollThumb::CUIFSmartScrollThumb( CUIFScroll *pUIScroll, const RECT *prc, DWORD dwStyle ) : CUIFScrollThumb( pUIScroll, prc, dwStyle )
  123. {
  124. m_fMouseIn = FALSE;
  125. SetActiveTheme(L"scrollbar");
  126. }
  127. /* ~ C U I F S M A R T S C R O L L T H U M B */
  128. /*------------------------------------------------------------------------------
  129. Destructor of CUIFSmartScrollThumb
  130. ------------------------------------------------------------------------------*/
  131. CUIFSmartScrollThumb::~CUIFSmartScrollThumb( void )
  132. {
  133. }
  134. /* O N M O U S E I N */
  135. /*------------------------------------------------------------------------------
  136. ------------------------------------------------------------------------------*/
  137. void CUIFSmartScrollThumb::OnMouseIn( POINT pt )
  138. {
  139. m_fMouseIn = TRUE;
  140. CallOnPaint();
  141. CUIFScrollThumb::OnMouseIn( pt );
  142. }
  143. /* O N M O U S E O U T */
  144. /*------------------------------------------------------------------------------
  145. ------------------------------------------------------------------------------*/
  146. void CUIFSmartScrollThumb::OnMouseOut( POINT pt )
  147. {
  148. m_fMouseIn = FALSE;
  149. CallOnPaint();
  150. CUIFScrollThumb::OnMouseOut( pt );
  151. }
  152. /* O N P A I N T */
  153. /*------------------------------------------------------------------------------
  154. Paint procedure of smart scoll thumb object
  155. ------------------------------------------------------------------------------*/
  156. void CUIFSmartScrollThumb::OnPaint( HDC hDC )
  157. {
  158. if (!IsEnabled()) {
  159. return;
  160. }
  161. CUIFObject::OnPaint( hDC );
  162. }
  163. /* O N P A I N T D E F A U L T */
  164. /*------------------------------------------------------------------------------
  165. Paint procedure of smart scoll thumb object (default)
  166. ------------------------------------------------------------------------------*/
  167. void CUIFSmartScrollThumb::OnPaintNoTheme( HDC hDC )
  168. {
  169. RECT rc = GetRectRef();
  170. FillRect( hDC, &rc, (HBRUSH)(COLOR_3DFACE + 1) );
  171. DrawEdge( hDC, &rc, BDR_RAISEDINNER, BF_RECT );
  172. }
  173. /* O N P A I N T W H I S T L E R */
  174. /*------------------------------------------------------------------------------
  175. Paint procedure of smart scoll thumb object (Whistler)
  176. ------------------------------------------------------------------------------*/
  177. BOOL CUIFSmartScrollThumb::OnPaintTheme( HDC hDC )
  178. {
  179. BOOL fRet = FALSE;
  180. if (!IsThemeActive()) {
  181. return FALSE;
  182. }
  183. if (SUCCEEDED(EnsureThemeData( GetUIWnd()->GetWnd()))) {
  184. int iStateID;
  185. RECT rcContent;
  186. SIZE sizeGrip;
  187. RECT rcGrip;
  188. // iStateID = IsCapture() ? SCRBS_PRESSED : m_fMouseIn ? SCRBS_HOT : SCRBS_NORMAL;
  189. iStateID = IsCapture() ? SCRBS_PRESSED : m_fMouseIn ? SCRBS_NORMAL : SCRBS_NORMAL;
  190. // draw thumb
  191. SetDefThemePartID(((m_dwStyle & UISMARTSCROLLTHUMB_HORZ) != 0) ? SBP_THUMBBTNHORZ : SBP_THUMBBTNVERT);
  192. fRet = SUCCEEDED(DrawThemeBackground(hDC, iStateID, &GetRectRef(), 0));
  193. // draw gripper
  194. GetThemeBackgroundContentRect( hDC, iStateID, &GetRectRef(), &rcContent );
  195. SetDefThemePartID(((m_dwStyle & UISMARTSCROLLTHUMB_HORZ) != 0) ? SBP_GRIPPERHORZ : SBP_GRIPPERVERT);
  196. GetThemePartSize( hDC, iStateID, NULL, TS_TRUE, &sizeGrip );
  197. sizeGrip.cx = min( sizeGrip.cx, rcContent.right - rcContent.left);
  198. sizeGrip.cy = min( sizeGrip.cy, rcContent.bottom - rcContent.top);
  199. rcGrip.left = ((rcContent.left + rcContent.right) - sizeGrip.cx) / 2;
  200. rcGrip.top = ((rcContent.top + rcContent.bottom) - sizeGrip.cy) / 2;
  201. rcGrip.right = rcGrip.left + sizeGrip.cx;
  202. rcGrip.bottom = rcGrip.top + sizeGrip.cy;
  203. fRet &= SUCCEEDED(DrawThemeBackground( hDC, iStateID, &rcGrip, 0 ));
  204. }
  205. return fRet;
  206. }
  207. /*=============================================================================*/
  208. /* */
  209. /* C U I F S M A R T S C R O L L */
  210. /* */
  211. /*=============================================================================*/
  212. //
  213. // CUIFSmartScroll
  214. //
  215. /* C U I F S M A R T S C R O L L */
  216. /*------------------------------------------------------------------------------
  217. Constructor of CUIFSmartScroll
  218. ------------------------------------------------------------------------------*/
  219. CUIFSmartScroll::CUIFSmartScroll( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFScroll( pParent, dwID, prc, dwStyle )
  220. {
  221. SetActiveTheme(L"scrollbar");
  222. }
  223. /* ~ C U I F S M A R T S C R O L L */
  224. /*------------------------------------------------------------------------------
  225. Destructor of CUIFSmartScroll
  226. ------------------------------------------------------------------------------*/
  227. CUIFSmartScroll::~CUIFSmartScroll( void )
  228. {
  229. }
  230. /* I N I T I A L I Z E */
  231. /*------------------------------------------------------------------------------
  232. Initialize CUIFSmartScroll object
  233. ------------------------------------------------------------------------------*/
  234. CUIFObject *CUIFSmartScroll::Initialize( void )
  235. {
  236. RECT rc;
  237. DWORD dwThumbStyle;
  238. switch (m_dwStyle & UISCROLL_DIRMASK) {
  239. default:
  240. case UISCROLL_VERTTB:
  241. case UISCROLL_VERTBT: {
  242. dwThumbStyle = UISMARTSCROLLTHUMB_VERT;
  243. break;
  244. }
  245. case UISCROLL_HORZLR:
  246. case UISCROLL_HORZRL: {
  247. dwThumbStyle = UISMARTSCROLLTHUMB_HORZ;
  248. break;
  249. }
  250. }
  251. GetBtnUpRect( &rc );
  252. m_pBtnUp = new CUIFSmartScrollButton( this, &rc, GetScrollUpBtnStyle() );
  253. m_pBtnUp->Initialize();
  254. AddUIObj( m_pBtnUp );
  255. GetBtnDnRect( &rc );
  256. m_pBtnDn = new CUIFSmartScrollButton( this, &rc, GetScrollDnBtnStyle() );
  257. m_pBtnDn->Initialize();
  258. AddUIObj( m_pBtnDn );
  259. GetThumbRect( &rc );
  260. m_pThumb = new CUIFSmartScrollThumb( this, &rc, GetScrollThumbStyle() | dwThumbStyle );
  261. m_pThumb->Initialize();
  262. AddUIObj( m_pThumb );
  263. return CUIFObject::Initialize();
  264. }
  265. /* S E T S T Y L E */
  266. /*------------------------------------------------------------------------------
  267. ------------------------------------------------------------------------------*/
  268. void CUIFSmartScroll::SetStyle( DWORD dwStyle )
  269. {
  270. CUIFScroll::SetStyle( dwStyle );
  271. DWORD dwThumbStyle;
  272. switch (m_dwStyle & UISCROLL_DIRMASK) {
  273. default:
  274. case UISCROLL_VERTTB:
  275. case UISCROLL_VERTBT: {
  276. dwThumbStyle = UISMARTSCROLLTHUMB_VERT;
  277. break;
  278. }
  279. case UISCROLL_HORZLR:
  280. case UISCROLL_HORZRL: {
  281. dwThumbStyle = UISMARTSCROLLTHUMB_HORZ;
  282. break;
  283. }
  284. }
  285. m_pThumb->SetStyle( GetScrollThumbStyle() | dwThumbStyle );
  286. }
  287. /* O N P A I N T D E F A U L T */
  288. /*------------------------------------------------------------------------------
  289. Paint procedure of scroll object (default)
  290. ------------------------------------------------------------------------------*/
  291. void CUIFSmartScroll::OnPaintNoTheme( HDC hDC )
  292. {
  293. HBRUSH hBrush;
  294. // paint scroll bar back
  295. hBrush = (HBRUSH)DefWindowProc( m_pUIWnd->GetWnd(), WM_CTLCOLORSCROLLBAR, (WPARAM)hDC, (LPARAM)m_pUIWnd->GetWnd() );
  296. if (hBrush == NULL) {
  297. // never happen? just in case...
  298. hBrush = GetSysColorBrush(COLOR_SCROLLBAR);
  299. }
  300. FillRect( hDC, &GetRectRef(), hBrush );
  301. DeleteObject( hBrush );
  302. // paint scroll area
  303. if (m_fScrollPage) {
  304. RECT rc;
  305. switch (m_dwScrollDir) {
  306. case UISCROLL_PAGEUP: {
  307. GetPageUpArea( &rc );
  308. break;
  309. }
  310. case UISCROLL_PAGEDOWN: {
  311. GetPageDnArea( &rc );
  312. break;
  313. }
  314. }
  315. InvertRect( hDC, &rc );
  316. }
  317. }
  318. /* O N P A I N T W H I S T L E R */
  319. /*------------------------------------------------------------------------------
  320. Paint procedure of scroll object (Whistler)
  321. ------------------------------------------------------------------------------*/
  322. BOOL CUIFSmartScroll::OnPaintTheme( HDC hDC )
  323. {
  324. BOOL fRet = FALSE;
  325. if (!IsThemeActive()) {
  326. return FALSE;
  327. }
  328. if (SUCCEEDED(EnsureThemeData( GetUIWnd()->GetWnd()))) {
  329. int iStateID;
  330. RECT rc;
  331. switch (m_dwStyle & UISCROLL_DIRMASK) {
  332. default:
  333. case UISCROLL_VERTTB: {
  334. SetDefThemePartID(SBP_UPPERTRACKVERT);
  335. break;
  336. }
  337. case UISCROLL_VERTBT: {
  338. SetDefThemePartID(SBP_LOWERTRACKHORZ);
  339. break;
  340. }
  341. case UISCROLL_HORZLR: {
  342. SetDefThemePartID(SBP_UPPERTRACKHORZ);
  343. break;
  344. }
  345. case UISCROLL_HORZRL: {
  346. SetDefThemePartID(SBP_LOWERTRACKHORZ);
  347. break;
  348. }
  349. }
  350. iStateID = (m_fScrollPage && (m_dwScrollDir == UISCROLL_PAGEUP)) ? SCRBS_PRESSED : SCRBS_NORMAL;
  351. GetPageUpArea( &rc );
  352. fRet = SUCCEEDED(DrawThemeBackground( hDC, iStateID, &rc, 0 ));
  353. switch (m_dwStyle & UISCROLL_DIRMASK) {
  354. default:
  355. case UISCROLL_VERTTB: {
  356. SetDefThemePartID(SBP_LOWERTRACKHORZ);
  357. break;
  358. }
  359. case UISCROLL_VERTBT: {
  360. SetDefThemePartID(SBP_UPPERTRACKVERT);
  361. break;
  362. }
  363. case UISCROLL_HORZLR: {
  364. SetDefThemePartID(SBP_LOWERTRACKHORZ);
  365. break;
  366. }
  367. case UISCROLL_HORZRL: {
  368. SetDefThemePartID(SBP_UPPERTRACKHORZ);
  369. break;
  370. }
  371. }
  372. iStateID = (m_fScrollPage && (m_dwScrollDir == UISCROLL_PAGEDOWN)) ? 3/* PRESSED */ : 1/* NORMAL */;
  373. GetPageDnArea( &rc );
  374. fRet = SUCCEEDED(DrawThemeBackground( hDC, iStateID, &rc, 0 ));
  375. }
  376. return fRet;
  377. }
  378. /*============================================================================*/
  379. /* */
  380. /* C C A N D L I S T A C C I T E M */
  381. /* */
  382. /*============================================================================*/
  383. /* C C A N D L I S T A C C I T E M */
  384. /*------------------------------------------------------------------------------
  385. ------------------------------------------------------------------------------*/
  386. CCandListAccItem::CCandListAccItem( CUIFCandListBase *pListUIObj, int iLine )
  387. {
  388. m_pListUIObj = pListUIObj;
  389. m_iLine = iLine;
  390. }
  391. /* ~ C C A N D L I S T A C C I T E M */
  392. /*------------------------------------------------------------------------------
  393. ------------------------------------------------------------------------------*/
  394. CCandListAccItem::~CCandListAccItem( void )
  395. {
  396. }
  397. /* G E T A C C N A M E */
  398. /*------------------------------------------------------------------------------
  399. Get acc item name
  400. (CCandAccItem method)
  401. ------------------------------------------------------------------------------*/
  402. BSTR CCandListAccItem::GetAccName( void )
  403. {
  404. return m_pListUIObj->GetAccNameProc( m_iLine );
  405. }
  406. /* G E T A C C V A L U E */
  407. /*------------------------------------------------------------------------------
  408. Get acc value
  409. ------------------------------------------------------------------------------*/
  410. BSTR CCandListAccItem::GetAccValue( void )
  411. {
  412. return m_pListUIObj->GetAccValueProc( m_iLine );
  413. }
  414. /* G E T A C C R O L E */
  415. /*------------------------------------------------------------------------------
  416. Get acc item role
  417. (CCandAccItem method)
  418. ------------------------------------------------------------------------------*/
  419. LONG CCandListAccItem::GetAccRole( void )
  420. {
  421. return m_pListUIObj->GetAccRoleProc( m_iLine );
  422. }
  423. /* G E T A C C S T A T E */
  424. /*------------------------------------------------------------------------------
  425. Get acc item state
  426. (CCandAccItem method)
  427. ------------------------------------------------------------------------------*/
  428. LONG CCandListAccItem::GetAccState( void )
  429. {
  430. return m_pListUIObj->GetAccStateProc( m_iLine );
  431. }
  432. /* G E T A C C L O C A T I O N */
  433. /*------------------------------------------------------------------------------
  434. Get acc location
  435. (CCandAccItem method)
  436. ------------------------------------------------------------------------------*/
  437. void CCandListAccItem::GetAccLocation( RECT *prc )
  438. {
  439. m_pListUIObj->GetAccLocationProc( m_iLine, prc );
  440. }
  441. /* O N S E L E C T */
  442. /*------------------------------------------------------------------------------
  443. ------------------------------------------------------------------------------*/
  444. void CCandListAccItem::OnSelect( void )
  445. {
  446. NotifyWinEvent( EVENT_OBJECT_SELECTION );
  447. }
  448. /*=============================================================================*/
  449. /* */
  450. /* C U I F C A N D L I S T */
  451. /* */
  452. /*=============================================================================*/
  453. //
  454. // CUIFCandListBase
  455. //
  456. /* C U I F C A N D L I S T B A S E */
  457. /*------------------------------------------------------------------------------
  458. Constructor of CUIFCandListBase
  459. ------------------------------------------------------------------------------*/
  460. CUIFCandListBase::CUIFCandListBase( void )
  461. {
  462. int i;
  463. m_hFontInlineComment = (HFONT)GetStockObject( DEFAULT_GUI_FONT );
  464. for (i = 0; i < CANDLISTACCITEM_MAX; i++) {
  465. m_rgListAccItem[i] = NULL;
  466. }
  467. }
  468. /* ~ C U I F C A N D L I S T B A S E */
  469. /*------------------------------------------------------------------------------
  470. Destructor of CUIFCandListBase
  471. ------------------------------------------------------------------------------*/
  472. CUIFCandListBase::~CUIFCandListBase( void )
  473. {
  474. int i;
  475. for (i = 0; i < CANDLISTACCITEM_MAX; i++) {
  476. if (m_rgListAccItem[i] != NULL) {
  477. delete m_rgListAccItem[i];
  478. }
  479. }
  480. }
  481. /* G E T C A N D I D A T E I T E M */
  482. /*------------------------------------------------------------------------------
  483. Get candidate item of candidate list item
  484. ------------------------------------------------------------------------------*/
  485. CCandidateItem *CUIFCandListBase::GetCandidateItem( int iItem )
  486. {
  487. CCandListItem *pListItem = GetCandItem( iItem );
  488. return (pListItem != NULL) ? pListItem->GetCandidateItem() : NULL;
  489. }
  490. /* S E T I C O N P O P U P C O M M E N T */
  491. /*------------------------------------------------------------------------------
  492. ------------------------------------------------------------------------------*/
  493. void CUIFCandListBase::SetIconPopupComment( HICON hIconOn, HICON hIconOff )
  494. {
  495. m_hIconPopupOn = hIconOn;
  496. m_hIconPopupOff = hIconOff;
  497. }
  498. /* I N I T A C C I T E M S */
  499. /*------------------------------------------------------------------------------
  500. ------------------------------------------------------------------------------*/
  501. void CUIFCandListBase::InitAccItems( CCandAccessible *pCandAcc )
  502. {
  503. int i;
  504. for (i = 0; i < CANDLISTACCITEM_MAX; i++) {
  505. m_rgListAccItem[i] = new CCandListAccItem( this, i );
  506. pCandAcc->AddAccItem( m_rgListAccItem[i] );
  507. }
  508. }
  509. /* G E T L I S T A C C I T E M */
  510. /*------------------------------------------------------------------------------
  511. ------------------------------------------------------------------------------*/
  512. CCandListAccItem *CUIFCandListBase::GetListAccItem( int i )
  513. {
  514. if (0 <= i && i < CANDLISTACCITEM_MAX) {
  515. return m_rgListAccItem[i];
  516. }
  517. return NULL;
  518. }
  519. //
  520. // CUIFCandList
  521. //
  522. /* C U I F C A N D L I S T */
  523. /*------------------------------------------------------------------------------
  524. Constructor of CUIFCandList
  525. ------------------------------------------------------------------------------*/
  526. CUIFCandList::CUIFCandList( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFListBase( pParent, dwID, prc, dwStyle )
  527. {
  528. m_iIndexStart = 1;
  529. m_nExtTopSpace = 0;
  530. m_nExtBottomSpace = 0;
  531. m_cxInlineCommentPos = -1;
  532. m_iItemHover = -1;
  533. }
  534. /* ~ C U I F C A N D L I S T */
  535. /*------------------------------------------------------------------------------
  536. Destructor of CUIFCandList
  537. ------------------------------------------------------------------------------*/
  538. CUIFCandList::~CUIFCandList( void )
  539. {
  540. }
  541. /* A D D C A N D I T E M */
  542. /*------------------------------------------------------------------------------
  543. Add new candidate item
  544. (CUIFCandListBase method)
  545. Returns index of candidate item added
  546. ------------------------------------------------------------------------------*/
  547. int CUIFCandList::AddCandItem( CCandListItem *pCandListItem )
  548. {
  549. return AddItem( pCandListItem );
  550. }
  551. /* G E T I T E M C O U N T */
  552. /*------------------------------------------------------------------------------
  553. Returns number of candidate item
  554. (CUIFCandListBase method)
  555. ------------------------------------------------------------------------------*/
  556. int CUIFCandList::GetItemCount( void )
  557. {
  558. return GetCount();
  559. }
  560. /* I S I T E M S E L E C T A B L E */
  561. /*------------------------------------------------------------------------------
  562. Returns TRUE, if candidate item with given index could be selected.
  563. Otherwise, returns FALSE.
  564. (CUIFCandListBase method)
  565. ------------------------------------------------------------------------------*/
  566. BOOL CUIFCandList::IsItemSelectable( int iListItem )
  567. {
  568. int iListItemMax = GetItemCount();
  569. return (0 <= iListItem) && (iListItem < iListItemMax);
  570. }
  571. /* G E T C A N D I T E M */
  572. /*------------------------------------------------------------------------------
  573. Get candidate item
  574. (CUIFCandListBase method)
  575. ------------------------------------------------------------------------------*/
  576. CCandListItem* CUIFCandList::GetCandItem( int iItem )
  577. {
  578. return (CCandListItem*)GetItem( iItem );
  579. }
  580. /* D E L A L L C A N D I T E M */
  581. /*------------------------------------------------------------------------------
  582. Delete all candidate items
  583. (CUIFCandListBase method)
  584. ------------------------------------------------------------------------------*/
  585. void CUIFCandList::DelAllCandItem( void )
  586. {
  587. DelAllItem();
  588. }
  589. /* S E T C U R S E L */
  590. /*------------------------------------------------------------------------------
  591. Set current selection
  592. (CUIFCandListBase method)
  593. ------------------------------------------------------------------------------*/
  594. void CUIFCandList::SetCurSel( int iSelection )
  595. {
  596. CCandListAccItem *pAccItem;
  597. SetSelection( iSelection, TRUE );
  598. //
  599. pAccItem = GetListAccItem( GetSelection() - GetTopItem() );
  600. if (pAccItem != NULL) {
  601. pAccItem ->OnSelect();
  602. }
  603. }
  604. /* G E T C U R S E L */
  605. /*------------------------------------------------------------------------------
  606. Get current selection
  607. (CUIFCandListBase method)
  608. ------------------------------------------------------------------------------*/
  609. int CUIFCandList::GetCurSel( void )
  610. {
  611. return GetSelection();
  612. }
  613. /* G E T T O P I T E M */
  614. /*------------------------------------------------------------------------------
  615. Get item displayed at the top of list
  616. (CUIFCandListBase method)
  617. ------------------------------------------------------------------------------*/
  618. int CUIFCandList::GetTopItem( void )
  619. {
  620. return GetTop();
  621. }
  622. /* G E T B O T T O M I T E M */
  623. /*------------------------------------------------------------------------------
  624. Get item displayed at the bottom of list
  625. (CUIFCandListBase method)
  626. ------------------------------------------------------------------------------*/
  627. int CUIFCandList::GetBottomItem( void )
  628. {
  629. return GetBottom();
  630. }
  631. /* I S V I S I B L E */
  632. /*------------------------------------------------------------------------------
  633. Get visible status of object
  634. (CUIFCandListBase method)
  635. ------------------------------------------------------------------------------*/
  636. BOOL CUIFCandList::IsVisible( void )
  637. {
  638. return CUIFListBase::IsVisible();
  639. }
  640. /* G E T R E C T */
  641. /*------------------------------------------------------------------------------
  642. Get rect of object
  643. (CUIFCandListBase method)
  644. ------------------------------------------------------------------------------*/
  645. void CUIFCandList::GetRect( RECT *prc )
  646. {
  647. CUIFListBase::GetRect( prc );
  648. }
  649. /* G E T I T E M R E C T */
  650. /*------------------------------------------------------------------------------
  651. Get item rect
  652. (CUIFCandListBase method)
  653. ------------------------------------------------------------------------------*/
  654. void CUIFCandList::GetItemRect( int iItem, RECT *prc )
  655. {
  656. Assert( prc != NULL );
  657. ::SetRect( prc, 0, 0, 0, 0 );
  658. if (GetTopItem() <= iItem && iItem <= GetBottomItem()) {
  659. GetLineRect( iItem - GetTopItem(), prc );
  660. }
  661. }
  662. /* S E T I N L I N E C O M M E N T P O S */
  663. /*------------------------------------------------------------------------------
  664. Set (horizontal) position to draw inline comment
  665. NOTE: if cx has negative value, inline comment will be aligned to right.
  666. (CUIFCandListBase method)
  667. ------------------------------------------------------------------------------*/
  668. void CUIFCandList::SetInlineCommentPos( int cx )
  669. {
  670. m_cxInlineCommentPos = cx;
  671. }
  672. /* S E T I N L I N E C O M M E N T F O N T */
  673. /*------------------------------------------------------------------------------
  674. Set font for inline comment
  675. (CUIFCandListBase method)
  676. ------------------------------------------------------------------------------*/
  677. void CUIFCandList::SetInlineCommentFont( HFONT hFont )
  678. {
  679. if (hFont == NULL) {
  680. hFont = (HFONT)GetStockObject( DEFAULT_GUI_FONT );
  681. }
  682. m_hFontInlineComment = hFont;
  683. CallOnPaint();
  684. }
  685. /* S E T I N D E X F O N T */
  686. /*------------------------------------------------------------------------------
  687. Set font for index
  688. (CUIFCandListBase method)
  689. ------------------------------------------------------------------------------*/
  690. void CUIFCandList::SetIndexFont( HFONT hFont )
  691. {
  692. if (hFont == NULL) {
  693. hFont = (HFONT)GetStockObject( DEFAULT_GUI_FONT );
  694. }
  695. m_hFontIndex = hFont;
  696. CallOnPaint();
  697. }
  698. /* S E T C A N D L I S T */
  699. /*------------------------------------------------------------------------------
  700. Set candidate list
  701. ------------------------------------------------------------------------------*/
  702. void CUIFCandList::SetCandList( CCandidateList *pCandList )
  703. {
  704. int nCandItem;
  705. int i;
  706. CCandidateItem *pCandItem;
  707. ASSERT( pCandList );
  708. nCandItem = pCandList->GetItemCount();
  709. for (i = 0; i < nCandItem; i++) {
  710. pCandItem = pCandList->GetCandidateItem( i );
  711. if (pCandItem->IsVisible()) {
  712. CCandListItem *pCandListItem = new CCandListItem( GetItemCount(), i, pCandItem );
  713. AddCandItem( pCandListItem );
  714. }
  715. }
  716. }
  717. /* G E T A C C N A M E P R O C */
  718. /*------------------------------------------------------------------------------
  719. Get acc item name
  720. ------------------------------------------------------------------------------*/
  721. BSTR CUIFCandList::GetAccNameProc( int iItem )
  722. {
  723. CCandidateItem *pCandItem;
  724. int iListItem = GetTopItem() + iItem;
  725. pCandItem = GetCandidateItem( iListItem );
  726. return (pCandItem != NULL) ? SysAllocString( pCandItem->GetString() ) : NULL;
  727. }
  728. /* G E T A C C V A L U E P R O C */
  729. /*------------------------------------------------------------------------------
  730. Get acc value
  731. ------------------------------------------------------------------------------*/
  732. BSTR CUIFCandList::GetAccValueProc( int iItem )
  733. {
  734. CCandidateItem *pCandItem;
  735. int iListItem = GetTopItem() + iItem;
  736. pCandItem = GetCandidateItem( iListItem );
  737. return (pCandItem != NULL) ? SysAllocString( pCandItem->GetString() ) : NULL;
  738. }
  739. /* G E T A C C R O L E P R O C */
  740. /*------------------------------------------------------------------------------
  741. Get acc item role
  742. ------------------------------------------------------------------------------*/
  743. LONG CUIFCandList::GetAccRoleProc( int iItem )
  744. {
  745. return ROLE_SYSTEM_LISTITEM;
  746. }
  747. /* G E T A C C S T A T E P R O C */
  748. /*------------------------------------------------------------------------------
  749. Get acc item state
  750. (CCandAccItem method)
  751. ------------------------------------------------------------------------------*/
  752. LONG CUIFCandList::GetAccStateProc( int iItem )
  753. {
  754. int iCurSel = GetCurSel();
  755. int iTopItem = GetTopItem();
  756. int iItemMax = GetItemCount();
  757. if (iTopItem + iItem == iCurSel) {
  758. return STATE_SYSTEM_SELECTED;
  759. }
  760. else if (iTopItem + iItem < iItemMax) {
  761. return STATE_SYSTEM_SELECTABLE;
  762. }
  763. else {
  764. return STATE_SYSTEM_UNAVAILABLE;
  765. }
  766. }
  767. /* G E T A C C L O C A T I O N P R O C */
  768. /*------------------------------------------------------------------------------
  769. Get acc location
  770. ------------------------------------------------------------------------------*/
  771. void CUIFCandList::GetAccLocationProc( int iItem, RECT *prc )
  772. {
  773. GetLineRect( iItem, prc );
  774. }
  775. /* O N L B U T T O N D O W N */
  776. /*------------------------------------------------------------------------------
  777. ------------------------------------------------------------------------------*/
  778. void CUIFCandList::OnLButtonDown( POINT pt )
  779. {
  780. SetItemHover( -1 );
  781. CUIFListBase::OnLButtonDown( pt );
  782. }
  783. /* O N L B U T T O N U P */
  784. /*------------------------------------------------------------------------------
  785. ------------------------------------------------------------------------------*/
  786. void CUIFCandList::OnLButtonUp( POINT pt )
  787. {
  788. SetItemHover( ListItemFromPoint( pt ) );
  789. CUIFListBase::OnLButtonUp( pt );
  790. }
  791. /* O N M O U S E M O V E */
  792. /*------------------------------------------------------------------------------
  793. (CUIFObject method)
  794. ------------------------------------------------------------------------------*/
  795. void CUIFCandList::OnMouseMove( POINT pt )
  796. {
  797. if (!IsCapture()) {
  798. SetItemHover( ListItemFromPoint( pt ) );
  799. }
  800. CUIFListBase::OnMouseMove( pt );
  801. }
  802. /* O N M O U S E I N */
  803. /*------------------------------------------------------------------------------
  804. (CUIFObject method)
  805. ------------------------------------------------------------------------------*/
  806. void CUIFCandList::OnMouseIn( POINT pt )
  807. {
  808. if (!IsCapture()) {
  809. SetItemHover( ListItemFromPoint( pt ) );
  810. }
  811. CUIFListBase::OnMouseMove( pt );
  812. }
  813. /* O N M O U S E O U T */
  814. /*------------------------------------------------------------------------------
  815. (CUIFObject method)
  816. ------------------------------------------------------------------------------*/
  817. void CUIFCandList::OnMouseOut( POINT pt )
  818. {
  819. if (!IsCapture()) {
  820. SetItemHover( -1 );
  821. }
  822. CUIFListBase::OnMouseMove( pt );
  823. }
  824. /* S E T S T A R T I N D E X */
  825. /*------------------------------------------------------------------------------
  826. ------------------------------------------------------------------------------*/
  827. void CUIFCandList::SetStartIndex( int iIndexStart )
  828. {
  829. m_iIndexStart = iIndexStart;
  830. }
  831. /* S E T E X T R A T O P S P A C E */
  832. /*------------------------------------------------------------------------------
  833. ------------------------------------------------------------------------------*/
  834. void CUIFCandList::SetExtraTopSpace( int nSpace )
  835. {
  836. RECT rcScroll;
  837. m_nExtTopSpace = nSpace;
  838. GetScrollBarRect( &rcScroll );
  839. m_pUIScroll->SetRect( &rcScroll );
  840. }
  841. /* S E T E X T R A B O T T O M S P A C E */
  842. /*------------------------------------------------------------------------------
  843. ------------------------------------------------------------------------------*/
  844. void CUIFCandList::SetExtraBottomSpace( int nSpace )
  845. {
  846. RECT rcScroll;
  847. m_nExtBottomSpace = nSpace;
  848. GetScrollBarRect( &rcScroll );
  849. m_pUIScroll->SetRect( &rcScroll );
  850. }
  851. /* G E T E X T R A T O P S P A C E */
  852. /*------------------------------------------------------------------------------
  853. ------------------------------------------------------------------------------*/
  854. int CUIFCandList::GetExtraTopSpace( void )
  855. {
  856. return m_nExtTopSpace;
  857. }
  858. /* G E T E X T R A B O T T O M S P A C E */
  859. /*------------------------------------------------------------------------------
  860. ------------------------------------------------------------------------------*/
  861. int CUIFCandList::GetExtraBottomSpace( void )
  862. {
  863. return m_nExtBottomSpace;
  864. }
  865. /* G E T L I N E R E C T */
  866. /*------------------------------------------------------------------------------
  867. ------------------------------------------------------------------------------*/
  868. void CUIFCandList::GetLineRect( int iLine, RECT *prc )
  869. {
  870. CUIFListBase::GetLineRect( iLine, prc );
  871. // exclude a space about scrollbar when it has space at top/bottom of scrollbar
  872. if ((m_nExtBottomSpace != 0) || (m_nExtTopSpace != 0)) {
  873. switch (m_dwStyle & UILIST_DIRMASK) {
  874. default:
  875. case UILIST_HORZTB:
  876. case UILIST_HORZBT: {
  877. prc->right = GetRectRef().right - GetSystemMetrics(SM_CXVSCROLL);
  878. break;
  879. }
  880. case UILIST_VERTLR:
  881. case UILIST_VERTRL: {
  882. prc->top = GetRectRef().top;
  883. prc->bottom = GetRectRef().bottom - GetSystemMetrics(SM_CYHSCROLL);
  884. break;
  885. }
  886. }
  887. }
  888. }
  889. /* G E T S C R O L L B A R R E C T */
  890. /*------------------------------------------------------------------------------
  891. ------------------------------------------------------------------------------*/
  892. void CUIFCandList::GetScrollBarRect( RECT *prc )
  893. {
  894. switch (m_dwStyle & UILIST_DIRMASK) {
  895. default:
  896. case UILIST_HORZTB:
  897. case UILIST_HORZBT: {
  898. prc->left = GetRectRef().right - GetSystemMetrics(SM_CXVSCROLL);
  899. prc->top = GetRectRef().top + m_nExtTopSpace;
  900. prc->right = GetRectRef().right;
  901. prc->bottom = GetRectRef().bottom - m_nExtBottomSpace;
  902. break;
  903. }
  904. case UILIST_VERTLR:
  905. case UILIST_VERTRL: {
  906. prc->left = GetRectRef().left + m_nExtBottomSpace;
  907. prc->top = GetRectRef().bottom - GetSystemMetrics(SM_CYHSCROLL);
  908. prc->right = GetRectRef().right - m_nExtTopSpace;
  909. prc->bottom = GetRectRef().bottom;
  910. break;
  911. }
  912. }
  913. }
  914. /* G E T S C R O L L B A R S T Y L E */
  915. /*------------------------------------------------------------------------------
  916. ------------------------------------------------------------------------------*/
  917. DWORD CUIFCandList::GetScrollBarStyle( void )
  918. {
  919. DWORD dwScrollStyle;
  920. switch (m_dwStyle & UILIST_DIRMASK) {
  921. default:
  922. case UILIST_HORZTB: {
  923. dwScrollStyle = UISCROLL_VERTTB;
  924. break;
  925. }
  926. case UILIST_HORZBT: {
  927. dwScrollStyle = UISCROLL_VERTBT;
  928. break;
  929. }
  930. case UILIST_VERTLR: {
  931. dwScrollStyle = UISCROLL_HORZLR;
  932. break;
  933. }
  934. case UILIST_VERTRL: {
  935. dwScrollStyle = UISCROLL_HORZRL;
  936. break;
  937. }
  938. }
  939. return dwScrollStyle;
  940. }
  941. /* C R E A T E S C R O L L B A R O B J */
  942. /*------------------------------------------------------------------------------
  943. ------------------------------------------------------------------------------*/
  944. CUIFScroll *CUIFCandList::CreateScrollBarObj( CUIFObject *pParent, DWORD dwID, RECT *prc, DWORD dwStyle )
  945. {
  946. return new CUIFSmartScroll( pParent, dwID, prc, dwStyle );
  947. }
  948. /* O N P A I N T */
  949. /*------------------------------------------------------------------------------
  950. Paint procedure of candidate list
  951. ------------------------------------------------------------------------------*/
  952. void CUIFCandList::OnPaint( HDC hDC )
  953. {
  954. HDC hDCMem;
  955. HBITMAP hBmpMem;
  956. HBITMAP hBmpOld;
  957. SIZE size;
  958. RECT rc;
  959. int iLine;
  960. HFONT hFontOld;
  961. RECT rcBorder;
  962. // prepare memory dc
  963. rc = GetRectRef();
  964. size.cx = rc.right - rc.left;
  965. size.cy = rc.bottom - rc.top;
  966. hDCMem = CreateCompatibleDC( hDC );
  967. if (!hDCMem)
  968. return ;
  969. hBmpMem = CreateCompatibleBitmap( hDC, size.cx, size.cy );
  970. hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmpMem );
  971. SetWindowOrgEx( hDCMem, rc.left, rc.top, NULL );
  972. hFontOld = (HFONT)SelectObject( hDCMem, GetFont() );
  973. // paint background
  974. m_pUIFScheme->FillRect( hDCMem, &rc, UIFCOLOR_WINDOW );
  975. // paint index bkgnd
  976. switch (m_dwStyle & UILIST_DIRMASK) {
  977. default:
  978. case UILIST_HORZTB:
  979. case UILIST_HORZBT: {
  980. rcBorder.left = rc.left;
  981. rcBorder.top = rc.top;
  982. rcBorder.right = rc.left + (GetLineHeight()) + 4;
  983. rcBorder.bottom = rc.bottom;
  984. break;
  985. }
  986. case UILIST_VERTLR:
  987. case UILIST_VERTRL: {
  988. rcBorder.left = rc.left;
  989. rcBorder.top = rc.top;
  990. rcBorder.right = rc.right;
  991. rcBorder.bottom = rc.top + (GetLineHeight()) + 4;
  992. break;
  993. }
  994. }
  995. m_pUIFScheme->FillRect( hDCMem, &rcBorder, UIFCOLOR_MENUBARSHORT );
  996. // paint items
  997. for (iLine = 0; iLine < m_nItemVisible + 1; iLine++) {
  998. CCandListItem *pItem;
  999. int iItem = m_iItemTop + iLine;
  1000. RECT rcLine;
  1001. pItem = GetCandItem( iItem );
  1002. if (pItem != NULL) {
  1003. GetLineRect( iLine, &rcLine );
  1004. if (!IsRectEmpty( &rcLine )) {
  1005. PaintItemProc( hDCMem, &rcLine, iLine + m_iIndexStart, pItem, (iItem == m_iItemSelect) );
  1006. }
  1007. }
  1008. }
  1009. //
  1010. BitBlt( hDC, GetRectRef().left, GetRectRef().top, size.cx, size.cy, hDCMem, rc.left, rc.top, SRCCOPY );
  1011. SelectObject( hDCMem, hFontOld );
  1012. SelectObject( hDCMem, hBmpOld );
  1013. DeleteObject( hBmpMem );
  1014. DeleteDC( hDCMem );
  1015. }
  1016. /* P A I N T I T E M P R O C */
  1017. /*------------------------------------------------------------------------------
  1018. ------------------------------------------------------------------------------*/
  1019. void CUIFCandList::PaintItemProc( HDC hDC, RECT *prc, int iIndex, CCandListItem *pItem, BOOL fSelected )
  1020. {
  1021. CCandidateItem *pCandItem;
  1022. RECT rcClip;
  1023. RECT rcText;
  1024. RECT rcIndex;
  1025. int iBkModeOld;
  1026. iBkModeOld = SetBkMode( hDC, TRANSPARENT );
  1027. // get candidate item
  1028. pCandItem = pItem->GetCandidateItem();
  1029. Assert( pCandItem != NULL );
  1030. // calc rects
  1031. switch (m_dwStyle & UILIST_DIRMASK) {
  1032. default:
  1033. case UILIST_HORZTB:
  1034. case UILIST_HORZBT: {
  1035. rcIndex.left = prc->left;
  1036. rcIndex.top = prc->top;
  1037. rcIndex.right = prc->left + GetLineHeight() + 4;
  1038. rcIndex.bottom = prc->bottom;
  1039. rcClip.left = rcIndex.right;
  1040. rcClip.top = prc->top;
  1041. rcClip.right = prc->right;
  1042. rcClip.bottom = prc->bottom;
  1043. rcText.left = rcIndex.right + 8;
  1044. rcText.top = prc->top;
  1045. rcText.right = prc->right - 8;
  1046. rcText.bottom = prc->bottom;
  1047. break;
  1048. }
  1049. case UILIST_VERTLR:
  1050. case UILIST_VERTRL: {
  1051. rcIndex.left = prc->left;
  1052. rcIndex.top = prc->top;
  1053. rcIndex.right = prc->right;
  1054. rcIndex.bottom = prc->top + GetLineHeight() + 4;
  1055. rcClip.left = prc->left;
  1056. rcClip.top = rcIndex.bottom;
  1057. rcClip.right = prc->right;
  1058. rcClip.bottom = prc->bottom;
  1059. rcText.left = prc->left;
  1060. rcText.top = rcIndex.bottom + 8;
  1061. rcText.right = prc->right;
  1062. rcText.bottom = prc->bottom - 8;
  1063. break;
  1064. }
  1065. }
  1066. // paint selection
  1067. if (fSelected) {
  1068. RECT rc = *prc;
  1069. rc.left += 1;
  1070. rc.right -= 1;
  1071. rc.bottom -= 1;
  1072. m_pUIFScheme->DrawSelectionRect( hDC, &rc, FALSE /* over */ );
  1073. }
  1074. // paint index
  1075. if ((m_dwStyle & UILIST_ICONSNOTNUMBERS) == 0)
  1076. {
  1077. if (0 <= iIndex && iIndex <= 9) {
  1078. SIZE size;
  1079. POINT ptOrg;
  1080. WCHAR wchIndex = L'0' + iIndex;
  1081. COLORREF colTextOld;
  1082. HFONT hFontOld;
  1083. // index
  1084. hFontOld = (HFONT)SelectObject( hDC, m_hFontIndex );
  1085. FLGetTextExtentPoint32( hDC, &wchIndex, 1, &size );
  1086. ptOrg.x = (rcIndex.right + rcIndex.left - size.cx) / 2;
  1087. ptOrg.y = (rcIndex.bottom + rcIndex.top - size.cy) / 2;
  1088. colTextOld = SetTextColor( hDC, GetUIFColor( UIFCOLOR_CTRLTEXT ) );
  1089. FLExtTextOutW( hDC, ptOrg.x, ptOrg.y, ETO_CLIPPED, &rcIndex, &wchIndex, 1, NULL );
  1090. SetTextColor( hDC, colTextOld );
  1091. SelectObject( hDC, hFontOld );
  1092. }
  1093. }
  1094. // paint candidate item
  1095. PaintItemText( hDC, &rcText, &rcClip, &rcIndex, pCandItem, fSelected );
  1096. //
  1097. SetBkMode( hDC, iBkModeOld );
  1098. }
  1099. /* P A I N T I T E M T E X T */
  1100. /*------------------------------------------------------------------------------
  1101. ------------------------------------------------------------------------------*/
  1102. void CUIFCandList::PaintItemText( HDC hDC, RECT *prcText, RECT *prcClip, RECT *prcIndex, CCandidateItem *pCandItem, BOOL fSelected )
  1103. {
  1104. COLORREF col;
  1105. COLORREF colText;
  1106. COLORREF colPrefix;
  1107. COLORREF colTextOld;
  1108. int iBkModeOld;
  1109. LPCWSTR psz;
  1110. HICON hIcon;
  1111. SIZE size;
  1112. POINT ptOrg;
  1113. POINT ptCenter;
  1114. SIZE sizeComment = {0};
  1115. POINT ptComment;
  1116. int cxyOrigin = 0;
  1117. // set color
  1118. if (fSelected) {
  1119. colText = GetUIFColor( UIFCOLOR_MOUSEOVERTEXT );
  1120. colPrefix = GetUIFColor( UIFCOLOR_CTRLTEXTDISABLED );
  1121. }
  1122. else {
  1123. colText = GetUIFColor( UIFCOLOR_CTRLTEXT );
  1124. colPrefix = GetUIFColor( UIFCOLOR_CTRLTEXTDISABLED );
  1125. }
  1126. if (pCandItem->GetColor( &col )) {
  1127. colText = col;
  1128. }
  1129. colTextOld = GetTextColor( hDC );
  1130. iBkModeOld = SetBkMode( hDC, TRANSPARENT );
  1131. // calc center
  1132. switch (m_dwStyle & UILIST_DIRMASK) {
  1133. default:
  1134. case UILIST_HORZTB: {
  1135. ptCenter.x = (prcText->left + prcText->right) / 2;
  1136. ptCenter.y = prcText->top + GetLineHeight() / 2;
  1137. break;
  1138. }
  1139. case UILIST_HORZBT: {
  1140. ptCenter.x = (prcText->left + prcText->right) / 2;
  1141. ptCenter.y = prcText->bottom - GetLineHeight() / 2;
  1142. break;
  1143. }
  1144. case UILIST_VERTLR: {
  1145. ptCenter.x = prcText->left + GetLineHeight() / 2;
  1146. ptCenter.y = (prcText->top + prcText->bottom) / 2;
  1147. break;
  1148. }
  1149. case UILIST_VERTRL: {
  1150. ptCenter.x = prcText->right - GetLineHeight() / 2;
  1151. ptCenter.y = (prcText->top + prcText->bottom) / 2;
  1152. break;
  1153. }
  1154. }
  1155. // paint icon
  1156. hIcon = pCandItem->GetIcon();
  1157. if (hIcon != NULL) {
  1158. RECT rcIcon;
  1159. size.cx = 16;
  1160. size.cy = 16;
  1161. if (GetLineHeight()-2 < size.cx) {
  1162. size.cx = size.cy = GetLineHeight()-2;
  1163. }
  1164. switch (m_dwStyle & UILIST_DIRMASK) {
  1165. default:
  1166. case UILIST_HORZTB: {
  1167. if (m_dwStyle & UILIST_ICONSNOTNUMBERS)
  1168. {
  1169. rcIcon.left = prcIndex->left;
  1170. rcIcon.right = prcIndex->right;
  1171. }
  1172. else
  1173. {
  1174. rcIcon.left = prcText->left;
  1175. rcIcon.right = prcText->left + GetLineHeight();
  1176. }
  1177. rcIcon.top = prcText->top;
  1178. rcIcon.bottom = prcText->top + GetLineHeight();
  1179. break;
  1180. }
  1181. case UILIST_HORZBT: {
  1182. if (m_dwStyle & UILIST_ICONSNOTNUMBERS)
  1183. {
  1184. rcIcon.left = prcIndex->left;
  1185. rcIcon.right = prcIndex->right;
  1186. }
  1187. else
  1188. {
  1189. rcIcon.left = prcText->left;
  1190. rcIcon.right = prcText->left + GetLineHeight();
  1191. }
  1192. rcIcon.top = prcText->bottom - GetLineHeight();
  1193. rcIcon.bottom = prcText->bottom;
  1194. break;
  1195. }
  1196. case UILIST_VERTLR: {
  1197. rcIcon.left = prcText->left;
  1198. rcIcon.right = prcText->left + GetLineHeight();
  1199. if (m_dwStyle & UILIST_ICONSNOTNUMBERS)
  1200. {
  1201. rcIcon.top = prcIndex->bottom - GetLineHeight();
  1202. rcIcon.bottom = prcIndex->bottom;
  1203. }
  1204. else
  1205. {
  1206. rcIcon.top = prcText->bottom - GetLineHeight();
  1207. rcIcon.bottom = prcText->bottom;
  1208. }
  1209. break;
  1210. }
  1211. case UILIST_VERTRL: {
  1212. rcIcon.left = prcText->right - GetLineHeight();
  1213. rcIcon.right = prcText->right;
  1214. if (m_dwStyle & UILIST_ICONSNOTNUMBERS)
  1215. {
  1216. rcIcon.top = prcIndex->top;
  1217. rcIcon.bottom = prcIndex->top + GetLineHeight();
  1218. }
  1219. else
  1220. {
  1221. rcIcon.top = prcText->top;
  1222. rcIcon.bottom = prcText->top + GetLineHeight();
  1223. }
  1224. break;
  1225. }
  1226. }
  1227. ptOrg.x = (rcIcon.left + rcIcon.right - size.cx) / 2;
  1228. ptOrg.y = (rcIcon.top + rcIcon.bottom - size.cx) / 2;
  1229. DrawIconEx( hDC, ptOrg.x, ptOrg.y, hIcon, size.cx, size.cy, 0, NULL, DI_NORMAL|DI_COMPAT );
  1230. if ((m_dwStyle & UILIST_ICONSNOTNUMBERS) == 0)
  1231. {
  1232. cxyOrigin += GetLineHeight();
  1233. }
  1234. }
  1235. // paint prefix string
  1236. psz = pCandItem->GetPrefixString();
  1237. if (psz != NULL) {
  1238. FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size );
  1239. switch (m_dwStyle & UILIST_DIRMASK) {
  1240. default:
  1241. case UILIST_HORZTB: {
  1242. ptOrg.x = prcText->left + cxyOrigin;
  1243. ptOrg.y = ptCenter.y - size.cy/2;
  1244. break;
  1245. }
  1246. case UILIST_HORZBT: {
  1247. ptOrg.x = prcText->right - cxyOrigin;
  1248. ptOrg.y = ptCenter.y + size.cy/2;
  1249. break;
  1250. }
  1251. case UILIST_VERTLR: {
  1252. ptOrg.x = ptCenter.x - size.cy/2;
  1253. ptOrg.y = prcText->bottom - cxyOrigin;
  1254. break;
  1255. }
  1256. case UILIST_VERTRL: {
  1257. ptOrg.x = ptCenter.x + size.cy/2;
  1258. ptOrg.y = prcText->top + cxyOrigin;
  1259. break;
  1260. }
  1261. }
  1262. SetTextColor( hDC, colPrefix );
  1263. FLExtTextOutW( hDC, ptOrg.x, ptOrg.y, ETO_CLIPPED, prcClip, psz, wcslen(psz), NULL );
  1264. cxyOrigin += size.cx;
  1265. }
  1266. // paint candidate string
  1267. psz = pCandItem->GetString();
  1268. FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size );
  1269. switch (m_dwStyle & UILIST_DIRMASK) {
  1270. default:
  1271. case UILIST_HORZTB: {
  1272. ptOrg.x = prcText->left + cxyOrigin;
  1273. ptOrg.y = ptCenter.y - size.cy/2;
  1274. break;
  1275. }
  1276. case UILIST_HORZBT: {
  1277. ptOrg.x = prcText->right - cxyOrigin;
  1278. ptOrg.y = ptCenter.y + size.cy/2;
  1279. break;
  1280. }
  1281. case UILIST_VERTLR: {
  1282. ptOrg.x = ptCenter.x - size.cy/2;
  1283. ptOrg.y = prcText->bottom - cxyOrigin;
  1284. break;
  1285. }
  1286. case UILIST_VERTRL: {
  1287. ptOrg.x = ptCenter.x + size.cy/2;
  1288. ptOrg.y = prcText->top + cxyOrigin;
  1289. break;
  1290. }
  1291. }
  1292. SetTextColor( hDC, colText );
  1293. FLExtTextOutW( hDC, ptOrg.x, ptOrg.y, ETO_CLIPPED, prcClip, psz, wcslen(psz), NULL );
  1294. cxyOrigin += size.cx;
  1295. // paint suffix string
  1296. psz = pCandItem->GetSuffixString();
  1297. if (psz != NULL) {
  1298. FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size );
  1299. switch (m_dwStyle & UILIST_DIRMASK) {
  1300. default:
  1301. case UILIST_HORZTB: {
  1302. ptOrg.x = prcText->left + cxyOrigin;
  1303. ptOrg.y = ptCenter.y - size.cy/2;
  1304. break;
  1305. }
  1306. case UILIST_HORZBT: {
  1307. ptOrg.x = prcText->right - cxyOrigin;
  1308. ptOrg.y = ptCenter.y + size.cy/2;
  1309. break;
  1310. }
  1311. case UILIST_VERTLR: {
  1312. ptOrg.x = ptCenter.x - size.cy/2;
  1313. ptOrg.y = prcText->bottom - cxyOrigin;
  1314. break;
  1315. }
  1316. case UILIST_VERTRL: {
  1317. ptOrg.x = ptCenter.x + size.cy/2;
  1318. ptOrg.y = prcText->top + cxyOrigin;
  1319. break;
  1320. }
  1321. }
  1322. SetTextColor( hDC, colPrefix );
  1323. FLExtTextOutW( hDC, ptOrg.x, ptOrg.y, ETO_CLIPPED, prcClip, psz, wcslen(psz), NULL );
  1324. cxyOrigin += size.cx;
  1325. }
  1326. // paint comment
  1327. psz = pCandItem->GetInlineComment();
  1328. if (psz != NULL) {
  1329. HFONT hFontOld = (HFONT)SelectObject( hDC, m_hFontInlineComment );
  1330. FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &sizeComment );
  1331. switch (m_dwStyle & UILIST_DIRMASK) {
  1332. default:
  1333. case UILIST_HORZTB: {
  1334. ptComment.x = (0 <= m_cxInlineCommentPos ? prcText->left + m_cxInlineCommentPos : prcText->right - sizeComment.cx);
  1335. ptComment.y = ptOrg.y + size.cy - sizeComment.cy;
  1336. break;
  1337. }
  1338. case UILIST_HORZBT: {
  1339. ptComment.x = (0 <= m_cxInlineCommentPos ? prcText->right - m_cxInlineCommentPos : prcText->left + sizeComment.cx);
  1340. ptComment.y = ptOrg.y;
  1341. break;
  1342. }
  1343. case UILIST_VERTLR: {
  1344. ptComment.x = ptCenter.x - sizeComment.cy/2;
  1345. ptComment.y = (0 <= m_cxInlineCommentPos ? prcText->bottom - m_cxInlineCommentPos : prcText->top + sizeComment.cx);
  1346. break;
  1347. }
  1348. case UILIST_VERTRL: {
  1349. ptComment.x = ptCenter.x + sizeComment.cy/2;
  1350. ptComment.y = (0 <= m_cxInlineCommentPos ? prcText->top + m_cxInlineCommentPos : prcText->bottom - sizeComment.cx);
  1351. break;
  1352. }
  1353. }
  1354. SetTextColor( hDC, colText );
  1355. FLExtTextOutW( hDC, ptComment.x, ptComment.y, ETO_CLIPPED, prcClip, psz, wcslen(psz), NULL );
  1356. SelectObject( hDC, hFontOld );
  1357. }
  1358. // paint popup comment icon
  1359. psz = pCandItem->GetPopupComment();
  1360. if (psz != NULL) {
  1361. HICON hIconPopup;
  1362. RECT rcIcon;
  1363. size.cx = 16;
  1364. size.cy = 16;
  1365. if (GetLineHeight()-2 < size.cx) {
  1366. size.cx = size.cy = GetLineHeight()-2;
  1367. }
  1368. switch (m_dwStyle & UILIST_DIRMASK) {
  1369. default:
  1370. case UILIST_HORZTB: {
  1371. rcIcon.left = prcText->right - GetLineHeight();
  1372. rcIcon.top = prcText->top;
  1373. rcIcon.right = prcText->right;
  1374. rcIcon.bottom = prcText->top + GetLineHeight();
  1375. break;
  1376. }
  1377. case UILIST_HORZBT: {
  1378. rcIcon.left = prcText->left;
  1379. rcIcon.top = prcText->bottom - GetLineHeight();
  1380. rcIcon.right = prcText->left + GetLineHeight();
  1381. rcIcon.bottom = prcText->bottom;
  1382. break;
  1383. }
  1384. case UILIST_VERTLR: {
  1385. rcIcon.left = prcText->left;
  1386. rcIcon.top = prcText->top;
  1387. rcIcon.right = prcText->left + GetLineHeight();
  1388. rcIcon.bottom = prcText->top + GetLineHeight();
  1389. break;
  1390. }
  1391. case UILIST_VERTRL: {
  1392. rcIcon.left = prcText->right - GetLineHeight();
  1393. rcIcon.top = prcText->bottom - GetLineHeight();
  1394. rcIcon.right = prcText->right;
  1395. rcIcon.bottom = prcText->bottom;
  1396. break;
  1397. }
  1398. }
  1399. ptOrg.x = (rcIcon.left + rcIcon.right - size.cx) / 2;
  1400. ptOrg.y = (rcIcon.top + rcIcon.bottom - size.cx) / 2;
  1401. hIconPopup = pCandItem->IsPopupCommentVisible() ? m_hIconPopupOn : m_hIconPopupOff;
  1402. DrawIconEx( hDC, ptOrg.x, ptOrg.y, hIconPopup, size.cx, size.cy, 0, NULL, DI_NORMAL|DI_COMPAT );
  1403. }
  1404. // restore device context settings
  1405. SetTextColor( hDC, colTextOld );
  1406. SetBkMode( hDC, iBkModeOld );
  1407. }
  1408. /* S E T I T E M H O V E R */
  1409. /*------------------------------------------------------------------------------
  1410. ------------------------------------------------------------------------------*/
  1411. void CUIFCandList::SetItemHover( int iItem )
  1412. {
  1413. if (m_iItemHover != iItem) {
  1414. m_iItemHover = iItem;
  1415. NotifyCommand( UICANDLIST_HOVERITEM, m_iItemHover );
  1416. }
  1417. }
  1418. //
  1419. // CUIFExtCandList
  1420. //
  1421. /* C U I F E X T C A N D L I S T */
  1422. /*------------------------------------------------------------------------------
  1423. Constructor of CUIFExtCandList
  1424. ------------------------------------------------------------------------------*/
  1425. CUIFExtCandList::CUIFExtCandList( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFCandList( pParent, dwID, prc, dwStyle )
  1426. {
  1427. }
  1428. /* ~ C U I F E X T C A N D L I S T */
  1429. /*------------------------------------------------------------------------------
  1430. Destructor of CUIFExtCandList
  1431. ------------------------------------------------------------------------------*/
  1432. CUIFExtCandList::~CUIFExtCandList( void )
  1433. {
  1434. }
  1435. /* O N T I M E R */
  1436. /*------------------------------------------------------------------------------
  1437. (CUIFObject method)
  1438. ------------------------------------------------------------------------------*/
  1439. void CUIFExtCandList::OnTimer( void )
  1440. {
  1441. }
  1442. /* O N L B U T T O N U P */
  1443. /*------------------------------------------------------------------------------
  1444. ------------------------------------------------------------------------------*/
  1445. void CUIFExtCandList::OnLButtonUp( POINT pt )
  1446. {
  1447. ClearSelection( TRUE );
  1448. CUIFCandList::OnLButtonUp( pt );
  1449. }
  1450. /* O N M O U S E M O V E */
  1451. /*------------------------------------------------------------------------------
  1452. (CUIFObject method)
  1453. ------------------------------------------------------------------------------*/
  1454. void CUIFExtCandList::OnMouseMove( POINT pt )
  1455. {
  1456. if (!PtInObject( pt )) {
  1457. ClearSelection( TRUE );
  1458. }
  1459. else {
  1460. CUIFCandList::OnMouseMove( pt );
  1461. }
  1462. }
  1463. /* O N M O U S E O U T */
  1464. /*------------------------------------------------------------------------------
  1465. (CUIFObject method)
  1466. ------------------------------------------------------------------------------*/
  1467. void CUIFExtCandList::OnMouseOut( POINT pt )
  1468. {
  1469. ClearSelection( TRUE );
  1470. CUIFCandList::OnMouseMove( pt );
  1471. }
  1472. /*=============================================================================*/
  1473. /* */
  1474. /* C U I F C A N D R A W D A T A */
  1475. /* */
  1476. /*=============================================================================*/
  1477. /* C U I F C A N D R A W D A T A */
  1478. /*------------------------------------------------------------------------------
  1479. Constructor of CUIFCandRawData
  1480. ------------------------------------------------------------------------------*/
  1481. CUIFCandRawData::CUIFCandRawData( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, dwID, prc, dwStyle )
  1482. {
  1483. m_pwchText = NULL;
  1484. m_hBitmap = NULL;
  1485. m_hEnhMetaFile = NULL;
  1486. m_hBmpCache = NULL;
  1487. }
  1488. /* ~ C U I F C A N D R A W D A T A */
  1489. /*------------------------------------------------------------------------------
  1490. Destructor of CUIFCandRawData
  1491. ------------------------------------------------------------------------------*/
  1492. CUIFCandRawData::~CUIFCandRawData( void )
  1493. {
  1494. ClearData();
  1495. ClearCache();
  1496. }
  1497. /* C L E A R D A T A */
  1498. /*------------------------------------------------------------------------------
  1499. ------------------------------------------------------------------------------*/
  1500. void CUIFCandRawData::ClearData( void )
  1501. {
  1502. if (m_pwchText != NULL) {
  1503. delete m_pwchText;
  1504. m_pwchText = NULL;
  1505. }
  1506. m_hBitmap = NULL;
  1507. m_hEnhMetaFile = NULL;
  1508. }
  1509. /* S E T T E X T */
  1510. /*------------------------------------------------------------------------------
  1511. Set text to display
  1512. ------------------------------------------------------------------------------*/
  1513. void CUIFCandRawData::SetText( LPCWSTR pwchText )
  1514. {
  1515. int cwch;
  1516. if (pwchText == NULL) {
  1517. return;
  1518. }
  1519. ClearData();
  1520. ClearCache();
  1521. cwch = wcslen( pwchText ) + 1;
  1522. m_pwchText = new WCHAR[ cwch ];
  1523. if (m_pwchText)
  1524. {
  1525. memcpy( m_pwchText, pwchText, cwch * sizeof(WCHAR) );
  1526. }
  1527. // update window
  1528. CallOnPaint();
  1529. }
  1530. /* S E T B I T M A P */
  1531. /*------------------------------------------------------------------------------
  1532. ------------------------------------------------------------------------------*/
  1533. void CUIFCandRawData::SetBitmap( HBITMAP hBitmap )
  1534. {
  1535. if (hBitmap == NULL) {
  1536. return;
  1537. }
  1538. ClearData();
  1539. ClearCache();
  1540. m_hBitmap = hBitmap;
  1541. // update window
  1542. CallOnPaint();
  1543. }
  1544. /* S E T M E T A F I L E */
  1545. /*------------------------------------------------------------------------------
  1546. ------------------------------------------------------------------------------*/
  1547. void CUIFCandRawData::SetMetaFile( HENHMETAFILE hEnhMetaFile )
  1548. {
  1549. if (hEnhMetaFile == NULL) {
  1550. return;
  1551. }
  1552. ClearData();
  1553. ClearCache();
  1554. m_hEnhMetaFile = hEnhMetaFile;
  1555. // update window
  1556. CallOnPaint();
  1557. }
  1558. /* G E T T E X T */
  1559. /*------------------------------------------------------------------------------
  1560. Get text
  1561. ------------------------------------------------------------------------------*/
  1562. int CUIFCandRawData::GetText( LPWSTR pwchBuf, int cwchBuf )
  1563. {
  1564. int cwchText = (m_pwchText == NULL) ? 0 : wcslen(m_pwchText);
  1565. if (cwchBuf <= 0) {
  1566. // return text length in cwch (not including null-terminater)
  1567. return cwchText;
  1568. }
  1569. else if (pwchBuf == NULL) {
  1570. // return error code
  1571. return (-1);
  1572. }
  1573. if (0 < cwchText) {
  1574. cwchText = min( cwchText, cwchBuf-1 );
  1575. memcpy( pwchBuf, m_pwchText, cwchText * sizeof(WCHAR) );
  1576. *(pwchBuf + cwchText) = L'\0'; // always null terminate
  1577. }
  1578. return cwchText;
  1579. }
  1580. /* G E T B I T M A P */
  1581. /*------------------------------------------------------------------------------
  1582. ------------------------------------------------------------------------------*/
  1583. HBITMAP CUIFCandRawData::GetBitmap( void )
  1584. {
  1585. return m_hBitmap;
  1586. }
  1587. /* G E T M E T A F I L E */
  1588. /*------------------------------------------------------------------------------
  1589. ------------------------------------------------------------------------------*/
  1590. HENHMETAFILE CUIFCandRawData::GetMetaFile( void )
  1591. {
  1592. return m_hEnhMetaFile;
  1593. }
  1594. /* S E T F O N T */
  1595. /*------------------------------------------------------------------------------
  1596. ------------------------------------------------------------------------------*/
  1597. void CUIFCandRawData::SetFont( HFONT hFont )
  1598. {
  1599. ClearCache();
  1600. CUIFObject::SetFont( hFont );
  1601. }
  1602. /* S E T S T Y L E */
  1603. /*------------------------------------------------------------------------------
  1604. ------------------------------------------------------------------------------*/
  1605. void CUIFCandRawData::SetStyle( DWORD dwStyle )
  1606. {
  1607. ClearCache();
  1608. CUIFObject::SetStyle( dwStyle );
  1609. }
  1610. /* O N P A I N T */
  1611. /*------------------------------------------------------------------------------
  1612. Paint procedure of static object
  1613. ------------------------------------------------------------------------------*/
  1614. void CUIFCandRawData::OnPaint( HDC hDC )
  1615. {
  1616. HDC hDCMem;
  1617. HBITMAP hBmpOld;
  1618. hDCMem = CreateCompatibleDC( hDC );
  1619. if (hDCMem == NULL) {
  1620. return; // nothing we can do
  1621. }
  1622. // crate cached image
  1623. if (m_hBmpCache == NULL) {
  1624. HBITMAP hBmp;
  1625. SIZE size;
  1626. RECT rc;
  1627. // draw horizontal in memory dc
  1628. switch (m_dwStyle) {
  1629. default:
  1630. case UICANDRAWDATA_HORZTB:
  1631. case UICANDRAWDATA_HORZBT: {
  1632. size.cx = GetRectRef().right - GetRectRef().left;
  1633. size.cy = GetRectRef().bottom - GetRectRef().top;
  1634. break;
  1635. }
  1636. case UICANDRAWDATA_VERTLR:
  1637. case UICANDRAWDATA_VERTRL: {
  1638. size.cx = GetRectRef().bottom - GetRectRef().top;
  1639. size.cy = GetRectRef().right - GetRectRef().left;
  1640. break;
  1641. }
  1642. }
  1643. ::SetRect( &rc, 0, 0, size.cx, size.cy );
  1644. // prepare memory dc
  1645. hBmp = CreateCompatibleBitmap( hDC, size.cx, size.cy );
  1646. if (!hBmp)
  1647. return;
  1648. hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmp );
  1649. m_pUIFScheme->FillRect( hDCMem, &rc, UIFCOLOR_WINDOW );
  1650. // draw rawdata image
  1651. if (m_pwchText != NULL) {
  1652. DrawTextProc( hDCMem, &rc );
  1653. }
  1654. else if (m_hBitmap != NULL) {
  1655. DrawBitmapProc( hDCMem, &rc );
  1656. }
  1657. else if (m_hEnhMetaFile != NULL) {
  1658. DrawMetaFileProc( hDCMem, &rc );
  1659. }
  1660. // create bitmap cache
  1661. SelectObject( hDCMem, hBmpOld );
  1662. switch (m_dwStyle) {
  1663. default:
  1664. case UICANDRAWDATA_HORZTB: {
  1665. m_hBmpCache = hBmp;
  1666. break;
  1667. }
  1668. case UICANDRAWDATA_HORZBT: {
  1669. m_hBmpCache = CreateRotateBitmap( hBmp, NULL, CANGLE180 );
  1670. DeleteObject( hBmp );
  1671. break;
  1672. }
  1673. case UICANDRAWDATA_VERTLR: {
  1674. m_hBmpCache = CreateRotateBitmap( hBmp, NULL, CANGLE90 );
  1675. DeleteObject( hBmp );
  1676. break;
  1677. }
  1678. case UICANDRAWDATA_VERTRL: {
  1679. m_hBmpCache = CreateRotateBitmap( hBmp, NULL, CANGLE270 );
  1680. DeleteObject( hBmp );
  1681. break;
  1682. }
  1683. }
  1684. }
  1685. // draw cached image
  1686. if (m_hBmpCache == NULL) {
  1687. DeleteDC( hDCMem );
  1688. return;
  1689. }
  1690. hBmpOld = (HBITMAP)SelectObject( hDCMem, m_hBmpCache );
  1691. BitBlt( hDC, GetRectRef().left, GetRectRef().top, GetRectRef().right - GetRectRef().left, GetRectRef().bottom - GetRectRef().top,
  1692. hDCMem, 0, 0, SRCCOPY );
  1693. SelectObject( hDCMem, hBmpOld );
  1694. DeleteDC( hDCMem );
  1695. }
  1696. /* O N L B U T T O N D O W N */
  1697. /*------------------------------------------------------------------------------
  1698. ------------------------------------------------------------------------------*/
  1699. void CUIFCandRawData::OnLButtonDown( POINT pt )
  1700. {
  1701. StartCapture();
  1702. }
  1703. /* O N L B U T T O N U P */
  1704. /*------------------------------------------------------------------------------
  1705. ------------------------------------------------------------------------------*/
  1706. void CUIFCandRawData::OnLButtonUp( POINT pt )
  1707. {
  1708. if (IsCapture()) {
  1709. EndCapture();
  1710. if (PtInObject( pt )) {
  1711. NotifyCommand( UICANDRAWDATA_CLICKED, 0 );
  1712. }
  1713. }
  1714. }
  1715. /* C L E A R C A C H E */
  1716. /*------------------------------------------------------------------------------
  1717. Claear cached rawdata image
  1718. ------------------------------------------------------------------------------*/
  1719. void CUIFCandRawData::ClearCache( void )
  1720. {
  1721. if (m_hBmpCache != NULL) {
  1722. DeleteObject( m_hBmpCache );
  1723. m_hBmpCache = NULL;
  1724. }
  1725. }
  1726. /* D R A W T E X T P R O C */
  1727. /*------------------------------------------------------------------------------
  1728. Draw text rawdata
  1729. NOTE: Rotation will be done in cached bitmap. Draw horizontal image here.
  1730. ------------------------------------------------------------------------------*/
  1731. void CUIFCandRawData::DrawTextProc( HDC hDC, const RECT *prc )
  1732. {
  1733. HFONT hFontOld;
  1734. int xAlign;
  1735. int yAlign;
  1736. SIZE size;
  1737. int cwch;
  1738. if (m_pwchText == NULL) {
  1739. return;
  1740. }
  1741. cwch = wcslen( m_pwchText );
  1742. // prepare objects
  1743. hFontOld= (HFONT)SelectObject( hDC, GetFont() );
  1744. // calc alignment
  1745. GetTextExtentPointW( hDC, m_pwchText, cwch, &size );
  1746. xAlign = 0;
  1747. yAlign = (prc->bottom - prc->top - size.cy) / 2;
  1748. // draw
  1749. SetBkMode( hDC, TRANSPARENT );
  1750. SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) );
  1751. FLExtTextOutW( hDC,
  1752. prc->left + xAlign,
  1753. prc->top + yAlign,
  1754. ETO_CLIPPED,
  1755. prc,
  1756. m_pwchText,
  1757. cwch,
  1758. NULL );
  1759. // restore objects
  1760. SelectObject( hDC, hFontOld );
  1761. }
  1762. /* D R A W B I T M A P P R O C */
  1763. /*------------------------------------------------------------------------------
  1764. Draw bitmap rawdata
  1765. NOTE: Rotation will be done in cached bitmap. Draw horizontal image here.
  1766. ------------------------------------------------------------------------------*/
  1767. void CUIFCandRawData::DrawBitmapProc( HDC hDC, const RECT *prc )
  1768. {
  1769. HDC hDCBmp;
  1770. HBITMAP hBmpOld;
  1771. BITMAP bmp;
  1772. SIZE sizeSrc;
  1773. SIZE sizeDst;
  1774. int aDen;
  1775. int aNum;
  1776. if (m_hBitmap == NULL) {
  1777. return;
  1778. }
  1779. // get bitmap size
  1780. GetObject( m_hBitmap, sizeof(bmp), &bmp );
  1781. sizeSrc.cx = bmp.bmWidth;
  1782. sizeSrc.cy = bmp.bmHeight;
  1783. if (sizeSrc.cx <= 0 || sizeSrc.cy <= 0) {
  1784. return;
  1785. }
  1786. // calc destination size (keep aspect ratio)
  1787. sizeDst.cx = (prc->right - prc->left);
  1788. sizeDst.cy = (prc->bottom - prc->top);
  1789. if (sizeDst.cx*sizeSrc.cy < sizeDst.cy*sizeSrc.cx) { /* sizeDst.cx/sizeSrc.cx < sizeDst.cy/sizeSrc.cy */
  1790. aDen = sizeSrc.cx;
  1791. aNum = sizeDst.cx;
  1792. }
  1793. else {
  1794. aDen = sizeSrc.cy;
  1795. aNum = sizeDst.cy;
  1796. }
  1797. sizeDst.cx = (sizeSrc.cx * aNum) / aDen;
  1798. sizeDst.cy = (sizeSrc.cy * aNum) / aDen;
  1799. Assert((sizeDst.cx==(prc->right - prc->left)) || (sizeDst.cy==(prc->bottom - prc->top)));
  1800. Assert((sizeDst.cx<=(prc->right - prc->left)) && (sizeDst.cy<=(prc->bottom - prc->top)));
  1801. // draw
  1802. hDCBmp = CreateCompatibleDC( hDC );
  1803. if (hDCBmp)
  1804. {
  1805. hBmpOld = (HBITMAP)SelectObject( hDCBmp, m_hBitmap );
  1806. StretchBlt( hDC, prc->left, prc->top, sizeDst.cx, sizeDst.cy,
  1807. hDCBmp, 0, 0, sizeSrc.cx, sizeSrc.cy, SRCCOPY );
  1808. SelectObject( hDCBmp, hBmpOld );
  1809. DeleteDC( hDCBmp );
  1810. }
  1811. }
  1812. /* D R A W M E T A F I L E P R O C */
  1813. /*------------------------------------------------------------------------------
  1814. Draw metafile rawdata
  1815. NOTE: Rotation will be done in cached bitmap. Draw horizontal image here.
  1816. ------------------------------------------------------------------------------*/
  1817. void CUIFCandRawData::DrawMetaFileProc( HDC hDC, const RECT *prc )
  1818. {
  1819. ENHMETAHEADER emh;
  1820. SIZE sizeSrc;
  1821. SIZE sizeDst;
  1822. int aDen;
  1823. int aNum;
  1824. RECT rcDst;
  1825. if (m_hEnhMetaFile == NULL) {
  1826. return;
  1827. }
  1828. // get bitmap size
  1829. GetEnhMetaFileHeader( m_hEnhMetaFile, sizeof(emh), &emh );
  1830. sizeSrc.cx = (emh.rclFrame.right - emh.rclFrame.left);
  1831. sizeSrc.cy = (emh.rclFrame.bottom - emh.rclFrame.top);
  1832. if (sizeSrc.cx <= 0 || sizeSrc.cy <= 0) {
  1833. return;
  1834. }
  1835. // calc destination size (keep aspect ratio)
  1836. sizeDst.cx = (prc->right - prc->left);
  1837. sizeDst.cy = (prc->bottom - prc->top);
  1838. if (sizeDst.cx*sizeSrc.cy < sizeDst.cy*sizeSrc.cx) { /* sizeDst.cx/sizeSrc.cx < sizeDst.cy/sizeSrc.cy */
  1839. aDen = sizeSrc.cx;
  1840. aNum = sizeDst.cx;
  1841. }
  1842. else {
  1843. aDen = sizeSrc.cy;
  1844. aNum = sizeDst.cy;
  1845. }
  1846. sizeDst.cx = (sizeSrc.cx * aNum) / aDen;
  1847. sizeDst.cy = (sizeSrc.cy * aNum) / aDen;
  1848. Assert((sizeDst.cx==(prc->right - prc->left)) || (sizeDst.cy==(prc->bottom - prc->top)));
  1849. Assert((sizeDst.cx<=(prc->right - prc->left)) && (sizeDst.cy<=(prc->bottom - prc->top)));
  1850. // draw
  1851. rcDst.left = prc->left;
  1852. rcDst.top = prc->top;
  1853. rcDst.right = rcDst.left + sizeDst.cx;
  1854. rcDst.bottom = rcDst.top + sizeDst.cy;
  1855. PlayEnhMetaFile( hDC, m_hEnhMetaFile, &rcDst );
  1856. }
  1857. /*=============================================================================*/
  1858. /* */
  1859. /* C U I F C A N D B O R D E R */
  1860. /* */
  1861. /*=============================================================================*/
  1862. /* C U I F C A N D B O R D E R */
  1863. /*------------------------------------------------------------------------------
  1864. Constructor of CUIFCandBorder
  1865. ------------------------------------------------------------------------------*/
  1866. CUIFCandBorder::CUIFCandBorder( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFBorder( pParent, dwID, prc, dwStyle )
  1867. {
  1868. }
  1869. /* ~ C U I F C A N D B O R D E R */
  1870. /*------------------------------------------------------------------------------
  1871. Destructor of CUIFCandBorder
  1872. ------------------------------------------------------------------------------*/
  1873. CUIFCandBorder::~CUIFCandBorder( void )
  1874. {
  1875. }
  1876. /* O N P A I N T */
  1877. /*------------------------------------------------------------------------------
  1878. Paint procedure of border object
  1879. ------------------------------------------------------------------------------*/
  1880. void CUIFCandBorder::OnPaint( HDC hDC )
  1881. {
  1882. RECT rc = GetRectRef();
  1883. switch (m_dwStyle & UIBORDER_DIRMASK) {
  1884. default:
  1885. case UIBORDER_HORZ: {
  1886. if (rc.top == rc.bottom) {
  1887. break;
  1888. }
  1889. rc.top = (rc.top + rc.bottom) / 2;
  1890. rc.bottom = rc.top + 1;
  1891. GetUIFScheme()->FillRect( hDC, &rc, UIFCOLOR_SPLITTERLINE );
  1892. break;
  1893. }
  1894. case UIBORDER_VERT: {
  1895. if (rc.left == rc.right) {
  1896. break;
  1897. }
  1898. rc.left = (rc.right + rc.left) / 2;
  1899. rc.right = rc.left + 1;
  1900. GetUIFScheme()->FillRect( hDC, &rc, UIFCOLOR_SPLITTERLINE );
  1901. break;
  1902. }
  1903. }
  1904. }
  1905. /*============================================================================*/
  1906. /* */
  1907. /* C U I F C A N D M E N U B U T T O N */
  1908. /* */
  1909. /*============================================================================*/
  1910. /* C U I F C A N D M E N U B U T T O N */
  1911. /*------------------------------------------------------------------------------
  1912. ------------------------------------------------------------------------------*/
  1913. CUIFCandMenuButton::CUIFCandMenuButton( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFButton2( pParent, dwID, prc, dwStyle )
  1914. {
  1915. }
  1916. /* ~ C U I F C A N D M E N U B U T T O N */
  1917. /*------------------------------------------------------------------------------
  1918. ------------------------------------------------------------------------------*/
  1919. CUIFCandMenuButton::~CUIFCandMenuButton( void )
  1920. {
  1921. }
  1922. /* G E T A C C N A M E */
  1923. /*------------------------------------------------------------------------------
  1924. Get acc item name
  1925. (CCandAccItem method)
  1926. ------------------------------------------------------------------------------*/
  1927. BSTR CUIFCandMenuButton::GetAccName( void )
  1928. {
  1929. return (GetToolTip() != NULL) ? SysAllocString( GetToolTip() ) : NULL;
  1930. }
  1931. /* G E T A C C V A L U E */
  1932. /*------------------------------------------------------------------------------
  1933. Get acc value
  1934. ------------------------------------------------------------------------------*/
  1935. BSTR CUIFCandMenuButton::GetAccValue( void )
  1936. {
  1937. return SysAllocString( L"" );
  1938. }
  1939. /* G E T A C C R O L E */
  1940. /*------------------------------------------------------------------------------
  1941. Get acc item role
  1942. (CCandAccItem method)
  1943. ------------------------------------------------------------------------------*/
  1944. LONG CUIFCandMenuButton::GetAccRole( void )
  1945. {
  1946. return ROLE_SYSTEM_PUSHBUTTON;
  1947. }
  1948. /* G E T A C C S T A T E */
  1949. /*------------------------------------------------------------------------------
  1950. Get acc item state
  1951. (CCandAccItem method)
  1952. ------------------------------------------------------------------------------*/
  1953. LONG CUIFCandMenuButton::GetAccState( void )
  1954. {
  1955. return (m_dwStatus == UIBUTTON_DOWN) ? STATE_SYSTEM_PRESSED : 0;
  1956. }
  1957. /* G E T A C C L O C A T I O N */
  1958. /*------------------------------------------------------------------------------
  1959. Get acc location
  1960. (CCandAccItem method)
  1961. ------------------------------------------------------------------------------*/
  1962. void CUIFCandMenuButton::GetAccLocation( RECT *prc )
  1963. {
  1964. GetRect( prc );
  1965. }
  1966. /* S E T S T A T U S */
  1967. /*------------------------------------------------------------------------------
  1968. ------------------------------------------------------------------------------*/
  1969. void CUIFCandMenuButton::SetStatus( DWORD dwStatus )
  1970. {
  1971. CUIFButton2::SetStatus( dwStatus );
  1972. NotifyWinEvent( EVENT_OBJECT_STATECHANGE );
  1973. }