// // cuicand.cpp - ui frame object for candidate UI // #include "private.h" #include "cuilib.h" #include "cuicand.h" #include "candutil.h" #include "wcand.h" // // // /*=============================================================================*/ /* */ /* C U I F S M A R T S C R O L L B U T T O N */ /* */ /*=============================================================================*/ // // CUIFSmartScrollButton // /* C U I F S M A R T S C R O L L B U T T O N */ /*------------------------------------------------------------------------------ Constructor of CUIFSmartScrollButton ------------------------------------------------------------------------------*/ CUIFSmartScrollButton::CUIFSmartScrollButton( CUIFScroll *pUIScroll, const RECT *prc, DWORD dwStyle ) : CUIFScrollButton( pUIScroll, prc, dwStyle ) { SetActiveTheme(L"scrollbar", SBP_ARROWBTN); } /* ~ C U I F S M A R T S C R O L L B U T T O N */ /*------------------------------------------------------------------------------ Destructor of CUIFSmartScrollButton ------------------------------------------------------------------------------*/ CUIFSmartScrollButton::~CUIFSmartScrollButton( void ) { } /* O N P A I N T N O T H E M E */ /*------------------------------------------------------------------------------ Paint procedure of smart scoll button object (default) ------------------------------------------------------------------------------*/ void CUIFSmartScrollButton::OnPaintNoTheme( HDC hDC ) { UINT uState = 0; switch (m_dwStyle & UISCROLLBUTTON_DIRMASK) { case UISCROLLBUTTON_LEFT: { uState = DFCS_SCROLLLEFT; break; } case UISCROLLBUTTON_UP: { uState = DFCS_SCROLLUP; break; } case UISCROLLBUTTON_RIGHT: { uState = DFCS_SCROLLRIGHT; break; } case UISCROLLBUTTON_DOWN: { uState = DFCS_SCROLLDOWN; break; } } // uState |= ((m_dwStatus == UIBUTTON_DOWN) ? DFCS_PUSHED | DFCS_FLAT : 0); uState |= ((!IsEnabled()) ? DFCS_INACTIVE : 0); RECT rc = GetRectRef(); DrawFrameControl( hDC, &rc, DFC_SCROLL, uState | DFCS_FLAT ); DrawEdge( hDC, &rc, (m_dwStatus == UIBUTTON_DOWN) ? BDR_SUNKENINNER : BDR_RAISEDINNER, BF_RECT ); } /* O N P A I N T T H E M E */ /*------------------------------------------------------------------------------ Paint procedure of smart scoll button object (Whistler) ------------------------------------------------------------------------------*/ BOOL CUIFSmartScrollButton::OnPaintTheme( HDC hDC ) { BOOL fRet = FALSE; if (!IsThemeActive()) { return FALSE; } if (SUCCEEDED(EnsureThemeData( GetUIWnd()->GetWnd()))) { int iStateID; switch (m_dwStyle & UISCROLLBUTTON_DIRMASK) { case UISCROLLBUTTON_LEFT: { iStateID = ABS_LEFTNORMAL; break; } case UISCROLLBUTTON_UP: { iStateID = ABS_UPNORMAL; break; } case UISCROLLBUTTON_RIGHT: { iStateID = ABS_RIGHTNORMAL; break; } case UISCROLLBUTTON_DOWN: { iStateID = ABS_DOWNNORMAL; break; } } if (!IsEnabled()) { iStateID += 3; } else if (m_dwStatus == UIBUTTON_DOWN) { iStateID += 2; } // else if (m_dwStatus != UIBUTTON_NORMAL) { // iStateID += 1; // } fRet = SUCCEEDED(DrawThemeBackground(hDC, iStateID, &GetRectRef(), 0)); } return fRet; } /*=============================================================================*/ /* */ /* C U I F S M A R T S C R O L L T H U M B */ /* */ /*=============================================================================*/ // // CUIFSmartScrollThumb // /* C U I F S M A R T S C R O L L T H U M B */ /*------------------------------------------------------------------------------ Constructor of CUIFSmartScrollThumb ------------------------------------------------------------------------------*/ CUIFSmartScrollThumb::CUIFSmartScrollThumb( CUIFScroll *pUIScroll, const RECT *prc, DWORD dwStyle ) : CUIFScrollThumb( pUIScroll, prc, dwStyle ) { m_fMouseIn = FALSE; SetActiveTheme(L"scrollbar"); } /* ~ C U I F S M A R T S C R O L L T H U M B */ /*------------------------------------------------------------------------------ Destructor of CUIFSmartScrollThumb ------------------------------------------------------------------------------*/ CUIFSmartScrollThumb::~CUIFSmartScrollThumb( void ) { } /* O N M O U S E I N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFSmartScrollThumb::OnMouseIn( POINT pt ) { m_fMouseIn = TRUE; CallOnPaint(); CUIFScrollThumb::OnMouseIn( pt ); } /* O N M O U S E O U T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFSmartScrollThumb::OnMouseOut( POINT pt ) { m_fMouseIn = FALSE; CallOnPaint(); CUIFScrollThumb::OnMouseOut( pt ); } /* O N P A I N T */ /*------------------------------------------------------------------------------ Paint procedure of smart scoll thumb object ------------------------------------------------------------------------------*/ void CUIFSmartScrollThumb::OnPaint( HDC hDC ) { if (!IsEnabled()) { return; } CUIFObject::OnPaint( hDC ); } /* O N P A I N T D E F A U L T */ /*------------------------------------------------------------------------------ Paint procedure of smart scoll thumb object (default) ------------------------------------------------------------------------------*/ void CUIFSmartScrollThumb::OnPaintNoTheme( HDC hDC ) { RECT rc = GetRectRef(); FillRect( hDC, &rc, (HBRUSH)(COLOR_3DFACE + 1) ); DrawEdge( hDC, &rc, BDR_RAISEDINNER, BF_RECT ); } /* O N P A I N T W H I S T L E R */ /*------------------------------------------------------------------------------ Paint procedure of smart scoll thumb object (Whistler) ------------------------------------------------------------------------------*/ BOOL CUIFSmartScrollThumb::OnPaintTheme( HDC hDC ) { BOOL fRet = FALSE; if (!IsThemeActive()) { return FALSE; } if (SUCCEEDED(EnsureThemeData( GetUIWnd()->GetWnd()))) { int iStateID; RECT rcContent; SIZE sizeGrip; RECT rcGrip; // iStateID = IsCapture() ? SCRBS_PRESSED : m_fMouseIn ? SCRBS_HOT : SCRBS_NORMAL; iStateID = IsCapture() ? SCRBS_PRESSED : m_fMouseIn ? SCRBS_NORMAL : SCRBS_NORMAL; // draw thumb SetDefThemePartID(((m_dwStyle & UISMARTSCROLLTHUMB_HORZ) != 0) ? SBP_THUMBBTNHORZ : SBP_THUMBBTNVERT); fRet = SUCCEEDED(DrawThemeBackground(hDC, iStateID, &GetRectRef(), 0)); // draw gripper GetThemeBackgroundContentRect( hDC, iStateID, &GetRectRef(), &rcContent ); SetDefThemePartID(((m_dwStyle & UISMARTSCROLLTHUMB_HORZ) != 0) ? SBP_GRIPPERHORZ : SBP_GRIPPERVERT); GetThemePartSize( hDC, iStateID, NULL, TS_TRUE, &sizeGrip ); sizeGrip.cx = min( sizeGrip.cx, rcContent.right - rcContent.left); sizeGrip.cy = min( sizeGrip.cy, rcContent.bottom - rcContent.top); rcGrip.left = ((rcContent.left + rcContent.right) - sizeGrip.cx) / 2; rcGrip.top = ((rcContent.top + rcContent.bottom) - sizeGrip.cy) / 2; rcGrip.right = rcGrip.left + sizeGrip.cx; rcGrip.bottom = rcGrip.top + sizeGrip.cy; fRet &= SUCCEEDED(DrawThemeBackground( hDC, iStateID, &rcGrip, 0 )); } return fRet; } /*=============================================================================*/ /* */ /* C U I F S M A R T S C R O L L */ /* */ /*=============================================================================*/ // // CUIFSmartScroll // /* C U I F S M A R T S C R O L L */ /*------------------------------------------------------------------------------ Constructor of CUIFSmartScroll ------------------------------------------------------------------------------*/ CUIFSmartScroll::CUIFSmartScroll( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFScroll( pParent, dwID, prc, dwStyle ) { SetActiveTheme(L"scrollbar"); } /* ~ C U I F S M A R T S C R O L L */ /*------------------------------------------------------------------------------ Destructor of CUIFSmartScroll ------------------------------------------------------------------------------*/ CUIFSmartScroll::~CUIFSmartScroll( void ) { } /* I N I T I A L I Z E */ /*------------------------------------------------------------------------------ Initialize CUIFSmartScroll object ------------------------------------------------------------------------------*/ CUIFObject *CUIFSmartScroll::Initialize( void ) { RECT rc; DWORD dwThumbStyle; switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: case UISCROLL_VERTBT: { dwThumbStyle = UISMARTSCROLLTHUMB_VERT; break; } case UISCROLL_HORZLR: case UISCROLL_HORZRL: { dwThumbStyle = UISMARTSCROLLTHUMB_HORZ; break; } } GetBtnUpRect( &rc ); m_pBtnUp = new CUIFSmartScrollButton( this, &rc, GetScrollUpBtnStyle() ); m_pBtnUp->Initialize(); AddUIObj( m_pBtnUp ); GetBtnDnRect( &rc ); m_pBtnDn = new CUIFSmartScrollButton( this, &rc, GetScrollDnBtnStyle() ); m_pBtnDn->Initialize(); AddUIObj( m_pBtnDn ); GetThumbRect( &rc ); m_pThumb = new CUIFSmartScrollThumb( this, &rc, GetScrollThumbStyle() | dwThumbStyle ); m_pThumb->Initialize(); AddUIObj( m_pThumb ); return CUIFObject::Initialize(); } /* S E T S T Y L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFSmartScroll::SetStyle( DWORD dwStyle ) { CUIFScroll::SetStyle( dwStyle ); DWORD dwThumbStyle; switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: case UISCROLL_VERTBT: { dwThumbStyle = UISMARTSCROLLTHUMB_VERT; break; } case UISCROLL_HORZLR: case UISCROLL_HORZRL: { dwThumbStyle = UISMARTSCROLLTHUMB_HORZ; break; } } m_pThumb->SetStyle( GetScrollThumbStyle() | dwThumbStyle ); } /* O N P A I N T D E F A U L T */ /*------------------------------------------------------------------------------ Paint procedure of scroll object (default) ------------------------------------------------------------------------------*/ void CUIFSmartScroll::OnPaintNoTheme( HDC hDC ) { HBRUSH hBrush; // paint scroll bar back hBrush = (HBRUSH)DefWindowProc( m_pUIWnd->GetWnd(), WM_CTLCOLORSCROLLBAR, (WPARAM)hDC, (LPARAM)m_pUIWnd->GetWnd() ); if (hBrush == NULL) { // never happen? just in case... hBrush = GetSysColorBrush(COLOR_SCROLLBAR); } FillRect( hDC, &GetRectRef(), hBrush ); DeleteObject( hBrush ); // paint scroll area if (m_fScrollPage) { RECT rc; switch (m_dwScrollDir) { case UISCROLL_PAGEUP: { GetPageUpArea( &rc ); break; } case UISCROLL_PAGEDOWN: { GetPageDnArea( &rc ); break; } } InvertRect( hDC, &rc ); } } /* O N P A I N T W H I S T L E R */ /*------------------------------------------------------------------------------ Paint procedure of scroll object (Whistler) ------------------------------------------------------------------------------*/ BOOL CUIFSmartScroll::OnPaintTheme( HDC hDC ) { BOOL fRet = FALSE; if (!IsThemeActive()) { return FALSE; } if (SUCCEEDED(EnsureThemeData( GetUIWnd()->GetWnd()))) { int iStateID; RECT rc; switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { SetDefThemePartID(SBP_UPPERTRACKVERT); break; } case UISCROLL_VERTBT: { SetDefThemePartID(SBP_LOWERTRACKHORZ); break; } case UISCROLL_HORZLR: { SetDefThemePartID(SBP_UPPERTRACKHORZ); break; } case UISCROLL_HORZRL: { SetDefThemePartID(SBP_LOWERTRACKHORZ); break; } } iStateID = (m_fScrollPage && (m_dwScrollDir == UISCROLL_PAGEUP)) ? SCRBS_PRESSED : SCRBS_NORMAL; GetPageUpArea( &rc ); fRet = SUCCEEDED(DrawThemeBackground( hDC, iStateID, &rc, 0 )); switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { SetDefThemePartID(SBP_LOWERTRACKHORZ); break; } case UISCROLL_VERTBT: { SetDefThemePartID(SBP_UPPERTRACKVERT); break; } case UISCROLL_HORZLR: { SetDefThemePartID(SBP_LOWERTRACKHORZ); break; } case UISCROLL_HORZRL: { SetDefThemePartID(SBP_UPPERTRACKHORZ); break; } } iStateID = (m_fScrollPage && (m_dwScrollDir == UISCROLL_PAGEDOWN)) ? 3/* PRESSED */ : 1/* NORMAL */; GetPageDnArea( &rc ); fRet = SUCCEEDED(DrawThemeBackground( hDC, iStateID, &rc, 0 )); } return fRet; } /*============================================================================*/ /* */ /* C C A N D L I S T A C C I T E M */ /* */ /*============================================================================*/ /* C C A N D L I S T A C C I T E M */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandListAccItem::CCandListAccItem( CUIFCandListBase *pListUIObj, int iLine ) { m_pListUIObj = pListUIObj; m_iLine = iLine; } /* ~ C C A N D L I S T A C C I T E M */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandListAccItem::~CCandListAccItem( void ) { } /* G E T A C C N A M E */ /*------------------------------------------------------------------------------ Get acc item name (CCandAccItem method) ------------------------------------------------------------------------------*/ BSTR CCandListAccItem::GetAccName( void ) { return m_pListUIObj->GetAccNameProc( m_iLine ); } /* G E T A C C V A L U E */ /*------------------------------------------------------------------------------ Get acc value ------------------------------------------------------------------------------*/ BSTR CCandListAccItem::GetAccValue( void ) { return m_pListUIObj->GetAccValueProc( m_iLine ); } /* G E T A C C R O L E */ /*------------------------------------------------------------------------------ Get acc item role (CCandAccItem method) ------------------------------------------------------------------------------*/ LONG CCandListAccItem::GetAccRole( void ) { return m_pListUIObj->GetAccRoleProc( m_iLine ); } /* G E T A C C S T A T E */ /*------------------------------------------------------------------------------ Get acc item state (CCandAccItem method) ------------------------------------------------------------------------------*/ LONG CCandListAccItem::GetAccState( void ) { return m_pListUIObj->GetAccStateProc( m_iLine ); } /* G E T A C C L O C A T I O N */ /*------------------------------------------------------------------------------ Get acc location (CCandAccItem method) ------------------------------------------------------------------------------*/ void CCandListAccItem::GetAccLocation( RECT *prc ) { m_pListUIObj->GetAccLocationProc( m_iLine, prc ); } /* O N S E L E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandListAccItem::OnSelect( void ) { NotifyWinEvent( EVENT_OBJECT_SELECTION ); } /*=============================================================================*/ /* */ /* C U I F C A N D L I S T */ /* */ /*=============================================================================*/ // // CUIFCandListBase // /* C U I F C A N D L I S T B A S E */ /*------------------------------------------------------------------------------ Constructor of CUIFCandListBase ------------------------------------------------------------------------------*/ CUIFCandListBase::CUIFCandListBase( void ) { int i; m_hFontInlineComment = (HFONT)GetStockObject( DEFAULT_GUI_FONT ); for (i = 0; i < CANDLISTACCITEM_MAX; i++) { m_rgListAccItem[i] = NULL; } } /* ~ C U I F C A N D L I S T B A S E */ /*------------------------------------------------------------------------------ Destructor of CUIFCandListBase ------------------------------------------------------------------------------*/ CUIFCandListBase::~CUIFCandListBase( void ) { int i; for (i = 0; i < CANDLISTACCITEM_MAX; i++) { if (m_rgListAccItem[i] != NULL) { delete m_rgListAccItem[i]; } } } /* G E T C A N D I D A T E I T E M */ /*------------------------------------------------------------------------------ Get candidate item of candidate list item ------------------------------------------------------------------------------*/ CCandidateItem *CUIFCandListBase::GetCandidateItem( int iItem ) { CCandListItem *pListItem = GetCandItem( iItem ); return (pListItem != NULL) ? pListItem->GetCandidateItem() : NULL; } /* S E T I C O N P O P U P C O M M E N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandListBase::SetIconPopupComment( HICON hIconOn, HICON hIconOff ) { m_hIconPopupOn = hIconOn; m_hIconPopupOff = hIconOff; } /* I N I T A C C I T E M S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandListBase::InitAccItems( CCandAccessible *pCandAcc ) { int i; for (i = 0; i < CANDLISTACCITEM_MAX; i++) { m_rgListAccItem[i] = new CCandListAccItem( this, i ); pCandAcc->AddAccItem( m_rgListAccItem[i] ); } } /* G E T L I S T A C C I T E M */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandListAccItem *CUIFCandListBase::GetListAccItem( int i ) { if (0 <= i && i < CANDLISTACCITEM_MAX) { return m_rgListAccItem[i]; } return NULL; } // // CUIFCandList // /* C U I F C A N D L I S T */ /*------------------------------------------------------------------------------ Constructor of CUIFCandList ------------------------------------------------------------------------------*/ CUIFCandList::CUIFCandList( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFListBase( pParent, dwID, prc, dwStyle ) { m_iIndexStart = 1; m_nExtTopSpace = 0; m_nExtBottomSpace = 0; m_cxInlineCommentPos = -1; m_iItemHover = -1; } /* ~ C U I F C A N D L I S T */ /*------------------------------------------------------------------------------ Destructor of CUIFCandList ------------------------------------------------------------------------------*/ CUIFCandList::~CUIFCandList( void ) { } /* A D D C A N D I T E M */ /*------------------------------------------------------------------------------ Add new candidate item (CUIFCandListBase method) Returns index of candidate item added ------------------------------------------------------------------------------*/ int CUIFCandList::AddCandItem( CCandListItem *pCandListItem ) { return AddItem( pCandListItem ); } /* G E T I T E M C O U N T */ /*------------------------------------------------------------------------------ Returns number of candidate item (CUIFCandListBase method) ------------------------------------------------------------------------------*/ int CUIFCandList::GetItemCount( void ) { return GetCount(); } /* I S I T E M S E L E C T A B L E */ /*------------------------------------------------------------------------------ Returns TRUE, if candidate item with given index could be selected. Otherwise, returns FALSE. (CUIFCandListBase method) ------------------------------------------------------------------------------*/ BOOL CUIFCandList::IsItemSelectable( int iListItem ) { int iListItemMax = GetItemCount(); return (0 <= iListItem) && (iListItem < iListItemMax); } /* G E T C A N D I T E M */ /*------------------------------------------------------------------------------ Get candidate item (CUIFCandListBase method) ------------------------------------------------------------------------------*/ CCandListItem* CUIFCandList::GetCandItem( int iItem ) { return (CCandListItem*)GetItem( iItem ); } /* D E L A L L C A N D I T E M */ /*------------------------------------------------------------------------------ Delete all candidate items (CUIFCandListBase method) ------------------------------------------------------------------------------*/ void CUIFCandList::DelAllCandItem( void ) { DelAllItem(); } /* S E T C U R S E L */ /*------------------------------------------------------------------------------ Set current selection (CUIFCandListBase method) ------------------------------------------------------------------------------*/ void CUIFCandList::SetCurSel( int iSelection ) { CCandListAccItem *pAccItem; SetSelection( iSelection, TRUE ); // pAccItem = GetListAccItem( GetSelection() - GetTopItem() ); if (pAccItem != NULL) { pAccItem ->OnSelect(); } } /* G E T C U R S E L */ /*------------------------------------------------------------------------------ Get current selection (CUIFCandListBase method) ------------------------------------------------------------------------------*/ int CUIFCandList::GetCurSel( void ) { return GetSelection(); } /* G E T T O P I T E M */ /*------------------------------------------------------------------------------ Get item displayed at the top of list (CUIFCandListBase method) ------------------------------------------------------------------------------*/ int CUIFCandList::GetTopItem( void ) { return GetTop(); } /* G E T B O T T O M I T E M */ /*------------------------------------------------------------------------------ Get item displayed at the bottom of list (CUIFCandListBase method) ------------------------------------------------------------------------------*/ int CUIFCandList::GetBottomItem( void ) { return GetBottom(); } /* I S V I S I B L E */ /*------------------------------------------------------------------------------ Get visible status of object (CUIFCandListBase method) ------------------------------------------------------------------------------*/ BOOL CUIFCandList::IsVisible( void ) { return CUIFListBase::IsVisible(); } /* G E T R E C T */ /*------------------------------------------------------------------------------ Get rect of object (CUIFCandListBase method) ------------------------------------------------------------------------------*/ void CUIFCandList::GetRect( RECT *prc ) { CUIFListBase::GetRect( prc ); } /* G E T I T E M R E C T */ /*------------------------------------------------------------------------------ Get item rect (CUIFCandListBase method) ------------------------------------------------------------------------------*/ void CUIFCandList::GetItemRect( int iItem, RECT *prc ) { Assert( prc != NULL ); ::SetRect( prc, 0, 0, 0, 0 ); if (GetTopItem() <= iItem && iItem <= GetBottomItem()) { GetLineRect( iItem - GetTopItem(), prc ); } } /* S E T I N L I N E C O M M E N T P O S */ /*------------------------------------------------------------------------------ Set (horizontal) position to draw inline comment NOTE: if cx has negative value, inline comment will be aligned to right. (CUIFCandListBase method) ------------------------------------------------------------------------------*/ void CUIFCandList::SetInlineCommentPos( int cx ) { m_cxInlineCommentPos = cx; } /* S E T I N L I N E C O M M E N T F O N T */ /*------------------------------------------------------------------------------ Set font for inline comment (CUIFCandListBase method) ------------------------------------------------------------------------------*/ void CUIFCandList::SetInlineCommentFont( HFONT hFont ) { if (hFont == NULL) { hFont = (HFONT)GetStockObject( DEFAULT_GUI_FONT ); } m_hFontInlineComment = hFont; CallOnPaint(); } /* S E T I N D E X F O N T */ /*------------------------------------------------------------------------------ Set font for index (CUIFCandListBase method) ------------------------------------------------------------------------------*/ void CUIFCandList::SetIndexFont( HFONT hFont ) { if (hFont == NULL) { hFont = (HFONT)GetStockObject( DEFAULT_GUI_FONT ); } m_hFontIndex = hFont; CallOnPaint(); } /* S E T C A N D L I S T */ /*------------------------------------------------------------------------------ Set candidate list ------------------------------------------------------------------------------*/ void CUIFCandList::SetCandList( CCandidateList *pCandList ) { int nCandItem; int i; CCandidateItem *pCandItem; ASSERT( pCandList ); nCandItem = pCandList->GetItemCount(); for (i = 0; i < nCandItem; i++) { pCandItem = pCandList->GetCandidateItem( i ); if (pCandItem->IsVisible()) { CCandListItem *pCandListItem = new CCandListItem( GetItemCount(), i, pCandItem ); AddCandItem( pCandListItem ); } } } /* G E T A C C N A M E P R O C */ /*------------------------------------------------------------------------------ Get acc item name ------------------------------------------------------------------------------*/ BSTR CUIFCandList::GetAccNameProc( int iItem ) { CCandidateItem *pCandItem; int iListItem = GetTopItem() + iItem; pCandItem = GetCandidateItem( iListItem ); return (pCandItem != NULL) ? SysAllocString( pCandItem->GetString() ) : NULL; } /* G E T A C C V A L U E P R O C */ /*------------------------------------------------------------------------------ Get acc value ------------------------------------------------------------------------------*/ BSTR CUIFCandList::GetAccValueProc( int iItem ) { CCandidateItem *pCandItem; int iListItem = GetTopItem() + iItem; pCandItem = GetCandidateItem( iListItem ); return (pCandItem != NULL) ? SysAllocString( pCandItem->GetString() ) : NULL; } /* G E T A C C R O L E P R O C */ /*------------------------------------------------------------------------------ Get acc item role ------------------------------------------------------------------------------*/ LONG CUIFCandList::GetAccRoleProc( int iItem ) { return ROLE_SYSTEM_LISTITEM; } /* G E T A C C S T A T E P R O C */ /*------------------------------------------------------------------------------ Get acc item state (CCandAccItem method) ------------------------------------------------------------------------------*/ LONG CUIFCandList::GetAccStateProc( int iItem ) { int iCurSel = GetCurSel(); int iTopItem = GetTopItem(); int iItemMax = GetItemCount(); if (iTopItem + iItem == iCurSel) { return STATE_SYSTEM_SELECTED; } else if (iTopItem + iItem < iItemMax) { return STATE_SYSTEM_SELECTABLE; } else { return STATE_SYSTEM_UNAVAILABLE; } } /* G E T A C C L O C A T I O N P R O C */ /*------------------------------------------------------------------------------ Get acc location ------------------------------------------------------------------------------*/ void CUIFCandList::GetAccLocationProc( int iItem, RECT *prc ) { GetLineRect( iItem, prc ); } /* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::OnLButtonDown( POINT pt ) { SetItemHover( -1 ); CUIFListBase::OnLButtonDown( pt ); } /* O N L B U T T O N U P */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::OnLButtonUp( POINT pt ) { SetItemHover( ListItemFromPoint( pt ) ); CUIFListBase::OnLButtonUp( pt ); } /* O N M O U S E M O V E */ /*------------------------------------------------------------------------------ (CUIFObject method) ------------------------------------------------------------------------------*/ void CUIFCandList::OnMouseMove( POINT pt ) { if (!IsCapture()) { SetItemHover( ListItemFromPoint( pt ) ); } CUIFListBase::OnMouseMove( pt ); } /* O N M O U S E I N */ /*------------------------------------------------------------------------------ (CUIFObject method) ------------------------------------------------------------------------------*/ void CUIFCandList::OnMouseIn( POINT pt ) { if (!IsCapture()) { SetItemHover( ListItemFromPoint( pt ) ); } CUIFListBase::OnMouseMove( pt ); } /* O N M O U S E O U T */ /*------------------------------------------------------------------------------ (CUIFObject method) ------------------------------------------------------------------------------*/ void CUIFCandList::OnMouseOut( POINT pt ) { if (!IsCapture()) { SetItemHover( -1 ); } CUIFListBase::OnMouseMove( pt ); } /* S E T S T A R T I N D E X */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::SetStartIndex( int iIndexStart ) { m_iIndexStart = iIndexStart; } /* S E T E X T R A T O P S P A C E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::SetExtraTopSpace( int nSpace ) { RECT rcScroll; m_nExtTopSpace = nSpace; GetScrollBarRect( &rcScroll ); m_pUIScroll->SetRect( &rcScroll ); } /* S E T E X T R A B O T T O M S P A C E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::SetExtraBottomSpace( int nSpace ) { RECT rcScroll; m_nExtBottomSpace = nSpace; GetScrollBarRect( &rcScroll ); m_pUIScroll->SetRect( &rcScroll ); } /* G E T E X T R A T O P S P A C E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ int CUIFCandList::GetExtraTopSpace( void ) { return m_nExtTopSpace; } /* G E T E X T R A B O T T O M S P A C E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ int CUIFCandList::GetExtraBottomSpace( void ) { return m_nExtBottomSpace; } /* G E T L I N E R E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::GetLineRect( int iLine, RECT *prc ) { CUIFListBase::GetLineRect( iLine, prc ); // exclude a space about scrollbar when it has space at top/bottom of scrollbar if ((m_nExtBottomSpace != 0) || (m_nExtTopSpace != 0)) { switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: case UILIST_HORZBT: { prc->right = GetRectRef().right - GetSystemMetrics(SM_CXVSCROLL); break; } case UILIST_VERTLR: case UILIST_VERTRL: { prc->top = GetRectRef().top; prc->bottom = GetRectRef().bottom - GetSystemMetrics(SM_CYHSCROLL); break; } } } } /* G E T S C R O L L B A R R E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::GetScrollBarRect( RECT *prc ) { switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: case UILIST_HORZBT: { prc->left = GetRectRef().right - GetSystemMetrics(SM_CXVSCROLL); prc->top = GetRectRef().top + m_nExtTopSpace; prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom - m_nExtBottomSpace; break; } case UILIST_VERTLR: case UILIST_VERTRL: { prc->left = GetRectRef().left + m_nExtBottomSpace; prc->top = GetRectRef().bottom - GetSystemMetrics(SM_CYHSCROLL); prc->right = GetRectRef().right - m_nExtTopSpace; prc->bottom = GetRectRef().bottom; break; } } } /* G E T S C R O L L B A R S T Y L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ DWORD CUIFCandList::GetScrollBarStyle( void ) { DWORD dwScrollStyle; switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { dwScrollStyle = UISCROLL_VERTTB; break; } case UILIST_HORZBT: { dwScrollStyle = UISCROLL_VERTBT; break; } case UILIST_VERTLR: { dwScrollStyle = UISCROLL_HORZLR; break; } case UILIST_VERTRL: { dwScrollStyle = UISCROLL_HORZRL; break; } } return dwScrollStyle; } /* C R E A T E S C R O L L B A R O B J */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CUIFScroll *CUIFCandList::CreateScrollBarObj( CUIFObject *pParent, DWORD dwID, RECT *prc, DWORD dwStyle ) { return new CUIFSmartScroll( pParent, dwID, prc, dwStyle ); } /* O N P A I N T */ /*------------------------------------------------------------------------------ Paint procedure of candidate list ------------------------------------------------------------------------------*/ void CUIFCandList::OnPaint( HDC hDC ) { HDC hDCMem; HBITMAP hBmpMem; HBITMAP hBmpOld; SIZE size; RECT rc; int iLine; HFONT hFontOld; RECT rcBorder; // prepare memory dc rc = GetRectRef(); size.cx = rc.right - rc.left; size.cy = rc.bottom - rc.top; hDCMem = CreateCompatibleDC( hDC ); if (!hDCMem) return ; hBmpMem = CreateCompatibleBitmap( hDC, size.cx, size.cy ); hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmpMem ); SetWindowOrgEx( hDCMem, rc.left, rc.top, NULL ); hFontOld = (HFONT)SelectObject( hDCMem, GetFont() ); // paint background m_pUIFScheme->FillRect( hDCMem, &rc, UIFCOLOR_WINDOW ); // paint index bkgnd switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: case UILIST_HORZBT: { rcBorder.left = rc.left; rcBorder.top = rc.top; rcBorder.right = rc.left + (GetLineHeight()) + 4; rcBorder.bottom = rc.bottom; break; } case UILIST_VERTLR: case UILIST_VERTRL: { rcBorder.left = rc.left; rcBorder.top = rc.top; rcBorder.right = rc.right; rcBorder.bottom = rc.top + (GetLineHeight()) + 4; break; } } m_pUIFScheme->FillRect( hDCMem, &rcBorder, UIFCOLOR_MENUBARSHORT ); // paint items for (iLine = 0; iLine < m_nItemVisible + 1; iLine++) { CCandListItem *pItem; int iItem = m_iItemTop + iLine; RECT rcLine; pItem = GetCandItem( iItem ); if (pItem != NULL) { GetLineRect( iLine, &rcLine ); if (!IsRectEmpty( &rcLine )) { PaintItemProc( hDCMem, &rcLine, iLine + m_iIndexStart, pItem, (iItem == m_iItemSelect) ); } } } // BitBlt( hDC, GetRectRef().left, GetRectRef().top, size.cx, size.cy, hDCMem, rc.left, rc.top, SRCCOPY ); SelectObject( hDCMem, hFontOld ); SelectObject( hDCMem, hBmpOld ); DeleteObject( hBmpMem ); DeleteDC( hDCMem ); } /* P A I N T I T E M P R O C */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::PaintItemProc( HDC hDC, RECT *prc, int iIndex, CCandListItem *pItem, BOOL fSelected ) { CCandidateItem *pCandItem; RECT rcClip; RECT rcText; RECT rcIndex; int iBkModeOld; iBkModeOld = SetBkMode( hDC, TRANSPARENT ); // get candidate item pCandItem = pItem->GetCandidateItem(); Assert( pCandItem != NULL ); // calc rects switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: case UILIST_HORZBT: { rcIndex.left = prc->left; rcIndex.top = prc->top; rcIndex.right = prc->left + GetLineHeight() + 4; rcIndex.bottom = prc->bottom; rcClip.left = rcIndex.right; rcClip.top = prc->top; rcClip.right = prc->right; rcClip.bottom = prc->bottom; rcText.left = rcIndex.right + 8; rcText.top = prc->top; rcText.right = prc->right - 8; rcText.bottom = prc->bottom; break; } case UILIST_VERTLR: case UILIST_VERTRL: { rcIndex.left = prc->left; rcIndex.top = prc->top; rcIndex.right = prc->right; rcIndex.bottom = prc->top + GetLineHeight() + 4; rcClip.left = prc->left; rcClip.top = rcIndex.bottom; rcClip.right = prc->right; rcClip.bottom = prc->bottom; rcText.left = prc->left; rcText.top = rcIndex.bottom + 8; rcText.right = prc->right; rcText.bottom = prc->bottom - 8; break; } } // paint selection if (fSelected) { RECT rc = *prc; rc.left += 1; rc.right -= 1; rc.bottom -= 1; m_pUIFScheme->DrawSelectionRect( hDC, &rc, FALSE /* over */ ); } // paint index if ((m_dwStyle & UILIST_ICONSNOTNUMBERS) == 0) { if (0 <= iIndex && iIndex <= 9) { SIZE size; POINT ptOrg; WCHAR wchIndex = L'0' + iIndex; COLORREF colTextOld; HFONT hFontOld; // index hFontOld = (HFONT)SelectObject( hDC, m_hFontIndex ); FLGetTextExtentPoint32( hDC, &wchIndex, 1, &size ); ptOrg.x = (rcIndex.right + rcIndex.left - size.cx) / 2; ptOrg.y = (rcIndex.bottom + rcIndex.top - size.cy) / 2; colTextOld = SetTextColor( hDC, GetUIFColor( UIFCOLOR_CTRLTEXT ) ); FLExtTextOutW( hDC, ptOrg.x, ptOrg.y, ETO_CLIPPED, &rcIndex, &wchIndex, 1, NULL ); SetTextColor( hDC, colTextOld ); SelectObject( hDC, hFontOld ); } } // paint candidate item PaintItemText( hDC, &rcText, &rcClip, &rcIndex, pCandItem, fSelected ); // SetBkMode( hDC, iBkModeOld ); } /* P A I N T I T E M T E X T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::PaintItemText( HDC hDC, RECT *prcText, RECT *prcClip, RECT *prcIndex, CCandidateItem *pCandItem, BOOL fSelected ) { COLORREF col; COLORREF colText; COLORREF colPrefix; COLORREF colTextOld; int iBkModeOld; LPCWSTR psz; HICON hIcon; SIZE size; POINT ptOrg; POINT ptCenter; SIZE sizeComment = {0}; POINT ptComment; int cxyOrigin = 0; // set color if (fSelected) { colText = GetUIFColor( UIFCOLOR_MOUSEOVERTEXT ); colPrefix = GetUIFColor( UIFCOLOR_CTRLTEXTDISABLED ); } else { colText = GetUIFColor( UIFCOLOR_CTRLTEXT ); colPrefix = GetUIFColor( UIFCOLOR_CTRLTEXTDISABLED ); } if (pCandItem->GetColor( &col )) { colText = col; } colTextOld = GetTextColor( hDC ); iBkModeOld = SetBkMode( hDC, TRANSPARENT ); // calc center switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { ptCenter.x = (prcText->left + prcText->right) / 2; ptCenter.y = prcText->top + GetLineHeight() / 2; break; } case UILIST_HORZBT: { ptCenter.x = (prcText->left + prcText->right) / 2; ptCenter.y = prcText->bottom - GetLineHeight() / 2; break; } case UILIST_VERTLR: { ptCenter.x = prcText->left + GetLineHeight() / 2; ptCenter.y = (prcText->top + prcText->bottom) / 2; break; } case UILIST_VERTRL: { ptCenter.x = prcText->right - GetLineHeight() / 2; ptCenter.y = (prcText->top + prcText->bottom) / 2; break; } } // paint icon hIcon = pCandItem->GetIcon(); if (hIcon != NULL) { RECT rcIcon; size.cx = 16; size.cy = 16; if (GetLineHeight()-2 < size.cx) { size.cx = size.cy = GetLineHeight()-2; } switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { if (m_dwStyle & UILIST_ICONSNOTNUMBERS) { rcIcon.left = prcIndex->left; rcIcon.right = prcIndex->right; } else { rcIcon.left = prcText->left; rcIcon.right = prcText->left + GetLineHeight(); } rcIcon.top = prcText->top; rcIcon.bottom = prcText->top + GetLineHeight(); break; } case UILIST_HORZBT: { if (m_dwStyle & UILIST_ICONSNOTNUMBERS) { rcIcon.left = prcIndex->left; rcIcon.right = prcIndex->right; } else { rcIcon.left = prcText->left; rcIcon.right = prcText->left + GetLineHeight(); } rcIcon.top = prcText->bottom - GetLineHeight(); rcIcon.bottom = prcText->bottom; break; } case UILIST_VERTLR: { rcIcon.left = prcText->left; rcIcon.right = prcText->left + GetLineHeight(); if (m_dwStyle & UILIST_ICONSNOTNUMBERS) { rcIcon.top = prcIndex->bottom - GetLineHeight(); rcIcon.bottom = prcIndex->bottom; } else { rcIcon.top = prcText->bottom - GetLineHeight(); rcIcon.bottom = prcText->bottom; } break; } case UILIST_VERTRL: { rcIcon.left = prcText->right - GetLineHeight(); rcIcon.right = prcText->right; if (m_dwStyle & UILIST_ICONSNOTNUMBERS) { rcIcon.top = prcIndex->top; rcIcon.bottom = prcIndex->top + GetLineHeight(); } else { rcIcon.top = prcText->top; rcIcon.bottom = prcText->top + GetLineHeight(); } break; } } ptOrg.x = (rcIcon.left + rcIcon.right - size.cx) / 2; ptOrg.y = (rcIcon.top + rcIcon.bottom - size.cx) / 2; DrawIconEx( hDC, ptOrg.x, ptOrg.y, hIcon, size.cx, size.cy, 0, NULL, DI_NORMAL|DI_COMPAT ); if ((m_dwStyle & UILIST_ICONSNOTNUMBERS) == 0) { cxyOrigin += GetLineHeight(); } } // paint prefix string psz = pCandItem->GetPrefixString(); if (psz != NULL) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { ptOrg.x = prcText->left + cxyOrigin; ptOrg.y = ptCenter.y - size.cy/2; break; } case UILIST_HORZBT: { ptOrg.x = prcText->right - cxyOrigin; ptOrg.y = ptCenter.y + size.cy/2; break; } case UILIST_VERTLR: { ptOrg.x = ptCenter.x - size.cy/2; ptOrg.y = prcText->bottom - cxyOrigin; break; } case UILIST_VERTRL: { ptOrg.x = ptCenter.x + size.cy/2; ptOrg.y = prcText->top + cxyOrigin; break; } } SetTextColor( hDC, colPrefix ); FLExtTextOutW( hDC, ptOrg.x, ptOrg.y, ETO_CLIPPED, prcClip, psz, wcslen(psz), NULL ); cxyOrigin += size.cx; } // paint candidate string psz = pCandItem->GetString(); FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { ptOrg.x = prcText->left + cxyOrigin; ptOrg.y = ptCenter.y - size.cy/2; break; } case UILIST_HORZBT: { ptOrg.x = prcText->right - cxyOrigin; ptOrg.y = ptCenter.y + size.cy/2; break; } case UILIST_VERTLR: { ptOrg.x = ptCenter.x - size.cy/2; ptOrg.y = prcText->bottom - cxyOrigin; break; } case UILIST_VERTRL: { ptOrg.x = ptCenter.x + size.cy/2; ptOrg.y = prcText->top + cxyOrigin; break; } } SetTextColor( hDC, colText ); FLExtTextOutW( hDC, ptOrg.x, ptOrg.y, ETO_CLIPPED, prcClip, psz, wcslen(psz), NULL ); cxyOrigin += size.cx; // paint suffix string psz = pCandItem->GetSuffixString(); if (psz != NULL) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { ptOrg.x = prcText->left + cxyOrigin; ptOrg.y = ptCenter.y - size.cy/2; break; } case UILIST_HORZBT: { ptOrg.x = prcText->right - cxyOrigin; ptOrg.y = ptCenter.y + size.cy/2; break; } case UILIST_VERTLR: { ptOrg.x = ptCenter.x - size.cy/2; ptOrg.y = prcText->bottom - cxyOrigin; break; } case UILIST_VERTRL: { ptOrg.x = ptCenter.x + size.cy/2; ptOrg.y = prcText->top + cxyOrigin; break; } } SetTextColor( hDC, colPrefix ); FLExtTextOutW( hDC, ptOrg.x, ptOrg.y, ETO_CLIPPED, prcClip, psz, wcslen(psz), NULL ); cxyOrigin += size.cx; } // paint comment psz = pCandItem->GetInlineComment(); if (psz != NULL) { HFONT hFontOld = (HFONT)SelectObject( hDC, m_hFontInlineComment ); FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &sizeComment ); switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { ptComment.x = (0 <= m_cxInlineCommentPos ? prcText->left + m_cxInlineCommentPos : prcText->right - sizeComment.cx); ptComment.y = ptOrg.y + size.cy - sizeComment.cy; break; } case UILIST_HORZBT: { ptComment.x = (0 <= m_cxInlineCommentPos ? prcText->right - m_cxInlineCommentPos : prcText->left + sizeComment.cx); ptComment.y = ptOrg.y; break; } case UILIST_VERTLR: { ptComment.x = ptCenter.x - sizeComment.cy/2; ptComment.y = (0 <= m_cxInlineCommentPos ? prcText->bottom - m_cxInlineCommentPos : prcText->top + sizeComment.cx); break; } case UILIST_VERTRL: { ptComment.x = ptCenter.x + sizeComment.cy/2; ptComment.y = (0 <= m_cxInlineCommentPos ? prcText->top + m_cxInlineCommentPos : prcText->bottom - sizeComment.cx); break; } } SetTextColor( hDC, colText ); FLExtTextOutW( hDC, ptComment.x, ptComment.y, ETO_CLIPPED, prcClip, psz, wcslen(psz), NULL ); SelectObject( hDC, hFontOld ); } // paint popup comment icon psz = pCandItem->GetPopupComment(); if (psz != NULL) { HICON hIconPopup; RECT rcIcon; size.cx = 16; size.cy = 16; if (GetLineHeight()-2 < size.cx) { size.cx = size.cy = GetLineHeight()-2; } switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { rcIcon.left = prcText->right - GetLineHeight(); rcIcon.top = prcText->top; rcIcon.right = prcText->right; rcIcon.bottom = prcText->top + GetLineHeight(); break; } case UILIST_HORZBT: { rcIcon.left = prcText->left; rcIcon.top = prcText->bottom - GetLineHeight(); rcIcon.right = prcText->left + GetLineHeight(); rcIcon.bottom = prcText->bottom; break; } case UILIST_VERTLR: { rcIcon.left = prcText->left; rcIcon.top = prcText->top; rcIcon.right = prcText->left + GetLineHeight(); rcIcon.bottom = prcText->top + GetLineHeight(); break; } case UILIST_VERTRL: { rcIcon.left = prcText->right - GetLineHeight(); rcIcon.top = prcText->bottom - GetLineHeight(); rcIcon.right = prcText->right; rcIcon.bottom = prcText->bottom; break; } } ptOrg.x = (rcIcon.left + rcIcon.right - size.cx) / 2; ptOrg.y = (rcIcon.top + rcIcon.bottom - size.cx) / 2; hIconPopup = pCandItem->IsPopupCommentVisible() ? m_hIconPopupOn : m_hIconPopupOff; DrawIconEx( hDC, ptOrg.x, ptOrg.y, hIconPopup, size.cx, size.cy, 0, NULL, DI_NORMAL|DI_COMPAT ); } // restore device context settings SetTextColor( hDC, colTextOld ); SetBkMode( hDC, iBkModeOld ); } /* S E T I T E M H O V E R */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandList::SetItemHover( int iItem ) { if (m_iItemHover != iItem) { m_iItemHover = iItem; NotifyCommand( UICANDLIST_HOVERITEM, m_iItemHover ); } } // // CUIFExtCandList // /* C U I F E X T C A N D L I S T */ /*------------------------------------------------------------------------------ Constructor of CUIFExtCandList ------------------------------------------------------------------------------*/ CUIFExtCandList::CUIFExtCandList( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFCandList( pParent, dwID, prc, dwStyle ) { } /* ~ C U I F E X T C A N D L I S T */ /*------------------------------------------------------------------------------ Destructor of CUIFExtCandList ------------------------------------------------------------------------------*/ CUIFExtCandList::~CUIFExtCandList( void ) { } /* O N T I M E R */ /*------------------------------------------------------------------------------ (CUIFObject method) ------------------------------------------------------------------------------*/ void CUIFExtCandList::OnTimer( void ) { } /* O N L B U T T O N U P */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFExtCandList::OnLButtonUp( POINT pt ) { ClearSelection( TRUE ); CUIFCandList::OnLButtonUp( pt ); } /* O N M O U S E M O V E */ /*------------------------------------------------------------------------------ (CUIFObject method) ------------------------------------------------------------------------------*/ void CUIFExtCandList::OnMouseMove( POINT pt ) { if (!PtInObject( pt )) { ClearSelection( TRUE ); } else { CUIFCandList::OnMouseMove( pt ); } } /* O N M O U S E O U T */ /*------------------------------------------------------------------------------ (CUIFObject method) ------------------------------------------------------------------------------*/ void CUIFExtCandList::OnMouseOut( POINT pt ) { ClearSelection( TRUE ); CUIFCandList::OnMouseMove( pt ); } /*=============================================================================*/ /* */ /* C U I F C A N D R A W D A T A */ /* */ /*=============================================================================*/ /* C U I F C A N D R A W D A T A */ /*------------------------------------------------------------------------------ Constructor of CUIFCandRawData ------------------------------------------------------------------------------*/ CUIFCandRawData::CUIFCandRawData( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, dwID, prc, dwStyle ) { m_pwchText = NULL; m_hBitmap = NULL; m_hEnhMetaFile = NULL; m_hBmpCache = NULL; } /* ~ C U I F C A N D R A W D A T A */ /*------------------------------------------------------------------------------ Destructor of CUIFCandRawData ------------------------------------------------------------------------------*/ CUIFCandRawData::~CUIFCandRawData( void ) { ClearData(); ClearCache(); } /* C L E A R D A T A */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandRawData::ClearData( void ) { if (m_pwchText != NULL) { delete m_pwchText; m_pwchText = NULL; } m_hBitmap = NULL; m_hEnhMetaFile = NULL; } /* S E T T E X T */ /*------------------------------------------------------------------------------ Set text to display ------------------------------------------------------------------------------*/ void CUIFCandRawData::SetText( LPCWSTR pwchText ) { int cwch; if (pwchText == NULL) { return; } ClearData(); ClearCache(); cwch = wcslen( pwchText ) + 1; m_pwchText = new WCHAR[ cwch ]; if (m_pwchText) { memcpy( m_pwchText, pwchText, cwch * sizeof(WCHAR) ); } // update window CallOnPaint(); } /* S E T B I T M A P */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandRawData::SetBitmap( HBITMAP hBitmap ) { if (hBitmap == NULL) { return; } ClearData(); ClearCache(); m_hBitmap = hBitmap; // update window CallOnPaint(); } /* S E T M E T A F I L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandRawData::SetMetaFile( HENHMETAFILE hEnhMetaFile ) { if (hEnhMetaFile == NULL) { return; } ClearData(); ClearCache(); m_hEnhMetaFile = hEnhMetaFile; // update window CallOnPaint(); } /* G E T T E X T */ /*------------------------------------------------------------------------------ Get text ------------------------------------------------------------------------------*/ int CUIFCandRawData::GetText( LPWSTR pwchBuf, int cwchBuf ) { int cwchText = (m_pwchText == NULL) ? 0 : wcslen(m_pwchText); if (cwchBuf <= 0) { // return text length in cwch (not including null-terminater) return cwchText; } else if (pwchBuf == NULL) { // return error code return (-1); } if (0 < cwchText) { cwchText = min( cwchText, cwchBuf-1 ); memcpy( pwchBuf, m_pwchText, cwchText * sizeof(WCHAR) ); *(pwchBuf + cwchText) = L'\0'; // always null terminate } return cwchText; } /* G E T B I T M A P */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HBITMAP CUIFCandRawData::GetBitmap( void ) { return m_hBitmap; } /* G E T M E T A F I L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HENHMETAFILE CUIFCandRawData::GetMetaFile( void ) { return m_hEnhMetaFile; } /* S E T F O N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandRawData::SetFont( HFONT hFont ) { ClearCache(); CUIFObject::SetFont( hFont ); } /* S E T S T Y L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandRawData::SetStyle( DWORD dwStyle ) { ClearCache(); CUIFObject::SetStyle( dwStyle ); } /* O N P A I N T */ /*------------------------------------------------------------------------------ Paint procedure of static object ------------------------------------------------------------------------------*/ void CUIFCandRawData::OnPaint( HDC hDC ) { HDC hDCMem; HBITMAP hBmpOld; hDCMem = CreateCompatibleDC( hDC ); if (hDCMem == NULL) { return; // nothing we can do } // crate cached image if (m_hBmpCache == NULL) { HBITMAP hBmp; SIZE size; RECT rc; // draw horizontal in memory dc switch (m_dwStyle) { default: case UICANDRAWDATA_HORZTB: case UICANDRAWDATA_HORZBT: { size.cx = GetRectRef().right - GetRectRef().left; size.cy = GetRectRef().bottom - GetRectRef().top; break; } case UICANDRAWDATA_VERTLR: case UICANDRAWDATA_VERTRL: { size.cx = GetRectRef().bottom - GetRectRef().top; size.cy = GetRectRef().right - GetRectRef().left; break; } } ::SetRect( &rc, 0, 0, size.cx, size.cy ); // prepare memory dc hBmp = CreateCompatibleBitmap( hDC, size.cx, size.cy ); if (!hBmp) return; hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmp ); m_pUIFScheme->FillRect( hDCMem, &rc, UIFCOLOR_WINDOW ); // draw rawdata image if (m_pwchText != NULL) { DrawTextProc( hDCMem, &rc ); } else if (m_hBitmap != NULL) { DrawBitmapProc( hDCMem, &rc ); } else if (m_hEnhMetaFile != NULL) { DrawMetaFileProc( hDCMem, &rc ); } // create bitmap cache SelectObject( hDCMem, hBmpOld ); switch (m_dwStyle) { default: case UICANDRAWDATA_HORZTB: { m_hBmpCache = hBmp; break; } case UICANDRAWDATA_HORZBT: { m_hBmpCache = CreateRotateBitmap( hBmp, NULL, CANGLE180 ); DeleteObject( hBmp ); break; } case UICANDRAWDATA_VERTLR: { m_hBmpCache = CreateRotateBitmap( hBmp, NULL, CANGLE90 ); DeleteObject( hBmp ); break; } case UICANDRAWDATA_VERTRL: { m_hBmpCache = CreateRotateBitmap( hBmp, NULL, CANGLE270 ); DeleteObject( hBmp ); break; } } } // draw cached image if (m_hBmpCache == NULL) { DeleteDC( hDCMem ); return; } hBmpOld = (HBITMAP)SelectObject( hDCMem, m_hBmpCache ); BitBlt( hDC, GetRectRef().left, GetRectRef().top, GetRectRef().right - GetRectRef().left, GetRectRef().bottom - GetRectRef().top, hDCMem, 0, 0, SRCCOPY ); SelectObject( hDCMem, hBmpOld ); DeleteDC( hDCMem ); } /* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandRawData::OnLButtonDown( POINT pt ) { StartCapture(); } /* O N L B U T T O N U P */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandRawData::OnLButtonUp( POINT pt ) { if (IsCapture()) { EndCapture(); if (PtInObject( pt )) { NotifyCommand( UICANDRAWDATA_CLICKED, 0 ); } } } /* C L E A R C A C H E */ /*------------------------------------------------------------------------------ Claear cached rawdata image ------------------------------------------------------------------------------*/ void CUIFCandRawData::ClearCache( void ) { if (m_hBmpCache != NULL) { DeleteObject( m_hBmpCache ); m_hBmpCache = NULL; } } /* D R A W T E X T P R O C */ /*------------------------------------------------------------------------------ Draw text rawdata NOTE: Rotation will be done in cached bitmap. Draw horizontal image here. ------------------------------------------------------------------------------*/ void CUIFCandRawData::DrawTextProc( HDC hDC, const RECT *prc ) { HFONT hFontOld; int xAlign; int yAlign; SIZE size; int cwch; if (m_pwchText == NULL) { return; } cwch = wcslen( m_pwchText ); // prepare objects hFontOld= (HFONT)SelectObject( hDC, GetFont() ); // calc alignment GetTextExtentPointW( hDC, m_pwchText, cwch, &size ); xAlign = 0; yAlign = (prc->bottom - prc->top - size.cy) / 2; // draw SetBkMode( hDC, TRANSPARENT ); SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) ); FLExtTextOutW( hDC, prc->left + xAlign, prc->top + yAlign, ETO_CLIPPED, prc, m_pwchText, cwch, NULL ); // restore objects SelectObject( hDC, hFontOld ); } /* D R A W B I T M A P P R O C */ /*------------------------------------------------------------------------------ Draw bitmap rawdata NOTE: Rotation will be done in cached bitmap. Draw horizontal image here. ------------------------------------------------------------------------------*/ void CUIFCandRawData::DrawBitmapProc( HDC hDC, const RECT *prc ) { HDC hDCBmp; HBITMAP hBmpOld; BITMAP bmp; SIZE sizeSrc; SIZE sizeDst; int aDen; int aNum; if (m_hBitmap == NULL) { return; } // get bitmap size GetObject( m_hBitmap, sizeof(bmp), &bmp ); sizeSrc.cx = bmp.bmWidth; sizeSrc.cy = bmp.bmHeight; if (sizeSrc.cx <= 0 || sizeSrc.cy <= 0) { return; } // calc destination size (keep aspect ratio) sizeDst.cx = (prc->right - prc->left); sizeDst.cy = (prc->bottom - prc->top); if (sizeDst.cx*sizeSrc.cy < sizeDst.cy*sizeSrc.cx) { /* sizeDst.cx/sizeSrc.cx < sizeDst.cy/sizeSrc.cy */ aDen = sizeSrc.cx; aNum = sizeDst.cx; } else { aDen = sizeSrc.cy; aNum = sizeDst.cy; } sizeDst.cx = (sizeSrc.cx * aNum) / aDen; sizeDst.cy = (sizeSrc.cy * aNum) / aDen; Assert((sizeDst.cx==(prc->right - prc->left)) || (sizeDst.cy==(prc->bottom - prc->top))); Assert((sizeDst.cx<=(prc->right - prc->left)) && (sizeDst.cy<=(prc->bottom - prc->top))); // draw hDCBmp = CreateCompatibleDC( hDC ); if (hDCBmp) { hBmpOld = (HBITMAP)SelectObject( hDCBmp, m_hBitmap ); StretchBlt( hDC, prc->left, prc->top, sizeDst.cx, sizeDst.cy, hDCBmp, 0, 0, sizeSrc.cx, sizeSrc.cy, SRCCOPY ); SelectObject( hDCBmp, hBmpOld ); DeleteDC( hDCBmp ); } } /* D R A W M E T A F I L E P R O C */ /*------------------------------------------------------------------------------ Draw metafile rawdata NOTE: Rotation will be done in cached bitmap. Draw horizontal image here. ------------------------------------------------------------------------------*/ void CUIFCandRawData::DrawMetaFileProc( HDC hDC, const RECT *prc ) { ENHMETAHEADER emh; SIZE sizeSrc; SIZE sizeDst; int aDen; int aNum; RECT rcDst; if (m_hEnhMetaFile == NULL) { return; } // get bitmap size GetEnhMetaFileHeader( m_hEnhMetaFile, sizeof(emh), &emh ); sizeSrc.cx = (emh.rclFrame.right - emh.rclFrame.left); sizeSrc.cy = (emh.rclFrame.bottom - emh.rclFrame.top); if (sizeSrc.cx <= 0 || sizeSrc.cy <= 0) { return; } // calc destination size (keep aspect ratio) sizeDst.cx = (prc->right - prc->left); sizeDst.cy = (prc->bottom - prc->top); if (sizeDst.cx*sizeSrc.cy < sizeDst.cy*sizeSrc.cx) { /* sizeDst.cx/sizeSrc.cx < sizeDst.cy/sizeSrc.cy */ aDen = sizeSrc.cx; aNum = sizeDst.cx; } else { aDen = sizeSrc.cy; aNum = sizeDst.cy; } sizeDst.cx = (sizeSrc.cx * aNum) / aDen; sizeDst.cy = (sizeSrc.cy * aNum) / aDen; Assert((sizeDst.cx==(prc->right - prc->left)) || (sizeDst.cy==(prc->bottom - prc->top))); Assert((sizeDst.cx<=(prc->right - prc->left)) && (sizeDst.cy<=(prc->bottom - prc->top))); // draw rcDst.left = prc->left; rcDst.top = prc->top; rcDst.right = rcDst.left + sizeDst.cx; rcDst.bottom = rcDst.top + sizeDst.cy; PlayEnhMetaFile( hDC, m_hEnhMetaFile, &rcDst ); } /*=============================================================================*/ /* */ /* C U I F C A N D B O R D E R */ /* */ /*=============================================================================*/ /* C U I F C A N D B O R D E R */ /*------------------------------------------------------------------------------ Constructor of CUIFCandBorder ------------------------------------------------------------------------------*/ CUIFCandBorder::CUIFCandBorder( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFBorder( pParent, dwID, prc, dwStyle ) { } /* ~ C U I F C A N D B O R D E R */ /*------------------------------------------------------------------------------ Destructor of CUIFCandBorder ------------------------------------------------------------------------------*/ CUIFCandBorder::~CUIFCandBorder( void ) { } /* O N P A I N T */ /*------------------------------------------------------------------------------ Paint procedure of border object ------------------------------------------------------------------------------*/ void CUIFCandBorder::OnPaint( HDC hDC ) { RECT rc = GetRectRef(); switch (m_dwStyle & UIBORDER_DIRMASK) { default: case UIBORDER_HORZ: { if (rc.top == rc.bottom) { break; } rc.top = (rc.top + rc.bottom) / 2; rc.bottom = rc.top + 1; GetUIFScheme()->FillRect( hDC, &rc, UIFCOLOR_SPLITTERLINE ); break; } case UIBORDER_VERT: { if (rc.left == rc.right) { break; } rc.left = (rc.right + rc.left) / 2; rc.right = rc.left + 1; GetUIFScheme()->FillRect( hDC, &rc, UIFCOLOR_SPLITTERLINE ); break; } } } /*============================================================================*/ /* */ /* C U I F C A N D M E N U B U T T O N */ /* */ /*============================================================================*/ /* C U I F C A N D M E N U B U T T O N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CUIFCandMenuButton::CUIFCandMenuButton( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFButton2( pParent, dwID, prc, dwStyle ) { } /* ~ C U I F C A N D M E N U B U T T O N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CUIFCandMenuButton::~CUIFCandMenuButton( void ) { } /* G E T A C C N A M E */ /*------------------------------------------------------------------------------ Get acc item name (CCandAccItem method) ------------------------------------------------------------------------------*/ BSTR CUIFCandMenuButton::GetAccName( void ) { return (GetToolTip() != NULL) ? SysAllocString( GetToolTip() ) : NULL; } /* G E T A C C V A L U E */ /*------------------------------------------------------------------------------ Get acc value ------------------------------------------------------------------------------*/ BSTR CUIFCandMenuButton::GetAccValue( void ) { return SysAllocString( L"" ); } /* G E T A C C R O L E */ /*------------------------------------------------------------------------------ Get acc item role (CCandAccItem method) ------------------------------------------------------------------------------*/ LONG CUIFCandMenuButton::GetAccRole( void ) { return ROLE_SYSTEM_PUSHBUTTON; } /* G E T A C C S T A T E */ /*------------------------------------------------------------------------------ Get acc item state (CCandAccItem method) ------------------------------------------------------------------------------*/ LONG CUIFCandMenuButton::GetAccState( void ) { return (m_dwStatus == UIBUTTON_DOWN) ? STATE_SYSTEM_PRESSED : 0; } /* G E T A C C L O C A T I O N */ /*------------------------------------------------------------------------------ Get acc location (CCandAccItem method) ------------------------------------------------------------------------------*/ void CUIFCandMenuButton::GetAccLocation( RECT *prc ) { GetRect( prc ); } /* S E T S T A T U S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCandMenuButton::SetStatus( DWORD dwStatus ) { CUIFButton2::SetStatus( dwStatus ); NotifyWinEvent( EVENT_OBJECT_STATECHANGE ); }