/**************************************************************************** * * FILE: StatBar.cpp * * CREATED: Chris Pirich (ChrisPi) 3-25-96 * * CONTENTS: CConfStatusBar object * ****************************************************************************/ #include "precomp.h" #include "resource.h" #include "statbar.h" #include "NmLdap.h" #include "call.h" #include "cr.h" #include "confwnd.h" #include "ConfPolicies.h" static inline void TT_AddToolInfo(HWND hwnd, TOOLINFO *pti) { SendMessage(hwnd, TTM_ADDTOOL, 0, reinterpret_cast(pti)); } static inline void TT_GetToolInfo(HWND hwnd, TOOLINFO *pti) { SendMessage(hwnd, TTM_GETTOOLINFO, 0, reinterpret_cast(pti)); } static inline void TT_SetToolInfo(HWND hwnd, TOOLINFO *pti) { SendMessage(hwnd, TTM_SETTOOLINFO, 0, reinterpret_cast(pti)); } // Status Bar area indexes enum { ID_SBP_TEXT, // ID_SBP_ULS, ID_SBP_ICON, NUM_STATUSBAR_WELLS } ; // Status Bar area measurements (pixels) static const UINT DXP_SB_PROG = 96; static const UINT DXP_SB_ULS = 0; // 220; static const UINT DXP_SB_ICON = 22; static const UINT DXP_SB_DEF_ICON = 40; static const int IconBorder = 2; static const int StatSepBorder = 2; CConfStatusBar * CConfStatusBar::m_pStatusBar = NULL; /**************************************************************************** * * CLASS: CConfStatusBar * * MEMBER: CConfStatusBar * * PURPOSE: Constructs object * ****************************************************************************/ CConfStatusBar::CConfStatusBar(CConfRoom* pcr) : m_pcrParent (pcr), m_fVisible (FALSE), m_hwnd (NULL) { DebugEntry(CConfStatusBar::CConfStatusBar); ASSERT(NULL == m_pStatusBar); m_pStatusBar = this; m_szULSStatus[0] = _T('\0'); for (int i=0; iitemData)) { int nLeft = pdis->rcItem.left; int nTop = pdis->rcItem.top; int xSmIcon = ::GetSystemMetrics(SM_CXSMICON); int ySmIcon = ::GetSystemMetrics(SM_CYSMICON); int nWidth = xSmIcon; int nHeight = pdis->rcItem.bottom - pdis->rcItem.top; if (nHeight > ySmIcon) { nTop += (nHeight - ySmIcon) / 2; nHeight = ySmIcon; } for (int i=0; ihDC, nLeft, nTop, m_hIconStatus[i], nWidth, nHeight, 0, NULL, DI_NORMAL); } nLeft += xSmIcon; } } return TRUE; } VOID CConfStatusBar::ForwardSysChangeMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) { if (NULL == m_hwnd) return; ::SendMessage(m_hwnd, uMsg, wParam, lParam); } /**************************************************************************** * * CLASS: CConfStatusBar * * MEMBER: Resize(WPARAM wParam, LPARAM lParam) * * PURPOSE: Handles window resizing * ****************************************************************************/ VOID CConfStatusBar::Resize(WPARAM wParam, LPARAM lParam) { if (NULL != m_hwnd) { ::SendMessage(m_hwnd, WM_SIZE, wParam, lParam); ResizeParts(); } } /**************************************************************************** * * CLASS: CConfStatusBar * * MEMBER: Create(HWND hwndParent) * * PURPOSE: Creates the status bar window * ****************************************************************************/ BOOL CConfStatusBar::Create(HWND hwndParent) { DebugEntry(CConfStatusBar::Create); BOOL bRet = FALSE; m_hwnd = CreateStatusWindow(WS_CHILD | WS_BORDER, g_szEmpty, hwndParent, ID_STATUS); if (NULL != m_hwnd) { // Create the ToolTip m_hwndLoginTT = CreateWindowEx(0, TOOLTIPS_CLASS, (LPSTR) NULL, 0, // styles CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, m_hwnd, (HMENU) NULL, ::GetInstanceHandle(), NULL); // Add the ToolTips for the 2 icons if (NULL != m_hwndLoginTT) { TOOLINFO ti; ti.cbSize = sizeof(TOOLINFO); ti.hwnd = m_hwnd; ti.hinst = ::GetInstanceHandle(); ti.lpszText = const_cast(g_szEmpty); SetRect(&ti.rect, 0, 0, 0, 0); for (UINT i=0; i uIconPartWidth) { DWORD rgPos[NUM_STATUSBAR_WELLS]; // right edge positions for each part rgPos[ID_SBP_TEXT] = dxp - (DXP_SB_ULS + uIconPartWidth); // rgPos[ID_SBP_ULS] = dxp - uIconPartWidth; rgPos[ID_SBP_ICON] = (DWORD) -1; ::SendMessage( m_hwnd, SB_SETPARTS, (WPARAM) ARRAY_ELEMENTS(rgPos), (LPARAM) rgPos); if (m_hwndLoginTT) { TCHAR szTitle[MAX_PATH]; TOOLINFO ti; ti.cbSize = sizeof(TOOLINFO); ti.hwnd = m_hwnd; int nIconsLeft = dxp - uIconPartWidth + StatSepBorder + IconBorder; for (UINT i=0; i(szTip); ti.uFlags = TTF_SUBCLASS; TT_SetToolInfo(m_hwndLoginTT, &ti); } /**************************************************************************** * * CLASS: CConfStatusBar * * MEMBER: RemoveHelpText() * * PURPOSE: Removes the status bar help text * ****************************************************************************/ VOID CConfStatusBar::RemoveHelpText() { // Taking status bar out of simple mode if (NULL != m_hwnd) { ::SendMessage(m_hwnd, SB_SIMPLE, FALSE, 0); } } /**************************************************************************** * * CLASS: CConfStatusBar * * MEMBER: SetHelpText(LPCTSTR pcszText) * * PURPOSE: Sets the status bar help text * ****************************************************************************/ VOID CConfStatusBar::SetHelpText(LPCTSTR pcszText) { // Putting status bar into simple mode if (NULL != m_hwnd) { ::SendMessage(m_hwnd, SB_SIMPLE, TRUE, 0); // 255 means simple mode - only 1 pane ::SendMessage( m_hwnd, SB_SETTEXT, 255 | SBT_NOBORDERS, (LPARAM) pcszText); } } /**************************************************************************** * * CLASS: CConfStatusBar * * MEMBER: Show(BOOL fShow) * * PURPOSE: Handles the toggling of the status bar window * ****************************************************************************/ VOID CConfStatusBar::Show(BOOL fShow) { DebugEntry(CConfStatusBar::Show); fShow = fShow != FALSE; if (m_fVisible != fShow) { m_fVisible = fShow; if (NULL != m_hwnd) { ::ShowWindow(m_hwnd, m_fVisible ? SW_SHOW : SW_HIDE); } // Force a resize ResizeParts(); } DebugExitVOID(CConfStatusBar::Show); } /**************************************************************************** * * CLASS: CConfStatusBar * * MEMBER: GetHeight() * * PURPOSE: Returns the height in pixels of the status bar * ****************************************************************************/ int CConfStatusBar::GetHeight() { RECT rc = {0, 0, 0, 0}; if (m_fVisible && (NULL != m_hwnd)) { GetWindowRect(m_hwnd, &rc); } return (rc.bottom - rc.top); } /**************************************************************************** * * CLASS: CConfStatusBar * * MEMBER: SetIcon(DWORD dwId) * * PURPOSE: Set the status bar icon * ****************************************************************************/ VOID CConfStatusBar::SetIcon(StatIcon eIcon, DWORD dwId) { DWORD &idIconStatus = m_idIconStatus[eIcon]; HICON &hIconStatus = m_hIconStatus [eIcon]; if ((NULL != m_hwnd) && (dwId != idIconStatus)) { TRACE_OUT(("Changing Icon from %d to %d", m_idIconStatus, dwId)); // REVIEW: what happens to old m_hIconStatus? HICON hIcon = (HICON) ::LoadImage(::GetInstanceHandle(), MAKEINTRESOURCE(dwId), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); if (NULL != hIcon) { idIconStatus = dwId; if (NULL != hIconStatus) { ::DestroyIcon(hIconStatus); } hIconStatus = hIcon; ::SendMessage( m_hwnd, SB_SETTEXT, ID_SBP_ICON | SBT_OWNERDRAW, (LPARAM) hIconStatus); } else { WARNING_OUT(("Unable to load status bar icon id=%d", dwId)); } } } /**************************************************************************** * * CLASS: CConfStatusBar * * MEMBER: SetText(UINT uID, LPCTSTR pcszText) * * PURPOSE: Set the status bar text * ****************************************************************************/ VOID CConfStatusBar::SetText(UINT uID, LPCTSTR pcszText) { lstrcpyn( m_szULSStatus, pcszText, CCHMAX(m_szULSStatus) ); if (NULL != m_hwnd) { ::SendMessage(m_hwnd, SB_SETTEXT, uID, (LPARAM) pcszText); } } /**************************************************************************** * * CLASS: CConfStatusBar * * FUNCTION: Update() * * PURPOSE: Updates the status bar * ****************************************************************************/ VOID CConfStatusBar::Update() { DBGENTRY(CConfStatusBar::Update); ASSERT(m_pcrParent); if (!m_fVisible) return; TCHAR szCallStatus[ MAX_PATH * 3 ]; // Call status is status + url and url can be 512 by itself... UINT uCallIcon = 0; DWORD dwCallTick = 0; if (0 == dwCallTick) { // no current calls - check if switching a/v dwCallTick = GetCallStatus(szCallStatus, CCHMAX(szCallStatus), &uCallIcon); } // if a call was started more recently than any other action, OR nothing is going on // (in which case all ticks should equal zero), use the conference / call status if (dwCallTick == 0) { // All ticks are zero - Get the default conference status bar info m_pcrParent->GetConferenceStatus(szCallStatus, CCHMAX(szCallStatus), &uCallIcon); } SetText(ID_SBP_TEXT, szCallStatus); SetIcon(StatConnect, uCallIcon); SetTooltip(StatConnect, szCallStatus); TCHAR szOldULSStatus[ARRAY_ELEMENTS(m_szULSStatus)]; lstrcpy(szOldULSStatus, m_szULSStatus); USES_RES2T switch( g_GkLogonState ) { case NM_GK_IDLE: uCallIcon = IDI_NETGRAY; lstrcpy(m_szULSStatus, RES2T(ID_STATUS_NOT_LOGGED_ON_TO_GATEKEEPER)); break; case NM_GK_LOGGING_ON: uCallIcon = IDS_STATUS_WAITING; lstrcpy(m_szULSStatus, RES2T(ID_STATUS_LOGING_ONTO_GATEKEEPER)); break; case NM_GK_LOGGED_ON: uCallIcon = IDI_NET; lstrcpy(m_szULSStatus, RES2T(ID_STATUS_LOGGED_ONTO_GATEKEEPER)); break; default: uCallIcon = IDI_NETGRAY; if(ConfPolicies::CallingMode_Direct == ConfPolicies::GetCallingMode()) { if(g_pLDAP) { g_pLDAP->GetStatusText(m_szULSStatus, CCHMAX(m_szULSStatus), &uCallIcon); } else { lstrcpy(m_szULSStatus, RES2T(ID_STATUS_LOGGEDOFF)); } } else { lstrcpy(m_szULSStatus, RES2T(ID_STATUS_NOT_LOGGED_ON_TO_GATEKEEPER)); } break; } if (lstrcmp(szOldULSStatus, m_szULSStatus)) { SetTooltip(StatLogin, m_szULSStatus); } SetIcon(StatLogin, uCallIcon); ::UpdateWindow(m_hwnd); } /* F O R C E S T A T U S B A R U P D A T E */ /*------------------------------------------------------------------------- %%Function: ForceStatusBarUpdate Force an update of the status bar. This can be called from any thread. All main UI updates should be done from the main thread. -------------------------------------------------------------------------*/ VOID ForceStatusBarUpdate(void) { CConfRoom * pcr = ::GetConfRoom(); if (NULL != pcr) { PostMessage(pcr->GetTopHwnd(), WM_STATUSBAR_UPDATE, 0, 0); } } /////////////////////////////////////////////////////////////////////////// /* C M D V I E W S T A T U S B A R */ /*------------------------------------------------------------------------- %%Function: CmdViewStatusBar -------------------------------------------------------------------------*/ VOID CmdViewStatusBar(void) { CConfStatusBar * pStatusBar = CConfStatusBar::GetInstance(); if (NULL == pStatusBar) return; CConfRoom * pcr = ::GetConfRoom(); if (NULL == pcr) return; HWND hwnd = pcr->GetTopHwnd(); // Turn off redraws: ::SendMessage(hwnd, WM_SETREDRAW, FALSE, 0); // Toggle visibility pStatusBar->Show(!pStatusBar->FVisible()); ::SendMessage(hwnd, WM_SETREDRAW, TRUE, 0); pcr->ForceWindowResize(); UpdateUI(CRUI_STATUSBAR); } /* C H E C K M E N U _ V I E W S T A T U S B A R */ /*------------------------------------------------------------------------- %%Function: CheckMenu_ViewStatusBar -------------------------------------------------------------------------*/ BOOL CheckMenu_ViewStatusBar(HMENU hMenu) { BOOL fCheck = FALSE; CConfStatusBar * pStatusBar = CConfStatusBar::GetInstance(); if (NULL != pStatusBar) { fCheck = pStatusBar->FVisible(); if (NULL != hMenu) { ::CheckMenuItem(hMenu, IDM_VIEW_STATUSBAR, fCheck ? MF_CHECKED : MF_UNCHECKED); } } return fCheck; }