// // wcand.cpp // #include "private.h" #include "wcand.h" #include "globals.h" #include "res.h" #include "candutil.h" #include "candui.h" #include "wpopup.h" #include "candmenu.h" #include "cuishadw.h" #define NUM_CANDSTR_MAX 9 // UI object IDs #define IDUIF_CANDNUMBUTTON 0x00000001 #define IDUIF_CANDIDATELIST 0x00000010 #define IDUIF_CANDIDATEMENU 0x00000011 #define IDUIF_RAWDATA 0x00000012 #define IDUIF_EXTCANDIDATELIST 0x00000013 #define IDUIF_OPTIONSLIST 0x00000014 #define IDUIF_BORDERLEFT 0x00000020 #define IDUIF_BORDERBOTTOM 0x00000021 #define IDUIF_BORDERRAWDATA 0x00000022 #define IDUIF_BORDER 0x00000023 #define IDUIF_CAPTION 0x00000024 #define IDUIF_BORDEREXTRACAND 0x00000025 #define IDUIF_CANDTIPBTN 0x00000026 #define IDUIF_BORDEROPTIONSCAND 0x00000027 #define IDUIF_EXTENDED 0x10000000 #define IDTIMER_POPUPCOMMENT_SELECT 0x6749 #define IDTIMER_POPUPCOMMENT_HOVER 0x674a #define IDTIMER_MENU_HOVER 0x674b // The menu hover timer is used by the options list object to emulate menu items // much more closely. Otherwise there may be a 1 second pause before they lose // highlighting when the standard cuilib mouseout timer kicks in to detect the // mouse leave event. It is set to 50ms currently and this causes the menus to // behave identically to normal menu items. It *only* affects the options menu // items - everything else gets the existing 1 second timer. #define CX_COMMENTWINDOW 200 /* C C A N D U I O B J E C T P A R E N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIObjectParent::CCandUIObjectParent( void ) { m_pUIObjectMgr = NULL; } /* ~ C C A N D U I O B J E C T P A R E N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIObjectParent::~CCandUIObjectParent( void ) { Uninitialize(); } /* I N T I I A L I Z E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandUIObjectParent::Initialize( CCandUIObjectMgr *pUIObjectMgr ) { Assert( pUIObjectMgr ); m_pUIObjectMgr = pUIObjectMgr; m_pUIObjectMgr->SetUIObjectParent( this ); return S_OK; } /* U N I N I T I A L I Z E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandUIObjectParent::Uninitialize( void ) { if (m_pUIObjectMgr != NULL) { m_pUIObjectMgr->SetUIObjectParent( NULL ); m_pUIObjectMgr = NULL; } return S_OK; } /* N O T I F Y U I O B J E C T E V E N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandUIObjectParent::NotifyUIObjectEvent( CANDUIOBJECT obj, CANDUIOBJECTEVENT event ) { if (m_pUIObjectMgr != NULL) { m_pUIObjectMgr->NotifyUIObjectEvent( obj, event ); } } /*============================================================================*/ /* */ /* C C A N D W I N D O W B A S E */ /* */ /*============================================================================*/ /* C C A N D W I N D O W B A S E */ /*------------------------------------------------------------------------------ Constructor of CCandWindowBase ------------------------------------------------------------------------------*/ CCandWindowBase::CCandWindowBase( CCandidateUI *pCandUI, DWORD dwStyle ) : CUIFWindow( g_hInst, dwStyle | UIWINDOW_HASTOOLTIP | UIWINDOW_HASSHADOW ) { int cxyIconMenuSize; m_cRef = 1; m_pCandUI = pCandUI; m_pCandAcc = NULL; m_pCandMenuBtn = NULL; m_pCandMenu = NULL; m_fCandMenuOpen = FALSE; m_nExtUIObj = 0; m_pCandRawData = NULL; m_fHasRawData = FALSE; m_fTargetClipped = FALSE; m_fOnSelectionChanged = FALSE; ::SetRect( &m_rcTarget, 0, 0, 0, 0 ); // initialize event sinks CCandListEventSink::InitEventSink( m_pCandUI->GetCandListMgr() ); CCandUIPropertyEventSink::InitEventSink( m_pCandUI->GetPropertyMgr() ); CCandUIExtensionEventSink::InitEventSink( m_pCandUI->GetExtensionMgr() ); // initialize resources cxyIconMenuSize = GetMenuIconSize(); m_hIconMenu = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE(IDI_ICONMENU), IMAGE_ICON, cxyIconMenuSize, cxyIconMenuSize, 0 ); m_hIconPopupOn = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE(IDI_ICONPOPUPON), IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS ); m_hIconPopupOff = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE(IDI_ICONPOPUPOFF), IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS ); m_hIconCandTipOn = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE(IDI_ICONTIPON), IMAGE_ICON, cxyIconMenuSize, cxyIconMenuSize, 0 ); m_hIconCandTipOff = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE(IDI_ICONTIPOFF), IMAGE_ICON, cxyIconMenuSize, cxyIconMenuSize, 0 ); // initialize accessibility object m_pCandAcc = new CCandAccessible( this ); // initialize as object parent CCandUIObjectParent::Initialize( m_pCandUI->GetUIObjectMgr() ); m_pCandUI->AddRef(); } /* ~ C C A N D W I N D O W B A S E */ /*------------------------------------------------------------------------------ Destructor of CCandWindowBase ------------------------------------------------------------------------------*/ CCandWindowBase::~CCandWindowBase() { // uninitialize as object parent CCandUIObjectParent::Uninitialize(); // dispose resources DestroyIcon( m_hIconMenu ); DestroyIcon( m_hIconPopupOn ); DestroyIcon( m_hIconPopupOff ); DestroyIcon( m_hIconCandTipOn ); DestroyIcon( m_hIconCandTipOff ); // CCandUIExtensionEventSink::DoneEventSink(); CCandUIPropertyEventSink::DoneEventSink(); CCandListEventSink::DoneEventSink(); if (m_pCandAcc != NULL) { m_pCandAcc->Release(); m_pCandAcc = NULL; } m_pCandUI->Release(); } /* A D D R E F */ /*------------------------------------------------------------------------------ Increment reference count (local method) ------------------------------------------------------------------------------*/ ULONG CCandWindowBase::AddRef( void ) { m_cRef++; return m_cRef; } /* R E L E A S E */ /*------------------------------------------------------------------------------ Decrement reference count and release object (local method) ------------------------------------------------------------------------------*/ ULONG CCandWindowBase::Release( void ) { m_cRef--; if (0 < m_cRef) { return m_cRef; } delete this; return 0; } /* 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 CCandWindowBase::OnSetCandidateList( void ) { Assert( FInitialized() ); SetCandidateListProc(); LayoutWindow(); SetSelectionProc(); } /* 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 CCandWindowBase::OnClearCandidateList( void ) { Assert( FInitialized() ); ClearCandidateListProc(); } /* 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 CCandWindowBase::OnCandItemUpdate( void ) { Assert( FInitialized() ); SetCandidateListProc(); SetSelectionProc(); } /* 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 CCandWindowBase::OnSelectionChanged( void ) { Assert( FInitialized() ); Assert( !m_fOnSelectionChanged ); m_fOnSelectionChanged = TRUE; SetSelectionProc(); m_fOnSelectionChanged = FALSE; } /* 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 CCandWindowBase::OnPropertyUpdated( CANDUIPROPERTY prop, CANDUIPROPERTYEVENT event ) { Assert( FInitialized() ); switch (prop) { case CANDUIPROP_CANDWINDOW: { if (event == CANDUIPROPEV_UPDATEVISIBLESTATE) { Show( GetPropertyMgr()->GetCandWindowProp()->IsVisible() ); } else if (event == CANDUIPROPEV_UPDATEPOSITION) { POINT pt; GetPropertyMgr()->GetCandWindowProp()->GetPosition( &pt ); SetWindowPos( pt ); } else { LayoutWindow(); } break; } case CANDUIPROP_TOOLTIP: { CUIFToolTip *pWndToolTip = GetToolTipWnd(); CUIFBalloonWindow *pWndCandTip = GetCandTipWindowObj(); if (pWndToolTip != NULL) { pWndToolTip->SetFont( GetPropertyMgr()->GetToolTipProp()->GetFont() ); pWndToolTip->Enable( GetPropertyMgr()->GetToolTipProp()->IsEnabled() ); } if (pWndCandTip != NULL) { pWndCandTip->SetFont( GetPropertyMgr()->GetToolTipProp()->GetFont() ); } break; } default: { LayoutWindow(); break; } } } /* O N E X T E N S I O N A D D */ /*------------------------------------------------------------------------------ Callback function on create extension (CCandUIExtensionEventSink method) ------------------------------------------------------------------------------*/ void CCandWindowBase::OnExtensionAdd( LONG iExtension ) { // NOTE: need to rebuild all UI objects to match index correctly DeleteExtensionObjects(); CreateExtensionObjects(); LayoutWindow(); } /* O N E X T E N S I O N D E L E T E D */ /*------------------------------------------------------------------------------ Callback function on delete extension (CCandUIExtensionEventSink method) ------------------------------------------------------------------------------*/ void CCandWindowBase::OnExtensionDeleted( LONG iExtension ) { // NOTE: need to rebuild all UI objects to match index correctly DeleteExtensionObjects(); CreateExtensionObjects(); LayoutWindow(); } /* O N E X T E N S I O N U P D A T E D */ /*------------------------------------------------------------------------------ Callback function on update extension (CCandUIExtensionEventSink method) ------------------------------------------------------------------------------*/ void CCandWindowBase::OnExtensionUpdated( LONG iExtension ) { SetExtensionObjectProps(); LayoutWindow(); } /* G E T C L A S S N A M E */ /*------------------------------------------------------------------------------ (CUIFWindow method) ------------------------------------------------------------------------------*/ LPCTSTR CCandWindowBase::GetClassName( void ) { return _T( WNDCLASS_CANDWND ); } /* G E T W N D T I T L E */ /*------------------------------------------------------------------------------ (CUIFWindow method) ------------------------------------------------------------------------------*/ LPCTSTR CCandWindowBase::GetWndTitle( void ) { return _T( WNDTITLE_CANDWND ); } /* I N I T I A L I Z E */ /*------------------------------------------------------------------------------ Initialize UI objects ------------------------------------------------------------------------------*/ CUIFObject *CCandWindowBase::Initialize( void ) { // // Here register candidate window class. // WNDCLASSEX WndClass; LPCTSTR pszClassName = GetClassName(); memset(&WndClass, 0, sizeof(WndClass)); WndClass.cbSize = sizeof(WndClass); WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_IME; WndClass.lpfnWndProc = WindowProcedure; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 8; WndClass.hInstance = g_hInst; WndClass.hIcon = NULL; WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = NULL; WndClass.lpszMenuName = NULL; WndClass.lpszClassName = pszClassName; WndClass.hIconSm = NULL; RegisterClassEx(&WndClass); CUIFObject *pUIObjRet; CUIFToolTip *pWndToolTip; // call CUIFWindow::Initialize() to create tooltip window pUIObjRet = CUIFWindow::Initialize(); // set tooltip font pWndToolTip = GetToolTipWnd(); if (GetToolTipWnd() != NULL) { pWndToolTip->SetFont( GetPropertyMgr()->GetToolTipProp()->GetFont() ); pWndToolTip->Enable( GetPropertyMgr()->GetToolTipProp()->IsEnabled() ); } return pUIObjRet; } /* S H O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::Show( BOOL fShow ) { if (!fShow && (m_pCandMenu != NULL)) { m_pCandMenu->ClosePopup(); } CUIFWindow::Show( fShow ); } /* O N C R E A T E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::OnCreate( HWND hWnd ) { SetProp( hWnd, (LPCTSTR)GlobalAddAtom(_T("MicrosoftTabletPenServiceProperty")), (HANDLE)1 ); if (m_pCandAcc != NULL) { m_pCandAcc->SetWindow( hWnd ); } NotifyUIObjectEvent( CANDUIOBJ_CANDWINDOW, CANDUIOBJEV_CREATED ); } /* O N D E S T R O Y */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::OnDestroy( HWND hWnd ) { NotifyUIObjectEvent( CANDUIOBJ_CANDWINDOW, CANDUIOBJEV_DESTROYED ); // NotifyWinEvent( EVENT_OBJECT_DESTROY ); if (m_pCandAcc != NULL) { m_pCandAcc->ClearAccItem(); m_pCandAcc->SetWindow( NULL ); } } /* O N N C D E S T R O Y */ /*------------------------------------------------------------------------------ on n c destroy ------------------------------------------------------------------------------*/ void CCandWindowBase::OnNCDestroy( HWND hWnd ) { RemoveProp( hWnd, (LPCTSTR)GlobalAddAtom(_T("MicrosoftTabletPenServiceProperty")) ); } /* O N S Y S C O L O R C H A N G E */ /*------------------------------------------------------------------------------ (CUIFWindow method) ------------------------------------------------------------------------------*/ void CCandWindowBase::OnSysColorChange() { int cxyIconMenuSize; // reload menu button icon DestroyIcon( m_hIconMenu ); DestroyIcon( m_hIconCandTipOn ); DestroyIcon( m_hIconCandTipOff ); cxyIconMenuSize = GetMenuIconSize(); m_hIconMenu = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE(IDI_ICONMENU), IMAGE_ICON, cxyIconMenuSize, cxyIconMenuSize, 0 ); m_hIconCandTipOn = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE(IDI_ICONTIPON), IMAGE_ICON, cxyIconMenuSize, cxyIconMenuSize, 0 ); m_hIconCandTipOff = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE(IDI_ICONTIPOFF), IMAGE_ICON, cxyIconMenuSize, cxyIconMenuSize, 0 ); if (m_pCandMenuBtn) { m_pCandMenuBtn->SetIcon( m_hIconMenu ); } // re-layout objects LayoutWindow(); } /* O N S H O W W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ LRESULT CCandWindowBase::OnShowWindow( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { // MSAA support if (wParam) { NotifyWinEvent( EVENT_OBJECT_SHOW ); // REVIEW: KOJIW: Unless we send notify EVENT_OBJECT_FOCUS, we never // receive WM_GETOBJECT message. Why??? NotifyWinEvent( EVENT_OBJECT_FOCUS ); } else { NotifyWinEvent( EVENT_OBJECT_HIDE ); } return CUIFWindow::OnShowWindow( hWnd, uMsg, wParam, lParam ); } /* O N W I N D O W P O S C H A N G E D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ LRESULT CCandWindowBase::OnWindowPosChanged( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LRESULT lResult = CUIFWindow::OnWindowPosChanged( hWnd, uMsg, wParam, lParam ); NotifyUIObjectEvent( CANDUIOBJ_CANDWINDOW, CANDUIOBJEV_UPDATED ); return lResult; } /* O N G E T O B J E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ LRESULT CCandWindowBase::OnGetObject( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LRESULT lResult = 0; switch (lParam) { //----------------------------------------------------- // We process the OBJID_CLIENT object identifier; // this is the client area of our application // window. //----------------------------------------------------- case OBJID_CLIENT: { HRESULT hr; if (m_pCandAcc == NULL) { lResult = (LRESULT)E_OUTOFMEMORY; break; } if (!m_pCandAcc->FInitialized()) { //----------------------------------------------------- // Initialize our Accessible object. If the // initialization fails, delete the Accessible // object and return the failure code. //----------------------------------------------------- hr = m_pCandAcc->Initialize(); if (FAILED( hr )) { m_pCandAcc->Release(); m_pCandAcc = NULL; lResult = (LRESULT)hr; break; } //----------------------------------------------------- // Send an EVENT_OBJECT_CREATE WinEvent for the // creation of the Accessible object for the // client area. //----------------------------------------------------- NotifyWinEvent( EVENT_OBJECT_CREATE ); } //----------------------------------------------------- // Call LresultFromObject() to create reference to // our Accessible object that MSAA will marshal to // the client. //----------------------------------------------------- lResult = m_pCandAcc->CreateRefToAccObj( wParam ); break; } default: { lResult = (LRESULT)0L; } } return lResult; } /* O N O B J E C T N O T I F Y */ /*------------------------------------------------------------------------------ (CUIFWindow method) ------------------------------------------------------------------------------*/ LRESULT CCandWindowBase::OnObjectNotify( CUIFObject *pUIObj, DWORD dwCommand, LPARAM lParam ) { DWORD dwID = pUIObj->GetID(); // candidate num buttons if (IDUIF_CANDNUMBUTTON <= dwID && dwID < (IDUIF_CANDNUMBUTTON + NUM_CANDSTR_MAX)) { int iListItem = GetUIListObj()->GetTopItem() + (dwID - 1); if (SelectItemProc( iListItem )) { CompleteCandidate(); } } // candidate menu button else if (dwID == IDUIF_CANDIDATEMENU) { if (m_pCandMenuBtn->GetToggleState()) { OpenCandidateMenu(); } } // candidate list else if (dwID == IDUIF_CANDIDATELIST) { switch (dwCommand) { case UILIST_SELECTED: { CompleteCandidate(); break; } case UILIST_SELCHANGED: { SelectCandidate(); break; } } } // options candidate list else if (dwID == IDUIF_OPTIONSLIST) { switch (dwCommand) { case UILIST_SELECTED: { CompleteOptionCandidate(); break; } case UILIST_SELCHANGED: { SelectCandidate(); break; } } } // candidate rawdata else if (dwID == IDUIF_RAWDATA) { switch (dwCommand) { case UICANDRAWDATA_CLICKED: { if (GetCandListMgr()->GetCandList()->FRawDataSelectable()) { m_pCandUI->NotifyCompleteRawData(); } break; } } } // extended UI objects else if (IDUIF_EXTENDED <= dwID && dwID < (DWORD)(IDUIF_EXTENDED + GetExtensionMgr()->GetExtensionNum())) { LONG iExtension = dwID - IDUIF_EXTENDED; GetExtensionMgr()->UpdateExtProp( iExtension, pUIObj ); m_pCandUI->NotifyExtensionEvent( iExtension, dwCommand, lParam ); } return 0; } /* O N U S E R */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::OnUser(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { if (uMsg == WM_USER) { ProcessCommand( (CANDUICOMMAND)wParam, (int)lParam ); } } /* I N I T C A N D I D A T E L I S T */ /*------------------------------------------------------------------------------ Initialize candidate list data in candidate window ------------------------------------------------------------------------------*/ void CCandWindowBase::InitCandidateList( void ) { // set candidate list data SetCandidateListProc(); // prepare to layout window // NOTE: Call it only once when initializing. PrepareLayout(); // layout ui objects LayoutWindow(); // set the selection SetSelectionProc(); } /* P R O C E S S C O M M A N D */ /*------------------------------------------------------------------------------ Process candidate commands Return value: S_OK : command processed successfully S_FALSE : command has not processed but not error E_FAIL : command is failed ------------------------------------------------------------------------------*/ HRESULT CCandWindowBase::ProcessCommand( CANDUICOMMAND cmd, INT iParam ) { HRESULT hr = E_FAIL; AddRef(); switch (MapCommand( cmd )) { case CANDUICMD_NONE: { hr = E_FAIL; break; } case CANDUICMD_NOP: { // no operation hr = S_OK; break; } case CANDUICMD_COMPLETE: { CompleteCandidate(); hr = S_OK; break; } case CANDUICMD_CANCEL: { CancelCandidate(); hr = S_OK; break; } case CANDUICMD_MOVESELNEXT: { SelectItemNext(); hr = S_OK; break; } case CANDUICMD_MOVESELPREV: { SelectItemPrev(); hr = S_OK; break; } case CANDUICMD_MOVESELPREVPG: { SelectPagePrev(); hr = S_OK; break; } case CANDUICMD_MOVESELNEXTPG: { SelectPageNext(); hr = S_OK; break; } case CANDUICMD_MOVESELFIRST: { SelectItemTop(); hr = S_OK; break; } case CANDUICMD_MOVESELLAST: { SelectItemEnd(); hr = S_OK; break; } case CANDUICMD_SELECTITEM: { if (SelectItemProc( iParam )) { CompleteCandidate(); hr = S_OK; } else { hr = S_FALSE; } break; } case CANDUICMD_SELECTLINE: { if (SelectItemProc( GetUIListObj()->GetTopItem() + iParam - 1 )) { CompleteCandidate(); hr = S_OK; } else { hr = S_FALSE; } break; } case CANDUICMD_OPENCANDMENU: { if (!FCandMenuOpen()) { OpenCandidateMenu(); hr = S_OK; } else { hr = S_FALSE; } break; } case CANDUICMD_SELECTRAWDATA: { Assert( GetCandListMgr()->GetCandList() != NULL ); // not eat key when rawdata is not selectable if (GetCandListMgr()->GetCandList()->FRawDataSelectable()) { hr = m_pCandUI->NotifyCompleteRawData(); } else { hr = E_FAIL; } break; } case CANDUICMD_SELECTEXTRACAND: { Assert( GetCandListMgr()->GetCandList() != NULL ); // not eat key when rawdata is not selectable if (GetCandListMgr()->GetCandList()->GetExtraCandItem() != NULL) { hr = m_pCandUI->NotifyCompleteExtraCand(); } else { hr = S_FALSE; } break; } default: { // unknown command has come Assert( FALSE ); break; } } Release(); return hr; } /* I S I N D E X V A L I D */ /*------------------------------------------------------------------------------ is index valid ------------------------------------------------------------------------------*/ HRESULT CCandWindowBase::IsIndexValid( int i, BOOL *pfValid ) { Assert( pfValid != NULL ); *pfValid = FALSE; if (GetUIListObj() == NULL) { return E_FAIL; } int iListItem = GetUIListObj()->GetTopItem() + i - 1; *pfValid = GetUIListObj()->IsItemSelectable( iListItem ); return S_OK; } /* D E S T R O Y W N D */ /*------------------------------------------------------------------------------ Destroy candidate window ------------------------------------------------------------------------------*/ void CCandWindowBase::DestroyWnd( void ) { if (m_pCandMenu != NULL) { m_pCandMenu->ClosePopup(); } DestroyWindow( GetWnd() ); } /* U P D A T E A L L W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::UpdateAllWindow( void ) { UpdateWindow(); } /* O P E N C A N D I D A T E M E N U */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::OpenCandidateMenu( void ) { CMenuButtonProperty *pMenuBtnProp; UINT uiCmd; RECT rc; POINT pt; BOOL fNotify = FALSE; // sanity check if (m_pCandMenuBtn == NULL) { return; } // do not open menu when button is not enabled and visible if (!m_pCandMenuBtn->IsEnabled() || !m_pCandMenuBtn->IsVisible()) { return; } pMenuBtnProp = GetPropertyMgr()->GetMenuButtonProp(); Assert( pMenuBtnProp != NULL ); Assert( pMenuBtnProp->IsEnabled() ); Assert( pMenuBtnProp->GetEventSink() ); if ( pMenuBtnProp->GetEventSink() == NULL ) { return; } // calc position to display m_pCandMenuBtn->GetRect( &rc ); ClientToScreen( m_hWnd, (POINT*)&rc.left ); ClientToScreen( m_hWnd, (POINT*)&rc.right ); pt.x = rc.left; pt.y = rc.bottom; // pushdown the menu button AddRef(); Assert( m_pCandMenuBtn->GetToggleState() ); m_pCandMenuBtn->SetToggleState( TRUE ); m_fCandMenuOpen = TRUE; // create and popup menu UpdateWindow(); m_pCandMenu = new CCandMenu( g_hInst ); if (m_pCandMenu != NULL) { if (pMenuBtnProp->GetEventSink()->InitMenu( m_pCandMenu ) == S_OK) { uiCmd = m_pCandMenu->ShowPopup( this, pt, &rc ); fNotify = TRUE; } m_pCandMenu->Release(); m_pCandMenu = NULL; } // restore the menu button m_fCandMenuOpen = FALSE; m_pCandMenuBtn->SetToggleState( FALSE ); // // // if (fNotify) { pMenuBtnProp->GetEventSink()->OnMenuCommand( uiCmd ); } Release(); } /* F C A N D M E N U O P E N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandWindowBase::FCandMenuOpen( void ) { return m_fCandMenuOpen; } /* G E T C A N D M E N U */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandMenu *CCandWindowBase::GetCandMenu( void ) { return m_pCandMenu; } /* G E T I C O N M E N U */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HICON CCandWindowBase::GetIconMenu( void ) { return m_hIconMenu; } /* G E T I C O N P O P U P O N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HICON CCandWindowBase::GetIconPopupOn( void ) { return m_hIconPopupOn; } /* G E T I C O N P O P U P O F F */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HICON CCandWindowBase::GetIconPopupOff( void ) { return m_hIconPopupOff; } /* F I N D U I O B J E C T */ /*------------------------------------------------------------------------------ Find UI object which has an ID When no UI object found, returns NULL. ------------------------------------------------------------------------------*/ CUIFObject *CCandWindowBase::FindUIObject( DWORD dwID ) { int nChild; int i; nChild = m_ChildList.GetCount(); for (i = 0; i < nChild; i++) { CUIFObject *pUIObj = m_ChildList.Get( i ); Assert( pUIObj ); if (pUIObj->GetID() == dwID) { return pUIObj; } } return NULL; } /* O P T I O N I T E M F R O M L I S T I T E M */ /*------------------------------------------------------------------------------ Get index of options candidate item in candidate list data from index of item in UIList object ------------------------------------------------------------------------------*/ int CCandWindowBase::OptionItemFromListItem( int iListItem ) { CUIFCandListBase *pUIListObj = GetUIOptionsListObj(); CCandListItem *pListItem; pListItem = pUIListObj->GetCandItem( iListItem ); return (pListItem != NULL) ? pListItem->GetICandItem() : ICANDITEM_NULL; } /* 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 CCandWindowBase::CandItemFromListItem( int iListItem ) { CUIFCandListBase *pUIListObj = GetUIListObj(); CCandListItem *pListItem; pListItem = pUIListObj->GetCandItem( iListItem ); return (pListItem != NULL) ? pListItem->GetICandItem() : ICANDITEM_NULL; } /* L I S T I T E M F R O M C A N D I T E M */ /*------------------------------------------------------------------------------ Get index of item in UIList object from index of candidate item in candidate list data ------------------------------------------------------------------------------*/ int CCandWindowBase::ListItemFromCandItem( int iCandItem ) { CUIFCandListBase *pUIListObj = GetUIListObj(); int iListItem; int nListItem; nListItem = pUIListObj->GetItemCount(); for (iListItem = 0; iListItem < nListItem; iListItem++) { CCandListItem *pListItem = pUIListObj->GetCandItem( iListItem ); if (pListItem != NULL && pListItem->GetICandItem() == iCandItem) { return iListItem; } } return -1; /* not found */ } /* O N M E N U O P E N E D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::OnMenuOpened( void ) { } /* O N M E N U C L O S E D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::OnMenuClosed( void ) { } /* S E T C A N D I D A T E L I S T P R O C */ /*------------------------------------------------------------------------------ Set candidate list ------------------------------------------------------------------------------*/ void CCandWindowBase::SetCandidateListProc( void ) { CUIFCandListBase *pUIListObj = GetUIListObj(); CUIFCandListBase *pUIOptionsListObj = GetUIOptionsListObj(); CCandidateList *pCandList; CCandidateList *pOptionsList; int i; int nListItem; pCandList = GetCandListMgr()->GetCandList(); Assert( pCandList != NULL ); pOptionsList = GetCandListMgr()->GetOptionsList(); Assert( pOptionsList != NULL); // reset list item pUIListObj->DelAllCandItem(); pUIListObj->SetCandList(pCandList); // reset options list item if (pOptionsList) { pUIOptionsListObj->DelAllCandItem(); pUIOptionsListObj->SetCandList(pOptionsList); pUIOptionsListObj->SetCurSel(-1); } // rawdata m_fHasRawData = pCandList->FHasRawData(); if (m_fHasRawData) { switch (pCandList->GetRawDataType()) { case CANDUIRDT_STRING: { m_pCandRawData->SetText( pCandList->GetRawDataString() ); break; } case CANDUIRDT_BITMAP: { m_pCandRawData->SetBitmap( pCandList->GetRawDataBitmap() ); break; } case CANDUIRDT_METAFILE: { m_pCandRawData->SetMetaFile( pCandList->GetRawDataMetafile() ); break; } } } // enable/disable candidate number button nListItem = pUIListObj->GetItemCount(); for (i = 0; i < NUM_CANDSTR_MAX; i++) { CUIFObject *pUIObj = FindUIObject( IDUIF_CANDNUMBUTTON + i ); if (pUIObj != NULL) { pUIObj->Enable( i < nListItem ); } } // update window if (m_hWnd != NULL) { InvalidateRect( m_hWnd, NULL, TRUE ); } } /* C L E A R C A N D I D A T E L I S T P R O C */ /*------------------------------------------------------------------------------ Clear candidte list ------------------------------------------------------------------------------*/ void CCandWindowBase::ClearCandidateListProc( void ) { GetUIListObj()->DelAllCandItem(); } /* S E T S E L E C T I O N P R O C */ /*------------------------------------------------------------------------------ Set selection ------------------------------------------------------------------------------*/ void CCandWindowBase::SetSelectionProc( void ) { int iCandItem; int iListItem; Assert( GetCandListMgr()->GetCandList() != NULL ); iCandItem = GetCandListMgr()->GetCandList()->GetSelection(); iListItem = ListItemFromCandItem( iCandItem ); SelectItemProc( iListItem ); } /* S E L E C T I T E M P R O C */ /*------------------------------------------------------------------------------ Select item procedure ------------------------------------------------------------------------------*/ BOOL CCandWindowBase::SelectItemProc( int iListItem ) { if (GetUIListObj()->IsItemSelectable( iListItem )) { GetUIListObj()->SetCurSel( iListItem ); return TRUE; } return FALSE; } /* S E L E C T I T E M T O P */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::SelectItemTop( void ) { SelectItemProc( 0 ); } /* S E L E C T I T E M E N D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::SelectItemEnd( void ) { SelectItemProc( GetUIListObj()->GetItemCount() - 1 ); } /* S E L E C T C A N D I D A T E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandWindowBase::SelectOptionCandidate( void ) { int iListItem; int iCandItem; iListItem = GetUIOptionsListObj()->GetCurSel(); iCandItem = OptionItemFromListItem( iListItem ); // NOTE: KOJIW: do not set selection again when the selection in listbox // is changed by selection update notification... if (m_fOnSelectionChanged) { return S_OK; } GetCandListMgr()->SetOptionSelection( iCandItem, this ); // We do not want to send a selection notification for options. return S_OK; } /* S E L E C T C A N D I D A T E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandWindowBase::SelectCandidate( void ) { int iListItem; int iCandItem; iListItem = GetUIListObj()->GetCurSel(); iCandItem = CandItemFromListItem( iListItem ); // NOTE: KOJIW: do not set selection again when the selection in listbox // is changed by selection update notification... if (m_fOnSelectionChanged) { return S_OK; } GetCandListMgr()->SetSelection( iCandItem, this ); return m_pCandUI->NotifySelectCand( iCandItem ); } /* C O M P L E T E O P T I O N C A N D I D A T E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandWindowBase::CompleteOptionCandidate( void ) { int iCandItem; int iListItem; iListItem = GetUIOptionsListObj()->GetCurSel(); iCandItem = OptionItemFromListItem( iListItem ); return m_pCandUI->NotifyCompleteOption( iCandItem ); } /* C O M P L E T E C A N D I D A T E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandWindowBase::CompleteCandidate( void ) { int iCandItem; int iListItem; iListItem = GetUIListObj()->GetCurSel(); iCandItem = CandItemFromListItem( iListItem ); return m_pCandUI->NotifyCompleteCand( iCandItem ); } /* C A N C E L C A N D I D A T E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandWindowBase::CancelCandidate( void ) { return m_pCandUI->NotifyCancelCand(); } /* G E T M E N U I C O N S I Z E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ int CCandWindowBase::GetMenuIconSize( void ) { const int iIconResSize = 12; // icon size in resource const int iDefBtnSize = 14; // button size of default int iIconSize; SIZE size; // reload menu button icon size.cx = GetSystemMetrics( SM_CXVSCROLL ); size.cy = GetSystemMetrics( SM_CYHSCROLL ); iIconSize = min( size.cx, size.cy ) - 2; iIconSize = iIconSize * iIconResSize / iDefBtnSize; return iIconSize; } /* C R E A T E E X T E N S I O N O B J E C T S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::CreateExtensionObjects( void ) { LONG nExtension; LONG i; Assert( m_nExtUIObj == 0 ); nExtension = GetExtensionMgr()->GetExtensionNum(); m_nExtUIObj = 0; for (i = 0; i < nExtension; i++) { CUIFObject *pUIObj = NULL; RECT rc = {0}; pUIObj = GetExtensionMgr()->CreateUIObject( i, this, IDUIF_EXTENDED + i, &rc ); if (pUIObj != NULL) { pUIObj->Initialize(); GetExtensionMgr()->UpdateObjProp( i, pUIObj ); AddUIObj( pUIObj ); m_nExtUIObj++; } } } /* D E L E T E E X T E N S I O N O B J E C T S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::DeleteExtensionObjects( void ) { LONG nExtension; LONG i; nExtension = GetExtensionMgr()->GetExtensionNum(); for (i = 0; i < nExtension; i++) { CUIFObject *pUIObj = FindUIObject( IDUIF_EXTENDED + i ); if (pUIObj != NULL) { RemoveUIObj( pUIObj ); delete pUIObj; m_nExtUIObj--; } } Assert( m_nExtUIObj == 0 ); m_nExtUIObj = 0; } /* S E T E X T E N S I O N O B J E C T P R O P S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindowBase::SetExtensionObjectProps( void ) { LONG nExtension; LONG i; nExtension = GetExtensionMgr()->GetExtensionNum(); for (i = 0; i < nExtension; i++) { CUIFObject *pUIObj = FindUIObject( IDUIF_EXTENDED + i ); if (pUIObj != NULL) { GetExtensionMgr()->UpdateObjProp( i, pUIObj ); } } } /*============================================================================*/ /* */ /* C C A N D W I N D O W */ /* */ /*============================================================================*/ /* C C A N D W I N D O W */ /*------------------------------------------------------------------------------ Constructor of CCandWindow ------------------------------------------------------------------------------*/ CCandWindow::CCandWindow( CCandidateUI *pCandUI, DWORD dwStyle ) : CCandWindowBase( pCandUI, dwStyle | UIWINDOW_TOPMOST | UIWINDOW_TOOLWINDOW | UIWINDOW_OFC10MENU ) { m_pOptionsListUIObj = NULL; m_pListUIObj = NULL; m_pExtListUIObj = NULL; m_pWndFrame = NULL; m_pCaptionObj = NULL; m_cxWndOffset = 0; m_cyWndOffset = 0; m_nItemShow = 1; m_pCommentWnd = NULL; m_fCommentWndOpen = FALSE; m_iItemAttensionSelect = -1; m_iItemAttensionHover = -1; m_pCandTipWnd = NULL; m_pCandTipBtn = NULL; m_fCandTipWndOpen = FALSE; } /* ~ C C A N D W I N D O W */ /*------------------------------------------------------------------------------ Destructor of CCandWindow ------------------------------------------------------------------------------*/ CCandWindow::~CCandWindow() { // // Notify UI object destroy // NotifyUIObjectEvent( CANDUIOBJ_OPTIONSLISTBOX, CANDUIOBJEV_DESTROYED ); NotifyUIObjectEvent( CANDUIOBJ_CANDLISTBOX, CANDUIOBJEV_DESTROYED ); NotifyUIObjectEvent( CANDUIOBJ_CANDCAPTION, CANDUIOBJEV_DESTROYED ); NotifyUIObjectEvent( CANDUIOBJ_MENUBUTTON, CANDUIOBJEV_DESTROYED ); NotifyUIObjectEvent( CANDUIOBJ_EXTRACANDIDATE, CANDUIOBJEV_DESTROYED ); NotifyUIObjectEvent( CANDUIOBJ_CANDRAWDATA, CANDUIOBJEV_DESTROYED ); NotifyUIObjectEvent( CANDUIOBJ_CANDTIPBUTTON, CANDUIOBJEV_DESTROYED ); if (m_pCommentWnd) { delete m_pCommentWnd; } if (m_pCandTipWnd) { delete m_pCandTipWnd; } } /* C R E A T E W N D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HWND CCandWindow::CreateWnd( HWND hWndParent ) { HWND hWnd = CCandWindowBase::CreateWnd( hWndParent ); Assert( GetCandListMgr()->GetCandList() != NULL ); // make timer to popup comment window SetAttensionBySelect( GetCandListMgr()->GetCandList()->GetSelection() ); return hWnd; } /* S H O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::Show( BOOL fShow ) { if (m_fCommentWndOpen) { m_pCommentWnd->Show( fShow ); } if (fShow) { if (m_fCandTipWndOpen) { OpenCandTipWindow(); } } else { if (m_fCandTipWndOpen) { CloseCandTipWindow(); } } CCandWindowBase::Show( fShow ); } /* I N I T I A L I Z E */ /*------------------------------------------------------------------------------ Initialize UI objects ------------------------------------------------------------------------------*/ CUIFObject *CCandWindow::Initialize( void ) { RECT rc = {0}; #ifdef NEVER CUIFButton *pButton; #endif CUIFBorder *pBorder; // // create window frame // m_pWndFrame = new CUIFWndFrame( this, &rc, UIWNDFRAME_THIN | UIWNDFRAME_NORESIZE ); if (m_pWndFrame != NULL) { m_pWndFrame->Initialize(); AddUIObj( m_pWndFrame ); } #ifdef NEVER if (!FHasStyle( UIWINDOW_OFFICENEWLOOK )) { int i; // // create candidate num buttons // for (i = 0; i < NUM_CANDSTR_MAX; i++) { WCHAR szNum[2]; pButton = new CUIFButton( this, IDUIF_CANDNUMBUTTON + i, &rc, UIBUTTON_CENTER | UIBUTTON_VCENTER ); if (pButton) { pButton->Initialize(); szNum[0] = L'1' + i; szNum[1] = L'\0'; pButton->SetText( szNum ); AddUIObj( pButton ); } } // // create border // pBorder = new CUIFBorder( this, IDUIF_BORDERLEFT, &rc, UIBORDER_VERT ); pBorder->Initialize(); AddUIObj( pBorder ); } #endif // // create options candidate list // m_pOptionsListUIObj = new CUIFCandList( this, IDUIF_OPTIONSLIST, &rc, UILIST_HORZTB ); if (m_pOptionsListUIObj != NULL) { m_pOptionsListUIObj->Initialize(); AddUIObj( m_pOptionsListUIObj ); // m_pOptionsListUIObj->SetIconPopupComment( m_hIconPopupOn, m_hIconPopupOff ); } // // create options candidate list border // pBorder = new CUIFCandBorder( this, IDUIF_BORDEROPTIONSCAND, &rc, UIBORDER_HORZ ); if (pBorder != NULL) { pBorder->Initialize(); AddUIObj( pBorder ); } // // create candidate list // m_pListUIObj = new CUIFCandList( this, IDUIF_CANDIDATELIST, &rc, UILIST_HORZTB ); if (m_pListUIObj != NULL) { m_pListUIObj->Initialize(); AddUIObj( m_pListUIObj ); m_pListUIObj->SetIconPopupComment( m_hIconPopupOn, m_hIconPopupOff ); } // // create extra candidate list // m_pExtListUIObj = new CUIFExtCandList( this, IDUIF_EXTCANDIDATELIST, &rc, UILIST_HORZTB ); if (m_pExtListUIObj != NULL) { m_pExtListUIObj->Initialize(); AddUIObj( m_pExtListUIObj ); } // // create extra candidate list border // pBorder = new CUIFCandBorder( this, IDUIF_BORDEREXTRACAND, &rc, UIBORDER_HORZ ); if (pBorder != NULL) { pBorder->Initialize(); AddUIObj( pBorder ); } // // create candidate menu button // m_pCandMenuBtn = new CUIFCandMenuButton( this, IDUIF_CANDIDATEMENU, &rc, UIBUTTON_TOGGLE | UIBUTTON_CENTER | UIBUTTON_VCENTER ); if (m_pCandMenuBtn != NULL) { m_pCandMenuBtn->Initialize(); AddUIObj( m_pCandMenuBtn ); if (m_pCandAcc != NULL) { m_pCandAcc->AddAccItem( (CUIFCandMenuButton*)m_pCandMenuBtn ); } m_pCandMenuBtn->SetIcon( m_hIconMenu ); } // // create raw data border // pBorder = new CUIFCandBorder( this, IDUIF_BORDERRAWDATA, &rc, UIBORDER_HORZ ); if (pBorder != NULL) { pBorder->Initialize(); AddUIObj( pBorder ); } // // creare raw data statics // m_pCandRawData = new CUIFCandRawData( this, IDUIF_RAWDATA, &rc, UICANDRAWDATA_HORZTB ); if (m_pCandRawData != NULL) { m_pCandRawData->Initialize(); AddUIObj( m_pCandRawData ); } // // create extension border // pBorder = new CUIFCandBorder( this, IDUIF_BORDERBOTTOM, &rc, UIBORDER_HORZ ); if (pBorder != NULL) { pBorder->Initialize(); AddUIObj( pBorder ); } // // create extension items // if (0 < GetExtensionMgr()->GetExtensionNum()) { CreateExtensionObjects(); } // // create caption // m_pCaptionObj = new CUIFWndCaption( this, IDUIF_CAPTION, &rc, UIWNDCAPTION_INACTIVE ); if (m_pCaptionObj != NULL) { m_pCaptionObj->Initialize(); AddUIObj( m_pCaptionObj ); } // // // m_pCandTipBtn = new CUIFButton2( this, IDUIF_CANDTIPBTN, &rc, UIBUTTON_CENTER | UIBUTTON_VCENTER ); if (m_pCandTipBtn != NULL) { m_pCandTipBtn->Initialize(); AddUIObj( m_pCandTipBtn ); m_pCandTipBtn->SetIcon( m_hIconCandTipOff ); } // // create candidate tip window // m_pCandTipWnd = new CUIFBalloonWindow( g_hInst, 0 ); if (m_pCandTipWnd) { m_pCandTipWnd->Initialize(); m_pCandTipWnd->SetFont( GetPropertyMgr()->GetToolTipProp()->GetFont() ); } // // create poupup window // m_pCommentWnd = new CPopupCommentWindow( this, m_pCandUI ); if (m_pCommentWnd != NULL) { m_pCommentWnd->Initialize(); } // // Initialize accessibility item // if (m_pCandAcc != NULL) { m_pListUIObj->InitAccItems( m_pCandAcc ); } // // Notify UI object creation // NotifyUIObjectEvent( CANDUIOBJ_OPTIONSLISTBOX, CANDUIOBJEV_CREATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDLISTBOX, CANDUIOBJEV_CREATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDCAPTION, CANDUIOBJEV_CREATED ); NotifyUIObjectEvent( CANDUIOBJ_MENUBUTTON, CANDUIOBJEV_CREATED ); NotifyUIObjectEvent( CANDUIOBJ_EXTRACANDIDATE, CANDUIOBJEV_CREATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDRAWDATA, CANDUIOBJEV_CREATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDTIPBUTTON, CANDUIOBJEV_CREATED ); return CCandWindowBase::Initialize(); } /* G E T W N D S T Y L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ DWORD CCandWindow::GetWndStyle( void ) { return CCandWindowBase::GetWndStyle() & ~WS_BORDER; } /* O N T I M E R */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::OnTimer( UINT uiTimerID ) { if (uiTimerID == IDTIMER_POPUPCOMMENT_SELECT || uiTimerID == IDTIMER_POPUPCOMMENT_HOVER) { int iItem; KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_SELECT ); KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_HOVER ); iItem = (uiTimerID == IDTIMER_POPUPCOMMENT_SELECT) ? m_iItemAttensionSelect : m_iItemAttensionHover; OpenCommentWindow( iItem ); } else if (uiTimerID == IDTIMER_MENU_HOVER) { // Check mouse position. POINT pt; RECT rc; GetCursorPos(&pt); ScreenToClient(m_hWnd, &pt); m_pOptionsListUIObj->GetRect(&rc); pt.x -= rc.left; pt.y -= rc.top; if (pt.x < 0 || pt.y < 0 || pt.x > (rc.right - rc.left) || pt.y > (rc.bottom - rc.top)) { KillTimer(m_hWnd, IDTIMER_MENU_HOVER); // Send messages that Cicero does on the mouse monitoring timer to trigger correct behavior and // unselect the menu item. SetObjectPointed( NULL, pt ); OnMouseOutFromWindow( pt ); } else { SetTimer(m_hWnd, IDTIMER_MENU_HOVER, 50, NULL); } } } /* O N S Y S C O L O R C H A N G E */ /*------------------------------------------------------------------------------ (CUIFWindow method) ------------------------------------------------------------------------------*/ void CCandWindow::OnSysColorChange() { CCandWindowBase::OnSysColorChange(); if (m_pCandTipBtn) { m_pCandTipBtn->SetIcon( m_fCandTipWndOpen ? m_hIconCandTipOn : m_hIconCandTipOff ); } } /* O N O B J E C T N O T I F Y */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ LRESULT CCandWindow::OnObjectNotify( CUIFObject *pUIObj, DWORD dwCommand, LPARAM lParam ) { // check hovering item if (pUIObj->GetID() == IDUIF_OPTIONSLIST) { if (dwCommand == UICANDLIST_HOVERITEM) { int iCandItem = OptionItemFromListItem( (int)lParam ); SetOptionsAttensionByHover( iCandItem ); } } else if (pUIObj->GetID() == IDUIF_CANDIDATELIST) { if (dwCommand == UICANDLIST_HOVERITEM) { int iCandItem = CandItemFromListItem( (int)lParam ); SetAttensionByHover( iCandItem ); } else if (dwCommand == UILIST_SELCHANGED) { int iCandItem = CandItemFromListItem( (int)lParam ); SetAttensionBySelect( iCandItem ); } } else if (pUIObj->GetID() == IDUIF_EXTCANDIDATELIST) { if (dwCommand == UILIST_SELECTED) { m_pCandUI->NotifyCompleteExtraCand(); return 0; } } else if (pUIObj->GetID() == IDUIF_CANDTIPBTN) { if (m_fCandTipWndOpen) { CloseCandTipWindow(); m_fCandTipWndOpen = FALSE; } else { OpenCandTipWindow(); m_fCandTipWndOpen = TRUE; } m_pCandTipBtn->SetIcon( m_fCandTipWndOpen ? m_hIconCandTipOn : m_hIconCandTipOff ); } return CCandWindowBase::OnObjectNotify( pUIObj, dwCommand, lParam ); } /* S E T T A R G E T R E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SetTargetRect( RECT *prc, BOOL fClipped ) { SIZE sizeWnd; sizeWnd.cx = _nWidth; sizeWnd.cy = _nHeight; if (IsShadowEnabled() && m_pWndShadow) { SIZE sizeShadow; m_pWndShadow->GetShift( &sizeShadow ); sizeWnd.cx += sizeShadow.cx; sizeWnd.cy += sizeShadow.cy; } m_rcTarget = *prc; m_fTargetClipped = fClipped; if (m_hWnd != NULL) { RECT rc; // move window here... switch (GetPropertyMgr()->GetCandWindowProp()->GetUIDirection()) { default: case CANDUIDIR_TOPTOBOTTOM: { CalcWindowRect( &rc, &m_rcTarget, sizeWnd.cx, sizeWnd.cy, m_cxWndOffset, m_cyWndOffset, ALIGN_LEFT, LOCATE_BELLOW ); break; } case CANDUIDIR_BOTTOMTOTOP: { CalcWindowRect( &rc, &m_rcTarget, sizeWnd.cx, sizeWnd.cy, m_cxWndOffset, m_cyWndOffset, ALIGN_RIGHT, LOCATE_ABOVE ); break; } case CANDUIDIR_RIGHTTOLEFT: { CalcWindowRect( &rc, &m_rcTarget, sizeWnd.cx, sizeWnd.cy, m_cxWndOffset, m_cyWndOffset, LOCATE_LEFT, ALIGN_TOP ); break; } case CANDUIDIR_LEFTTORIGHT: { CalcWindowRect( &rc, &m_rcTarget, sizeWnd.cx, sizeWnd.cy, m_cxWndOffset, m_cyWndOffset, LOCATE_RIGHT, ALIGN_BOTTOM ); break; } } if (rc.left != _xWnd || rc.top != _yWnd) { Move( rc.left, rc.top, -1, -1 ); // if (m_pCommentWnd != NULL) { m_pCommentWnd->OnCandWindowMove( TRUE ); } if (m_pCandTipWnd != NULL) { MoveCandTipWindow(); } } } } /* S E T W I N D O W P O S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SetWindowPos( POINT pt ) { if (m_hWnd != NULL) { RECT rc; 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 ); // if (m_pCommentWnd != NULL) { m_pCommentWnd->OnCandWindowMove( TRUE ); } if (m_pCandTipWnd != NULL) { MoveCandTipWindow(); } } } } /* P R E P A R E L A Y O U T */ /*------------------------------------------------------------------------------ Prepare to layout window NOTE: This method will be called just once after created (not called when candidate list has updated) ------------------------------------------------------------------------------*/ void CCandWindow::PrepareLayout( void ) { // determine lines of options list ui object m_nOptionsItemShow = m_pOptionsListUIObj->GetCount(); // determine lines of list ui object if (GetPropertyMgr()->GetCandListBoxProp()->GetHeight() == -1) { m_nItemShow = min( m_pListUIObj->GetCount(), NUM_CANDSTR_MAX ); m_nItemShow = max( m_nItemShow, 1 ); } else { m_nItemShow = GetPropertyMgr()->GetCandListBoxProp()->GetHeight(); } Assert((1 <= m_nItemShow) && (m_nItemShow <= 9)); // determine candtip window open status m_fCandTipWndOpen = (GetCandListMgr()->GetCandList()->GetTipString() != NULL); } /* L A Y O U T W I N D O W */ /*------------------------------------------------------------------------------ Layout window ------------------------------------------------------------------------------*/ void CCandWindow::LayoutWindow( void ) { HDC hDC = GetDC( m_hWnd ); int nChild; int i; CUIFObject *pUIObj; // metrics SIZE sizeMetText; SIZE sizeMetCaptionText; SIZE sizeMetCandItem; #ifdef NEVER SIZE sizeMetCandNum; #endif SIZE sizeMetSmButton; SIZE sizeMetScroll; SIZE sizeMetBorder; #ifdef NEVER SIZE sizeMetMargin; #endif SIZE sizeMetWndFrame; SIZE sizeCaptionObj = {0}; SIZE sizeExtCandListObj = {0}; SIZE sizeExtCandListBdr = {0}; SIZE sizeOptionsListObj = {0}; SIZE sizeOptionsListBdr = {0}; SIZE sizeCandListObj = {0}; SIZE sizeRawDataObj = {0}; SIZE sizeRawDataBdr = {0}; SIZE sizeCandListArea = {0}; SIZE sizeExtensionArea = {0}; SIZE sizeWindow = {0}; RECT rcClient = {0}; RECT rcWindow = {0}; RECT rcCaptionObj = {0}; RECT rcOptionsListBdr = {0}; RECT rcCandListArea = {0}; RECT rcExtensionArea = {0}; RECT rcExtCandListObj = {0}; RECT rcExtCandListBdr = {0}; RECT rcOptionsListObj = {0}; RECT rcCandListObj = {0}; RECT rcRawDataObj = {0}; RECT rcRawDataBdr = {0}; int cxMax = 0; int cxMaxCandString = 0; int cxMaxInlineComment = 0; int cxInlineCommentPos = 0; int cxyExtraTopSpace = 0; int cxyExtraBottomSpace = 0; DWORD dwListStyle; DWORD dwBdrStyle; CANDUIUIDIRECTION uidir = GetPropertyMgr()->GetCandWindowProp()->GetUIDirection(); #ifdef NEVER BOOL fShowNumber = !FHasStyle( UIWINDOW_OFFICENEWLOOK ); #endif BOOL fShowCaption = GetPropertyMgr()->GetWindowCaptionProp()->IsVisible(); BOOL fShowCandTip = (GetCandListMgr()->GetCandList() != NULL) ? (GetCandListMgr()->GetCandList()->GetTipString() != NULL) : FALSE; HFONT hFontUI = (HFONT)GetStockObject( DEFAULT_GUI_FONT ); HFONT hFontCandidateList = GetPropertyMgr()->GetCandStringProp()->GetFont(); HFONT hFontInlineComment = GetPropertyMgr()->GetInlineCommentProp()->GetFont(); HFONT hFontIndex = GetPropertyMgr()->GetCandIndexProp()->GetFont(); HFONT hFontCaption = GetPropertyMgr()->GetWindowCaptionProp()->GetFont(); BOOL fHasExtension = (0 < GetExtensionMgr()->GetExtensionNum()); BOOL fShowExtCandList = FALSE; BOOL fShowOptionsCandList = FALSE; BOOL fHasPopupComment = FALSE; Assert( 1 <= m_nItemShow ); // // set font of UI object // nChild = m_ChildList.GetCount(); for (i = 0; i < nChild; i++) { CUIFObject *pUIObjTmp = m_ChildList.Get( i ); Assert( pUIObjTmp != NULL ); if (pUIObjTmp == m_pListUIObj) { m_pListUIObj->SetFont( hFontCandidateList ); m_pListUIObj->SetInlineCommentFont( hFontInlineComment ); m_pListUIObj->SetIndexFont( hFontIndex ); } else if (pUIObjTmp == m_pOptionsListUIObj) { m_pOptionsListUIObj->SetFont( hFontCandidateList ); m_pOptionsListUIObj->SetInlineCommentFont( hFontInlineComment ); m_pOptionsListUIObj->SetIndexFont( hFontIndex ); } else if (pUIObjTmp == m_pExtListUIObj) { m_pExtListUIObj->SetFont( hFontCandidateList ); m_pExtListUIObj->SetInlineCommentFont( hFontInlineComment ); m_pExtListUIObj->SetIndexFont( hFontIndex ); } else if (pUIObjTmp == m_pCaptionObj) { pUIObjTmp->SetFont( hFontCaption ); } else { pUIObjTmp->SetFont( hFontUI ); } } // // calculate metrics // // window frame sizeMetWndFrame.cx = 0; sizeMetWndFrame.cy = 0; if (m_pWndFrame != NULL) { m_pWndFrame->GetFrameSize( &sizeMetWndFrame ); } // candidate item sizeMetText.cx = GetFontHeightOfFont( hDC, hFontCandidateList ); sizeMetText.cy = GetFontHeightOfFont( hDC, hFontCandidateList ); sizeMetCandItem.cx = sizeMetText.cy * 4; sizeMetCandItem.cy = m_pUIFScheme->CyMenuItem( sizeMetText.cy ); // Options list. if (m_pOptionsListUIObj != NULL) { HFONT hFontOld = (HFONT)GetCurrentObject( hDC, OBJ_FONT ); int nItem = m_pOptionsListUIObj->GetCount(); LPCWSTR psz; SIZE size; CCandidateItem *pOptionsItem; fShowOptionsCandList = (0 < nItem); // get candidate string width SelectObject( hDC, hFontCandidateList ); for (i = 0; i < nItem; i++) { pOptionsItem = m_pOptionsListUIObj->GetCandidateItem( i ); // can't really do anything if this is null // if ( !pOptionsItem ) continue; psz = pOptionsItem->GetString(); if (psz != NULL) { SIZE sizeT; FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); if (pOptionsItem->GetIcon() != NULL) { size.cx += sizeMetCandItem.cy; } if (psz = pOptionsItem->GetPrefixString()) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &sizeT ); size.cx += sizeT.cx; } if (psz = pOptionsItem->GetSuffixString()) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &sizeT ); size.cx += sizeT.cx; } cxMaxCandString = max( cxMaxCandString, size.cx ); // check if it has popup comment if (pOptionsItem->GetPopupComment() != NULL) { fHasPopupComment = TRUE; } } } // get inline comment width SelectObject( hDC, hFontInlineComment ); for (i = 0; i < nItem; i++) { pOptionsItem = m_pOptionsListUIObj->GetCandidateItem( i ); if (pOptionsItem) { psz = pOptionsItem->GetInlineComment(); if (psz != NULL) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); cxMaxInlineComment = max( cxMaxInlineComment, size.cx ); } } } SelectObject( hDC, hFontOld ); } // Main candidate list. if (m_pListUIObj != NULL) { HFONT hFontOld = (HFONT)GetCurrentObject( hDC, OBJ_FONT ); int nItem = m_pListUIObj->GetCount(); LPCWSTR psz; SIZE size; CCandidateItem *pCandItem; // get candidate string width SelectObject( hDC, hFontCandidateList ); for (i = 0; i < nItem; i++) { pCandItem = m_pListUIObj->GetCandidateItem( i ); // can't really do anything if this is null // if ( !pCandItem ) continue; psz = pCandItem->GetString(); if (psz != NULL) { SIZE sizeT; FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); if (pCandItem->GetIcon() != NULL) { size.cx += sizeMetCandItem.cy; } if (psz = pCandItem->GetPrefixString()) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &sizeT ); size.cx += sizeT.cx; } if (psz = pCandItem->GetSuffixString()) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &sizeT ); size.cx += sizeT.cx; } cxMaxCandString = max( cxMaxCandString, size.cx ); // check if it has popup comment if (pCandItem->GetPopupComment() != NULL) { fHasPopupComment = TRUE; } } } // get inline comment width SelectObject( hDC, hFontInlineComment ); for (i = 0; i < nItem; i++) { pCandItem = m_pListUIObj->GetCandidateItem( i ); if (pCandItem) { psz = pCandItem->GetInlineComment(); if (psz != NULL) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); cxMaxInlineComment = max( cxMaxInlineComment, size.cx ); } } } SelectObject( hDC, hFontOld ); } // extra candidate item if (m_pExtListUIObj != NULL) { HFONT hFontOld = (HFONT)GetCurrentObject( hDC, OBJ_FONT ); int nItem = m_pExtListUIObj->GetCount(); LPCWSTR psz; SIZE size; CCandidateItem *pCandItem; fShowExtCandList = (0 < nItem); Assert( nItem <= 1 ); // get candidate string width SelectObject( hDC, hFontCandidateList ); for (i = 0; i < nItem; i++) { pCandItem = m_pExtListUIObj->GetCandidateItem( i ); // can't really do anything if this is null // if ( !pCandItem ) continue; psz = pCandItem->GetString(); if (psz != NULL) { SIZE sizeT; FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); if (pCandItem->GetIcon() != NULL) { size.cx += sizeMetCandItem.cy; } if (psz = pCandItem->GetPrefixString()) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &sizeT ); size.cx += sizeT.cx; } if (psz = pCandItem->GetSuffixString()) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &sizeT ); size.cx += sizeT.cx; } cxMaxCandString = max( cxMaxCandString, size.cx ); // check if it has popup comment if (pCandItem->GetPopupComment() != NULL) { fHasPopupComment = TRUE; } } } // get inline comment width SelectObject( hDC, hFontInlineComment ); for (i = 0; i < nItem; i++) { pCandItem = m_pExtListUIObj->GetCandidateItem( i ); if (pCandItem) { psz = pCandItem->GetInlineComment(); if (psz != NULL) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); cxMaxInlineComment = max( cxMaxInlineComment, size.cx ); } } } SelectObject( hDC, hFontOld ); } // calc width of candidate item and inline comment if (0 < cxMaxInlineComment) { int cxT = (cxMaxCandString + sizeMetText.cy / 2 + cxMaxInlineComment); cxT += 8 /* margen at left */ + (fHasPopupComment ? sizeMetText.cy / 2 + sizeMetCandItem.cy : 0) + 8 /* margin at right */; cxInlineCommentPos = cxMaxCandString + sizeMetText.cy / 2; sizeMetCandItem.cx = max( sizeMetCandItem.cx, cxT ); } else { int cxT = cxMaxCandString; cxT += 8 /* margen at left */ + (fHasPopupComment ? sizeMetText.cy / 2 + sizeMetCandItem.cy : 0) + 8 /* margin at right */; cxInlineCommentPos = 0; sizeMetCandItem.cx = max( sizeMetCandItem.cx, cxT ); } #ifdef NEVER // number button sizeMetCandNum.cx = sizeMetCandItem.cy; sizeMetCandNum.cy = sizeMetCandItem.cy; #endif // scrollbar sizeMetScroll.cx = GetSystemMetrics( SM_CXVSCROLL ); sizeMetScroll.cy = GetSystemMetrics( SM_CYHSCROLL ); // candidate menu button switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { sizeMetSmButton.cx = sizeMetSmButton.cy = sizeMetScroll.cx; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { sizeMetSmButton.cx = sizeMetSmButton.cy = sizeMetScroll.cy; break; } } // caption text if (m_pCaptionObj != NULL) { HFONT hFontOld = (HFONT)SelectObject( hDC, hFontCaption ); LPCWSTR psz; SIZE size; psz = GetPropertyMgr()->GetWindowCaptionProp()->GetText(); if (psz != NULL) { FLGetTextExtentPoint32( hDC, psz, wcslen(psz), &size ); } else { FLGetTextExtentPoint32( hDC, L" ", 1, &size ); } sizeMetCaptionText.cx = size.cx; sizeMetCaptionText.cy = size.cy; SelectObject( hDC, hFontOld); } // border sizeMetBorder.cx = 3; sizeMetBorder.cy = 3; #ifdef NEVER // object margin sizeMetMargin.cx = 1; sizeMetMargin.cy = 1; #endif // // calculate sizes of objects // // caption sizeCaptionObj.cx = 0; sizeCaptionObj.cy = 0; if (fShowCaption) { sizeCaptionObj.cx = sizeMetCaptionText.cx + 16; sizeCaptionObj.cy = sizeMetCaptionText.cy + 2; } // extra candidate list sizeExtCandListObj.cx = 0; sizeExtCandListObj.cy = 0; sizeExtCandListBdr.cx = 0; sizeExtCandListBdr.cy = 0; if (fShowExtCandList) { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { sizeExtCandListObj.cx = sizeMetCandItem.cx + sizeMetScroll.cx + sizeMetCandItem.cy + 4; sizeExtCandListObj.cy = sizeMetCandItem.cy; sizeExtCandListBdr.cx = sizeExtCandListObj.cx; sizeExtCandListBdr.cy = sizeMetBorder.cy; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { sizeExtCandListObj.cx = sizeMetCandItem.cy; sizeExtCandListObj.cy = sizeMetCandItem.cx + sizeMetScroll.cx + sizeMetCandItem.cy + 4; sizeExtCandListBdr.cx = sizeMetBorder.cx; sizeExtCandListBdr.cy = sizeExtCandListObj.cy; break; } } } // Options candidate list #ifdef NEVER if (FHasStyle( UIWINDOW_OFFICENEWLOOK )) { #endif switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { sizeOptionsListObj.cx = sizeMetCandItem.cx + sizeMetScroll.cx + sizeMetCandItem.cy + 4; sizeOptionsListObj.cy = sizeMetCandItem.cy * m_nOptionsItemShow; sizeOptionsListBdr.cx = sizeOptionsListObj.cx; sizeOptionsListBdr.cy = fShowOptionsCandList ? sizeMetBorder.cy : 0; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { sizeOptionsListObj.cx = sizeMetCandItem.cy * m_nOptionsItemShow; sizeOptionsListObj.cy = sizeMetCandItem.cx + sizeMetScroll.cy + sizeMetCandItem.cy + 4; sizeOptionsListBdr.cx = fShowOptionsCandList ? sizeMetBorder.cx : 0; sizeOptionsListBdr.cy = sizeOptionsListObj.cy; break; } } #ifdef NEVER } else { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { sizeOptionsListObj.cx = sizeMetCandItem.cx + sizeMetScroll.cx; sizeOptionsListObj.cy = sizeMetCandItem.cy * m_nOptionsItemShow; sizeOptionsListBdr.cx = sizeOptionsListObj.cx; sizeOptionsListBdr.cy = sizeMetBorder.cy; m_cxWndOffset = -(sizeMetWndFrame.cx + (fShowNumber ? sizeMetCandNum.cx + sizeMetMargin.cx + sizeMetBorder.cx + sizeMetMargin.cx : 0)); m_cyWndOffset = 0; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { sizeOptionsListObj.cx = sizeMetCandItem.cy * m_nOptionsItemShow; sizeOptionsListObj.cy = sizeMetCandItem.cx + sizeMetScroll.cy; sizeOptionsListBdr.cx = sizeMetBorder.cx; sizeOptionsListBdr.cy = sizeOptionsListObj.cy; m_cxWndOffset = 0; m_cyWndOffset = -(sizeMetWndFrame.cy + (fShowNumber ? sizeMetCandNum.cy + sizeMetMargin.cy + sizeMetBorder.cy + sizeMetMargin.cy : 0)); break; } } } #endif // candidate list #ifdef NEVER if (FHasStyle( UIWINDOW_OFFICENEWLOOK )) { #endif switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { sizeCandListObj.cx = sizeMetCandItem.cx + sizeMetScroll.cx + sizeMetCandItem.cy + 4; sizeCandListObj.cy = sizeMetCandItem.cy * m_nItemShow; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { sizeCandListObj.cx = sizeMetCandItem.cy * m_nItemShow; sizeCandListObj.cy = sizeMetCandItem.cx + sizeMetScroll.cy + sizeMetCandItem.cy + 4; break; } } #ifdef NEVER } else { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { sizeCandListObj.cx = sizeMetCandItem.cx + sizeMetScroll.cx; sizeCandListObj.cy = sizeMetCandItem.cy * m_nItemShow; m_cxWndOffset = -(sizeMetWndFrame.cx + (fShowNumber ? sizeMetCandNum.cx + sizeMetMargin.cx + sizeMetBorder.cx + sizeMetMargin.cx : 0)); m_cyWndOffset = 0; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { sizeCandListObj.cx = sizeMetCandItem.cy * m_nItemShow; sizeCandListObj.cy = sizeMetCandItem.cx + sizeMetScroll.cy; m_cxWndOffset = 0; m_cyWndOffset = -(sizeMetWndFrame.cy + (fShowNumber ? sizeMetCandNum.cy + sizeMetMargin.cy + sizeMetBorder.cy + sizeMetMargin.cy : 0)); break; } } } #endif // raw data sizeRawDataObj.cx = 0; sizeRawDataObj.cy = 0; sizeRawDataBdr.cx = 0; sizeRawDataBdr.cy = 0; if (m_fHasRawData) { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { sizeRawDataObj.cx = sizeCandListObj.cx + 2; sizeRawDataObj.cy = sizeMetText.cy * 3 / 2; sizeRawDataBdr.cx = sizeRawDataObj.cx; sizeRawDataBdr.cy = sizeMetBorder.cy; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { sizeRawDataObj.cx = sizeMetText.cy * 3 / 2; sizeRawDataObj.cy = sizeCandListObj.cy + 2; sizeRawDataBdr.cx = sizeMetBorder.cx; sizeRawDataBdr.cy = sizeRawDataObj.cy; break; } } } // // calc offsets // #ifdef NEVER if (FHasStyle( UIWINDOW_OFFICENEWLOOK )) { #endif switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: { m_cxWndOffset = -(sizeMetWndFrame.cx + sizeMetCandItem.cy + 4 + 8); m_cyWndOffset = 0; break; } case CANDUIDIR_BOTTOMTOTOP: { m_cxWndOffset = +(sizeMetWndFrame.cx + sizeMetScroll.cx + 4); m_cyWndOffset = 0; break; } case CANDUIDIR_RIGHTTOLEFT: { m_cxWndOffset = 0; m_cyWndOffset = -(sizeMetWndFrame.cy + sizeMetCandItem.cy + 4 + 8); break; } case CANDUIDIR_LEFTTORIGHT: { m_cxWndOffset = 0; m_cyWndOffset = +(sizeMetWndFrame.cy + sizeMetScroll.cy + 4); break; } } #ifdef NEVER } else { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { m_cxWndOffset = -(sizeMetWndFrame.cx + (fShowNumber ? sizeMetCandNum.cx + sizeMetMargin.cx + sizeMetBorder.cx + sizeMetMargin.cx : 0)); m_cyWndOffset = 0; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { m_cxWndOffset = 0; m_cyWndOffset = -(sizeMetWndFrame.cy + (fShowNumber ? sizeMetCandNum.cy + sizeMetMargin.cy + sizeMetBorder.cy + sizeMetMargin.cy : 0)); break; } } } #endif // // calculate sizes of areas // // candlist area #ifdef NEVER if (FHasStyle( UIWINDOW_OFFICENEWLOOK )) { #endif switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { // candidate list sizeCandListArea.cx = sizeCandListObj.cx; sizeCandListArea.cy = sizeCandListObj.cy; // options candidate list sizeCandListArea.cx = max( sizeCandListArea.cx, sizeOptionsListObj.cx ); sizeCandListArea.cy += sizeOptionsListObj.cy + sizeOptionsListBdr.cy; // extra candidate list sizeCandListArea.cx = max( sizeCandListArea.cx, sizeExtCandListObj.cx ); sizeCandListArea.cy += sizeExtCandListObj.cy + sizeExtCandListBdr.cy; // raw data sizeCandListArea.cx = max( sizeCandListArea.cx, sizeRawDataObj.cx ); sizeCandListArea.cy += sizeRawDataObj.cy + sizeRawDataBdr.cy; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { // candidate list sizeCandListArea.cx = sizeCandListObj.cx; sizeCandListArea.cy = sizeCandListObj.cy; // options candidate list sizeCandListArea.cx += sizeOptionsListObj.cx + sizeOptionsListBdr.cx; sizeCandListArea.cy = max( sizeCandListArea.cy, sizeOptionsListObj.cy ); // extra candidate list sizeCandListArea.cx += sizeExtCandListObj.cx + sizeExtCandListBdr.cx; sizeCandListArea.cy = max( sizeCandListArea.cy, sizeExtCandListObj.cy ); // raw data sizeCandListArea.cx += sizeRawDataObj.cx + sizeRawDataBdr.cx; sizeCandListArea.cy = max( sizeCandListArea.cy, sizeRawDataObj.cy ); break; } } #ifdef NEVER } else { sizeCandListArea.cx = sizeCandListObj.cx; /* be adjusted later */ sizeCandListArea.cy = sizeCandListObj.cy; /* be adjusted later */ if (fShowNumber) { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { sizeCandListArea.cx += sizeMetCandNum.cx + sizeMetMargin.cx + sizeMetBorder.cx + sizeMetMargin.cx; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { sizeCandListArea.cy += sizeMetCandNum.cy + sizeMetMargin.cy + sizeMetBorder.cy + sizeMetMargin.cy; break; } } } } #endif // extension area sizeExtensionArea.cx = 0; sizeExtensionArea.cy = 0; if (fHasExtension) { SIZE size; LONG nExtension; LONG iExtension; nExtension = GetExtensionMgr()->GetExtensionNum(); for (iExtension = 0; iExtension < nExtension; iExtension++) { CCandUIExtension *pExtension = GetExtensionMgr()->GetExtension( iExtension ); pExtension->GetSize( &size ); sizeExtensionArea.cx += size.cx; sizeExtensionArea.cy = max( sizeExtensionArea.cy, size.cy ); } if (0 < nExtension) { sizeExtensionArea.cx += 2; sizeExtensionArea.cy += sizeMetBorder.cy; } } // // adjust object/area size // // max width cxMax = sizeCaptionObj.cx; cxMax = max( cxMax, sizeCandListArea.cx ); cxMax = max( cxMax, sizeExtensionArea.cx ); // size of areas sizeCaptionObj.cx = cxMax; sizeCandListArea.cx = cxMax; sizeExtensionArea.cx = cxMax; // objects in candidate list areas switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { sizeExtCandListObj.cx = sizeCandListArea.cx; sizeExtCandListBdr.cx = sizeCandListArea.cx; sizeOptionsListObj.cx = sizeCandListArea.cx; sizeOptionsListBdr.cx = sizeCandListArea.cx; sizeCandListObj.cx = sizeCandListArea.cx; sizeRawDataObj.cx = sizeCandListArea.cx; sizeRawDataBdr.cx = sizeCandListArea.cx; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { sizeExtCandListObj.cy = sizeCandListArea.cy; sizeExtCandListBdr.cy = sizeCandListArea.cy; sizeOptionsListObj.cy = sizeCandListArea.cy; sizeOptionsListBdr.cy = sizeCandListArea.cy; sizeCandListObj.cy = sizeCandListArea.cy; sizeRawDataObj.cy = sizeCandListArea.cy; sizeRawDataBdr.cy = sizeCandListArea.cy; break; } } // // calculate window size, client area // switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { // window size sizeWindow.cx = sizeMetWndFrame.cx * 2 + cxMax; sizeWindow.cy = sizeMetWndFrame.cy * 2 + sizeCaptionObj.cy + sizeCandListArea.cy + sizeExtensionArea.cy; // margin at top and bottom sizeWindow.cy += 2; // client area rcClient.left = sizeMetWndFrame.cx; rcClient.top = sizeMetWndFrame.cy + 1; rcClient.right = sizeWindow.cx - sizeMetWndFrame.cx; rcClient.bottom = sizeWindow.cy - sizeMetWndFrame.cy - 1; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { // window size sizeWindow.cx = sizeMetWndFrame.cx * 2 + cxMax; sizeWindow.cy = sizeMetWndFrame.cy * 2 + sizeCaptionObj.cy + sizeCandListArea.cy + sizeExtensionArea.cy; // margin at top and bottom sizeWindow.cx += 2; // client area rcClient.left = sizeMetWndFrame.cx + 1; rcClient.top = sizeMetWndFrame.cy; rcClient.right = sizeWindow.cx - sizeMetWndFrame.cx + 1; rcClient.bottom = sizeWindow.cy - sizeMetWndFrame.cy; break; } } // // calculate area/object rects // // caption rcCaptionObj.left = rcClient.left; rcCaptionObj.top = rcClient.top; rcCaptionObj.right = rcCaptionObj.left + sizeCaptionObj.cx; rcCaptionObj.bottom = rcCaptionObj.top + sizeCaptionObj.cy; // candidate list area rcCandListArea.left = rcClient.left; rcCandListArea.top = rcCaptionObj.bottom; rcCandListArea.right = rcCandListArea.left + sizeCandListArea.cx; rcCandListArea.bottom = rcCandListArea.top + sizeCandListArea.cy; // extension area rcExtensionArea.left = rcClient.left; rcExtensionArea.top = rcCandListArea.bottom; rcExtensionArea.right = rcExtensionArea.left + sizeExtensionArea.cx; rcExtensionArea.bottom = rcExtensionArea.top + sizeExtensionArea.cy; // // calculate object rects in candidate list area // switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: { int py = rcCandListArea.top; // extra candidate list rcExtCandListObj.left = rcCandListArea.left; rcExtCandListObj.top = py; rcExtCandListObj.right = rcExtCandListObj.left + sizeExtCandListObj.cx; rcExtCandListObj.bottom = rcExtCandListObj.top + sizeExtCandListObj.cy; py = rcExtCandListObj.bottom; rcExtCandListBdr.left = rcCandListArea.left; rcExtCandListBdr.top = py; rcExtCandListBdr.right = rcExtCandListBdr.left + sizeExtCandListBdr.cx; rcExtCandListBdr.bottom = rcExtCandListBdr.top + sizeExtCandListBdr.cy; py = rcExtCandListBdr.bottom; // candidate list rcCandListObj.left = rcCandListArea.left; rcCandListObj.top = py; rcCandListObj.right = rcCandListObj.left + sizeCandListObj.cx; rcCandListObj.bottom = rcCandListObj.top + sizeCandListObj.cy; py = rcCandListObj.bottom; // rawdata rcRawDataBdr.left = rcCandListArea.left; rcRawDataBdr.top = py; rcRawDataBdr.right = rcRawDataBdr.left + sizeRawDataBdr.cx; rcRawDataBdr.bottom = rcRawDataBdr.top + sizeRawDataBdr.cy; py = rcRawDataBdr.bottom; rcRawDataObj.left = rcCandListArea.left; rcRawDataObj.top = py; rcRawDataObj.right = rcRawDataObj.left + sizeRawDataObj.cx; rcRawDataObj.bottom = rcRawDataObj.top + sizeRawDataObj.cy; py = rcRawDataObj.bottom; // options candidate list rcOptionsListBdr.left = rcCandListArea.left; rcOptionsListBdr.top = py; rcOptionsListBdr.right = rcOptionsListBdr.left + sizeOptionsListBdr.cx; rcOptionsListBdr.bottom = rcOptionsListBdr.top + sizeOptionsListBdr.cy; py = rcOptionsListBdr.bottom; rcOptionsListObj.left = rcCandListArea.left; rcOptionsListObj.top = py; rcOptionsListObj.right = rcOptionsListObj.left + sizeOptionsListObj.cx; rcOptionsListObj.bottom = rcOptionsListObj.top + sizeOptionsListObj.cy; py = rcOptionsListObj.bottom; break; } case CANDUIDIR_BOTTOMTOTOP: { int py = rcCandListArea.top; // options candidate list rcOptionsListObj.left = rcCandListArea.left; rcOptionsListObj.top = py; rcOptionsListObj.right = rcOptionsListObj.left + sizeOptionsListObj.cx; rcOptionsListObj.bottom = rcOptionsListObj.top + sizeOptionsListObj.cy; py = rcOptionsListObj.bottom; rcOptionsListBdr.left = rcCandListArea.left; rcOptionsListBdr.top = py; rcOptionsListBdr.right = rcOptionsListBdr.left + sizeOptionsListBdr.cx; rcOptionsListBdr.bottom = rcOptionsListBdr.top + sizeOptionsListBdr.cy; py = rcOptionsListBdr.bottom; // rawdata rcRawDataObj.left = rcCandListArea.left; rcRawDataObj.top = py; rcRawDataObj.right = rcRawDataObj.left + sizeRawDataObj.cx; rcRawDataObj.bottom = rcRawDataObj.top + sizeRawDataObj.cy; py = rcRawDataObj.bottom; rcRawDataBdr.left = rcCandListArea.left; rcRawDataBdr.top = py; rcRawDataBdr.right = rcRawDataBdr.left + sizeRawDataBdr.cx; rcRawDataBdr.bottom = rcRawDataBdr.top + sizeRawDataBdr.cy; py = rcRawDataBdr.bottom; // candidate list rcCandListObj.left = rcCandListArea.left; rcCandListObj.top = py; rcCandListObj.right = rcCandListObj.left + sizeCandListObj.cx; rcCandListObj.bottom = rcCandListObj.top + sizeCandListObj.cy; py = rcCandListObj.bottom; // extra candidate list rcExtCandListBdr.left = rcCandListArea.left; rcExtCandListBdr.top = py; rcExtCandListBdr.right = rcExtCandListBdr.left + sizeExtCandListBdr.cx; rcExtCandListBdr.bottom = rcExtCandListBdr.top + sizeExtCandListBdr.cy; py = rcExtCandListBdr.bottom; rcExtCandListObj.left = rcCandListArea.left; rcExtCandListObj.top = py; rcExtCandListObj.right = rcExtCandListObj.left + sizeExtCandListObj.cx; rcExtCandListObj.bottom = rcExtCandListObj.top + sizeExtCandListObj.cy; py = rcExtCandListObj.bottom; break; } case CANDUIDIR_RIGHTTOLEFT: { int px = rcCandListArea.right; // extra candidate list rcExtCandListObj.left = px - sizeExtCandListObj.cx; rcExtCandListObj.top = rcCandListArea.top; rcExtCandListObj.right = rcExtCandListObj.left + sizeExtCandListObj.cx; rcExtCandListObj.bottom = rcExtCandListObj.top + sizeExtCandListObj.cy; px = rcExtCandListObj.left; rcExtCandListBdr.left = px - sizeExtCandListBdr.cx; rcExtCandListBdr.top = rcCandListArea.top; rcExtCandListBdr.right = rcExtCandListBdr.left + sizeExtCandListBdr.cx; rcExtCandListBdr.bottom = rcExtCandListBdr.top + sizeExtCandListBdr.cy; px = rcExtCandListBdr.left; // candidate list rcCandListObj.left = px - sizeCandListObj.cx; rcCandListObj.top = rcCandListArea.top; rcCandListObj.right = rcCandListObj.left + sizeCandListObj.cx; rcCandListObj.bottom = rcCandListObj.top + sizeCandListObj.cy; px = rcCandListObj.left; // rawdata rcRawDataBdr.left = px - sizeRawDataBdr.cx; rcRawDataBdr.top = rcCandListArea.top; rcRawDataBdr.right = rcRawDataBdr.left + sizeRawDataBdr.cx; rcRawDataBdr.bottom = rcRawDataBdr.top + sizeRawDataBdr.cy; px = rcRawDataBdr.left; rcRawDataObj.left = px - sizeRawDataObj.cx; rcRawDataObj.top = rcCandListArea.top; rcRawDataObj.right = rcRawDataObj.left + sizeRawDataObj.cx; rcRawDataObj.bottom = rcRawDataObj.top + sizeRawDataObj.cy; px = rcRawDataObj.left; // options candidate list rcOptionsListBdr.left = px - sizeOptionsListBdr.cx; rcOptionsListBdr.top = rcCandListArea.top; rcOptionsListBdr.right = rcOptionsListBdr.left + sizeOptionsListBdr.cx; rcOptionsListBdr.bottom = rcOptionsListBdr.top + sizeOptionsListBdr.cy; px = rcOptionsListBdr.left; rcOptionsListObj.left = px - sizeOptionsListObj.cx; rcOptionsListObj.top = rcCandListArea.top; rcOptionsListObj.right = rcOptionsListObj.left + sizeOptionsListObj.cx; rcOptionsListObj.bottom = rcOptionsListObj.top + sizeOptionsListObj.cy; px = rcOptionsListObj.left; break; } case CANDUIDIR_LEFTTORIGHT: { int px = rcCandListArea.left; // extra candidate list rcExtCandListObj.left = px; rcExtCandListObj.top = rcCandListArea.top; rcExtCandListObj.right = rcExtCandListObj.left + sizeExtCandListObj.cx; rcExtCandListObj.bottom = rcExtCandListObj.top + sizeExtCandListObj.cy; px = rcExtCandListObj.right; rcExtCandListBdr.left = px; rcExtCandListBdr.top = rcCandListArea.top; rcExtCandListBdr.right = rcExtCandListBdr.left + sizeExtCandListBdr.cx; rcExtCandListBdr.bottom = rcExtCandListBdr.top + sizeExtCandListBdr.cy; px = rcExtCandListBdr.right; // candidate list rcCandListObj.left = px; rcCandListObj.top = rcCandListArea.top; rcCandListObj.right = rcCandListObj.left + sizeCandListObj.cx; rcCandListObj.bottom = rcCandListObj.top + sizeCandListObj.cy; px = rcCandListObj.right; // rawdata rcRawDataBdr.left = px; rcRawDataBdr.top = rcCandListArea.top; rcRawDataBdr.right = rcRawDataBdr.left + sizeRawDataBdr.cx; rcRawDataBdr.bottom = rcRawDataBdr.top + sizeRawDataBdr.cy; px = rcRawDataBdr.right; rcRawDataObj.left = px; rcRawDataObj.top = rcCandListArea.top; rcRawDataObj.right = rcRawDataObj.left + sizeRawDataObj.cx; rcRawDataObj.bottom = rcRawDataObj.top + sizeRawDataObj.cy; px = rcRawDataObj.right; // options candidate list rcOptionsListBdr.left = px; rcOptionsListBdr.top = rcCandListArea.top; rcOptionsListBdr.right = rcOptionsListBdr.left + sizeOptionsListBdr.cx; rcOptionsListBdr.bottom = rcOptionsListBdr.top + sizeOptionsListBdr.cy; px = rcOptionsListBdr.right; rcOptionsListObj.left = px; rcOptionsListObj.top = rcCandListArea.top; rcOptionsListObj.right = rcOptionsListObj.left + sizeOptionsListObj.cx; rcOptionsListObj.bottom = rcOptionsListObj.top + sizeOptionsListObj.cy; px = rcOptionsListObj.right; break; } } // // change window position and size // // window position SIZE sizeTotal = sizeWindow; if (IsShadowEnabled() && m_pWndShadow) { SIZE sizeShadow; m_pWndShadow->GetShift( &sizeShadow ); sizeTotal.cx += sizeShadow.cx; sizeTotal.cy += sizeShadow.cy; } switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: { CalcWindowRect( &rcWindow, &m_rcTarget, sizeTotal.cx, sizeTotal.cy, m_cxWndOffset, m_cyWndOffset, ALIGN_LEFT, LOCATE_BELLOW ); break; } case CANDUIDIR_BOTTOMTOTOP: { CalcWindowRect( &rcWindow, &m_rcTarget, sizeTotal.cx, sizeTotal.cy, m_cxWndOffset, m_cyWndOffset, ALIGN_RIGHT, LOCATE_ABOVE ); break; } case CANDUIDIR_RIGHTTOLEFT: { CalcWindowRect( &rcWindow, &m_rcTarget, sizeTotal.cx, sizeTotal.cy, m_cxWndOffset, m_cyWndOffset, LOCATE_LEFT, ALIGN_TOP ); break; } case CANDUIDIR_LEFTTORIGHT: { CalcWindowRect( &rcWindow, &m_rcTarget, sizeTotal.cx, sizeTotal.cy, m_cxWndOffset, m_cyWndOffset, LOCATE_RIGHT, ALIGN_BOTTOM ); break; } } // rcWindow now include the shadow size. restore to original size rcWindow.right = rcWindow.left + sizeWindow.cx; rcWindow.bottom = rcWindow.top + sizeWindow.cy; Move( rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top ); // layout window frame if (m_pWndFrame != NULL) { RECT rc; rc.left = 0; rc.top = 0; rc.right = rcWindow.right - rcWindow.left; rc.bottom = rcWindow.bottom - rcWindow.top; m_pWndFrame->SetRect( &rc ); m_pWndFrame->Show( TRUE ); } // // misc // // list/border style switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: { dwListStyle = UILIST_HORZTB; dwBdrStyle = UIBORDER_HORZ; break; } case CANDUIDIR_BOTTOMTOTOP: { dwListStyle = UILIST_HORZBT; dwBdrStyle = UIBORDER_HORZ; break; } case CANDUIDIR_RIGHTTOLEFT: { dwListStyle = UILIST_VERTRL; dwBdrStyle = UIBORDER_VERT; break; } case CANDUIDIR_LEFTTORIGHT: { dwListStyle = UILIST_VERTLR; dwBdrStyle = UIBORDER_VERT; break; } } // // layout objects // // caption if (m_pCaptionObj != NULL) { m_pCaptionObj->SetRect( &rcCaptionObj ); m_pCaptionObj->Show( fShowCaption ); m_pCaptionObj->SetText( GetPropertyMgr()->GetWindowCaptionProp()->GetText() ); } // extra candidate list object if (m_pExtListUIObj != NULL) { m_pExtListUIObj->SetStyle( dwListStyle ); m_pExtListUIObj->SetLineHeight( sizeMetCandItem.cy ); m_pExtListUIObj->SetInlineCommentPos( cxInlineCommentPos ); m_pExtListUIObj->SetRect( &rcExtCandListObj ); m_pExtListUIObj->Show( fShowExtCandList ); } // extra candidate list border pUIObj = FindUIObject( IDUIF_BORDEREXTRACAND ); if (pUIObj != NULL) { pUIObj->SetStyle( dwBdrStyle ); pUIObj->SetRect( &rcExtCandListBdr ); pUIObj->Show( fShowExtCandList ); } // candidate menu button if (m_pCandMenuBtn != NULL) { RECT rc; BOOL fExtraSpace = GetPropertyMgr()->GetMenuButtonProp()->IsVisible(); switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: { rc.left = rcCandListObj.right - sizeMetSmButton.cx; rc.top = rcCandListObj.bottom - sizeMetSmButton.cy; rc.right = rc.left + sizeMetSmButton.cx; rc.bottom = rc.top + sizeMetSmButton.cy; cxyExtraBottomSpace = (fExtraSpace ? sizeMetSmButton.cy : 0); break; } case CANDUIDIR_BOTTOMTOTOP: { rc.left = rcCandListObj.right - sizeMetSmButton.cx; rc.top = rcCandListObj.top; rc.right = rc.left + sizeMetSmButton.cx; rc.bottom = rc.top + sizeMetSmButton.cy; cxyExtraTopSpace = (fExtraSpace ? sizeMetSmButton.cy : 0); break; } case CANDUIDIR_RIGHTTOLEFT: { rc.left = rcCandListObj.left; rc.top = rcCandListObj.bottom - sizeMetSmButton.cy; rc.right = rc.left + sizeMetSmButton.cx; rc.bottom = rc.top + sizeMetSmButton.cy; cxyExtraBottomSpace = (fExtraSpace ? sizeMetSmButton.cx : 0); break; } case CANDUIDIR_LEFTTORIGHT: { rc.left = rcCandListObj.right - sizeMetSmButton.cx; rc.top = rcCandListObj.bottom - sizeMetSmButton.cy; rc.right = rc.left + sizeMetSmButton.cx; rc.bottom = rc.top + sizeMetSmButton.cy; cxyExtraTopSpace = (fExtraSpace ? sizeMetSmButton.cx : 0); break; } } m_pCandMenuBtn->SetRect( &rc ); m_pCandMenuBtn->Show( GetPropertyMgr()->GetMenuButtonProp()->IsVisible() ); m_pCandMenuBtn->Enable( GetPropertyMgr()->GetMenuButtonProp()->IsEnabled() ); m_pCandMenuBtn->SetToolTip( GetPropertyMgr()->GetMenuButtonProp()->GetToolTipString() ); } // layout candidate tip button if (m_pCandTipBtn != NULL) { RECT rc; BOOL fExtraSpace = FALSE; if (m_pExtListUIObj && m_pExtListUIObj->IsVisible()) { m_pExtListUIObj->GetRect( &rc ); } else { rc = rcCandListObj; fExtraSpace = fShowCandTip; } switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: { rc.left = rc.right - sizeMetSmButton.cx; rc.top = rc.top; rc.right = rc.left + sizeMetSmButton.cx; rc.bottom = rc.top + sizeMetSmButton.cy; cxyExtraTopSpace = (fExtraSpace ? sizeMetSmButton.cy : 0); break; } case CANDUIDIR_BOTTOMTOTOP: { rc.left = rc.right - sizeMetSmButton.cx; rc.top = rc.bottom - sizeMetSmButton.cy; rc.right = rc.left + sizeMetSmButton.cx; rc.bottom = rc.top + sizeMetSmButton.cy; cxyExtraBottomSpace = (fExtraSpace ? sizeMetSmButton.cy : 0); break; } case CANDUIDIR_RIGHTTOLEFT: { rc.left = rc.right - sizeMetSmButton.cx; rc.top = rc.bottom - sizeMetSmButton.cy; rc.right = rc.left + sizeMetSmButton.cx; rc.bottom = rc.top + sizeMetSmButton.cy; cxyExtraTopSpace = (fExtraSpace ? sizeMetSmButton.cy : 0); break; } case CANDUIDIR_LEFTTORIGHT: { rc.left = rc.left; rc.top = rc.bottom - sizeMetSmButton.cy; rc.right = rc.left + sizeMetSmButton.cx; rc.bottom = rc.top + sizeMetSmButton.cy; cxyExtraBottomSpace = (fExtraSpace ? sizeMetSmButton.cy : 0); break; } } m_pCandTipBtn->SetRect( &rc ); m_pCandTipBtn->SetIcon( m_fCandTipWndOpen ? m_hIconCandTipOn : m_hIconCandTipOff ); m_pCandTipBtn->Show( fShowCandTip ); m_pCandTipBtn->Enable( TRUE ); // m_pCandTipBtn->SetToolTip( GetPropertyMgr()->GetMenuButtonProp()->GetToolTipString() ); } // candidate list if (m_pListUIObj != NULL) { m_pListUIObj->SetStyle( dwListStyle ); m_pListUIObj->SetLineHeight( sizeMetCandItem.cy ); m_pListUIObj->SetInlineCommentPos( cxInlineCommentPos ); m_pListUIObj->SetRect( &rcCandListObj ); m_pListUIObj->SetExtraTopSpace( cxyExtraTopSpace ); m_pListUIObj->SetExtraBottomSpace( cxyExtraBottomSpace ); } // rawdata object if (m_pCandRawData != NULL) { DWORD dwStyle; RECT rc; rc = rcRawDataObj; switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: { dwStyle = UICANDRAWDATA_HORZTB; InflateRect( &rc, -1, 0 ); break; } case CANDUIDIR_BOTTOMTOTOP: { dwStyle = UICANDRAWDATA_HORZBT; InflateRect( &rc, -1, 0 ); break; } case CANDUIDIR_RIGHTTOLEFT: { dwStyle = UICANDRAWDATA_VERTRL; InflateRect( &rc, 0, -1 ); break; } case CANDUIDIR_LEFTTORIGHT: { dwStyle = UICANDRAWDATA_VERTLR; InflateRect( &rc, 0, -1 ); break; } } m_pCandRawData->SetStyle( dwStyle ); m_pCandRawData->SetRect( &rc ); m_pCandRawData->Show( m_fHasRawData ); } // rawdata border pUIObj = FindUIObject( IDUIF_BORDERRAWDATA ); if (pUIObj != NULL) { pUIObj->SetStyle( dwBdrStyle ); pUIObj->SetRect( &rcRawDataBdr ); pUIObj->Show( m_fHasRawData ); } // options candidate list border pUIObj = FindUIObject( IDUIF_BORDEROPTIONSCAND ); if (pUIObj != NULL) { pUIObj->SetStyle( dwBdrStyle ); pUIObj->SetRect( &rcOptionsListBdr ); pUIObj->Show( fShowOptionsCandList ); } // options candidate list if (m_pOptionsListUIObj != NULL) { m_pOptionsListUIObj->SetStyle( dwListStyle | UILIST_ICONSNOTNUMBERS ); m_pOptionsListUIObj->SetLineHeight( sizeMetCandItem.cy ); m_pOptionsListUIObj->SetInlineCommentPos( cxInlineCommentPos ); m_pOptionsListUIObj->SetRect( &rcOptionsListObj ); m_pOptionsListUIObj->SetExtraTopSpace( cxyExtraTopSpace ); m_pOptionsListUIObj->SetExtraBottomSpace( cxyExtraBottomSpace ); } // extension area border pUIObj = FindUIObject( IDUIF_BORDERBOTTOM ); if (pUIObj != NULL) { RECT rc; rc.left = rcExtensionArea.left; rc.top = rcExtensionArea.top; rc.right = rcExtensionArea.right; rc.bottom = rc.top + sizeMetBorder.cy; pUIObj->SetRect( &rc ); pUIObj->Show( fHasExtension ); } // extension objects if (fHasExtension) { SIZE size; LONG nExtension; LONG iExtension; POINT pt; RECT rc; pt.x = rcExtensionArea.left + 1; pt.y = rcExtensionArea.top + sizeMetBorder.cy; nExtension = GetExtensionMgr()->GetExtensionNum(); for (iExtension = 0; iExtension < nExtension; iExtension++) { CCandUIExtension *pExtension = GetExtensionMgr()->GetExtension( iExtension ); CUIFObject *pUIObjExt; pExtension->GetSize( &size ); rc.left = pt.x; rc.top = pt.y; rc.right = rc.left + size.cx; rc.bottom = rc.top + size.cy; pUIObjExt = FindUIObject( IDUIF_EXTENDED + iExtension ); if (pUIObjExt != NULL) { pUIObjExt->SetRect( &rc ); } pt.x += size.cx; } } #ifdef NEVER // layout candidate num buttons and border if (fShowNumber) { RECT rc; DWORD dwStyle; // buttons for (i = 0; i < NUM_CANDSTR_MAX; i++) { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { /* NOTE: KOJIW: unconfirmed */ rc.left = rcCandListArea.left; rc.top = rcCandListArea.top + sizeMetCandNum.cy * i; rc.right = rc.left + sizeMetCandNum.cx; rc.bottom = rc.top + sizeMetCandNum.cy; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { /* NOTE: KOJIW: unconfirmed */ rc.left = rcCandListArea.right - sizeMetCandNum.cy * (i+1); rc.top = rcCandListArea.top; rc.right = rc.left + sizeMetCandNum.cx; rc.bottom = rc.top + sizeMetCandNum.cy; break; } } pUIObj = FindUIObject( IDUIF_CANDNUMBUTTON + i ); if (pUIObj != NULL) { pUIObj->Show( (i < m_nItemShow) ); pUIObj->SetRect( &rc ); } } // border switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { /* NOTE: KOJIW: unconfirmed */ rc.left = rcCandListArea.left + sizeMetCandNum.cx + sizeMetMargin.cx; rc.top = rcCandListArea.top; rc.right = rc.left + sizeMetBorder.cx; rc.bottom = rcCandListArea.bottom; dwStyle = UIBORDER_VERT; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { /* NOTE: KOJIW: unconfirmed */ rc.left = rcCandListArea.left; rc.top = rcCandListArea.top + sizeMetCandNum.cy + sizeMetMargin.cy; rc.right = rcCandListArea.right; rc.bottom = rc.top + sizeMetBorder.cy; dwStyle = UIBORDER_HORZ; break; } } pUIObj = FindUIObject( IDUIF_BORDERLEFT ); if (pUIObj != NULL) { pUIObj->Show( TRUE ); pUIObj->SetStyle( dwStyle ); pUIObj->SetRect( &rc ); } } else { // buttons for (i = 0; i < NUM_CANDSTR_MAX; i++) { pUIObj = FindUIObject( IDUIF_CANDNUMBUTTON + i ); if (pUIObj != NULL) { pUIObj->Show( FALSE ); } } // border pUIObj = FindUIObject( IDUIF_BORDERLEFT ); if (pUIObj != NULL) { pUIObj->Show( FALSE ); } } #endif // // Notify UI object update // NotifyUIObjectEvent( CANDUIOBJ_OPTIONSLISTBOX, CANDUIOBJEV_UPDATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDLISTBOX, CANDUIOBJEV_UPDATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDCAPTION, CANDUIOBJEV_UPDATED ); NotifyUIObjectEvent( CANDUIOBJ_MENUBUTTON, CANDUIOBJEV_UPDATED ); NotifyUIObjectEvent( CANDUIOBJ_EXTRACANDIDATE, CANDUIOBJEV_UPDATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDRAWDATA, CANDUIOBJEV_UPDATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDTIPBUTTON, CANDUIOBJEV_UPDATED ); // if (m_pCandTipWnd != NULL) { MoveCandTipWindow(); } ReleaseDC( m_hWnd, hDC ); } /* S E L E C T I T E M N E X T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SelectItemNext( void ) { int iCurSel = m_pListUIObj->GetSelection(); int iVisTop = m_pListUIObj->GetTop(); int iVisBtm = m_pListUIObj->GetBottom(); int iSelMax = m_pListUIObj->GetCount() - 1; int iSelNew = iCurSel + 1; if (iSelMax < iSelNew) { ScrollToTop(); iSelNew = 0; } else if (iVisBtm < iSelNew) { ScrollPageNext(); } SelectItemProc( iSelNew ); } /* S E L E C T I T E M P R E V */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SelectItemPrev( void ) { int iCurSel = m_pListUIObj->GetSelection(); int iVisTop = m_pListUIObj->GetTop(); int iVisBtm = m_pListUIObj->GetBottom(); int iSelMax = m_pListUIObj->GetItemCount() - 1; int iSelNew = iCurSel - 1; if (iSelNew < 0) { ScrollToEnd(); iSelNew = iSelMax; } else if (iSelNew < iVisTop) { ScrollPagePrev(); } SelectItemProc( iSelNew ); } /* S E L E C T P A G E N E X T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SelectPageNext( void ) { int iCurSel = m_pListUIObj->GetSelection(); int iVisTop = m_pListUIObj->GetTop(); int iVisBtm = m_pListUIObj->GetBottom(); int iSelMax = m_pListUIObj->GetItemCount() - 1; int iItemPage = m_pListUIObj->GetVisibleCount(); if (iCurSel == iSelMax) { SelectItemTop(); } else { int iSelNew; if (iCurSel == iVisBtm) { iSelNew = min( iCurSel + iItemPage, iSelMax ); } else { iSelNew = iVisBtm; } SelectItemProc( iSelNew ); } } /* S E L E C T P A G E P R E V */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SelectPagePrev( void ) { int iCurSel = m_pListUIObj->GetSelection(); int iVisTop = m_pListUIObj->GetTop(); int iVisBtm = m_pListUIObj->GetBottom(); int iSelMax = m_pListUIObj->GetItemCount() - 1; int iItemPage = m_pListUIObj->GetVisibleCount(); if (iCurSel == 0) { SelectItemEnd(); } else { int iSelNew; if (iCurSel == iVisTop) { iSelNew = max( 0, iCurSel - iItemPage ); } else { iSelNew = iVisTop; } SelectItemProc( iSelNew ); } } /* M A P C O M M A N D */ /*------------------------------------------------------------------------------ Map directional command to undirectional command (CUIFWindowBase method) ------------------------------------------------------------------------------*/ CANDUICOMMAND CCandWindow::MapCommand( CANDUICOMMAND cmd ) { CANDUIUIDIRECTION uidir = GetPropertyMgr()->GetCandWindowProp()->GetUIDirection(); switch (cmd) { case CANDUICMD_MOVESELUP: { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: { cmd = CANDUICMD_MOVESELPREV; break; } case CANDUIDIR_BOTTOMTOTOP: { cmd = CANDUICMD_MOVESELNEXT; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { cmd = CANDUICMD_NONE; break; } } break; } case CANDUICMD_MOVESELDOWN: { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: { cmd = CANDUICMD_MOVESELNEXT; break; } case CANDUIDIR_BOTTOMTOTOP: { cmd = CANDUICMD_MOVESELPREV; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { cmd = CANDUICMD_NONE; break; } } break; } case CANDUICMD_MOVESELLEFT: { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { cmd = CANDUICMD_NONE; break; } case CANDUIDIR_RIGHTTOLEFT: { cmd = CANDUICMD_MOVESELNEXT; break; } case CANDUIDIR_LEFTTORIGHT: { cmd = CANDUICMD_MOVESELPREV; break; } } break; } case CANDUICMD_MOVESELRIGHT: { switch (uidir) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { cmd = CANDUICMD_NONE; break; } case CANDUIDIR_RIGHTTOLEFT: { cmd = CANDUICMD_MOVESELPREV; break; } case CANDUIDIR_LEFTTORIGHT: { cmd = CANDUICMD_MOVESELNEXT; break; } } break; } } return cmd; } /* U P D A T E A L L W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::UpdateAllWindow( void ) { CCandWindowBase::UpdateAllWindow(); if (m_pCommentWnd != NULL) { m_pCommentWnd->UpdateWindow(); } } /* G E T C A N D W I N D O W O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CCandWindowBase *CCandWindow::GetCandWindowObj( void ) { return this; } /* G E T P O P U P C O M M E N T W I N D O W O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CPopupCommentWindow *CCandWindow::GetPopupCommentWindowObj( void ) { return m_pCommentWnd; } /* G E T O P T I O N S L I S T B O X O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFCandListBase *CCandWindow::GetOptionsListBoxObj( void ) { return m_pOptionsListUIObj; } /* G E T C A N D L I S T B O X O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFCandListBase *CCandWindow::GetCandListBoxObj( void ) { return m_pListUIObj; } /* G E T C A P T I O N O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFWndCaption *CCandWindow::GetCaptionObj( void ) { return m_pCaptionObj; } /* G E T M E N U B U T T O N O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFButton *CCandWindow::GetMenuButtonObj( void ) { return m_pCandMenuBtn; } /* G E T E X T R A C A N D I D A T E O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFCandListBase *CCandWindow::GetExtraCandidateObj( void ) { return m_pExtListUIObj; } /* G E T C A N D R A W D A T A O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFCandRawData *CCandWindow::GetCandRawDataObj( void ) { return m_pCandRawData; } /* G E T C A N D T I P W I N D O W O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFBalloonWindow *CCandWindow::GetCandTipWindowObj( void ) { return m_pCandTipWnd; } /* G E T C A N D T I P B U T T O N O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFButton *CCandWindow::GetCandTipButtonObj( void ) { return m_pCandTipBtn; } /* S C R O L L P A G E N E X T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::ScrollPageNext( void ) { int iCurSel = m_pListUIObj->GetSelection(); int iVisTop = m_pListUIObj->GetTop(); int iVisBtm = m_pListUIObj->GetBottom(); int iSelMax = m_pListUIObj->GetItemCount() - 1; int iItemPage = m_pListUIObj->GetVisibleCount(); int iTopNew = iVisTop + iItemPage; if (iSelMax - iItemPage < iTopNew) { ScrollToEnd(); } else { m_pListUIObj->SetTop( iTopNew, TRUE ); } } /* S C R O L L P A G E P R E V */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::ScrollPagePrev( void ) { int iCurSel = m_pListUIObj->GetSelection(); int iVisTop = m_pListUIObj->GetTop(); int iVisBtm = m_pListUIObj->GetBottom(); int iSelMax = m_pListUIObj->GetItemCount() - 1; int iItemPage = m_pListUIObj->GetVisibleCount(); int iTopNew = iVisTop - iItemPage; if (iTopNew < 0) { ScrollToTop(); } else { m_pListUIObj->SetTop( iTopNew, TRUE ); } } /* S C R O L L T O T O P */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::ScrollToTop( void ) { m_pListUIObj->SetTop( 0, TRUE ); } /* S C R O L L T O E N D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::ScrollToEnd( void ) { int iSelMax = m_pListUIObj->GetItemCount() - 1; int iItemPage = m_pListUIObj->GetVisibleCount(); m_pListUIObj->SetTop( iSelMax - iItemPage + 1, TRUE ); } /* O N C O M M E N T W I N D O W M O V E D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::OnCommentWindowMoved( void ) { NotifyUIObjectEvent( CANDUIOBJ_POPUPCOMMENTWINDOW, CANDUIOBJEV_UPDATED ); } /* O N C O M M E N T S E L E C T E D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::OnCommentSelected( int iCandItem ) { m_pCandUI->NotifyCompleteCand( iCandItem ); } /* O N C O M M E N T C L O S E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::OnCommentClose( void ) { CloseCommentWindow(); } /* O N M E N U O P E N E D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::OnMenuOpened( void ) { if (m_pCommentWnd != NULL) { m_pCommentWnd->OnCandWindowMove( FALSE ); } } /* O N M E N U C L O S E D */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::OnMenuClosed( void ) { if (m_pCommentWnd != NULL) { m_pCommentWnd->OnCandWindowMove( FALSE ); } } /* S E T C A N D I D A T E L I S T P R O C */ /*------------------------------------------------------------------------------ Set candidate list ------------------------------------------------------------------------------*/ void CCandWindow::SetCandidateListProc( void ) { CCandidateList *pCandList; CCandidateItem *pCandItem; pCandList = GetCandListMgr()->GetCandList(); Assert( pCandList != NULL ); // reset list item if (m_pExtListUIObj) { m_pExtListUIObj->DelAllCandItem(); pCandItem = pCandList->GetExtraCandItem(); if (pCandItem != NULL) { if (pCandItem->IsVisible()) { CCandListItem *pCandListItem = new CCandListItem( m_pExtListUIObj->GetItemCount(), ICANDITEM_EXTRA, pCandItem ); m_pExtListUIObj->AddCandItem( pCandListItem ); } m_pExtListUIObj->ClearSelection( FALSE ); m_pExtListUIObj->SetStartIndex( 0 ); } } CCandWindowBase::SetCandidateListProc(); } /* C L E A R C A N D I D A T E L I S T P R O C */ /*------------------------------------------------------------------------------ Clear candidte list ------------------------------------------------------------------------------*/ void CCandWindow::ClearCandidateListProc( void ) { if (m_pExtListUIObj) { m_pExtListUIObj->DelAllCandItem(); } CCandWindowBase::ClearCandidateListProc(); } /* S E T A T T E N S I O N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SetAttensionBySelect( int iItem ) { CCandidateList *pCandList; CCandidateItem *pCandItem; BOOL fHasPopupComment; // Satori#3928 // do nothing when candidate list is already cleared if (GetCandListMgr()->GetCandList() == NULL) { m_iItemAttensionSelect = -1; m_iItemAttensionHover = -1; KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_SELECT ); KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_HOVER ); return; } m_iItemAttensionSelect = iItem; // check if item has popup comment pCandList = GetCandListMgr()->GetCandList(); Assert( pCandList != NULL ); pCandItem = pCandList->GetCandidateItem( m_iItemAttensionSelect ); fHasPopupComment = (pCandItem != NULL && pCandItem->GetPopupComment() != NULL); // if (m_fCommentWndOpen) { if (fHasPopupComment) { // update comment window contents SetCommentStatus( iItem ); } else { // close comment window CloseCommentWindow(); } } else { KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_SELECT ); KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_HOVER ); // make timer to wait to open comment if (fHasPopupComment) { if (IsWindow(m_hWnd)) { SetTimer( m_hWnd, IDTIMER_POPUPCOMMENT_SELECT, GetPropertyMgr()->GetPopupCommentWindowProp()->GetDelayTime(), NULL ); } } } } /* S E T A T T E N S I O N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SetOptionsAttensionByHover( int iItem ) { CCandidateList *pCandList; CCandidateItem *pCandItem; BOOL fHasPopupComment; // Satori#3928 // do nothing when candidate list is already cleared if (GetCandListMgr()->GetOptionsList() == NULL) { m_iItemAttensionSelect = -1; m_iItemAttensionHover = -1; KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_SELECT ); KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_HOVER ); return; } m_iItemAttensionHover = iItem; // check if item has popup comment pCandList = GetCandListMgr()->GetOptionsList(); Assert( pCandList != NULL ); pCandItem = pCandList->GetCandidateItem( m_iItemAttensionHover ); fHasPopupComment = (pCandItem != NULL && pCandItem->GetPopupComment() != NULL); // if (m_fCommentWndOpen) { if (fHasPopupComment) { // update comment window contents SetCommentStatus( iItem ); } } else { KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_HOVER ); // make timer to wait to open comment if (fHasPopupComment) { if (IsWindow(m_hWnd)) { SetTimer( m_hWnd, IDTIMER_POPUPCOMMENT_HOVER, GetPropertyMgr()->GetPopupCommentWindowProp()->GetDelayTime(), NULL ); } } } if (iItem != -1) { SetTimer(m_hWnd, IDTIMER_MENU_HOVER, 50, NULL); } else { KillTimer( m_hWnd, IDTIMER_MENU_HOVER); } GetUIOptionsListObj()->SetCurSel(iItem); } /* S E T A T T E N S I O N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SetAttensionByHover( int iItem ) { CCandidateList *pCandList; CCandidateItem *pCandItem; BOOL fHasPopupComment; // Satori#3928 // do nothing when candidate list is already cleared if (GetCandListMgr()->GetCandList() == NULL) { m_iItemAttensionSelect = -1; m_iItemAttensionHover = -1; KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_SELECT ); KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_HOVER ); return; } m_iItemAttensionHover = iItem; // check if item has popup comment pCandList = GetCandListMgr()->GetCandList(); Assert( pCandList != NULL ); pCandItem = pCandList->GetCandidateItem( m_iItemAttensionHover ); fHasPopupComment = (pCandItem != NULL && pCandItem->GetPopupComment() != NULL); // if (m_fCommentWndOpen) { if (fHasPopupComment) { // update comment window contents SetCommentStatus( iItem ); } } else { KillTimer( m_hWnd, IDTIMER_POPUPCOMMENT_HOVER ); // make timer to wait to open comment if (fHasPopupComment) { if (IsWindow(m_hWnd)) { SetTimer( m_hWnd, IDTIMER_POPUPCOMMENT_HOVER, GetPropertyMgr()->GetPopupCommentWindowProp()->GetDelayTime(), NULL ); } } } } /* O P E N C O M M E N T W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::OpenCommentWindow( int iItem ) { if (m_pCommentWnd->GetWnd() == NULL) { Assert( !m_fCommentWndOpen ); // create comment window m_pCommentWnd->CreateWnd( m_hWnd ); m_pCommentWnd->Move( 0, 0, CX_COMMENTWINDOW, 0 ); m_pCommentWnd->OnCandWindowMove( TRUE ); NotifyUIObjectEvent( CANDUIOBJ_POPUPCOMMENTWINDOW, CANDUIOBJEV_CREATED ); } SetCommentStatus( iItem ); if (!m_fCommentWndOpen) { m_pCommentWnd->Show( TRUE ); m_fCommentWndOpen = TRUE; } } /* C L O S E C O M M E N T W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::CloseCommentWindow( void ) { if (m_fCommentWndOpen) { Assert( m_pCommentWnd->GetWnd() != NULL ); m_pCommentWnd->Show( FALSE ); ClearCommentStatus(); } m_fCommentWndOpen = FALSE; if (m_pCommentWnd->GetWnd() != NULL) { m_pCommentWnd->DestroyWnd(); NotifyUIObjectEvent( CANDUIOBJ_POPUPCOMMENTWINDOW, CANDUIOBJEV_DESTROYED ); } } /* S E T C O M M E N T S T A T U S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::SetCommentStatus( int iItem ) { CCandidateList *pCandList; CCandidateItem *pCandItem; int i; int nItem; DWORD dwGroupID = 0; // get comment group id pCandList = GetCandListMgr()->GetCandList(); Assert( pCandList != NULL ); pCandItem = pCandList->GetCandidateItem( iItem ); if (pCandItem == NULL) { Assert( FALSE ); ClearCommentStatus(); } else { dwGroupID = pCandItem->GetPopupCommentGroupID(); } // show popup comment in same group nItem = pCandList->GetItemCount(); for (i = 0; i < nItem; i++) { pCandItem = pCandList->GetCandidateItem( i ); if (pCandItem != NULL) { BOOL fMatch = ((pCandItem->GetPopupCommentGroupID() & dwGroupID) != 0); pCandItem->SetPopupCommentState( fMatch ); } } // repaint list box and notify if (m_pListUIObj != NULL) { m_pListUIObj->CallOnPaint(); UpdateWindow(); } GetCandListMgr()->NotifyCandItemUpdate( this ); } /* C L E A R C O M M E N T S T A T U S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::ClearCommentStatus( void ) { CCandidateList *pCandList; CCandidateItem *pCandItem; int i; int nItem; pCandList = GetCandListMgr()->GetCandList(); Assert( pCandList != NULL ); // hide all popup comment nItem = pCandList->GetItemCount(); for (i = 0; i < nItem; i++) { pCandItem = pCandList->GetCandidateItem( i ); if (pCandItem != NULL) { pCandItem->SetPopupCommentState( FALSE ); } } // repaint list box and notify if (m_pListUIObj != NULL) { m_pListUIObj->CallOnPaint(); UpdateWindow(); } GetCandListMgr()->NotifyCandItemUpdate( this ); } /* O P E N C A N D T I P W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::OpenCandTipWindow( void ) { if (GetCandListMgr()->GetCandList() == NULL) { return; } if (m_pCandTipWnd->GetWnd() == NULL) { m_pCandTipWnd->CreateWnd( m_hWnd ); NotifyUIObjectEvent( CANDUIOBJ_CANDTIPWINDOW, CANDUIOBJEV_CREATED ); } m_pCandTipWnd->SetText( GetCandListMgr()->GetCandList()->GetTipString() ); ShowCandTipWindow( TRUE ); // if (m_pCommentWnd != NULL) { m_pCommentWnd->OnCandWindowMove( FALSE ); } } /* C L O S E C A N D T I P W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::CloseCandTipWindow( void ) { if (m_pCandTipWnd->GetWnd() != NULL) { DestroyWindow( m_pCandTipWnd->GetWnd() ); NotifyUIObjectEvent( CANDUIOBJ_CANDTIPWINDOW, CANDUIOBJEV_DESTROYED ); } // if (m_pCommentWnd != NULL) { m_pCommentWnd->OnCandWindowMove( FALSE ); } } /* M O V E C A N D T I P W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::MoveCandTipWindow( void ) { RECT rcWnd; RECT rcBtn; POINT pt; BALLOONWNDPOS pos; BALLOONWNDALIGN align; if (m_pCandTipWnd->GetWnd() == NULL) { return; } GetWindowRect( GetWnd(), &rcWnd ); m_pCandTipBtn->GetRect( &rcBtn ); pt.x = rcWnd.left + (rcBtn.left + rcBtn.right) / 2; pt.y = rcWnd.top + (rcBtn.top + rcBtn.bottom) / 2; switch (GetPropertyMgr()->GetCandWindowProp()->GetUIDirection()) { default: case CANDUIDIR_TOPTOBOTTOM: { pos = BALLOONPOS_RIGHT; align = BALLOONALIGN_TOP; break; } case CANDUIDIR_BOTTOMTOTOP: { pos = BALLOONPOS_RIGHT; align = BALLOONALIGN_BOTTOM; break; } case CANDUIDIR_RIGHTTOLEFT: { pos = BALLOONPOS_BELLOW; align = BALLOONALIGN_RIGHT; break; } case CANDUIDIR_LEFTTORIGHT: { pos = BALLOONPOS_BELLOW; align = BALLOONALIGN_LEFT; break; } } m_pCandTipWnd->SetBalloonPos( pos ); m_pCandTipWnd->SetBalloonAlign( align ); m_pCandTipWnd->SetExcludeRect( &rcWnd ); m_pCandTipWnd->SetTargetPos( pt ); NotifyUIObjectEvent( CANDUIOBJ_CANDTIPWINDOW, CANDUIOBJEV_UPDATED ); } /* S H O W C A N D T I P W I N D O W */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandWindow::ShowCandTipWindow( BOOL fShow ) { if (m_pCandTipWnd->GetWnd() == NULL) { return; } if (fShow) { MoveCandTipWindow(); m_pCandTipWnd->Show( TRUE ); } else { m_pCandTipWnd->Show( FALSE ); } } /*============================================================================*/ /* */ /* C C H S C A N D W I N D O W */ /* */ /*============================================================================*/ /* C C H S C A N D W I N D O W */ /*------------------------------------------------------------------------------ Constructor of CChsCandWindow ------------------------------------------------------------------------------*/ CChsCandWindow::CChsCandWindow( CCandidateUI *pCandUIEx, DWORD dwStyle ) : CCandWindowBase( pCandUIEx, dwStyle | UIWINDOW_TOPMOST | UIWINDOW_TOOLWINDOW | UIWINDOW_OFC10MENU ) { m_pListUIObj = NULL; } /* ~ C C H S C A N D W I N D O W */ /*------------------------------------------------------------------------------ Destructor of CChsCandWindow ------------------------------------------------------------------------------*/ CChsCandWindow::~CChsCandWindow() { // // Notify UI object destroy // NotifyUIObjectEvent( CANDUIOBJ_CANDLISTBOX, CANDUIOBJEV_DESTROYED ); NotifyUIObjectEvent( CANDUIOBJ_MENUBUTTON, CANDUIOBJEV_DESTROYED ); NotifyUIObjectEvent( CANDUIOBJ_CANDRAWDATA, CANDUIOBJEV_DESTROYED ); } /* I N I T U I O B J E C T S */ /*------------------------------------------------------------------------------ Create UI objects ------------------------------------------------------------------------------*/ CUIFObject *CChsCandWindow::Initialize( void ) { RECT rc = {0}; CUIFBorder *pBorder; // // create border // pBorder = new CUIFBorder( this, IDUIF_BORDER, &rc, UIBORDER_VERT ); if(pBorder) { pBorder->Initialize(); AddUIObj( pBorder ); } // // create candidate list // m_pListUIObj = new CUIFRowList( this, IDUIF_CANDIDATELIST, &rc, UILIST_HORZTB ); if (m_pListUIObj) { m_pListUIObj->Initialize(); AddUIObj( m_pListUIObj ); } // // create candidate menu button // m_pCandMenuBtn = new CUIFSmartMenuButton( this, IDUIF_CANDIDATEMENU, &rc, UIBUTTON_TOGGLE ); if (m_pCandMenuBtn) { m_pCandMenuBtn->Initialize(); AddUIObj( m_pCandMenuBtn ); m_pCandMenuBtn->SetIcon( m_hIconMenu ); } // // create raw data statics // m_pCandRawData = new CUIFCandRawData( this, IDUIF_RAWDATA, &rc, UICANDRAWDATA_HORZTB ); if (m_pCandRawData) { m_pCandRawData->Initialize(); AddUIObj( m_pCandRawData ); } // // add extensions // CreateExtensionObjects(); // // Notify UI object creation // NotifyUIObjectEvent( CANDUIOBJ_CANDLISTBOX, CANDUIOBJEV_CREATED ); NotifyUIObjectEvent( CANDUIOBJ_MENUBUTTON, CANDUIOBJEV_CREATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDRAWDATA, CANDUIOBJEV_CREATED ); return CCandWindowBase::Initialize(); } /* L A Y O U T W I N D O W */ /*------------------------------------------------------------------------------ Layout window ------------------------------------------------------------------------------*/ void CChsCandWindow::LayoutWindow( void ) { HDC hDC = GetDC( m_hWnd ); RECT rc; DWORD dwStyle; CUIFObject *pUIObj; SIZE size; LONG nExtension; HFONT hFontUI = GetPropertyMgr()->GetCandIndexProp()->GetFont(); HFONT hFontCandidateList = GetPropertyMgr()->GetCandStringProp()->GetFont(); BOOL fHorizontal = ((GetPropertyMgr()->GetCandWindowProp()->GetUIDirection() == CANDUIDIR_RIGHTTOLEFT) || (GetPropertyMgr()->GetCandWindowProp()->GetUIDirection() == CANDUIDIR_LEFTTORIGHT)) ? FALSE : TRUE; // calc metrics int cyText; int cxObjectMargin = 1; int cyObjectMargin = 1; int cxBorder = 2; // border width of vertical border int cyBorder = 2; // border height of horizontal border int cxCandRow; int cyCandRow; int cxMenuBtn; int cyMenuBtn; int cxStatus = 0; int cyStatus = 0; int cxWindow = 0; int cyWindow = 0; GetTextExtent( hFontCandidateList, L"1", 1, &size, fHorizontal ); cyText = max(size.cx, size.cy); cxMenuBtn = cyText / 2; cyMenuBtn = cyText / 2; // // font settings // int nChild = m_ChildList.GetCount(); for (int i = 0; i < nChild; i++) { CUIFObject *pUIObjTmp = m_ChildList.Get( i ); Assert( pUIObjTmp != NULL ); if (pUIObjTmp != m_pListUIObj) { pUIObjTmp->SetFont( hFontUI ); } else { m_pListUIObj->SetFont( hFontCandidateList ); m_pListUIObj->SetInlineCommentFont( GetPropertyMgr()->GetInlineCommentProp()->GetFont() ); m_pListUIObj->SetIndexFont( GetPropertyMgr()->GetCandIndexProp()->GetFont() ); } } // // calculate the size of candidate row // if (fHorizontal) { cyCandRow = cyBorder + cyText; cxCandRow = ( cxBorder + cyText + cyText + HCAND_ITEM_MARGIN ) * NUM_CANDSTR_MAX + cyCandRow * 2; } else { cxCandRow = cxBorder + cyText; cyCandRow = ( cyBorder + cyText + cyText + HCAND_ITEM_MARGIN ) * NUM_CANDSTR_MAX + cxCandRow * 2; } // // calculate the size of status area // // extension items nExtension = GetExtensionMgr()->GetExtensionNum(); if (0 < nExtension) { LONG i; for (i = 0; i < nExtension; i++) { CCandUIExtension *pExtension = GetExtensionMgr()->GetExtension( i ); pExtension->GetSize( &size ); if (fHorizontal) { cxStatus += size.cx + cxBorder; cyStatus = max( cyStatus, size.cy + cxBorder ); } else { cxStatus = max( cxStatus, size.cx + cxBorder ); cyStatus += size.cy + cxBorder; } } if (fHorizontal) { cyStatus += cyObjectMargin + cyBorder + cyObjectMargin; } else { cxStatus += cxObjectMargin + cxBorder + cxObjectMargin; } } else if (m_fHasRawData) { if (fHorizontal) { cxStatus = cxCandRow; cyStatus = GetSystemMetrics( SM_CXHSCROLL ) + cyObjectMargin + cyBorder + cyObjectMargin; } else { cxStatus = GetSystemMetrics( SM_CXHSCROLL ) + cxObjectMargin + cxBorder + cxObjectMargin; cyStatus = cyCandRow; } } else { } // // calculate window size, considering margins/border size // if (fHorizontal) { cxWindow = max( cxBorder + cxMenuBtn + cxCandRow, cxStatus ); cyWindow = cyCandRow + cyStatus; rc.left = m_rcTarget.left; rc.top = m_rcTarget.bottom; } else { cxWindow = cxCandRow + cxStatus; cyWindow = max( cxBorder + cyMenuBtn + cyCandRow, cyStatus ); rc.left = m_rcTarget.left - cxWindow; rc.top = m_rcTarget.top; } // // change window position and size // rc.right = rc.left + cxWindow + cxBorder; rc.bottom = rc.top + cyWindow + cyBorder; Move( rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top ); // // layout candidate menu button // (uses rc of window. do this after layouting window) // if (fHorizontal) { rc.left = 0; rc.top = 0; rc.right = cxMenuBtn + cxBorder; rc.bottom = cyCandRow; } else { rc.right = cxWindow; rc.top = 0; rc.left = rc.right - cxCandRow; rc.bottom = cyMenuBtn + cyBorder; } if (m_pCandMenuBtn != NULL) { m_pCandMenuBtn->SetRect( &rc ); m_pCandMenuBtn->Show( TRUE ); m_pCandMenuBtn->Enable( GetPropertyMgr()->GetMenuButtonProp()->IsEnabled() ); m_pCandMenuBtn->SetToolTip( GetPropertyMgr()->GetMenuButtonProp()->GetToolTipString() ); } // // layout candidate row // (uses rc of window. do this after layouting candidate menu button ) if (fHorizontal) { rc.left = rc.right; rc.right = rc.left + cxCandRow; dwStyle = UILIST_HORZTB; } else { rc.top = rc.bottom; rc.bottom = rc.top + cyCandRow; dwStyle = UILIST_VERTRL; } if (m_pListUIObj != NULL) { m_pListUIObj->SetRect( &rc ); m_pListUIObj->SetStyle( dwStyle ); m_pListUIObj->Show( TRUE ); } // // layout extensions // pUIObj = FindUIObject( IDUIF_BORDER ); if ((0 < nExtension) || m_fHasRawData) { // // layout border // if (fHorizontal) { rc.left = 0; rc.top = cyCandRow + cyObjectMargin; rc.right = cxWindow; rc.bottom = rc.top + cyBorder; dwStyle = UIBORDER_HORZ; } else { rc.right = cxStatus - cyObjectMargin; rc.left = rc.right - cxBorder; rc.top = 0; rc.bottom = cyWindow; dwStyle = UIBORDER_VERT; } if (pUIObj != NULL) { pUIObj->SetStyle( dwStyle ); pUIObj->SetRect( &rc ); pUIObj->Show( TRUE ); } } else { if (pUIObj != NULL) { pUIObj->Show( FALSE ); } } if (0 < nExtension) { LONG i; // layout rawdata object if (m_fHasRawData) { if (fHorizontal) { rc.left = 0; rc.top = cyCandRow + cyObjectMargin + cyBorder + cyObjectMargin; rc.right = cxWindow - cxStatus; rc.bottom = cyWindow; dwStyle = UICANDRAWDATA_HORZTB; } else { rc.left = 0; rc.top = 0; rc.right = cxStatus - cyObjectMargin - cyBorder - cyObjectMargin; rc.bottom = cyWindow - cyStatus; dwStyle = UICANDRAWDATA_VERTRL; } Assert(m_pCandRawData != NULL); m_pCandRawData->SetStyle( dwStyle ); m_pCandRawData->SetRect( &rc ); m_pCandRawData->Show( TRUE ); } else { m_pCandRawData->Show( FALSE ); } // // layout extension items // if (fHorizontal) { rc.left = cxWindow - cxStatus; rc.top = cyCandRow + cyObjectMargin + cyBorder + cyObjectMargin; rc.right = rc.left; rc.bottom = cyWindow; } else { rc.left = 0; rc.top = cyWindow - cyStatus; rc.right = cxStatus - cyObjectMargin - cyBorder - cyObjectMargin; rc.bottom = rc.top; } for (i = 0; i < nExtension; i++) { CCandUIExtension *pExtension = GetExtensionMgr()->GetExtension( i ); CUIFObject *pUIObjExt = FindUIObject( IDUIF_EXTENDED + i ); pExtension->GetSize( &size ); if (fHorizontal) { rc.left = rc.right; rc.top = rc.top; rc.right = rc.right + size.cx + cxBorder; rc.bottom = rc.top + size.cy + cyBorder; } else { rc.left = rc.left; rc.top = rc.bottom; rc.right = rc.left + size.cx + cxBorder; rc.bottom = rc.bottom + size.cy + cxBorder; } if (pUIObjExt != NULL) { pUIObjExt->SetRect( &rc ); } } } else { // layout rawdata object if (m_fHasRawData) { if (fHorizontal) { rc.left = 0; rc.top = cyCandRow + cyObjectMargin + cyBorder + cyObjectMargin; rc.right = cxWindow; rc.bottom = cyWindow; dwStyle = UICANDRAWDATA_HORZTB; } else { rc.left = 0; rc.top = 0; rc.right = cxStatus - cyObjectMargin - cyBorder - cyObjectMargin; rc.bottom = cyWindow; dwStyle = UICANDRAWDATA_VERTRL; } Assert(m_pCandRawData != NULL); m_pCandRawData->SetStyle( dwStyle ); m_pCandRawData->SetRect( &rc ); m_pCandRawData->Show( TRUE ); } else { m_pCandRawData->Show( FALSE ); } } // // Notify UI object update // NotifyUIObjectEvent( CANDUIOBJ_CANDLISTBOX, CANDUIOBJEV_UPDATED ); NotifyUIObjectEvent( CANDUIOBJ_MENUBUTTON, CANDUIOBJEV_UPDATED ); NotifyUIObjectEvent( CANDUIOBJ_CANDRAWDATA, CANDUIOBJEV_UPDATED ); ReleaseDC( m_hWnd, hDC ); } /* S E L E C T I T E M N E X T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CChsCandWindow::SelectItemNext( void ) { ((CUIFRowList*)m_pListUIObj)->ShiftItem( 1 ); } /* S E L E C T I T E M P R E V */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CChsCandWindow::SelectItemPrev( void ) { ((CUIFRowList*)m_pListUIObj)->ShiftItem( -1 ); } /* S E L E C T P A G E N E X T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CChsCandWindow::SelectPageNext( void ) { ((CUIFRowList*)m_pListUIObj)->ShiftPage( 1 ); } /* S E L E C T P A G E P R E V */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CChsCandWindow::SelectPagePrev( void ) { ((CUIFRowList*)m_pListUIObj)->ShiftPage( -1 ); } /* M A P C O M M A N D */ /*------------------------------------------------------------------------------ Map directional command to undirectional command (CUIFWindowBase method) ------------------------------------------------------------------------------*/ CANDUICOMMAND CChsCandWindow::MapCommand( CANDUICOMMAND cmd ) { BOOL fVertical = (GetPropertyMgr()->GetCandWindowProp()->GetUIDirection() == CANDUIDIR_RIGHTTOLEFT) || (GetPropertyMgr()->GetCandWindowProp()->GetUIDirection() == CANDUIDIR_LEFTTORIGHT); switch (cmd) { case CANDUICMD_MOVESELUP: { cmd = (fVertical ? CANDUICMD_MOVESELPREV : CANDUICMD_NONE); break; } case CANDUICMD_MOVESELDOWN: { cmd = (fVertical ? CANDUICMD_MOVESELNEXT : CANDUICMD_NONE); break; } case CANDUICMD_MOVESELLEFT: { cmd = (fVertical ? CANDUICMD_NONE : CANDUICMD_MOVESELPREV); break; } case CANDUICMD_MOVESELRIGHT: { cmd = (fVertical ? CANDUICMD_NONE : CANDUICMD_MOVESELNEXT); break; } } return cmd; } /* G E T C A N D W I N D O W O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CCandWindowBase *CChsCandWindow::GetCandWindowObj( void ) { return this; } /* G E T P O P U P C O M M E N T W I N D O W O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CPopupCommentWindow *CChsCandWindow::GetPopupCommentWindowObj( void ) { return NULL; } /* G E T O P T I O N S L I S T B O X O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFCandListBase *CChsCandWindow::GetOptionsListBoxObj( void ) { return NULL; } /* G E T C A N D L I S T B O X O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFCandListBase *CChsCandWindow::GetCandListBoxObj( void ) { return m_pListUIObj; } /* G E T C A P T I O N O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFWndCaption *CChsCandWindow::GetCaptionObj( void ) { return NULL; } /* G E T M E N U B U T T O N O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFButton *CChsCandWindow::GetMenuButtonObj( void ) { return m_pCandMenuBtn; } /* G E T E X T R A C A N D I D A T E O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFCandListBase *CChsCandWindow::GetExtraCandidateObj( void ) { return NULL; } /* G E T C A N D R A W D A T A O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFCandRawData *CChsCandWindow::GetCandRawDataObj( void ) { return m_pCandRawData; } /* G E T C A N D T I P W I N D O W O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFBalloonWindow *CChsCandWindow::GetCandTipWindowObj( void ) { return NULL; } /* G E T C A N D T I P B U T T O N O B J */ /*------------------------------------------------------------------------------ (CCandUIObjectParent method) ------------------------------------------------------------------------------*/ CUIFButton *CChsCandWindow::GetCandTipButtonObj( void ) { return NULL; } /* S E T T A R G E T R E C T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CChsCandWindow::SetTargetRect( RECT *prc, BOOL fClipped ) { m_rcTarget = *prc; m_fTargetClipped = fClipped; if (m_hWnd != NULL) { int nLeft; int nTop; // move window here... switch (GetPropertyMgr()->GetCandWindowProp()->GetUIDirection()) { default: case CANDUIDIR_TOPTOBOTTOM: case CANDUIDIR_BOTTOMTOTOP: { nLeft = m_rcTarget.left; nTop = m_rcTarget.bottom; break; } case CANDUIDIR_RIGHTTOLEFT: case CANDUIDIR_LEFTTORIGHT: { nLeft = m_rcTarget.left - _nWidth; nTop = m_rcTarget.top; break; } } Move( nLeft, nTop, -1, -1 ); } } /* S E T W I N D O W P O S */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CChsCandWindow::SetWindowPos( POINT pt ) { if (m_hWnd != NULL) { Move( pt.x, pt.y, -1, -1 ); } } /*============================================================================*/ /* */ /* C C A N D U I O B J E C T M G R */ /* */ /*============================================================================*/ /* C C A N D U I O B J E C T M G R */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIObjectMgr::CCandUIObjectMgr( void ) { int i; m_pCandUI = NULL; m_pUIObjectParent = NULL; for (i = 0; i < CANDUIOBJSINK_MAX; i++) { m_rgSink[i] = NULL; } } /* ~ C C A N D U I O B J E C T M G R */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIObjectMgr::~CCandUIObjectMgr( void ) { Uninitialize(); } /* I N I T I A L I Z E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandUIObjectMgr::Initialize( CCandidateUI *pCandUI ) { m_pCandUI = pCandUI; m_pUIObjectParent = NULL; #if defined(DEBUG) || defined(_DEBUG) // check all reference object are unregistered for (int i = 0; i < CANDUIOBJSINK_MAX; i++) { Assert( m_rgSink[i] == NULL ); } #endif return S_OK; } /* U N I N I T I A L I Z E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandUIObjectMgr::Uninitialize( void ) { m_pCandUI = NULL; m_pUIObjectParent = NULL; #if defined(DEBUG) || defined(_DEBUG) // check all reference object are unregistered for (int i = 0; i < CANDUIOBJSINK_MAX; i++) { Assert( m_rgSink[i] == NULL ); } #endif return S_OK; } /* A D V I S E E V E N T S I N K */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandUIObjectMgr::AdviseEventSink( CCandUIObjectEventSink *pSink ) { int i; for (i = 0; i < CANDUIOBJSINK_MAX; i++) { if (m_rgSink[i] == NULL) { m_rgSink[i] = pSink; return S_OK; } } Assert( FALSE ); return E_FAIL; } /* U N A D V I S E E V E N T S I N K */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandUIObjectMgr::UnadviseEventSink( CCandUIObjectEventSink *pSink ) { int i; for (i = 0; i < CANDUIOBJSINK_MAX; i++) { if (m_rgSink[i] == pSink) { m_rgSink[i] = NULL; return S_OK; } } Assert( FALSE ); return E_FAIL; } /* N O T I F Y U I O B J E C T E V E N T */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ void CCandUIObjectMgr::NotifyUIObjectEvent( CANDUIOBJECT obj, CANDUIOBJECTEVENT event ) { int i; for (i = 0; i < CANDUIOBJSINK_MAX; i++) { if (m_rgSink[i] != NULL) { m_rgSink[i]->OnObjectEvent( obj, event ); } } } /*============================================================================*/ /* */ /* C C A N D U I P R O P E R T Y E V E N T S I N K */ /* */ /*============================================================================*/ /* C C A N D U I O B J E C T E V E N T S I N K */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIObjectEventSink::CCandUIObjectEventSink( void ) { m_pObjectMgr = NULL; } /* ~ C C A N D U I O B J E C T E V E N T S I N K */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIObjectEventSink::~CCandUIObjectEventSink( void ) { Assert( m_pObjectMgr == NULL ); if (m_pObjectMgr != NULL) { DoneEventSink(); } } /* I N I T E V E N T S I N K */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandUIObjectEventSink::InitEventSink( CCandUIObjectMgr *pObjectMgr ) { Assert( pObjectMgr != NULL ); Assert( m_pObjectMgr == NULL ); if (pObjectMgr == NULL) { return E_INVALIDARG; } m_pObjectMgr = pObjectMgr; return m_pObjectMgr->AdviseEventSink( this ); } /* D O N E E V E N T S I N K */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ HRESULT CCandUIObjectEventSink::DoneEventSink( void ) { HRESULT hr; Assert( m_pObjectMgr != NULL ); if (m_pObjectMgr == NULL) { return E_FAIL; } hr = m_pObjectMgr->UnadviseEventSink( this ); m_pObjectMgr = NULL; return hr; }