// // wpopup.cpp // #include "private.h" #include "wpopup.h" #include "wcand.h" #include "globals.h" #include "res.h" #include "candutil.h" #include "candui.h" #include "candmenu.h" // UI object IDs #define IDUIF_COMMENTLIST 0x00000001 #define IDUIF_CLOSEBUTTON 0x00000002 /*=============================================================================*/ /* */ /* C U I F C O M M E N T L I S T */ /* */ /*=============================================================================*/ /* C U I F C O M M E N T L I S T */ /*------------------------------------------------------------------------------ Constructor of CUIFCommentList ------------------------------------------------------------------------------*/ CUIFCommentList::CUIFCommentList( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFListBase( pParent, dwID, prc, dwStyle ) { m_cyTitle = 0; m_cyTitleMargin = 1; m_cxCommentMargin = 9; m_cyCommentMargin = 6; m_hFontTitle = (HFONT)GetStockObject( DEFAULT_GUI_FONT ); m_hFontText = (HFONT)GetStockObject( DEFAULT_GUI_FONT ); } /* ~ C U I F C O M M E N T L I S T */ /*------------------------------------------------------------------------------ Destructor of CUIFCommentList ------------------------------------------------------------------------------*/ CUIFCommentList::~CUIFCommentList( void ) { } /* S E T R E C T */ /*------------------------------------------------------------------------------ Set rect of UI object (CUIFObject method) ------------------------------------------------------------------------------*/ void CUIFCommentList::SetRect( const RECT *prc ) { BOOL fChangeWidth = ((GetRectRef().right - GetRectRef().left) != (prc->right - prc->left)); CUIFListBase::SetRect( prc ); if (fChangeWidth) { CalcItemHeight(); } } /* A D D C O M M E N T I T E M */ /*------------------------------------------------------------------------------ Add comment item ------------------------------------------------------------------------------*/ void CUIFCommentList::AddCommentItem( CCommentListItem *pListItem ) { AddItem( pListItem ); } /* G E T C O M M E N T I T E M */ /*------------------------------------------------------------------------------ Get comment item ------------------------------------------------------------------------------*/ CCommentListItem *CUIFCommentList::GetCommentItem( int iListItem ) { return (CCommentListItem *)GetItem( iListItem ); } /* I N I T I T E M H E I G H T */ /*------------------------------------------------------------------------------ Intitalize item height NOTE: This must be called after set all comment list items ------------------------------------------------------------------------------*/ void CUIFCommentList::InitItemHeight( void ) { CalcTitleHeight(); CalcItemHeight(); } /* G E T T O T A L H E I G H T */ /*------------------------------------------------------------------------------ Get height of all items ------------------------------------------------------------------------------*/ int CUIFCommentList::GetTotalHeight( void ) { int nHeight = 0; int nItem = GetCount(); int iItem; for (iItem = 0; iItem < nItem; iItem++) { nHeight += GetItemHeight( iItem ); } return nHeight; } /* G E T M I N I M U M W I D T H */ /*------------------------------------------------------------------------------ Get minimum width ------------------------------------------------------------------------------*/ int CUIFCommentList::GetMinimumWidth( void ) { return CalcMinimumWidth(); } /* S E T T I T L E F O N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCommentList::SetTitleFont( HFONT hFont ) { m_hFontTitle = hFont; } /* S E T T E X T F O N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CUIFCommentList::SetTextFont( HFONT hFont ) { m_hFontText = hFont; } /* G E T I T E M H E I G H T */ /*------------------------------------------------------------------------------ Get height of item (CUIFListBase method) ------------------------------------------------------------------------------*/ int CUIFCommentList::GetItemHeight( int iItem ) { CCommentListItem *pItem = GetCommentItem( iItem ); Assert( pItem != NULL ); return (pItem != NULL) ? pItem->GetHeight() + m_cyTitle : 0; } /* P A I N T I T E M P R O C */ /*------------------------------------------------------------------------------ Paint list item (CUIFListBase method ) ------------------------------------------------------------------------------*/ void CUIFCommentList::PaintItemProc( HDC hDC, RECT *prc, CListItemBase *pItem, BOOL fSelected ) { CCommentListItem *pListItem = (CCommentListItem *)pItem; CCandidateItem *pCandItem; HFONT hFontOld; COLORREF colTextOld; int iBkModeOld; RECT rc; Assert( pListItem != NULL ); pCandItem = pListItem->GetCandidateItem(); Assert( pCandItem != NULL ); hFontOld = (HFONT)GetCurrentObject( hDC, OBJ_FONT ); colTextOld = GetTextColor( hDC ); iBkModeOld = SetBkMode( hDC, TRANSPARENT ); // paint title rc = *prc; rc.bottom = rc.top + m_cyTitle; if (IntersectRect( &rc, &rc, prc )) { LPCWSTR psz = pCandItem->GetString(); HPEN hPen; HPEN hPenOld; SIZE size; InflateRect( &rc, 0, -m_cyTitleMargin ); // draw title text SelectObject( hDC, m_hFontTitle ); SetTextColor( hDC, GetUIFColor( UIFCOLOR_CTRLTEXT ) ); FLExtTextOutW( hDC, rc.left, rc.top, ETO_CLIPPED, &rc, psz, wcslen(psz), NULL ); FLExtTextOutW( hDC, rc.left+1, rc.top, ETO_CLIPPED, &rc, psz, wcslen(psz), NULL ); // draw underline FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); hPen = CreatePen( PS_SOLID, 0, GetUIFColor( UIFCOLOR_BORDEROUTER ) ); hPenOld = (HPEN)SelectObject( hDC, hPen ); MoveToEx( hDC, rc.left, rc.top + size.cy, NULL ); LineTo( hDC, rc.right, rc.top + size.cy ); SelectObject( hDC, hPenOld ); DeleteObject( hPen ); } // paint comment rc = *prc; rc.top = rc.top + m_cyTitle; if (IntersectRect( &rc, &rc, prc )){ LPCWSTR psz; rc.left += m_cxCommentMargin; rc.top += m_cyCommentMargin; rc.bottom -= m_cyCommentMargin; SelectObject( hDC, m_hFontText ); SetTextColor( hDC, GetSysColor( COLOR_WINDOWTEXT ) ); psz = pCandItem->GetPopupComment(); PaintCommentProc( hDC, &rc, psz, FALSE ); } // restore device context settings SelectObject( hDC, hFontOld ); SetTextColor( hDC, colTextOld ); SetBkMode( hDC, iBkModeOld ); } /* P A I N T C O M M E N T P R O C */ /*------------------------------------------------------------------------------ Paint comment text proc returns height of comment text ------------------------------------------------------------------------------*/ int CUIFCommentList::PaintCommentProc( HDC hDC, const RECT *prc, LPCWSTR pwch, BOOL fCalcOnly ) { return FLDrawTextW( hDC, pwch, wcslen(pwch), prc, DT_TOP | DT_LEFT | DT_WORDBREAK | DT_EDITCONTROL | (fCalcOnly ? DT_CALCRECT : 0) ); } /* C A L C M I N I M U M W I D T H */ /*------------------------------------------------------------------------------ Calculate minimum width ------------------------------------------------------------------------------*/ int CUIFCommentList::CalcMinimumWidth( void ) { HDC hDC = GetDC( NULL ); int nItem = GetCount(); int iItem; HFONT hFontOld; int cxTitle = 0; // prepare DC hFontOld = (HFONT)SelectObject( hDC, m_hFontTitle ); // calc height of all items for (iItem = 0; iItem < nItem; iItem++) { CCommentListItem *pItem = GetCommentItem( iItem ); if (pItem != NULL) { CCandidateItem *pCandItem = pItem->GetCandidateItem(); SIZE size; FLGetTextExtentPoint32( hDC, pCandItem->GetString(), wcslen(pCandItem->GetString()), &size ); cxTitle = max( cxTitle, size.cx ); } } // restore DC SelectObject( hDC, hFontOld ); ReleaseDC( NULL, hDC ); return cxTitle + 1; } /* C A L C T I T L E H E I G H T */ /*------------------------------------------------------------------------------ Calculate height of title ------------------------------------------------------------------------------*/ void CUIFCommentList::CalcTitleHeight( void ) { HDC hDC = GetDC( NULL ); m_cyTitle = GetFontHeightOfFont( hDC, m_hFontTitle ) + m_cyTitleMargin * 2; ReleaseDC( NULL, hDC ); } /* C A L C I T E M H E I G H T */ /*------------------------------------------------------------------------------ Calculate height of all items ------------------------------------------------------------------------------*/ void CUIFCommentList::CalcItemHeight( void ) { HDC hDC = GetDC( NULL ); int nItem = GetCount(); int iItem; HFONT hFontOld; // prepare DC hFontOld = (HFONT)SelectObject( hDC, m_hFontText ); // calc height of all items for (iItem = 0; iItem < nItem; iItem++) { CCommentListItem *pItem = GetCommentItem( iItem ); if (pItem != NULL) { CalcItemHeightProc( hDC, pItem ); } } // restore DC SelectObject( hDC, hFontOld ); ReleaseDC( NULL, hDC ); } /* C A L C I T E M H E I G H T P R O C */ /*------------------------------------------------------------------------------ Calclate height of item main routine ------------------------------------------------------------------------------*/ void CUIFCommentList::CalcItemHeightProc( HDC hDC, CCommentListItem *pListItem ) { CCandidateItem *pCandItem = pListItem->GetCandidateItem(); RECT rc; int cyComment; GetRect( &rc ); rc.left += m_cxCommentMargin; cyComment = PaintCommentProc( hDC, &rc, pCandItem->GetPopupComment(), TRUE ) + m_cyCommentMargin * 2; pListItem->SetHeight( cyComment ); } /*============================================================================*/ /* */ /* C P O P U P C O M M E N T W I N D O W */ /* */ /*============================================================================*/ /* C P O P U P C O M M E N T W I N D O W */ /*------------------------------------------------------------------------------ Constructor of CPopupCommentWindow ------------------------------------------------------------------------------*/ CPopupCommentWindow::CPopupCommentWindow( CCandWindow *pCandWnd, CCandidateUI *pCandUI ) : CUIFWindow( g_hInst, UIWINDOW_TOPMOST | UIWINDOW_TOOLWINDOW | UIWINDOW_OFC10WORKPANE | UIWINDOW_HASSHADOW ) { m_pCandUI = pCandUI; m_pCandWnd = pCandWnd; m_pWndFrame = NULL; m_pCloseBtn = NULL; m_pCaption = NULL; m_pCommentList = NULL; m_hIconClose = NULL; m_fUserMoved = FALSE; // initialize event sinks CCandListEventSink::InitEventSink( m_pCandUI->GetCandListMgr() ); CCandUIPropertyEventSink::InitEventSink( m_pCandUI->GetPropertyMgr() ); // initialize resources m_hIconClose = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE(IDI_ICONCLOSE), IMAGE_ICON, 0, 0, LR_LOADMAP3DCOLORS ); } /* ~ C P O P U P C O M M E N T W I N D O W */ /*------------------------------------------------------------------------------ Destructor of CPopupCommentWindow ------------------------------------------------------------------------------*/ CPopupCommentWindow::~CPopupCommentWindow( void ) { // dispose resources DestroyIcon( m_hIconClose ); // CCandUIPropertyEventSink::DoneEventSink(); CCandListEventSink::DoneEventSink(); } /* G E T C L A S S N A M E */ /*------------------------------------------------------------------------------ (CUIFWindow method) ------------------------------------------------------------------------------*/ LPCTSTR CPopupCommentWindow::GetClassName( void ) { return _T( WNDCLASS_POPUPWND ); } /* G E T W N D T I T L E */ /*------------------------------------------------------------------------------ (CUIFWindow method) ------------------------------------------------------------------------------*/ LPCTSTR CPopupCommentWindow::GetWndTitle( void ) { return _T( WNDTITLE_POPUPWND ); } /* O N S E T C A N D I D A T E L I S T */ /*------------------------------------------------------------------------------ Callback function on SetCandidateList (CCandListEventSink method) NOTE: Do not update candidate item in the callback functios ------------------------------------------------------------------------------*/ void CPopupCommentWindow::OnSetCandidateList( void ) { Assert( FInitialized() ); SetCommentListProc(); LayoutWindow(); } /* O N C L E A R C A N D I D A T E L I S T */ /*------------------------------------------------------------------------------ Callback function on ClearCandidateList (CCandListEventSink method) NOTE: Do not update candidate item in the callback functios ------------------------------------------------------------------------------*/ void CPopupCommentWindow::OnClearCandidateList( void ) { Assert( FInitialized() ); ClearCommentListProc(); LayoutWindow(); } /* O N C A N D I T E M U P D A T E */ /*------------------------------------------------------------------------------ Callback function of candiate item has been updated (CCandListEventSink method) NOTE: Do not update candidate item in the callback functios ------------------------------------------------------------------------------*/ void CPopupCommentWindow::OnCandItemUpdate( void ) { Assert( FInitialized() ); SetCommentListProc(); LayoutWindow(); } /* O N S E L E C T I O N C H A N G E D */ /*------------------------------------------------------------------------------ Callback function of candiate selection has been changed (CCandListEventSink method) NOTE: Do not update candidate item in the callback functios ------------------------------------------------------------------------------*/ void CPopupCommentWindow::OnSelectionChanged( void ) { Assert( FInitialized() ); } /* O N P R O P E R T Y U P D A T E D */ /*------------------------------------------------------------------------------ Callback function on update CandiateUI property (CCandUIPropertyEventSink method) ------------------------------------------------------------------------------*/ void CPopupCommentWindow::OnPropertyUpdated( CANDUIPROPERTY prop, CANDUIPROPERTYEVENT event ) { switch (prop) { case CANDUIPROP_POPUPCOMMENTWINDOW: { if (event == CANDUIPROPEV_UPDATEPOSITION) { POINT pt; RECT rc; GetPropertyMgr()->GetPopupCommentWindowProp()->GetPosition( &pt ); rc.left = pt.x; rc.top = pt.y; rc.right = pt.x + _nWidth; rc.bottom = pt.y + _nHeight; AdjustWindowRect( NULL, &rc, &pt, FALSE ); if (rc.left != _xWnd || rc.top != _yWnd) { Move( rc.left, rc.top, -1, -1 ); } } else { LayoutWindow( TRUE /* resize/repos always */ ); } break; } default: { LayoutWindow( TRUE /* resize/repos always */ ); break; } } } /* I N I T I A L I Z E */ /*------------------------------------------------------------------------------ Initialize UI objects ------------------------------------------------------------------------------*/ CUIFObject *CPopupCommentWindow::Initialize( void ) { RECT rc = {0}; // // create window frame // m_pWndFrame = new CUIFWndFrame( this, &rc, UIWNDFRAME_ROUNDTHICK | UIWNDFRAME_RESIZERIGHT ); if (m_pWndFrame) { m_pWndFrame->Initialize(); AddUIObj( m_pWndFrame ); } // // create caption // m_pCaption = new CUIFWndCaption( this, 0, &rc, UIWNDCAPTION_MOVABLE ); if (m_pCaption) { m_pCaption->Initialize(); AddUIObj( m_pCaption ); } // // create close button // m_pCloseBtn = new CUIFCaptionButton( this, IDUIF_CLOSEBUTTON, &rc, UIBUTTON_PUSH | UIBUTTON_CENTER | UIBUTTON_VCENTER ); if (m_pCloseBtn) { m_pCloseBtn->Initialize(); m_pCloseBtn->SetIcon( m_hIconClose ); AddUIObj( m_pCloseBtn ); } // // create list // m_pCommentList = new CUIFCommentList( this, IDUIF_COMMENTLIST, &rc, UILIST_HORZTB | UILIST_VARIABLEHEIGHT ); if (m_pCommentList) { m_pCommentList->Initialize(); AddUIObj( m_pCommentList ); } return CUIFWindow::Initialize(); } /* M O V E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CPopupCommentWindow::Move( int x, int y, int nWidth, int nHeight ) { BOOL fResize = (nWidth != -1 || nHeight != -1); RECT rc; if (fResize) { RECT rcTest; int nHeightNew; // if (nWidth == -1) { nWidth = _nWidth; } if (nHeight == -1) { nHeight = _nHeight; } // get resizable width rc.left = _xWnd; rc.top = _yWnd; rc.right = _xWnd + nWidth; rc.bottom = _yWnd + nHeight; AdjustWindowRect( GetWnd(), &rc, NULL, TRUE ); nWidth = rc.right - rc.left; // get expected window height rcTest.left = 0; rcTest.top = 0; rcTest.right = nWidth; rcTest.bottom = nHeight; nHeightNew = LayoutWindowProc( &rcTest ); if (0 < nHeightNew) { nHeight = nHeightNew; } // adjust window pos again (because height might be changed) rc.left = _xWnd; rc.top = _yWnd; rc.right = _xWnd + nWidth; rc.bottom = _yWnd + nHeight; AdjustWindowRect( GetWnd(), &rc, NULL, FALSE ); } else { m_fUserMoved = TRUE; // ensure window is on workarea rc.left = x; rc.top = y; rc.right = x + _nWidth; rc.bottom = y + _nHeight; AdjustWindowRect( GetWnd(), &rc, NULL, FALSE ); } CUIFWindow::Move( rc.left, rc.top, nWidth, nHeight ); if (fResize) { // re-layout child object again // (window size should not be changed by this...) LayoutWindow(); } } /* O N W I N D O W P O S C H A N G E D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ LRESULT CPopupCommentWindow::OnWindowPosChanged( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LRESULT lResult = CUIFWindow::OnWindowPosChanged( hWnd, uMsg, wParam, lParam ); m_pCandWnd->OnCommentWindowMoved(); return lResult; } /* O N O B J E C T N O T I F Y */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ LRESULT CPopupCommentWindow::OnObjectNotify( CUIFObject *pUIObj, DWORD dwCommand, LPARAM lParam ) { DWORD dwID = pUIObj->GetID(); // comment list if (dwID == IDUIF_COMMENTLIST) { switch (dwCommand) { case UILIST_SELECTED: { int iCandItem = CandItemFromListItem( (int)lParam ); m_pCandWnd->OnCommentSelected( iCandItem ); break; } } } // close button else if (dwID == IDUIF_CLOSEBUTTON) { switch (dwCommand) { case UIBUTTON_PRESSED: { m_pCandWnd->OnCommentClose(); break; } } } return 0; } /* O N C R E A T E */ /*------------------------------------------------------------------------------ on create ------------------------------------------------------------------------------*/ void CPopupCommentWindow::OnCreate( HWND hWnd ) { SetProp( hWnd, (LPCTSTR)GlobalAddAtom(_T("MicrosoftTabletPenServiceProperty")), (HANDLE)1 ); } /* O N N C D E S T R O Y */ /*------------------------------------------------------------------------------ on n c destroy ------------------------------------------------------------------------------*/ void CPopupCommentWindow::OnNCDestroy( HWND hWnd ) { RemoveProp( hWnd, (LPCTSTR)GlobalAddAtom(_T("MicrosoftTabletPenServiceProperty")) ); } /* D E S T R O Y W N D */ /*------------------------------------------------------------------------------ Destroy candidate window ------------------------------------------------------------------------------*/ void CPopupCommentWindow::DestroyWnd( void ) { DestroyWindow( GetWnd() ); } /* L A Y O U T W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CPopupCommentWindow::LayoutWindow( BOOL fResize ) { RECT rcWnd = GetRectRef(); int nHeight; // get expected window size nHeight = LayoutWindowProc( &rcWnd ); // change window size if required if (fResize || ((0 < nHeight) && (GetRectRef().bottom - GetRectRef().top != nHeight))) { int nWidth = GetRectRef().right - GetRectRef().left; RECT rc; if (m_fUserMoved || !GetPropertyMgr()->GetPopupCommentWindowProp()->IsAutoMoveEnabled()) { rc.left = _xWnd; rc.top = _yWnd; rc.right = _xWnd + nWidth; rc.bottom = _yWnd + nHeight; AdjustWindowRect( GetWnd(), &rc, NULL, FALSE ); CUIFWindow::Move( rc.left, rc.top, nWidth, nHeight ); } else { POINT pt; CalcPos( &pt, nWidth, nHeight ); CUIFWindow::Move( pt.x, pt.y, nWidth, nHeight ); } // layout again rcWnd = GetRectRef(); LayoutWindowProc( &rcWnd ); } } /* L A Y O U T W I N D O W P R O C */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ int CPopupCommentWindow::LayoutWindowProc( RECT *prcWnd ) { RECT rcInt = *prcWnd; RECT rc; int cyFrame = 0; int cyList = 0; int cyCaption = 0; // set font if (m_pCommentList != NULL) { m_pCommentList->SetTitleFont( GetPropertyMgr()->GetPopupCommentTitleProp()->GetFont() ); m_pCommentList->SetTextFont( GetPropertyMgr()->GetPopupCommentTextProp()->GetFont() ); } // layout frame if (m_pWndFrame != NULL) { m_pWndFrame->SetRect( prcWnd ); m_pWndFrame->Show( TRUE ); m_pWndFrame->GetInternalRect( &rcInt ); cyFrame = (prcWnd->bottom - prcWnd->top) - (rcInt.bottom - rcInt.top); } // layout caption if (m_pCaption != NULL) { rc.left = rcInt.left; rc.top = rcInt.top; rc.right = rcInt.right; rc.bottom = rcInt.top + 16; m_pCaption->SetRect( &rc ); m_pCaption->Show( TRUE ); cyCaption = 16; } // layout close button if (m_pCloseBtn != NULL) { rc.left = rcInt.right - cyCaption; rc.top = rcInt.top; rc.right = rcInt.right; rc.bottom = rcInt.top + cyCaption; m_pCloseBtn->SetRect( &rc ); m_pCloseBtn->Show( TRUE ); } // layout list if (m_pCommentList != NULL) { rc.left = rcInt.left + 6; rc.top = rcInt.top + 16; rc.right = rcInt.right - 6; rc.bottom = rcInt.bottom; m_pCommentList->SetRect( &rc ); m_pCommentList->Show( TRUE ); cyList = m_pCommentList->GetTotalHeight(); } return ((cyList != 0) ? cyFrame + cyList + cyCaption : (-1)); } /* O N C A N D W I N D O W M O V E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CPopupCommentWindow::OnCandWindowMove( BOOL fResetAnyway ) { POINT pt; if (!fResetAnyway && m_fUserMoved) { return; } m_fUserMoved = FALSE; if (!GetPropertyMgr()->GetPopupCommentWindowProp()->IsAutoMoveEnabled()) { return; } CalcPos( &pt, _nWidth, _nHeight ); CUIFWindow::Move( pt.x, pt.y, -1, -1 ); } /* S E T C O M M E N T L I S T P R O C */ /*------------------------------------------------------------------------------ Set comment list ------------------------------------------------------------------------------*/ void CPopupCommentWindow::SetCommentListProc( void ) { CCandidateList *pCandList; int i; int nCandItem; int cxMinimum; RECT rc; SIZE sizeFrame = {0}; SIZE size; if (m_pCommentList == NULL) { return; } pCandList = GetCandListMgr()->GetCandList(); Assert( pCandList != NULL ); // reset list item m_pCommentList->DelAllItem(); // Windows#482518/Satori81#907 - prevent from AV in case that we cannot get candidate list instance if (pCandList == NULL) { return; } // add list item nCandItem = pCandList->GetItemCount(); for (i = 0; i < nCandItem; i++) { CCandidateItem *pCandItem; pCandItem = pCandList->GetCandidateItem( i ); if (pCandItem->IsVisible() && pCandItem->IsPopupCommentVisible()) { CCommentListItem *pListItem = new CCommentListItem( i, pCandItem ); if (pListItem) m_pCommentList->AddCommentItem( pListItem ); } } // get minimum width cxMinimum = m_pCommentList->GetMinimumWidth(); if (m_pWndFrame != NULL) { m_pWndFrame->GetFrameSize( &sizeFrame ); } size.cx = cxMinimum + sizeFrame.cx + sizeFrame.cx + 6 + 6; size.cy = -1; size.cx = max( size.cx, GetSystemMetrics( SM_CXMIN ) ); // resize window when needed GetRect( &rc ); if ((rc.right - rc.left) < size.cx) { Move( _xWnd, _yWnd, size.cx, size.cy ); } // set minimum window size if (m_pWndFrame != NULL) { m_pWndFrame->SetMinimumSize( &size ); } // calc list item height m_pCommentList->InitItemHeight(); // update window if (m_hWnd != NULL) { InvalidateRect( m_hWnd, NULL, TRUE ); } } /* C L E A R C O M M E N T L I S T P R O C */ /*------------------------------------------------------------------------------ Clear comment list ------------------------------------------------------------------------------*/ void CPopupCommentWindow::ClearCommentListProc( void ) { m_pCommentList->DelAllItem(); } /* C A N D I T E M F R O M L I S T I T E M */ /*------------------------------------------------------------------------------ Get index of candidate item in candidate list data from index of item in UIList object ------------------------------------------------------------------------------*/ int CPopupCommentWindow::CandItemFromListItem( int iListItem ) { CCommentListItem *pListItem; if (m_pCommentList == NULL) { return ICANDITEM_NULL; } pListItem = m_pCommentList->GetCommentItem( iListItem ); Assert( pListItem != NULL ); return (pListItem != NULL) ? pListItem->GetICandItem() : ICANDITEM_NULL; } /* C A L C P O S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CPopupCommentWindow::CalcPos( POINT *ppt, int nWidth, int nHeight ) { RECT rcCandWnd; RECT rc; int cxOffset; int cyOffset; CUIFBalloonWindow *pCandTipWnd; CCandMenu *pCandMenu; WNDALIGNH HAlign; WNDALIGNV VAlign; GetWindowRect( m_pCandWnd->GetWnd(), &rcCandWnd ); // calc align switch (GetPropertyMgr()->GetCandWindowProp()->GetUIDirection()) { default: case CANDUIDIR_TOPTOBOTTOM: { HAlign = LOCATE_RIGHT; VAlign = ALIGN_TOP; break; } case CANDUIDIR_BOTTOMTOTOP: { HAlign = LOCATE_RIGHT; VAlign = ALIGN_BOTTOM; break; } case CANDUIDIR_RIGHTTOLEFT: { HAlign = ALIGN_LEFT; VAlign = LOCATE_BELLOW; break; } case CANDUIDIR_LEFTTORIGHT: { HAlign = ALIGN_LEFT; VAlign = LOCATE_BELLOW; break; } } // calc offset to don't overlap with tip cxOffset = 0; cyOffset = 0; pCandTipWnd = m_pCandWnd->GetCandTipWindowObj(); if (pCandTipWnd != NULL && IsWindow( pCandTipWnd->GetWnd() ) && pCandTipWnd->IsVisible()) { RECT rcCandTipWnd; GetWindowRect( pCandTipWnd->GetWnd(), &rcCandTipWnd ); switch (GetPropertyMgr()->GetCandWindowProp()->GetUIDirection()) { default: case CANDUIDIR_TOPTOBOTTOM: { cyOffset += rcCandTipWnd.bottom - rcCandWnd.top; break; } case CANDUIDIR_BOTTOMTOTOP: { cyOffset += rcCandTipWnd.top - rcCandWnd.bottom - 1; break; } case CANDUIDIR_RIGHTTOLEFT: { rcCandWnd.top = min( rcCandWnd.top, rcCandTipWnd.top ); rcCandWnd.bottom = max( rcCandWnd.bottom, rcCandTipWnd.bottom ); break; } case CANDUIDIR_LEFTTORIGHT: { rcCandWnd.top = min( rcCandWnd.top, rcCandTipWnd.top ); rcCandWnd.bottom = max( rcCandWnd.bottom, rcCandTipWnd.bottom ); break; } } } // calc pos CalcWindowRect( &rc, &rcCandWnd, nWidth, nHeight, cxOffset, cyOffset, HAlign, VAlign ); // recalc pos to don't overlap with menu pCandMenu = m_pCandWnd->GetCandMenu(); if (pCandMenu != NULL) { CUIFMenu *pCandMenuWnd; pCandMenuWnd = pCandMenu->GetMenuUI(); if (pCandMenuWnd != NULL) { RECT rcCandMenu; RECT rcUnion; RECT rcIntersect; GetWindowRect( pCandMenuWnd->GetWnd(), &rcCandMenu ); if (IntersectRect( &rcIntersect, &rc, &rcCandMenu )) { UnionRect( &rcUnion, &rcCandWnd, &rcCandMenu ); switch (GetPropertyMgr()->GetCandWindowProp()->GetUIDirection()) { default: case CANDUIDIR_TOPTOBOTTOM: { cyOffset += rcCandWnd.top - min( rcCandWnd.top, rcUnion.top ); break; } case CANDUIDIR_BOTTOMTOTOP: { cyOffset += rcCandWnd.bottom - max( rcCandWnd.bottom, rcUnion.bottom ); break; } case CANDUIDIR_RIGHTTOLEFT: { // cxOffset = rcCandWnd.right - max( rcCandWnd.right, rcUnion.right ); cxOffset += rcCandWnd.left - min( rcCandWnd.left, rcUnion.left ); break; } case CANDUIDIR_LEFTTORIGHT: { cxOffset += rcCandWnd.left - min( rcCandWnd.left, rcUnion.left ); break; } } CalcWindowRect( &rc, &rcUnion, nWidth, nHeight, cxOffset, cyOffset, HAlign, VAlign ); } } } ppt->x = rc.left; ppt->y = rc.top; }