Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentaskband.c
Go to the documentation of this file.
00001 /* 00002 * ReactOS Explorer 00003 * 00004 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org> 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00019 */ 00020 00021 #include <precomp.h> 00022 00023 /***************************************************************************** 00024 ** ITaskBand **************************************************************** 00025 *****************************************************************************/ 00026 00027 const GUID CLSID_ITaskBand = {0x68284FAA,0x6A48,0x11D0,{0x8C,0x78,0x00,0xC0,0x4F,0xD9,0x18,0xB4}}; 00028 00029 static const ITaskBandVtbl ITaskBandImpl_Vtbl; 00030 static const IDeskBandVtbl IDeskBandImpl_Vtbl; 00031 static const IObjectWithSiteVtbl IObjectWithSiteImpl_Vtbl; 00032 static const IDeskBarVtbl IDeskBarImpl_Vtbl; 00033 static const IPersistStreamVtbl IPersistStreamImpl_Vtbl; 00034 static const IWinEventHandlerVtbl IWinEventHandlerImpl_Vtbl; 00035 00036 typedef struct 00037 { 00038 const ITaskBandVtbl *lpVtbl; 00039 const IDeskBandVtbl *lpDeskBandVtbl; 00040 const IObjectWithSiteVtbl *lpObjectWithSiteVtbl; 00041 const IDeskBarVtbl *lpDeskBarVtbl; 00042 const IPersistStreamVtbl *lpPersistStreamVtbl; 00043 const IWinEventHandlerVtbl *lpWindowEventHandlerVtbl; 00044 /* FIXME: Implement IOleCommandTarget */ 00045 LONG Ref; 00046 00047 ITrayWindow *Tray; 00048 IUnknown *punkSite; 00049 00050 HWND hWnd; 00051 DWORD dwBandID; 00052 } ITaskBandImpl; 00053 00054 static IUnknown * 00055 IUnknown_from_ITaskBandImpl(ITaskBandImpl *This) 00056 { 00057 return (IUnknown *)&This->lpVtbl; 00058 } 00059 00060 IMPL_CASTS(ITaskBand, ITaskBand, lpVtbl) 00061 IMPL_CASTS(IDeskBand, ITaskBand, lpDeskBandVtbl) 00062 IMPL_CASTS(IObjectWithSite, ITaskBand, lpObjectWithSiteVtbl) 00063 IMPL_CASTS(IDeskBar, ITaskBand, lpDeskBarVtbl) 00064 IMPL_CASTS(IPersistStream, ITaskBand, lpPersistStreamVtbl) 00065 IMPL_CASTS(IWinEventHandler, ITaskBand, lpWindowEventHandlerVtbl) 00066 00067 static ULONG STDMETHODCALLTYPE 00068 ITaskBandImpl_AddRef(IN OUT ITaskBand *iface) 00069 { 00070 ITaskBandImpl *This = ITaskBandImpl_from_ITaskBand(iface); 00071 00072 return InterlockedIncrement(&This->Ref); 00073 } 00074 00075 static VOID 00076 ITaskBandImpl_Free(IN OUT ITaskBandImpl *This) 00077 { 00078 if (This->punkSite != NULL) 00079 { 00080 IUnknown_Release(This->punkSite); 00081 This->punkSite = NULL; 00082 } 00083 00084 HeapFree(hProcessHeap, 00085 0, 00086 This); 00087 } 00088 00089 static ULONG STDMETHODCALLTYPE 00090 ITaskBandImpl_Release(IN OUT ITaskBand *iface) 00091 { 00092 ITaskBandImpl *This = ITaskBandImpl_from_ITaskBand(iface); 00093 ULONG Ret; 00094 00095 Ret = InterlockedDecrement(&This->Ref); 00096 00097 if (Ret == 0) 00098 ITaskBandImpl_Free(This); 00099 00100 return Ret; 00101 } 00102 00103 static HRESULT STDMETHODCALLTYPE 00104 ITaskBandImpl_QueryInterface(IN OUT ITaskBand *iface, 00105 IN REFIID riid, 00106 OUT LPVOID *ppvObj) 00107 { 00108 ITaskBandImpl *This; 00109 00110 if (ppvObj == NULL) 00111 return E_POINTER; 00112 00113 This = ITaskBandImpl_from_ITaskBand(iface); 00114 00115 if (IsEqualIID(riid, 00116 &IID_IUnknown)) 00117 { 00118 *ppvObj = IUnknown_from_ITaskBandImpl(This); 00119 } 00120 else if (IsEqualIID(riid, 00121 &IID_IDeskBand) || 00122 IsEqualIID(riid, 00123 &IID_IOleWindow) || 00124 IsEqualIID(riid, 00125 &IID_IDockingWindow)) 00126 { 00127 *ppvObj = IDeskBand_from_ITaskBandImpl(This); 00128 } 00129 else if (IsEqualIID(riid, 00130 &IID_IObjectWithSite)) 00131 { 00132 *ppvObj = IObjectWithSite_from_ITaskBandImpl(This); 00133 } 00134 else if (IsEqualIID(riid, 00135 &IID_IDeskBar)) 00136 { 00137 *ppvObj = IDeskBar_from_ITaskBandImpl(This); 00138 } 00139 else if (IsEqualIID(riid, 00140 &IID_IWinEventHandler)) 00141 { 00142 /* When run on Windows the system queries this interface, which is completely 00143 undocumented :( It's queried during initialization of the tray band site. 00144 The system apparently uses this interface to forward messages to be handled 00145 by the band child window. This interface appears to be implemented by a number 00146 of classes provided by the shell, including the IBandSite interface. In that 00147 we (the host application) forward messages to the default message handler (in 00148 our case the IBandSite default message handler for the Rebar control)! This 00149 interface in the ITaskBand implementation is only actually used if we use 00150 the same interface to forward messages to the IBandSite implementation of 00151 the shell! */ 00152 *ppvObj = IWinEventHandler_from_ITaskBandImpl(This); 00153 } 00154 #if 0 00155 else if (IsEqualIID(riid, 00156 &IID_IPersistStream) || 00157 IsEqualIID(riid, 00158 &IID_IPersist)) 00159 { 00160 *ppvObj = IPersistStream_from_ITaskBandImpl(This); 00161 } 00162 #endif 00163 else 00164 { 00165 *ppvObj = NULL; 00166 return E_NOINTERFACE; 00167 } 00168 00169 ITaskBandImpl_AddRef(iface); 00170 return S_OK; 00171 } 00172 00173 static HRESULT STDMETHODCALLTYPE 00174 ITaskBandImpl_GetRebarBandID(IN OUT ITaskBand *iface, 00175 OUT DWORD *pdwBandID) 00176 { 00177 ITaskBandImpl *This = ITaskBandImpl_from_ITaskBand(iface); 00178 00179 if (This->dwBandID != (DWORD)-1) 00180 { 00181 if (pdwBandID != NULL) 00182 *pdwBandID = This->dwBandID; 00183 00184 return S_OK; 00185 } 00186 00187 return E_FAIL; 00188 } 00189 00190 static const ITaskBandVtbl ITaskBandImpl_Vtbl = 00191 { 00192 /*** IUnknown methods ***/ 00193 ITaskBandImpl_QueryInterface, 00194 ITaskBandImpl_AddRef, 00195 ITaskBandImpl_Release, 00196 /*** ITaskBand methods ***/ 00197 ITaskBandImpl_GetRebarBandID 00198 }; 00199 00200 /*****************************************************************************/ 00201 00202 METHOD_IUNKNOWN_INHERITED_ADDREF(IDeskBand, ITaskBand) 00203 METHOD_IUNKNOWN_INHERITED_RELEASE(IDeskBand, ITaskBand) 00204 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IDeskBand, ITaskBand) 00205 00206 static HRESULT STDMETHODCALLTYPE 00207 ITaskBandImpl_GetWindow(IN OUT IDeskBand *iface, 00208 OUT HWND *phwnd) 00209 { 00210 ITaskBandImpl *This = ITaskBandImpl_from_IDeskBand(iface); 00211 00212 /* NOTE: We have to return the tray window here so that ITaskBarClient 00213 knows the parent window of the Rebar control it creates when 00214 calling ITaskBarClient::SetDeskBarSite()! However, once we 00215 created a window we return the task switch window! */ 00216 if (This->hWnd != NULL) 00217 *phwnd = This->hWnd; 00218 else 00219 *phwnd = ITrayWindow_GetHWND(This->Tray); 00220 00221 DbgPrint("ITaskBand::GetWindow(0x%p->0x%p)\n", phwnd, *phwnd); 00222 00223 if (*phwnd != NULL) 00224 return S_OK; 00225 00226 return E_FAIL; 00227 } 00228 00229 static HRESULT STDMETHODCALLTYPE 00230 ITaskBandImpl_ContextSensitiveHelp(IN OUT IDeskBand *iface, 00231 IN BOOL fEnterMode) 00232 { 00233 /* FIXME: Implement */ 00234 return E_NOTIMPL; 00235 } 00236 00237 static HRESULT STDMETHODCALLTYPE 00238 ITaskBandImpl_ShowDW(IN OUT IDeskBand *iface, 00239 IN BOOL bShow) 00240 { 00241 /* We don't do anything... */ 00242 return S_OK; 00243 } 00244 00245 static HRESULT STDMETHODCALLTYPE 00246 ITaskBandImpl_CloseDW(IN OUT IDeskBand *iface, 00247 IN DWORD dwReserved) 00248 { 00249 /* We don't do anything... */ 00250 return S_OK; 00251 } 00252 00253 static HRESULT STDMETHODCALLTYPE 00254 ITaskBandImpl_ResizeBoderDW(IN OUT IDeskBand *iface, 00255 IN LPCRECT prcBorder, 00256 IN IUnknown *punkToolbarSite, 00257 IN BOOL fReserved) 00258 { 00259 /* No need to implement this method */ 00260 return E_NOTIMPL; 00261 } 00262 00263 static HRESULT STDMETHODCALLTYPE 00264 ITaskBandImpl_GetBandInfo(IN OUT IDeskBand *iface, 00265 IN DWORD dwBandID, 00266 IN DWORD dwViewMode, 00267 IN OUT DESKBANDINFO *pdbi) 00268 { 00269 ITaskBandImpl *This = ITaskBandImpl_from_IDeskBand(iface); 00270 DbgPrint("ITaskBand::GetBandInfo(0x%x,0x%x,0x%p) hWnd=0x%p\n", dwBandID, dwViewMode, pdbi, This->hWnd); 00271 00272 /* NOTE: We could save dwBandID in the instance in case we need it later... */ 00273 00274 if (This->hWnd != NULL) 00275 { 00276 /* The task band never has a title */ 00277 pdbi->dwMask &= ~DBIM_TITLE; 00278 00279 /* NOTE: We don't return DBIMF_UNDELETEABLE here, the band site will 00280 handle us differently and add this flag for us. The reason for 00281 this is future changes that might allow it to be deletable. 00282 We want the band site to be in charge of this decision rather 00283 the band itself! */ 00284 /* FIXME: What about DBIMF_NOGRIPPER and DBIMF_ALWAYSGRIPPER */ 00285 pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT; 00286 00287 if (dwViewMode & DBIF_VIEWMODE_VERTICAL) 00288 { 00289 pdbi->ptIntegral.y = 1; 00290 pdbi->ptMinSize.y = 1; 00291 /* FIXME: Get the button metrics from the task bar object!!! */ 00292 pdbi->ptMinSize.x = (3 * GetSystemMetrics(SM_CXEDGE) / 2) + /* FIXME: Might be wrong if only one column! */ 00293 GetSystemMetrics(SM_CXSIZE) + (2 * GetSystemMetrics(SM_CXEDGE)); /* FIXME: Min button size, query!!! */ 00294 } 00295 else 00296 { 00297 pdbi->ptMinSize.y = GetSystemMetrics(SM_CYSIZE) + (2 * GetSystemMetrics(SM_CYEDGE)); /* FIXME: Query */ 00298 pdbi->ptIntegral.y = pdbi->ptMinSize.y + (3 * GetSystemMetrics(SM_CYEDGE) / 2); /* FIXME: Query metrics */ 00299 /* We're not going to allow task bands where not even the minimum button size fits into the band */ 00300 pdbi->ptMinSize.x = pdbi->ptIntegral.y; 00301 } 00302 00303 /* Ignored: pdbi->ptMaxSize.x */ 00304 pdbi->ptMaxSize.y = -1; 00305 00306 /* FIXME: We should query the height from the task bar object!!! */ 00307 pdbi->ptActual.y = GetSystemMetrics(SM_CYSIZE) + (2 * GetSystemMetrics(SM_CYEDGE)); 00308 00309 /* Save the band ID for future use in case we need to check whether a given band 00310 is the task band */ 00311 This->dwBandID = dwBandID; 00312 00313 DbgPrint("H: %d, Min: %d,%d, Integral.y: %d Actual: %d,%d\n", (dwViewMode & DBIF_VIEWMODE_VERTICAL) == 0, 00314 pdbi->ptMinSize.x, pdbi->ptMinSize.y, pdbi->ptIntegral.y, 00315 pdbi->ptActual.x,pdbi->ptActual.y); 00316 00317 return S_OK; 00318 } 00319 00320 return E_FAIL; 00321 } 00322 00323 static const IDeskBandVtbl IDeskBandImpl_Vtbl = 00324 { 00325 /*** IUnknown methods ***/ 00326 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IDeskBand, ITaskBand), 00327 METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IDeskBand, ITaskBand), 00328 METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IDeskBand, ITaskBand), 00329 /*** IOleWindow methods ***/ 00330 ITaskBandImpl_GetWindow, 00331 ITaskBandImpl_ContextSensitiveHelp, 00332 /*** IDockingWindow methods ***/ 00333 ITaskBandImpl_ShowDW, 00334 ITaskBandImpl_CloseDW, 00335 ITaskBandImpl_ResizeBoderDW, 00336 /*** IDeskBand methods ***/ 00337 ITaskBandImpl_GetBandInfo 00338 }; 00339 00340 /*****************************************************************************/ 00341 00342 METHOD_IUNKNOWN_INHERITED_ADDREF(IDeskBar, ITaskBand) 00343 METHOD_IUNKNOWN_INHERITED_RELEASE(IDeskBar, ITaskBand) 00344 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IDeskBar, ITaskBand) 00345 00346 static HRESULT STDMETHODCALLTYPE 00347 IDeskBarImpl_GetWindow(IN OUT IDeskBar *iface, 00348 OUT HWND *phwnd) 00349 { 00350 ITaskBandImpl *This = ITaskBandImpl_from_IDeskBar(iface); 00351 IDeskBand *DeskBand = IDeskBand_from_ITaskBandImpl(This); 00352 00353 /* Proxy to IDeskBand interface */ 00354 return IDeskBand_GetWindow(DeskBand, 00355 phwnd); 00356 } 00357 00358 static HRESULT STDMETHODCALLTYPE 00359 IDeskBarImpl_ContextSensitiveHelp(IN OUT IDeskBar *iface, 00360 IN BOOL fEnterMode) 00361 { 00362 ITaskBandImpl *This = ITaskBandImpl_from_IDeskBar(iface); 00363 IDeskBand *DeskBand = IDeskBand_from_ITaskBandImpl(This); 00364 00365 /* Proxy to IDeskBand interface */ 00366 return IDeskBand_ContextSensitiveHelp(DeskBand, 00367 fEnterMode); 00368 } 00369 00370 static HRESULT STDMETHODCALLTYPE 00371 IDeskBarImpl_SetClient(IN OUT IDeskBar *iface, 00372 IN IUnknown *punkClient) 00373 { 00374 DbgPrint("IDeskBar::SetClient(0x%p)\n", punkClient); 00375 return E_NOTIMPL; 00376 } 00377 00378 static HRESULT STDMETHODCALLTYPE 00379 IDeskBarImpl_GetClient(IN OUT IDeskBar *iface, 00380 OUT IUnknown **ppunkClient) 00381 { 00382 DbgPrint("IDeskBar::GetClient(0x%p)\n", ppunkClient); 00383 return E_NOTIMPL; 00384 } 00385 00386 static HRESULT STDMETHODCALLTYPE 00387 IDeskBarImpl_OnPosRectChangeDB(IN OUT IDeskBar *iface, 00388 IN RECT *prc) 00389 { 00390 DbgPrint("IDeskBar::OnPosRectChangeDB(0x%p=(%d,%d,%d,%d))\n", prc, prc->left, prc->top, prc->right, prc->bottom); 00391 if (prc->bottom - prc->top == 0) 00392 return S_OK; 00393 00394 return S_FALSE; 00395 } 00396 00397 static const IDeskBarVtbl IDeskBarImpl_Vtbl = 00398 { 00399 /*** IUnknown methods ***/ 00400 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IDeskBar, ITaskBand), 00401 METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IDeskBar, ITaskBand), 00402 METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IDeskBar, ITaskBand), 00403 /*** IOleWindow methods ***/ 00404 IDeskBarImpl_GetWindow, 00405 IDeskBarImpl_ContextSensitiveHelp, 00406 /*** IDeskBar methods ***/ 00407 IDeskBarImpl_SetClient, 00408 IDeskBarImpl_GetClient, 00409 IDeskBarImpl_OnPosRectChangeDB 00410 }; 00411 00412 /*****************************************************************************/ 00413 00414 METHOD_IUNKNOWN_INHERITED_ADDREF(IPersistStream, ITaskBand) 00415 METHOD_IUNKNOWN_INHERITED_RELEASE(IPersistStream, ITaskBand) 00416 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IPersistStream, ITaskBand) 00417 00418 static HRESULT STDMETHODCALLTYPE 00419 ITaskBandImpl_GetClassID(IN OUT IPersistStream *iface, 00420 OUT CLSID *pClassID) 00421 { 00422 DbgPrint("ITaskBand::GetClassID(0x%p)\n", pClassID); 00423 /* We're going to return the (internal!) CLSID of the task band interface */ 00424 *pClassID = CLSID_ITaskBand; 00425 return S_OK; 00426 } 00427 00428 static HRESULT STDMETHODCALLTYPE 00429 ITaskBandImpl_IsDirty(IN OUT IPersistStream *iface) 00430 { 00431 /* The object hasn't changed since the last save! */ 00432 return S_FALSE; 00433 } 00434 00435 static HRESULT STDMETHODCALLTYPE 00436 ITaskBandImpl_Load(IN OUT IPersistStream *iface, 00437 IN IStream *pStm) 00438 { 00439 DbgPrint("ITaskBand::Load called\n"); 00440 /* Nothing to do */ 00441 return S_OK; 00442 } 00443 00444 static HRESULT STDMETHODCALLTYPE 00445 ITaskBandImpl_Save(IN OUT IPersistStream *iface, 00446 IN IStream *pStm, 00447 IN BOOL fClearDirty) 00448 { 00449 /* Nothing to do */ 00450 return S_OK; 00451 } 00452 00453 static HRESULT STDMETHODCALLTYPE 00454 ITaskBandImpl_GetSizeMax(IN OUT IPersistStream *iface, 00455 OUT ULARGE_INTEGER *pcbSize) 00456 { 00457 DbgPrint("ITaskBand::GetSizeMax called\n"); 00458 /* We don't need any space for the task band */ 00459 pcbSize->QuadPart = 0; 00460 return S_OK; 00461 } 00462 00463 static const IPersistStreamVtbl IPersistStreamImpl_Vtbl = 00464 { 00465 /*** IUnknown methods ***/ 00466 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IPersistStream, ITaskBand), 00467 METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IPersistStream, ITaskBand), 00468 METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IPersistStream, ITaskBand), 00469 /*** IPersist methods ***/ 00470 ITaskBandImpl_GetClassID, 00471 /*** IPersistStream methods ***/ 00472 ITaskBandImpl_IsDirty, 00473 ITaskBandImpl_Load, 00474 ITaskBandImpl_Save, 00475 ITaskBandImpl_GetSizeMax 00476 }; 00477 00478 /*****************************************************************************/ 00479 00480 METHOD_IUNKNOWN_INHERITED_ADDREF(IObjectWithSite, ITaskBand) 00481 METHOD_IUNKNOWN_INHERITED_RELEASE(IObjectWithSite, ITaskBand) 00482 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IObjectWithSite, ITaskBand) 00483 00484 static HRESULT STDMETHODCALLTYPE 00485 ITaskBandImpl_SetSite(IN OUT IObjectWithSite *iface, 00486 IN IUnknown* pUnkSite) 00487 { 00488 ITaskBandImpl *This = ITaskBandImpl_from_IObjectWithSite(iface); 00489 HRESULT hRet = E_FAIL; 00490 00491 DbgPrint("ITaskBand::SetSite(0x%p)\n", pUnkSite); 00492 00493 /* Release the current site */ 00494 if (This->punkSite != NULL) 00495 { 00496 IUnknown_Release(This->punkSite); 00497 } 00498 00499 This->punkSite = NULL; 00500 This->hWnd = NULL; 00501 00502 if (pUnkSite != NULL) 00503 { 00504 IOleWindow *OleWindow; 00505 00506 /* Check if the site supports IOleWindow */ 00507 hRet = IUnknown_QueryInterface(pUnkSite, 00508 &IID_IOleWindow, 00509 (PVOID*)&OleWindow); 00510 if (SUCCEEDED(hRet)) 00511 { 00512 HWND hWndParent = NULL; 00513 00514 hRet = IOleWindow_GetWindow(OleWindow, 00515 &hWndParent); 00516 if (SUCCEEDED(hRet)) 00517 { 00518 /* Attempt to create the task switch window */ 00519 00520 DbgPrint("CreateTaskSwitchWnd(Parent: 0x%p)\n", hWndParent); 00521 This->hWnd = CreateTaskSwitchWnd(hWndParent, 00522 This->Tray); 00523 if (This->hWnd != NULL) 00524 { 00525 This->punkSite = pUnkSite; 00526 hRet = S_OK; 00527 } 00528 else 00529 { 00530 DbgPrint("CreateTaskSwitchWnd() failed!\n"); 00531 IUnknown_Release(OleWindow); 00532 hRet = E_FAIL; 00533 } 00534 } 00535 else 00536 IUnknown_Release(OleWindow); 00537 } 00538 else 00539 DbgPrint("Querying IOleWindow failed: 0x%x\n", hRet); 00540 } 00541 00542 return hRet; 00543 } 00544 00545 static HRESULT STDMETHODCALLTYPE 00546 ITaskBandImpl_GetSite(IN OUT IObjectWithSite *iface, 00547 IN REFIID riid, 00548 OUT VOID **ppvSite) 00549 { 00550 ITaskBandImpl *This = ITaskBandImpl_from_IObjectWithSite(iface); 00551 DbgPrint("ITaskBand::GetSite(0x%p,0x%p)\n", riid, ppvSite); 00552 00553 if (This->punkSite != NULL) 00554 { 00555 return IUnknown_QueryInterface(This->punkSite, 00556 riid, 00557 ppvSite); 00558 } 00559 00560 *ppvSite = NULL; 00561 return E_FAIL; 00562 } 00563 00564 static const IObjectWithSiteVtbl IObjectWithSiteImpl_Vtbl = 00565 { 00566 /*** IUnknown methods ***/ 00567 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IObjectWithSite, ITaskBand), 00568 METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IObjectWithSite, ITaskBand), 00569 METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IObjectWithSite, ITaskBand), 00570 /*** IObjectWithSite methods ***/ 00571 ITaskBandImpl_SetSite, 00572 ITaskBandImpl_GetSite 00573 }; 00574 00575 00576 /*****************************************************************************/ 00577 00578 METHOD_IUNKNOWN_INHERITED_ADDREF(IWinEventHandler, ITaskBand) 00579 METHOD_IUNKNOWN_INHERITED_RELEASE(IWinEventHandler, ITaskBand) 00580 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IWinEventHandler, ITaskBand) 00581 00582 static HRESULT STDMETHODCALLTYPE 00583 IWinEventHandlerImpl_ProcessMessage(IN OUT IWinEventHandler *iface, 00584 IN HWND hWnd, 00585 IN UINT uMsg, 00586 IN WPARAM wParam, 00587 IN LPARAM lParam, 00588 OUT LRESULT *plrResult) 00589 { 00590 DbgPrint("ITaskBand: IWinEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p)\n", hWnd, uMsg, wParam, lParam, plrResult); 00591 return E_NOTIMPL; 00592 } 00593 00594 static HRESULT STDMETHODCALLTYPE 00595 IWinEventHandlerImpl_ContainsWindow(IN OUT IWinEventHandler *iface, 00596 IN HWND hWnd) 00597 { 00598 ITaskBandImpl *This = ITaskBandImpl_from_IWinEventHandler(iface); 00599 HRESULT hRet = S_OK; 00600 00601 if (This->hWnd != hWnd || 00602 !IsChild(This->hWnd, 00603 hWnd)) 00604 { 00605 hRet = S_FALSE; 00606 } 00607 00608 DbgPrint("ITaskBand::ContainsWindow(0x%p) returns %s\n", hWnd, hRet == S_OK ? "S_OK" : "S_FALSE"); 00609 00610 return hRet; 00611 } 00612 00613 static const IWinEventHandlerVtbl IWinEventHandlerImpl_Vtbl = 00614 { 00615 /*** IUnknown methods ***/ 00616 METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IWinEventHandler, ITaskBand), 00617 METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IWinEventHandler, ITaskBand), 00618 METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IWinEventHandler, ITaskBand), 00619 /*** IWinEventHandler methods ***/ 00620 IWinEventHandlerImpl_ProcessMessage, 00621 IWinEventHandlerImpl_ContainsWindow 00622 }; 00623 00624 /*****************************************************************************/ 00625 00626 static ITaskBandImpl * 00627 ITaskBandImpl_Construct(IN OUT ITrayWindow *Tray) 00628 { 00629 ITaskBandImpl *This; 00630 00631 This = HeapAlloc(hProcessHeap, 00632 0, 00633 sizeof(*This)); 00634 if (This == NULL) 00635 return NULL; 00636 00637 ZeroMemory(This, 00638 sizeof(*This)); 00639 This->lpVtbl = &ITaskBandImpl_Vtbl; 00640 This->lpDeskBandVtbl = &IDeskBandImpl_Vtbl; 00641 This->lpObjectWithSiteVtbl = &IObjectWithSiteImpl_Vtbl; 00642 This->lpDeskBarVtbl = &IDeskBarImpl_Vtbl; 00643 This->lpPersistStreamVtbl = &IPersistStreamImpl_Vtbl; 00644 This->lpWindowEventHandlerVtbl = &IWinEventHandlerImpl_Vtbl; 00645 This->Ref = 1; 00646 00647 This->Tray = Tray; 00648 This->dwBandID = (DWORD)-1; 00649 00650 return This; 00651 } 00652 00653 ITaskBand * 00654 CreateTaskBand(IN OUT ITrayWindow *Tray) 00655 { 00656 ITaskBandImpl *This; 00657 00658 This = ITaskBandImpl_Construct(Tray); 00659 if (This != NULL) 00660 { 00661 return ITaskBand_from_ITaskBandImpl(This); 00662 } 00663 00664 return NULL; 00665 } Generated on Mon May 28 2012 04:18:08 for ReactOS by
1.7.6.1
|