#ifndef __NmAppletImpl_h__ #define __NmAppletImpl_h__ #define DECLARE_NMAPPLET_CAPS(dwCaps)\ static DWORD _GetNmAppletCaps()\ {\ return dwCaps;\ } #define DECLARE_NMAPPLET_FILE_OPEN_FILTER(idStringResourceFilter, idStringResourceExt) \ static HRESULT _GetNmAppletFileOpenFilter( LPTSTR szFilter, int cchMaxFilter, LPTSTR szExtension, int cchMaxExtension )\ { HRESULT hr = S_OK;\ DBGENTRY(_GetNmAppletFileOpenFilter);\ if( SUCCEEDED( hr = NmCtlLoadString( idStringResourceFilter, szFilter, cchMaxFilter ) ) )\ {\ hr = NmCtlLoadString( idStringResourceExt, szExtension, cchMaxExtension );\ }\ DBGEXIT_HR(_GetNmAppletFileOpenFilter,hr);\ return hr;\ } template class ATL_NO_VTABLE INmAppletImpl { // YOU MUST ONLY PUT DATA MEMBERS OR HELPER FNS AT THE END OF THE CLASS // THE VTABLE FOR INmAgendaItemView MUST BE AT THE BEGINNING OF THE CLASS!!!! public: INmAppletImpl( void ) : m_bInsertFileMenuIntoEditGroup( false ) { DBGENTRY(INmAppletImpl::INmAppletImpl); DBGEXIT(INmAppletImpl::INmAppletImpl); } ~INmAppletImpl( void ) { DBGENTRY(INmAppletImpl::~INmAppletImpl); DBGEXIT(INmAppletImpl::~INmAppletImpl); } public: // IUnknown // STDMETHOD(QueryInterface)(REFIID riid, void ** ppvObject) = 0; _ATL_DEBUG_ADDREF_RELEASE_IMPL(INmAppletImpl) // The INmApplet Interface... STDMETHOD(get_NmAppletCaps)( OUT DWORD* pdwCaps ) { DBGENTRY(INmAppletImpl::get_NmAppletCaps) HRESULT hr = S_OK; ASSERT( pdwCaps != NULL ); *pdwCaps = T::_GetNmAppletCaps(); DBGEXIT_HR(INmAppletImpl::get_NmAppletCaps ,hr) return hr; } STDMETHOD(SaveDialog)( /*[in, out, retval]*/ LPTSTR lpszFile, /*[in]*/ DWORD dwFlags, /*[out]*/ LPWORD pnFileOffset ) { DBGENTRY(INmAppletImpl::SaveDialog) HRESULT hr = S_OK; T* pT = static_cast(this); TCHAR szFilter[MAX_PATH]; TCHAR szDefExt[MAX_PATH]; if( SUCCEEDED ( hr = T::_GetNmAppletFileOpenFilter( szFilter, CCHMAX( szFilter ), szDefExt, CCHMAX( szDefExt ) ) ) ) { ConvertSzCh(szFilter); OPENFILENAME ofn; ClearStruct( &ofn ); ofn.lStructSize = sizeof( OPENFILENAME ); ofn.hwndOwner = pT->m_hWnd; ofn.lpstrFilter = szFilter; ofn.lpstrFile = lpszFile; ofn.nMaxFile = MAX_PATH; ofn.lpstrDefExt = szDefExt; ofn.Flags = dwFlags; if( !GetSaveFileName( &ofn ) ) { hr = E_FAIL; } else { *pnFileOffset = ofn.nFileOffset; } } DBGEXIT_HR(INmAppletImpl::SaveDialog,hr) return hr; } STDMETHOD(OpenDialog)() { DBGENTRY(INmAppletImpl::OpenDialog) HRESULT hr = E_NOTIMPL; DBGEXIT_HR(INmAppletImpl::OpenDialog,hr) return hr; } STDMETHOD(GetIconBitmaps)( IN int cxBitmap, IN int cyBitmap, OUT int* pcStates, OUT HBITMAP** pphBitmapIcon, OUT HBITMAP** pphBitmapIconHot, OUT HBITMAP** pphBitmapIconDisabled ) { DBGENTRY(INmAppletImpl::GetIconBitmaps) HRESULT hr = E_NOTIMPL; DBGEXIT_HR(INmAppletImpl::GetIconBitmaps,hr) return hr; } STDMETHOD(GetIconLabel)( OUT BSTR* pLabel ) { DBGENTRY(INmAppletImpl::GetIconLabel) HRESULT hr = E_NOTIMPL; DBGEXIT_HR(INmAppletImpl::GetIconLabel,hr) return hr; } STDMETHOD(OnContainerActivating)( IN BOOL bAppActivating ) { DBGENTRY(INmAppletImpl::OnContainerActivating) HRESULT hr = S_OK; DBGEXIT_HR(INmAppletImpl::OnContainerActivating,hr) return hr; } STDMETHOD(SetFocus)() { DBGENTRY(INmAppletImpl::SetFocus) HRESULT hr = S_OK; DBGEXIT_HR(INmAppletImpl::SetFocus,hr) return hr; } STDMETHOD(SetClientSite)( IN INmAppletClientSite* pClientSite ) { DBGENTRY(INmAppletImpl::SetClientSite); HRESULT hr = S_OK; m_spContianerAppletSite = pClientSite; DBGEXIT_HR(INmAppletImpl::SetClientSite,hr); return hr; } STDMETHOD(ShiftFocus)( IN HWND hWndCur, BOOL bForward ) { DBGENTRY(INmAppletImpl::ShiftFocus); HRESULT hr = S_OK; DBGEXIT_HR(INmAppletImpl::ShiftFocus,hr); return hr; } STDMETHOD(IsChild)( IN HWND hWnd ) { DBGENTRY(INmAppletImpl::IsChild); HRESULT hr = S_FALSE; DBGEXIT_HR(INmAppletImpl::IsChild,hr); return hr; } STDMETHOD(QueryEndSession)( OUT BOOL* pbCancelTermination ) { DBGENTRY(INmAppletImpl::QueryEndSession); HRESULT hr = S_OK; if( pbCancelTermination ) { *pbCancelTermination = FALSE; } else { hr = E_POINTER; } DBGEXIT_HR(INmAppletImpl::QueryEndSession,hr); return hr; } STDMETHOD(OnMenuSelect)( IN DWORD wParam, IN DWORD lParam ) { DBGENTRY(INmAppletImpl::OnMenuSelect); HRESULT hr = S_OK; DBGEXIT_HR(INmAppletImpl::OnMenuSelect,hr); return hr; } STDMETHOD(OnCommand)( IN DWORD wParam, IN DWORD lParam ) { DBGENTRY(INmAppletImpl::OnCommand); HRESULT hr = S_OK; DBGEXIT_HR(INmAppletImpl::OnCommand,hr); return hr; } STDMETHOD(OnGetMinMax)( IN DWORD lParam ) { DBGENTRY(INmAppletImpl::OnGetMinMax); HRESULT hr = S_OK; DBGEXIT_HR(INmAppletImpl::OnGetMinMax,hr); return hr; } static DWORD _GetNmAppletCaps() { return 0; } protected: // PUT data members here bool m_bInsertFileMenuIntoEditGroup; CComPtr m_spContianerAppletSite; }; static HRESULT _MoveMenuToSharedMenu( HMENU hMenu, HMENU hMenuShared, int MenuBarIndex, int InsertionIndex ) { DBGENTRY(MoveMenuToSharedMenu); HRESULT hr = S_OK; if( IsMenu( hMenu ) && IsMenu( hMenuShared ) ) { TCHAR szMenuItem[ MAX_PATH ] = TEXT(""); int cbMenuItem = 0; MENUITEMINFO mii; ClearStruct( &mii ); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_DATA | MIIM_SUBMENU | MIIM_TYPE; mii.fType = MFT_STRING; cbMenuItem = GetMenuString( hMenu, MenuBarIndex, szMenuItem, MAX_PATH, MF_BYPOSITION ); if( 0 != cbMenuItem ) { mii.cch = 1 + cbMenuItem; mii.dwTypeData = szMenuItem; mii.hSubMenu = GetSubMenu( hMenu, MenuBarIndex ); RemoveMenu( hMenu, MenuBarIndex, MF_BYPOSITION ); if( 0 == InsertMenuItem( hMenuShared, InsertionIndex, TRUE, &mii ) ) { ERROR_OUT(("InsertMenuItem failed")); hr = HRESULT_FROM_WIN32(GetLastError()); } } else { ERROR_OUT(("GetMenuString failed")); hr = E_FAIL; } } else { ERROR_OUT(("Passed a bad menu handle")); hr = E_HANDLE; } DBGEXIT_HR( MoveMenuToSharedMenu, hr ); return hr; } inline STDMETHODIMP NmApplet_UIActivate(LONG iVerb, const RECT* prcPosRect, CComControlBase* pThis, HMENU* phMenuShared, DWORD dwMenuResourceID, int nEditGroupMenuBarItems, int nObjectGroupMenuBarItems, int nHelpGroupMenuBarItems ) { DBGENTRY(Applet_UIActivate); HRESULT hr = S_OK; bool bPreviouslyActiveUI = pThis->m_bUIActive; // CComControlBase::InPlaceActivawe may change the state of m_bUIActive // which would indicate that we are UI activating for the first time... hr = pThis->InPlaceActivate( iVerb, NULL ); if( SUCCEEDED( hr ) && (!bPreviouslyActiveUI) && pThis->m_bUIActive ) { OLEINPLACEFRAMEINFO frameInfo; RECT rcPos, rcClip; CComPtr spInPlaceFrame; CComPtr spInPlaceUIWindow; ClearStruct(&frameInfo); frameInfo.cb = sizeof(OLEINPLACEFRAMEINFO); CComPtr pIPO; pThis->ControlQueryInterface(IID_IOleInPlaceObject, (void**)&pIPO); _ASSERTE(pIPO != NULL); if (prcPosRect != NULL) { pIPO->SetObjectRects(prcPosRect, prcPosRect); } if( pThis->m_spInPlaceSite ) { hr = pThis->m_spInPlaceSite->GetWindowContext(&spInPlaceFrame, &spInPlaceUIWindow, &rcPos, &rcClip, &frameInfo); if( spInPlaceFrame ) { // Create the shared menu... *phMenuShared = ::CreateMenu(); if( NULL != *phMenuShared ) { OLEMENUGROUPWIDTHS mgw; ClearStruct( &mgw ); if( SUCCEEDED( hr = spInPlaceFrame->InsertMenus(*phMenuShared, &mgw) ) ) { HMENU hMenu = LoadMenu( _Module.GetModuleInstance(), MAKEINTRESOURCE( dwMenuResourceID ) ); if( hMenu ) { int InsertionIndex, i; // Edit Group InsertionIndex = mgw.width[0]; for( i = 0; i < nEditGroupMenuBarItems; i++ ) { _MoveMenuToSharedMenu( hMenu, *phMenuShared, 0, InsertionIndex + i ); } mgw.width[1] = nEditGroupMenuBarItems; // Object Group InsertionIndex = mgw.width[0] + mgw.width[1] + mgw.width[2]; for( i = 0; i < nObjectGroupMenuBarItems; i++ ) { _MoveMenuToSharedMenu( hMenu, *phMenuShared, 0, InsertionIndex + i ); } mgw.width[3] = nObjectGroupMenuBarItems; // Object Group // Help Group InsertionIndex = mgw.width[0] + mgw.width[1] + mgw.width[2] + mgw.width[3] + mgw.width[4]; for( i = 0; i < nHelpGroupMenuBarItems; i++ ) { _MoveMenuToSharedMenu( hMenu, *phMenuShared, 0, InsertionIndex + i ); } mgw.width[5] = nHelpGroupMenuBarItems; // Help Group HOLEMENU hOLEMENU = OleCreateMenuDescriptor( *phMenuShared, &mgw ); if( hOLEMENU ) { hr = spInPlaceFrame->SetMenu( *phMenuShared, hOLEMENU, pThis->m_hWndCD ); } else { hr = E_OUTOFMEMORY; } DestroyMenu(hMenu); } else { hr = HRESULT_FROM_WIN32(GetLastError()); } } else { DestroyMenu( *phMenuShared ); *phMenuShared = NULL; } } else { hr = HRESULT_FROM_WIN32(GetLastError()); ERROR_OUT(("Could not create menu...")); } } } else { hr = E_UNEXPECTED; } } DBGEXIT_HR(Applet_UIActivate,hr); return hr; } #endif // __NmAppletImpl_h__