// // cuicand2.cpp - ui frame object for candidate UI // #include "private.h" #include "cuilib.h" #include "cuicand2.h" #include "candutil.h" #ifndef IDUIF_CANDNUMBUTTON #define IDUIF_CANDNUMBUTTON 0x00000001 #endif /*=============================================================================*/ /* */ /* C U I F S M A R T M E N U B U T T O N */ /* */ /*=============================================================================*/ // // CUIFSmartMenuButton // /* C U I F S M A R T M E N U B U T T O N */ /*------------------------------------------------------------------------------ Constructor of CUIFSmartMenuButton ------------------------------------------------------------------------------*/ CUIFSmartMenuButton::CUIFSmartMenuButton( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFButton2( pParent, dwID, prc, dwStyle ) { m_pUIFScheme = CreateUIFScheme( UIFSCHEME_OFC10TOOLBAR ); Assert( m_pUIFScheme != NULL ); } /* ~ C U I F S M A R T M E N U B U T T O N */ /*------------------------------------------------------------------------------ Destructor of CUIFSmartMenuButton ------------------------------------------------------------------------------*/ CUIFSmartMenuButton::~CUIFSmartMenuButton( void ) { // dispose scheme delete m_pUIFScheme; } /* O N P A I N T */ /*------------------------------------------------------------------------------ Paint procedure of smart menu button object ------------------------------------------------------------------------------*/ void CUIFSmartMenuButton::OnPaint( HDC hDC ) { DWORD dwState = 0; HDC hDCMem; HBITMAP hBmpMem; HBITMAP hBmpOld; SIZE size; RECT rc; COLORREF col; // make draw flag dwState |= (m_fToggled) ? UIFDCS_SELECTED : 0; switch (m_dwStatus) { case UIBUTTON_DOWN: { dwState |= UIFDCS_MOUSEDOWN; break; } case UIBUTTON_HOVER: case UIBUTTON_DOWNOUT: { dwState |= UIFDCS_MOUSEOVER; break; } } dwState |= (IsEnabled() ? 0 : UIFDCS_DISABLED); // prepare memory dc size.cx = GetRectRef().right - GetRectRef().left; size.cy = GetRectRef().bottom - GetRectRef().top; hDCMem = CreateCompatibleDC( hDC ); hBmpMem = CreateCompatibleBitmap( hDC, size.cx, size.cy ); hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmpMem ); ::SetRect( &rc, 0, 0, size.cx, size.cy ); // paint background m_pUIFScheme->DrawCtrlBkgd( hDCMem, &rc, UIFDCF_BUTTON, dwState ); // paint face if (dwState & UIFDCS_DISABLED) { col = GetUIFColor( UIFCOLOR_CTRLTEXTDISABLED ); } else { col = GetUIFColor( UIFCOLOR_CTRLTEXT ); } DrawTriangle( hDCMem, &rc, col, UIFDCTF_MENUDROP ); // draw button edge m_pUIFScheme->DrawCtrlEdge( hDCMem, &rc, UIFDCF_BUTTON, dwState ); // BitBlt( hDC, GetRectRef().left, GetRectRef().top, size.cx, size.cy, hDCMem, 0, 0, SRCCOPY ); SelectObject( hDCMem, hBmpOld ); if (hBmpMem) DeleteObject( hBmpMem ); DeleteDC( hDCMem ); } /*=============================================================================*/ /* */ /* C U I F S M A R T P A G E B U T T O N */ /* */ /*=============================================================================*/ // // CUIFSmartPageButton // /* C U I F S M A R T P A G E B U T T O N */ /*------------------------------------------------------------------------------ Constructor of CUIFSmartPageButton ------------------------------------------------------------------------------*/ CUIFSmartPageButton::CUIFSmartPageButton( CUIFObject *pParent, const RECT *prc, DWORD dwStyle ) : CUIFButton2( pParent, 0, prc, dwStyle ) { m_pUIFScheme = CreateUIFScheme( UIFSCHEME_OFC10TOOLBAR ); Assert( m_pUIFScheme != NULL ); } /* ~ C U I F S M A R T P A G E B U T T O N */ /*------------------------------------------------------------------------------ Destructor of CUIFSmartPageButton ------------------------------------------------------------------------------*/ CUIFSmartPageButton::~CUIFSmartPageButton( void ) { // dispose scheme delete m_pUIFScheme; } /* O N P A I N T */ /*------------------------------------------------------------------------------ Paint procedure of smart page button object ------------------------------------------------------------------------------*/ void CUIFSmartPageButton::OnPaint( HDC hDC ) { DWORD dwState = 0; DWORD dwFlag; HDC hDCMem; HBITMAP hBmpMem; HBITMAP hBmpOld; SIZE size; RECT rc; COLORREF col; // make draw flag dwState |= (m_fToggled) ? UIFDCS_SELECTED : 0; switch (m_dwStatus) { case UIBUTTON_DOWN: { dwState |= UIFDCS_MOUSEDOWN; break; } case UIBUTTON_HOVER: case UIBUTTON_DOWNOUT: { dwState |= UIFDCS_MOUSEOVER; break; } } dwState |= IsEnabled() ? 0 : UIFDCS_DISABLED; // prepare memory dc size.cx = GetRectRef().right - GetRectRef().left; size.cy = GetRectRef().bottom - GetRectRef().top; hDCMem = CreateCompatibleDC( hDC ); hBmpMem = CreateCompatibleBitmap( hDC, size.cx, size.cy ); hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmpMem ); ::SetRect( &rc, 0, 0, size.cx, size.cy ); // paint background m_pUIFScheme->DrawCtrlBkgd( hDCMem, &rc, UIFDCF_BUTTON, dwState ); // paint face switch (m_dwStyle & UISCROLLBUTTON_DIRMASK) { case UISCROLLBUTTON_LEFT: { dwFlag = UIFDCTF_RIGHTTOLEFT; break; } case UISCROLLBUTTON_UP: { dwFlag = UIFDCTF_BOTTOMTOTOP; break; } case UISCROLLBUTTON_RIGHT: { dwFlag = UIFDCTF_LEFTTORIGHT; break; } case UISCROLLBUTTON_DOWN: { dwFlag = UIFDCTF_TOPTOBOTTOM; break; } } if (dwState & UIFDCS_DISABLED) { col = GetUIFColor( UIFCOLOR_CTRLTEXTDISABLED ); } else { col = GetUIFColor( UIFCOLOR_CTRLTEXT ); } DrawTriangle( hDCMem, &rc, col, dwFlag ); // draw button edge m_pUIFScheme->DrawCtrlEdge( hDCMem, &rc, UIFDCF_BUTTON, dwState ); // BitBlt( hDC, GetRectRef().left, GetRectRef().top, size.cx, size.cy, hDCMem, 0, 0, SRCCOPY ); SelectObject( hDCMem, hBmpOld ); if (hBmpMem) DeleteObject( hBmpMem ); DeleteDC( hDCMem ); } /*=============================================================================*/ /* */ /* C U I F R O W B U T T O N */ /* */ /*=============================================================================*/ // // CUIFRowButton // /* C U I F R O W B U T T O N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CUIFRowButton::CUIFRowButton( CUIFObject *pParent, DWORD dwID, DWORD dwStyle) : CUIFButton2( pParent, dwID, NULL, dwStyle ) { m_pCandListItem = NULL; m_hFontInlineComment = NULL; m_cxInlineCommentPos = -1; m_fSelected = FALSE; UpdateText(); } /* ~ C U I F R O W B U T T O N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CUIFRowButton::~CUIFRowButton( void ) { } /* S E T S T Y L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowButton::SetStyle( DWORD dwStyle ) { CUIFObject::SetStyle( dwStyle ); UpdateText(); } /* U P D A T E T E X T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowButton::UpdateText( void ) { WCHAR pwch[3]; pwch[0] = (WCHAR)'0' + (WORD)(GetID() % 10); pwch[1] = (WCHAR)' '; pwch[2] = (WCHAR)'\0'; SetText(pwch); } /* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowButton::OnLButtonDown( POINT pt ) { CUIFButton2::OnLButtonDown(pt); NotifyCommand( UILIST_SELCHANGED, m_pCandListItem->GetIListItem() ); } /* S E T I N L I N E C O M M E N T F O N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowButton::SetInlineCommentFont( HFONT hFont ) { Assert(hFont != NULL); m_hFontInlineComment = hFont; } /* S E T I N L I N E C O M M E N T P O S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowButton::SetInlineCommentPos( int cx ) { m_cxInlineCommentPos = cx; } /* S E T C A N D L I S T I T E M */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowButton::SetCandListItem( CCandListItem* pItem ) { m_pCandListItem = pItem; } /* G E T E X T E N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowButton::GetExtent( SIZE *psize) { SIZE size; LPCWSTR psz; BOOL fHorizontal = (m_dwStyle & UIBUTTON_VCENTER) ? TRUE : FALSE; Assert(psize); psize->cx = 0; psize->cy = 0; GetTextExtent( m_hFont, GetText(), wcslen( GetText() ), psize, fHorizontal ); if (m_pCandListItem != NULL) { psz = m_pCandListItem->GetCandidateItem()->GetString(); GetTextExtent( m_hFont, psz, wcslen( psz ), &size, fHorizontal ); psize->cx += size.cx; psize->cy = max(psize->cy, size.cy); if ( psz = m_pCandListItem->GetCandidateItem()->GetPrefixString() ) { GetTextExtent( m_hFont, psz, wcslen( psz ), &size, fHorizontal ); psize->cx += size.cx; psize->cy = max(psize->cy, size.cy); } if ( psz = m_pCandListItem->GetCandidateItem()->GetSuffixString() ) { GetTextExtent( m_hFont, psz, wcslen( psz ), &size, fHorizontal ); psize->cx += size.cx; psize->cy = max(psize->cy, size.cy); } if ( psz = m_pCandListItem->GetCandidateItem()->GetInlineComment() ) { GetTextExtent( m_hFontInlineComment, psz, wcslen( psz ), &size, fHorizontal ); psize->cx += size.cx; if (m_cxInlineCommentPos > 0) { psize->cx += m_cxInlineCommentPos; } psize->cy = max(psize->cy, size.cy); } } Assert(psize->cx); Assert(psize->cy); psize->cx += 2; // width of button borders psize->cy += 2; // height of button borders } /* S E L E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowButton::SetSelected( BOOL fSelected ) { m_fSelected = fSelected; } /* O N P A I N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowButton::OnPaint( HDC hDC ) { HFONT hFontOld; COLORREF colTextOld; COLORREF colText; int nBkModeOld; LPCWSTR psz; SIZE size; BOOL fHorizontal = (m_dwStyle & UIBUTTON_VCENTER) ? TRUE : FALSE; const int ccxMargin = 1; const int ccyMargin = 1; POINT ptOrg; RECT rc; DWORD dwState = 0; Assert( m_pCandListItem != NULL ); // make draw flag dwState |= (m_fToggled) ? UIFDCS_SELECTED : 0; switch (m_dwStatus) { case UIBUTTON_DOWN: { dwState |= UIFDCS_MOUSEDOWN; break; } case UIBUTTON_DOWNOUT: { dwState |= UIFDCS_MOUSEOVER; break; } } dwState |= m_fSelected ? UIFDCS_MOUSEOVER : 0; dwState |= IsEnabled() ? 0 : UIFDCS_DISABLED; GetRect(&rc); // paint background m_pUIFScheme->DrawCtrlBkgd( hDC, &rc, UIFDCF_BUTTON, dwState ); // // paint index text // if (fHorizontal) { ptOrg.x = GetRectRef().left + ccxMargin; ptOrg.y = GetRectRef().top + ccyMargin; } else { ptOrg.x = GetRectRef().right - ccxMargin; ptOrg.y = GetRectRef().top + ccyMargin; } colText = GetUIFColor( UIFCOLOR_CTRLTEXT ); colTextOld = SetTextColor( hDC, colText ); nBkModeOld = SetBkMode( hDC, TRANSPARENT ); hFontOld = (HFONT)SelectObject( hDC, m_hFont ); GetTextExtent( m_hFont, GetText(), wcslen( GetText() ), &size, fHorizontal ); if (fHorizontal) { FLTextOutW( hDC, ptOrg.x + size.cx / 4, ptOrg.y, GetText(), wcslen( GetText() ) ); ptOrg.x += size.cx; } else { FLTextOutW( hDC, ptOrg.x, ptOrg.y + size.cx / 4, GetText(), wcslen( GetText() ) ); ptOrg.y += size.cx; } // // paint prefix string // psz = m_pCandListItem->GetCandidateItem()->GetPrefixString(); if (psz != NULL) { colText = GetUIFColor( UIFCOLOR_CTRLTEXTDISABLED ); SetTextColor( hDC, colText ); FLTextOutW( hDC, ptOrg.x, ptOrg.y, psz, wcslen(psz) ); GetTextExtent( m_hFont, psz, wcslen( psz ), &size, fHorizontal ); if (fHorizontal) { ptOrg.x += size.cx; } else { ptOrg.y += size.cx; } } // // paint cand list item string // if ( dwState & UIFDCS_MOUSEDOWN ) { colText = GetUIFColor( UIFCOLOR_MOUSEDOWNTEXT ); } else if ( dwState & UIFDCS_MOUSEOVER ) { colText = GetUIFColor( UIFCOLOR_MOUSEOVERTEXT ); } else if (m_pCandListItem->GetCandidateItem()->GetColor( &colText )) { } else { colText = GetUIFColor( UIFCOLOR_CTRLTEXT ); } SetTextColor( hDC, colText ); psz = m_pCandListItem->GetCandidateItem()->GetString(); FLTextOutW( hDC, ptOrg.x, ptOrg.y, psz, wcslen(psz) ); GetTextExtent( m_hFont, psz, wcslen( psz ), &size, fHorizontal ); if (fHorizontal) { ptOrg.x += size.cx; } else { ptOrg.y += size.cx; } // // paint prefix string // psz = m_pCandListItem->GetCandidateItem()->GetSuffixString(); if (psz != NULL) { colText = GetUIFColor( UIFCOLOR_CTRLTEXTDISABLED ); SetTextColor( hDC, colText ); FLTextOutW( hDC, ptOrg.x, ptOrg.y, psz, wcslen(psz) ); GetTextExtent( m_hFont, psz, wcslen( psz ), &size, fHorizontal ); if (fHorizontal) { ptOrg.x += size.cx; } else { ptOrg.y += size.cx; } } // // paint cand list item string // psz = m_pCandListItem->GetCandidateItem()->GetInlineComment(); if (psz != NULL) { int cxInlineCommentPos; int nFontHeight; SelectObject( hDC, m_hFontInlineComment ); colText = GetUIFColor( UIFCOLOR_CTRLTEXT ); SetTextColor( hDC, colText ); // Don't do things while (m_cxInlineCommentPos < 0) cxInlineCommentPos = max( m_cxInlineCommentPos, 0 ); // Get the font height. GetTextExtent( m_hFontInlineComment, L"1", 1, &size, fHorizontal ); nFontHeight = max(size.cx, size.cy); if (fHorizontal) { ptOrg.x += cxInlineCommentPos; ptOrg.y += ( (GetRectRef().bottom - GetRectRef().top) - nFontHeight ) / 2; FLTextOutW( hDC, ptOrg.x, ptOrg.y, psz, wcslen(psz) ); } else { ptOrg.x -= ( (GetRectRef().right - GetRectRef().left) - nFontHeight ) / 2; ptOrg.y += cxInlineCommentPos; FLTextOutW( hDC, ptOrg.x, ptOrg.y, psz, wcslen(psz) ); } } SetTextColor( hDC, colTextOld ); SetBkMode( hDC, nBkModeOld ); SelectObject( hDC, hFontOld ); // draw button edge m_pUIFScheme->DrawCtrlEdge( hDC, &rc, UIFDCF_BUTTON, dwState ); } /*=============================================================================*/ /* */ /* C U I F R O W L I S T */ /* */ /*=============================================================================*/ // // CUIFRowList // /* C U I F R O W L I S T */ /*------------------------------------------------------------------------------ Constructor of CUIFRowList ------------------------------------------------------------------------------*/ CUIFRowList::CUIFRowList( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, dwID, prc, dwStyle ) { m_nItem = 0; m_pcpCurPage = NULL; m_iItemSelect = -1; m_cpPageHead.iPageStart = 0; m_cpPageHead.nPageSize = 0; m_cpPageHead.pPrev = NULL; m_cpPageHead.pNext = NULL; m_pCandPageUpBtn = NULL; m_pCandPageDnBtn = NULL; for (int i = 0; i < NUM_CANDSTR_MAX; i++) { m_rgpButton[i] = NULL; } } /* ~ C U I F L I S T */ /*------------------------------------------------------------------------------ Destructor of CUIFRowList ------------------------------------------------------------------------------*/ CUIFRowList::~CUIFRowList( void ) { CListItemBase *pItem; while (pItem = m_listItem.GetFirst()) { m_listItem.Remove(pItem); delete pItem; } ClearPageInfo(); } /* I N I T I A L I Z E */ /*------------------------------------------------------------------------------ Initialize list object ------------------------------------------------------------------------------*/ CUIFObject *CUIFRowList::Initialize( void ) { RECT rc = { 0 }; // // create candidate page up button // m_pCandPageUpBtn = new CUIFSmartPageButton( this, &rc, GetPageUpBtnStyle() ); m_pCandPageUpBtn->Initialize(); AddUIObj( m_pCandPageUpBtn ); // // create candidate page down button // m_pCandPageDnBtn = new CUIFSmartPageButton( this, &rc, GetPageDnBtnStyle() ); m_pCandPageDnBtn->Initialize(); AddUIObj( m_pCandPageDnBtn ); for (int i = 0; i < NUM_CANDSTR_MAX; i++) { m_rgpButton[i] = new CUIFRowButton( this, 1 + i, GetRowButtonStyle() ); m_rgpButton[i]->Initialize(); AddUIObj( m_rgpButton[i] ); } return CUIFObject::Initialize(); } /* S E T S T Y L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowList::SetStyle( DWORD dwStyle ) { RECT rc; CUIFObject::SetStyle( dwStyle ); // change page button style either m_pCandPageUpBtn->SetStyle( GetPageUpBtnStyle() ); m_pCandPageDnBtn->SetStyle( GetPageDnBtnStyle() ); for (int i = 0; i < NUM_CANDSTR_MAX; i++) { m_rgpButton[i]->SetStyle( GetRowButtonStyle() ); } // set page up button position GetPageUpBtnRect( &rc ); m_pCandPageUpBtn->SetRect( &rc ); // set page down button position GetPageDnBtnRect( &rc ); m_pCandPageDnBtn->SetRect( &rc ); // repage Repage(); // update window CallOnPaint(); } /* S E T R E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowList::SetRect( const RECT *prc ) { RECT rc; CUIFObject::SetRect( prc ); // set page up button position GetPageUpBtnRect( &rc ); m_pCandPageUpBtn->SetRect( &rc ); // set page down button position GetPageDnBtnRect( &rc ); m_pCandPageDnBtn->SetRect( &rc ); // update window CallOnPaint(); } /* O N O B J E C T N O T I F Y */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ LRESULT CUIFRowList::OnObjectNotify( CUIFObject *pUIObj, DWORD dwCommand, LPARAM lParam ) { LRESULT lResult = -1; DWORD dwID = pUIObj->GetID(); if (IDUIF_CANDNUMBUTTON <= dwID && dwID < (DWORD)(IDUIF_CANDNUMBUTTON + NUM_CANDSTR_MAX)) { switch (dwCommand) { case UILIST_SELCHANGED: { SetCurSel( (LONG)(LONG_PTR)(lParam) ); lResult = 0; break; } } } else if (pUIObj == m_pCandPageUpBtn) { switch (dwCommand) { case UIBUTTON_PRESSED: { ShiftPage( -1 ); lResult = 0; break; } } } else if (pUIObj == m_pCandPageDnBtn) { switch (dwCommand) { case UIBUTTON_PRESSED: { ShiftPage( +1 ); lResult = 0; break; } } } if (lResult != 0) { Assert(m_pParent != NULL); lResult = m_pParent->OnObjectNotify( pUIObj, dwCommand, lParam ); } return lResult; } /* R E P A G E */ /*------------------------------------------------------------------------------ Refresh the page info link ------------------------------------------------------------------------------*/ void CUIFRowList::Repage( void ) { SIZE sizeItem; BOOL fPageFull; CANDPAGE *pTrace, *pPageNew; int nPageLimit, nPageOccupied, nItemOnPage, nItemSize; CCandListItem *pItem; BOOL fHorizontal; ClearPageInfo(); if (IsRectEmpty( &GetRectRef() )) { return; } pItem = (CCandListItem*)m_listItem.GetFirst(); if (pItem == NULL) { return; } nPageOccupied = 0; nItemOnPage = 0; fPageFull = FALSE; pTrace = NULL; switch (m_dwStyle & UILIST_DIRMASK) { default: Assert(FALSE); case UILIST_HORZTB: case UILIST_HORZBT: { fHorizontal = TRUE; nPageLimit = (GetRectRef().right - GetRectRef().left) - (GetRectRef().bottom - GetRectRef().top) * 2; break; } case UILIST_VERTLR: case UILIST_VERTRL: { fHorizontal = FALSE; nPageLimit = (GetRectRef().bottom - GetRectRef().top) - (GetRectRef().right - GetRectRef().left) * 2; break; } } // // Use the object pointed to m_rgpButton[0] for repaging calculation. // do { if (m_rgpButton[nItemOnPage] == NULL) { ClearPageInfo(); return; } m_rgpButton[nItemOnPage]->SetCandListItem( pItem ); m_rgpButton[nItemOnPage]->GetExtent(&sizeItem); nItemSize = sizeItem.cx; if ( nPageOccupied + nItemSize > nPageLimit ) { fPageFull = TRUE; } else { nPageOccupied += nItemSize + HCAND_ITEM_MARGIN; nItemOnPage++; // pItem = (CCandListItem*)pItem->GetNext(); int iItem = m_listItem.Find( pItem ); if (0 <= iItem) { pItem = (CCandListItem*)m_listItem.Get( iItem+1 ); } else { pItem = NULL; } // Reach the max item limit? if (nItemOnPage >= NUM_CANDSTR_MAX) { fPageFull = TRUE; } // Reach the end of cand list? if (pItem == NULL) { fPageFull = TRUE; } } if (fPageFull) { // // Create a new page info node // pPageNew = new CANDPAGE; if (pPageNew == NULL) { ClearPageInfo(); return; } pPageNew->pNext = NULL; pPageNew->pPrev = pTrace; if (pTrace != NULL) { pPageNew->iPageStart = pTrace->iPageStart + pTrace->nPageSize; pTrace->pNext = pPageNew; } else { pPageNew->iPageStart = 0; m_cpPageHead.pNext = pPageNew; } pPageNew->nPageSize = nItemOnPage; m_cpPageHead.pPrev = pPageNew; pTrace = pPageNew; // // Restart the accumulation for next page // nPageOccupied = 0; nItemOnPage = 0; fPageFull = FALSE; } } while (pItem != NULL); m_pcpCurPage = m_cpPageHead.pNext; // Current page is the 1st. m_iItemSelect = m_pcpCurPage->iPageStart; // layout current page row buttons position, and page button status LayoutCurPage(); } /* S H I F T I T E M */ /*------------------------------------------------------------------------------ shift current item by nItem (+/-) ------------------------------------------------------------------------------*/ void CUIFRowList::ShiftItem( int nItem ) { SetCurSel( m_iItemSelect + nItem ); } /* S H I F T P A G E */ /*------------------------------------------------------------------------------ shift current page by nPage (+/-) ------------------------------------------------------------------------------*/ void CUIFRowList::ShiftPage( int nPage ) { CANDPAGE *pPage; int nPageOffset = nPage; pPage = m_pcpCurPage; while (pPage != NULL) { if (nPageOffset < 0) { pPage = pPage->pPrev; nPageOffset++; } else if (nPageOffset > 0) { pPage = pPage->pNext; nPageOffset--; } else { m_pcpCurPage = pPage; m_iItemSelect = m_pcpCurPage->iPageStart; break; } } // layout current page row buttons position, and page button status LayoutCurPage(); NotifyCommand( UILIST_SELCHANGED, m_iItemSelect ); } /* G E T P A G E U P B T N R E C T */ /*------------------------------------------------------------------------------ Get page-up button position ------------------------------------------------------------------------------*/ void CUIFRowList::GetPageUpBtnRect( RECT *prc ) { Assert( prc != NULL ); GetRect(prc); switch (m_dwStyle & UILIST_DIRMASK) { default: Assert(FALSE); case UILIST_HORZTB: case UILIST_HORZBT: { prc->right -= GetRectRef().bottom - GetRectRef().top; prc->left = prc->right - (GetRectRef().bottom - GetRectRef().top); break; } case UILIST_VERTLR: case UILIST_VERTRL: { prc->bottom -= GetRectRef().right - GetRectRef().left; prc->top = prc->bottom - (GetRectRef().right - GetRectRef().left); break; } } } /* G E T P A G E D O W N B T N R E C T */ /*------------------------------------------------------------------------------ Get page-down button position ------------------------------------------------------------------------------*/ void CUIFRowList::GetPageDnBtnRect( RECT *prc ) { Assert( prc != NULL ); GetRect(prc); switch (m_dwStyle & UILIST_DIRMASK) { default: Assert(FALSE); case UILIST_HORZTB: case UILIST_HORZBT: { prc->left = GetRectRef().right - (GetRectRef().bottom - GetRectRef().top); break; } case UILIST_VERTLR: case UILIST_VERTRL: { prc->top = GetRectRef().bottom - (GetRectRef().right - GetRectRef().left); break; } } } /* S E T F O N T */ /*------------------------------------------------------------------------------ Set font for UI and candidate list ------------------------------------------------------------------------------*/ void CUIFRowList::SetFont( HFONT hFont ) { CUIFObject::SetFont( hFont ); // repage Repage(); // update window CallOnPaint(); } /* G E T P A G E U P B T N S T Y L E */ /*------------------------------------------------------------------------------ Get page up button style ------------------------------------------------------------------------------*/ DWORD CUIFRowList::GetPageUpBtnStyle( void ) { switch (m_dwStyle) { default: Assert(FALSE); case UILIST_HORZTB: case UILIST_HORZBT: { return UISCROLLBUTTON_LEFT; break; } case UILIST_VERTLR: case UILIST_VERTRL: { return UISCROLLBUTTON_UP; } } } /* G E T P A G E D N B T N S T Y L E */ /*------------------------------------------------------------------------------ Get page-down button style ------------------------------------------------------------------------------*/ DWORD CUIFRowList::GetPageDnBtnStyle( void ) { switch (m_dwStyle) { default: Assert(FALSE); case UILIST_HORZTB: case UILIST_HORZBT: { return UISCROLLBUTTON_RIGHT; } case UILIST_VERTLR: case UILIST_VERTRL: { return UISCROLLBUTTON_DOWN; } } } /* G E T R O W B U T T O N S T Y L E */ /*------------------------------------------------------------------------------ Get row button style ------------------------------------------------------------------------------*/ DWORD CUIFRowList::GetRowButtonStyle( void ) { switch ( m_dwStyle ) { default: Assert(FALSE); case UILIST_HORZTB: case UILIST_HORZBT: return UIBUTTON_PUSH | UIBUTTON_VCENTER | UIBUTTON_LEFT; case UILIST_VERTLR: case UILIST_VERTRL: return UIBUTTON_PUSH | UIBUTTON_CENTER | UIBUTTON_TOP; } } /* C L E A R P A G E I N F O */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowList::ClearPageInfo( void ) { CANDPAGE *pPage; while (pPage = m_cpPageHead.pNext) { m_cpPageHead.pNext = pPage->pNext; delete pPage; } m_cpPageHead.pPrev = NULL; m_pcpCurPage = NULL; m_iItemSelect = -1; } /* R E L A Y O U T C U R P A G E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowList::LayoutCurPage( void ) { int i; CCandListItem *pItem; RECT rc; SIZE size; if (IsRectEmpty( &GetRectRef() )) { return; } i = 0; if (m_pcpCurPage != NULL) { GetRect( &rc ); switch ( m_dwStyle ) { default: Assert(FALSE); case UILIST_HORZTB: case UILIST_HORZBT: rc.right = rc.left - HCAND_ITEM_MARGIN; break; case UILIST_VERTLR: case UILIST_VERTRL: rc.bottom = rc.top - HCAND_ITEM_MARGIN; break; } for (NULL; i < m_pcpCurPage->nPageSize; i++) { pItem = (CCandListItem*)GetCandItem( m_pcpCurPage->iPageStart + i ); Assert(pItem != NULL); m_rgpButton[i]->SetCandListItem(pItem); m_rgpButton[i]->GetExtent( &size ); m_rgpButton[i]->SetSelected( (m_pcpCurPage->iPageStart + i == m_iItemSelect) ? TRUE : FALSE ); switch ( m_dwStyle ) { default: Assert(FALSE); case UILIST_HORZTB: case UILIST_HORZBT: { rc.left = rc.right + HCAND_ITEM_MARGIN; rc.right = rc.left + size.cx; break; } case UILIST_VERTLR: case UILIST_VERTRL: { rc.top = rc.bottom + HCAND_ITEM_MARGIN; rc.bottom = rc.top + size.cx; break; } } m_rgpButton[i]->SetRect( &rc ); m_rgpButton[i]->Show( TRUE ); } } for (NULL; i < NUM_CANDSTR_MAX; i++) { m_rgpButton[i]->SetSelected( FALSE ); m_rgpButton[i]->Show( FALSE ); } // // update paging buttons enable/disable status // if (m_pcpCurPage) { // m_cpPageHead.pPrev is the first page m_pCandPageUpBtn->Enable( (m_pcpCurPage != m_cpPageHead.pNext) ? TRUE : FALSE ); // m_cpPageHead.pPrev is the last page m_pCandPageDnBtn->Enable( (m_pcpCurPage != m_cpPageHead.pPrev) ? TRUE : FALSE ); } else { m_pCandPageUpBtn->Enable( FALSE ); m_pCandPageDnBtn->Enable( FALSE ); } // update window CallOnPaint(); } /* 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 ------------------------------------------------------------------------------*/ void CUIFRowList::SetInlineCommentFont( HFONT hFont ) { if (hFont == NULL) { hFont = (HFONT)GetStockObject( DEFAULT_GUI_FONT ); } for (int i = 0; i < NUM_CANDSTR_MAX; i++) { if (m_rgpButton[i] != NULL) { m_rgpButton[i]->SetInlineCommentFont( hFont ); } } // repage Repage(); // update window CallOnPaint(); } /* 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 on the left of item text. ------------------------------------------------------------------------------*/ void CUIFRowList::SetInlineCommentPos( int cx ) { for (int i = 0; i < NUM_CANDSTR_MAX; i++) { if (m_rgpButton[i] != NULL) { m_rgpButton[i]->SetInlineCommentPos( cx ); } } // repage Repage(); // update window CallOnPaint(); } /* S E T I N D E X F O N T */ /*------------------------------------------------------------------------------ Set font for index ------------------------------------------------------------------------------*/ void CUIFRowList::SetIndexFont( HFONT hFont ) { } /* A D D C A N D I T E M */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ int CUIFRowList::AddCandItem( CCandListItem *pCandListItem ) { int nId = m_nItem; m_listItem.Add( pCandListItem ); m_nItem++; return nId; } /* S E T C A N D L I S T */ /*------------------------------------------------------------------------------ Set candidate list ------------------------------------------------------------------------------*/ void CUIFRowList::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 ); } } // update page info Repage(); // update window CallOnPaint(); return; } /* S E T C U R S E L */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowList::SetCurSel( int iSelection ) { CANDPAGE *pPage; m_iItemSelect = min(iSelection, m_nItem - 1); m_iItemSelect = max(0, m_iItemSelect); pPage = m_pcpCurPage; while (pPage != NULL) { if (m_iItemSelect < pPage->iPageStart) { pPage = pPage->pPrev; } else if (m_iItemSelect >= pPage->iPageStart + pPage->nPageSize) { pPage = pPage->pNext; } else { m_pcpCurPage = pPage; break; } } // layout current page row buttons position, and page button status LayoutCurPage(); NotifyCommand( UILIST_SELCHANGED, m_iItemSelect ); } /* D E L A L L C A N D I T E M */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowList::DelAllCandItem( void ) { CListItemBase *pItem; while (pItem = m_listItem.GetFirst()) { m_listItem.Remove(pItem); delete pItem; m_nItem--; } Assert(!m_nItem); m_pcpCurPage = NULL; m_iItemSelect = -1; // layout current page row buttons position, and page button status LayoutCurPage(); } /* G E T C A N D I T E M */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandListItem *CUIFRowList::GetCandItem( int nId ) { int nItem; int i; CListItemBase *pItem; nItem = m_listItem.GetCount(); for (i = 0; i < nItem; i++) { pItem = m_listItem.Get( i ); if (nId == (int)((CCandListItem*)pItem)->GetIListItem()) { return (CCandListItem*)pItem; } } return NULL; } /* G E T C U R S E L */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ int CUIFRowList::GetCurSel( void ) { return m_iItemSelect; } /* G E T T O P I T E M */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ int CUIFRowList::GetTopItem( void ) { if (m_pcpCurPage != NULL) { return m_pcpCurPage->iPageStart; } else { return -1; } } /* G E T B O T O M I T E M */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ int CUIFRowList::GetBottomItem( void ) { if (m_pcpCurPage != NULL) { return m_pcpCurPage->iPageStart + m_pcpCurPage->nPageSize; } else { return -1; } } /* I S V I S I B L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CUIFRowList::IsVisible( void ) { return CUIFObject::IsVisible(); } /* G E T R E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowList::GetRect( RECT *prc ) { CUIFObject::GetRect( prc ); } /* G E T I T E M R E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFRowList::GetItemRect( int iItem, RECT *prc ) { Assert( prc != NULL ); ::SetRect( prc, 0, 0, 0, 0 ); if (GetTopItem() <= iItem && iItem <= GetBottomItem()) { int iButton = iItem - GetTopItem(); if ((0 <= iButton && iButton < NUM_CANDSTR_MAX) && m_rgpButton[iButton]->IsVisible()) { m_rgpButton[iButton]->GetRect( prc ); } } } /* G E T I T E M C O U N T */ /*------------------------------------------------------------------------------ Returns number of candidate item (CUIFCandListBase method) ------------------------------------------------------------------------------*/ int CUIFRowList::GetItemCount( void ) { return m_nItem; } /* 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 CUIFRowList::IsItemSelectable( int iListItem ) { // Satori#3632(Cicero#3413) if (m_pcpCurPage == NULL) { return FALSE; } if ( iListItem < m_pcpCurPage->iPageStart ) { } else if ((m_pcpCurPage->iPageStart + m_pcpCurPage->nPageSize) <= iListItem) { } else { return TRUE; } return FALSE; }