ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

taskband.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.