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

bandsite.cpp
Go to the documentation of this file.
00001 /*
00002  *  Rebar band site
00003  *
00004  *  Copyright 2007  Hervé Poussineau
00005  *  Copyright 2009  Andrew Hill
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00020  */
00021 
00022 #include "precomp.h"
00023 
00024 WINE_DEFAULT_DEBUG_CHANNEL(browseui);
00025 
00026 #ifndef ASSERT
00027 #define ASSERT(cond) \
00028     if (!(cond)) \
00029         ERR ("ASSERTION %s AT %s:%d FAILED!\n", #cond, __FILE__, __LINE__)
00030 #endif
00031 
00032 CBandSiteBase::CBandSiteBase()
00033 {
00034     fBandsCount = 0;
00035     fBandsAllocated = 0;
00036     fBands = NULL;
00037     fRebarWindow = NULL;
00038 }
00039 
00040 UINT CBandSiteBase::GetBandID(struct BandObject *Band)
00041 {
00042     return (UINT)(Band - fBands);
00043 }
00044 
00045 struct CBandSiteBase::BandObject *CBandSiteBase::GetBandByID(DWORD dwBandID)
00046 {
00047     if ((LONG)dwBandID >= fBandsAllocated)
00048         return NULL;
00049 
00050     if (fBands[dwBandID].DeskBand == NULL)
00051         return NULL;
00052 
00053     return &fBands[dwBandID];
00054 }
00055 
00056 void CBandSiteBase::FreeBand(struct BandObject *Band)
00057 {
00058     ATLASSERT(Band->DeskBand != NULL);
00059     ATLASSERT(Band->OleWindow != NULL);
00060     ATLASSERT(Band->WndEvtHandler != NULL);
00061     Band->DeskBand->Release();
00062     Band->OleWindow->Release();
00063     Band->WndEvtHandler->Release();
00064     memset(Band, 0, sizeof(*Band));
00065     fBandsCount--;
00066 }
00067 
00068 DWORD CBandSiteBase::GetBandSiteViewMode()
00069 {
00070     DWORD                                   dwStyle;
00071 
00072     /* FIXME: What about DBIF_VIEWMODE_FLOATING and DBIF_VIEWMODE_TRANSPARENT? */
00073     dwStyle = GetWindowLongPtr(fRebarWindow, GWL_STYLE);
00074 
00075     if (dwStyle & CCS_VERT)
00076         return DBIF_VIEWMODE_VERTICAL;
00077     else
00078         return DBIF_VIEWMODE_NORMAL;
00079 }
00080 
00081 VOID CBandSiteBase::BuildRebarBandInfo(struct BandObject *Band, REBARBANDINFOW *prbi)
00082 {
00083     memset(prbi, 0, sizeof(*prbi));
00084     prbi->cbSize = sizeof(*prbi);
00085 
00086     prbi->fMask = RBBIM_ID;
00087     prbi->wID = GetBandID(Band);
00088 
00089     if (Band->dbi.dwMask & DBIM_MINSIZE)
00090     {
00091         prbi->fMask |= RBBIM_CHILDSIZE;
00092         prbi->cxMinChild = Band->dbi.ptMinSize.x;
00093         prbi->cyMinChild = Band->dbi.ptMinSize.y;
00094     }
00095 
00096     if (Band->dbi.dwMask & DBIM_MAXSIZE)
00097     {
00098         prbi->fMask |= RBBIM_CHILDSIZE;
00099         prbi->cyMaxChild = Band->dbi.ptMaxSize.y;
00100     }
00101 
00102     if ((Band->dbi.dwMask & (DBIM_INTEGRAL | DBIM_MODEFLAGS)) == (DBIM_INTEGRAL | DBIM_MODEFLAGS) &&
00103         (Band->dbi.dwModeFlags & DBIMF_VARIABLEHEIGHT))
00104     {
00105         prbi->fMask |= RBBIM_CHILDSIZE;
00106         prbi->cyIntegral = Band->dbi.ptIntegral.y;
00107     }
00108 
00109     if (Band->dbi.dwMask & DBIM_ACTUAL)
00110     {
00111         prbi->fMask |= RBBIM_IDEALSIZE | RBBIM_SIZE | RBBIM_CHILDSIZE;
00112         prbi->cxIdeal = Band->dbi.ptActual.x;
00113         prbi->cx = Band->dbi.ptActual.x;
00114         prbi->cyChild = Band->dbi.ptActual.y;
00115     }
00116 
00117     if (Band->dbi.dwMask & DBIM_TITLE)
00118     {
00119         prbi->fMask |= RBBIM_TEXT;
00120         prbi->lpText = Band->dbi.wszTitle;
00121         prbi->cch = wcslen(Band->dbi.wszTitle);
00122     }
00123 
00124     if (Band->dbi.dwMask & DBIM_MODEFLAGS)
00125     {
00126         prbi->fMask |= RBBIM_STYLE;
00127 
00128         if (Band->dbi.dwModeFlags & DBIMF_FIXED)
00129             prbi->fStyle |= RBBS_FIXEDSIZE | RBBS_NOGRIPPER;
00130         if (Band->dbi.dwModeFlags & DBIMF_FIXEDBMP)
00131             prbi->fStyle |= RBBS_FIXEDBMP;
00132         if (Band->dbi.dwModeFlags & DBIMF_VARIABLEHEIGHT)
00133             prbi->fStyle |= RBBS_VARIABLEHEIGHT;
00134         if (Band->dbi.dwModeFlags & DBIMF_DEBOSSED)
00135             prbi->fStyle |= RBBS_CHILDEDGE;
00136         if (Band->dbi.dwModeFlags & DBIMF_USECHEVRON)
00137             prbi->fStyle |= RBBS_USECHEVRON;
00138         if (Band->dbi.dwModeFlags & DBIMF_BREAK)
00139             prbi->fStyle |= RBBS_BREAK;
00140         if (Band->dbi.dwModeFlags & DBIMF_TOPALIGN)
00141             prbi->fStyle |= RBBS_TOPALIGN;
00142         if (Band->dbi.dwModeFlags & DBIMF_NOGRIPPER)
00143             prbi->fStyle |= RBBS_NOGRIPPER;
00144         if (Band->dbi.dwModeFlags & DBIMF_ALWAYSGRIPPER)
00145             prbi->fStyle |= RBBS_GRIPPERALWAYS;
00146     }
00147 
00148     if ((Band->dbi.dwMask & (DBIM_BKCOLOR | DBIM_MODEFLAGS)) == (DBIM_BKCOLOR | DBIM_MODEFLAGS) &&
00149         (Band->dbi.dwModeFlags & DBIMF_BKCOLOR))
00150     {
00151         prbi->fMask |= RBBIM_COLORS;
00152         prbi->clrFore = (COLORREF)(COLOR_WINDOWTEXT + 1);
00153         prbi->clrBack = Band->dbi.crBkgnd;
00154     }
00155 }
00156 
00157 HRESULT CBandSiteBase::UpdateSingleBand(struct BandObject *Band)
00158 {
00159     REBARBANDINFOW                          rbi;
00160     DWORD                                   dwViewMode;
00161     UINT                                    uBand;
00162     HRESULT                                 hRet;
00163 
00164     memset(&Band->dbi, 0, sizeof(Band->dbi));
00165     Band->dbi.dwMask = DBIM_MINSIZE | DBIM_MAXSIZE | DBIM_INTEGRAL |
00166         DBIM_ACTUAL | DBIM_TITLE | DBIM_MODEFLAGS | DBIM_BKCOLOR;
00167 
00168     dwViewMode = GetBandSiteViewMode();
00169 
00170     hRet = Band->DeskBand->GetBandInfo((DWORD)GetBandID(Band), dwViewMode, &Band->dbi);
00171     if (SUCCEEDED(hRet))
00172     {
00173         BuildRebarBandInfo(Band, &rbi);
00174         if (SUCCEEDED(Band->OleWindow->GetWindow(&rbi.hwndChild)) &&
00175             rbi.hwndChild != NULL)
00176         {
00177             rbi.fMask |= RBBIM_CHILD;
00178             WARN ("ReBar band uses child window 0x%p\n", rbi.hwndChild);
00179         }
00180 
00181         uBand = (UINT)SendMessageW(fRebarWindow, RB_IDTOINDEX, (WPARAM)rbi.wID, 0);
00182         if (uBand != (UINT)-1)
00183         {
00184             if (!SendMessageW(fRebarWindow, RB_SETBANDINFOW, (WPARAM)uBand, (LPARAM)&rbi))
00185             {
00186                 WARN("Failed to update the rebar band!\n");
00187             }
00188         }
00189         else
00190             WARN("Failed to map rebar band id to index!\n");
00191 
00192     }
00193 
00194     return hRet;
00195 }
00196 
00197 HRESULT CBandSiteBase::UpdateAllBands()
00198 {
00199     LONG                                    i;
00200     HRESULT                                 hRet;
00201 
00202     for (i = 0; i < fBandsAllocated; i++)
00203     {
00204         if (fBands[i].DeskBand != NULL)
00205         {
00206             hRet = UpdateSingleBand(&fBands[i]);
00207             if (!SUCCEEDED(hRet))
00208                 return hRet;
00209         }
00210     }
00211 
00212     return S_OK;
00213 }
00214 
00215 HRESULT CBandSiteBase::UpdateBand(DWORD dwBandID)
00216 {
00217     struct BandObject                       *Band;
00218 
00219     Band = GetBandByID(dwBandID);
00220     if (Band == NULL)
00221         return E_FAIL;
00222 
00223     return UpdateSingleBand(Band);
00224 }
00225 
00226 struct CBandSiteBase::BandObject *CBandSiteBase::GetBandFromHwnd(HWND hwnd)
00227 {
00228     HRESULT                                 hRet;
00229     HWND                                    hWndBand;
00230     LONG                                    i;
00231 
00232     for (i = 0; i < fBandsAllocated; i++)
00233     {
00234         if (fBands[i].DeskBand != NULL)
00235         {
00236             ASSERT(fBands[i].OleWindow);
00237 
00238             hWndBand = NULL;
00239             hRet = fBands[i].OleWindow->GetWindow(&hWndBand);
00240             if (SUCCEEDED(hRet) && hWndBand == hwnd)
00241                 return &fBands[i];
00242         }
00243     }
00244 
00245     return NULL;
00246 }
00247 
00248 CBandSiteBase::~CBandSiteBase()
00249 {
00250 
00251     TRACE("destroying %p\n", this);
00252 
00253     if (fRebarWindow != NULL)
00254     {
00255         DestroyWindow(fRebarWindow);
00256         fRebarWindow = NULL;
00257     }
00258 
00259     if (fBands != NULL)
00260     {
00261         int i;
00262         for (i = 0; i < fBandsAllocated; i++)
00263         {
00264             if (fBands[i].DeskBand != NULL)
00265                 FreeBand(&fBands[i]);
00266         }
00267         CoTaskMemFree(fBands);
00268         fBands = NULL;
00269     }
00270 }
00271 
00272 HRESULT STDMETHODCALLTYPE CBandSiteBase::AddBand(IUnknown *punk)
00273 {
00274     INT                                     i;
00275     LONG                                    NewAllocated;
00276     struct BandObject                       *NewBand = NULL;
00277     CComPtr<IDeskBand>                      DeskBand;
00278     CComPtr<IObjectWithSite>                ObjWithSite;
00279     CComPtr<IOleWindow>                     OleWindow;
00280     CComPtr<IWinEventHandler>               WndEvtHandler;
00281     REBARBANDINFOW                          rbi;
00282     HRESULT                                 hRet;
00283     UINT                                    uBand;
00284 
00285     TRACE("(%p, %p)\n", this, punk);
00286 
00287     if (punk == NULL || fRebarWindow == NULL)
00288         return E_FAIL;
00289 
00290     hRet = punk->QueryInterface(IID_IDeskBand, (PVOID *)&DeskBand);
00291     if (!SUCCEEDED(hRet) || DeskBand == NULL)
00292         goto Cleanup;
00293     hRet = punk->QueryInterface(IID_IObjectWithSite, (PVOID *)&ObjWithSite);
00294     if (!SUCCEEDED(hRet) || ObjWithSite == NULL)
00295         goto Cleanup;
00296     hRet = punk->QueryInterface(IID_IOleWindow, (PVOID *)&OleWindow);
00297     if (!SUCCEEDED(hRet) || OleWindow == NULL)
00298         goto Cleanup;
00299     hRet = punk->QueryInterface(IID_IWinEventHandler, (PVOID *)&WndEvtHandler);
00300     if (!SUCCEEDED(hRet) || WndEvtHandler == NULL)
00301         goto Cleanup;
00302 
00303     hRet = S_OK;
00304     if (fBandsAllocated > fBandsCount)
00305     {
00306         /* Search for a free band object */
00307         for (i = 0; i < fBandsAllocated; i++)
00308         {
00309             if (fBands[i].DeskBand == NULL)
00310             {
00311                 NewBand = &fBands[i];
00312                 break;
00313             }
00314         }
00315     }
00316     else if (fBandsAllocated > 0)
00317     {
00318         ASSERT (fBands != NULL);
00319 
00320         /* Reallocate the band object array */
00321         NewAllocated = fBandsAllocated + 8;
00322         if (NewAllocated > 0xFFFF)
00323             NewAllocated = 0xFFFF;
00324         if (NewAllocated == fBandsAllocated)
00325         {
00326             hRet = E_OUTOFMEMORY;
00327             goto Cleanup;
00328         }
00329         
00330 
00331         NewBand = reinterpret_cast<struct BandObject *>(CoTaskMemAlloc(NewAllocated * sizeof(struct BandObject)));
00332         if (NewBand == NULL)
00333         {
00334             hRet = E_OUTOFMEMORY;
00335             goto Cleanup;
00336         }
00337 
00338         /* Copy the old array */
00339         memcpy(NewBand, fBands, fBandsAllocated * sizeof(struct BandObject));
00340 
00341         /* Initialize the added bands */
00342         memset(&NewBand[fBandsAllocated], 0, (NewAllocated - fBandsAllocated) * sizeof(struct BandObject));
00343 
00344         NewBand = &fBands[fBandsAllocated];
00345         fBandsAllocated = NewAllocated;
00346         CoTaskMemFree(fBands);
00347         fBands = NewBand;
00348     }
00349     else
00350     {
00351         ASSERT(fBands == NULL);
00352         ASSERT(fBandsAllocated == 0);
00353         ASSERT(fBandsCount == 0);
00354 
00355         /* Allocate new array */
00356         fBands = reinterpret_cast<struct BandObject *>(CoTaskMemAlloc(8 * sizeof(struct BandObject)));
00357         if (fBands == NULL)
00358         {
00359             hRet = E_OUTOFMEMORY;
00360             goto Cleanup;
00361         }
00362 
00363         /* Initialize the added bands */
00364         memset(fBands, 0, 8 * sizeof(struct BandObject));
00365 
00366         fBandsAllocated += 8;
00367         NewBand = &fBands[0];
00368     }
00369 
00370     if (SUCCEEDED(hRet))
00371     {
00372         ASSERT(NewBand != NULL);
00373 
00374         fBandsCount++;
00375         NewBand->DeskBand = DeskBand.Detach();
00376         NewBand->OleWindow = OleWindow.Detach();
00377         NewBand->WndEvtHandler = WndEvtHandler.Detach();
00378 
00379         /* Create the ReBar band */
00380         hRet = ObjWithSite->SetSite((IOleWindow *)this);
00381         if (SUCCEEDED(hRet))
00382         {
00383             uBand = 0xffffffff;
00384             if (SUCCEEDED(UpdateSingleBand(NewBand)))
00385             {
00386                 if (NewBand->dbi.dwMask & DBIM_MODEFLAGS)
00387                 {
00388                     if (NewBand->dbi.dwModeFlags & DBIMF_ADDTOFRONT)
00389                         uBand = 0;
00390                 }
00391             }
00392 
00393             BuildRebarBandInfo(NewBand, &rbi);
00394 
00395             if (SUCCEEDED(NewBand->OleWindow->GetWindow(&rbi.hwndChild)) &&
00396                 rbi.hwndChild != NULL)
00397             {
00398                 rbi.fMask |= RBBIM_CHILD;
00399                 WARN ("ReBar band uses child window 0x%p\n", rbi.hwndChild);
00400             }
00401 
00402             if (!SendMessageW(fRebarWindow, RB_INSERTBANDW, (WPARAM)uBand, (LPARAM)&rbi))
00403                 return E_FAIL;
00404 
00405             hRet = (HRESULT)((USHORT)GetBandID(NewBand));
00406         }
00407         else
00408         {
00409             WARN("IBandSite::AddBand(): Call to IDeskBand::SetSite() failed: %x\n", hRet);
00410 
00411             /* Remove the band from the ReBar control */
00412             BuildRebarBandInfo(NewBand, &rbi);
00413             uBand = (UINT)SendMessageW(fRebarWindow, RB_IDTOINDEX, (WPARAM)rbi.wID, 0);
00414             if (uBand != (UINT)-1)
00415             {
00416                 if (!SendMessageW(fRebarWindow, RB_DELETEBAND, (WPARAM)uBand, 0))
00417                 {
00418                     ERR("Failed to delete band!\n");
00419                 }
00420             }
00421             else
00422                 ERR("Failed to map band id to index!\n");
00423 
00424             FreeBand(NewBand);
00425 
00426             hRet = E_FAIL;
00427             /* goto Cleanup; */
00428         }
00429     }
00430 Cleanup:
00431     return hRet;
00432 }
00433 
00434 HRESULT STDMETHODCALLTYPE CBandSiteBase::EnumBands(UINT uBand, DWORD *pdwBandID)
00435 {
00436     DWORD                                   i;
00437 
00438     TRACE("(%p, %u, %p)\n", this, uBand, pdwBandID);
00439 
00440     if (uBand == 0xffffffff)
00441         return (UINT)fBandsCount;
00442 
00443     if (uBand >= (UINT)fBandsCount)
00444         return E_FAIL;
00445 
00446     for (i = 0; i < (DWORD)fBandsAllocated; i++)
00447     {
00448         if (fBands[i].DeskBand != NULL)
00449         {
00450             if (uBand == 0)
00451             {
00452                 *pdwBandID = i;
00453                 return S_OK;
00454             }
00455 
00456             uBand--;
00457         }
00458     }
00459 
00460     return E_FAIL;
00461 }
00462 
00463 HRESULT STDMETHODCALLTYPE CBandSiteBase::QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName)
00464 {
00465     struct BandObject                       *Band;
00466 
00467     TRACE("(%p, %u, %p, %p, %p, %d)\n", this, dwBandID, ppstb, pdwState, pszName, cchName);
00468 
00469     Band = GetBandByID(dwBandID);
00470     if (Band == NULL)
00471         return E_FAIL;
00472 
00473     if (ppstb != NULL)
00474     {
00475         Band->DeskBand->AddRef();
00476         *ppstb = Band->DeskBand;
00477     }
00478 
00479     if (pdwState != NULL)
00480     {
00481         FIXME("IBandSite::QueryBand() requests band state!\n");
00482         *pdwState = 0;
00483     }
00484 
00485     if (pszName != NULL && cchName > 0)
00486     {
00487         FIXME("IBandSite::QueryBand() requests band name!\n");
00488         pszName[0] = 0;
00489     }
00490     return S_OK;
00491 }
00492 
00493 HRESULT STDMETHODCALLTYPE CBandSiteBase::SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState)
00494 {
00495     struct BandObject                       *Band;
00496 
00497     TRACE("(%p, %u, %x, %x)\n", this, dwBandID, dwMask, dwState);
00498 
00499     Band = GetBandByID(dwBandID);
00500     if (Band == NULL)
00501         return E_FAIL;
00502 
00503     FIXME("Stub\n");
00504     return E_NOTIMPL;
00505 }
00506 
00507 HRESULT STDMETHODCALLTYPE CBandSiteBase::RemoveBand(DWORD dwBandID)
00508 {
00509     struct BandObject                       *Band;
00510     UINT                                    uBand;
00511 
00512     TRACE("(%p, %u)\n", this, dwBandID);
00513 
00514     if (fRebarWindow == NULL)
00515         return E_FAIL;
00516 
00517     Band = GetBandByID(dwBandID);
00518     if (Band == NULL)
00519         return E_FAIL;
00520 
00521     uBand = (UINT)SendMessageW(fRebarWindow, RB_IDTOINDEX, (WPARAM)GetBandID(Band), 0);
00522     if (uBand != (UINT)-1)
00523     {
00524         if (!SendMessageW(fRebarWindow, RB_DELETEBAND, (WPARAM)uBand, 0))
00525         {
00526             ERR("Could not delete band!\n");
00527         }
00528     }
00529     else
00530         ERR("Could not map band id to index!\n");
00531 
00532     FreeBand(Band);
00533     return S_OK;
00534 }
00535 
00536 HRESULT STDMETHODCALLTYPE CBandSiteBase::GetBandObject(DWORD dwBandID, REFIID riid, VOID **ppv)
00537 {
00538     struct BandObject                       *Band;
00539 
00540     TRACE("(%p, %u, %s, %p)\n", this, dwBandID, debugstr_guid(&riid), ppv);
00541 
00542     Band = GetBandByID(dwBandID);
00543     if (Band == NULL)
00544     {
00545         *ppv = NULL;
00546         return E_FAIL;
00547     }
00548 
00549     return Band->DeskBand->QueryInterface(riid, ppv);
00550 }
00551 
00552 HRESULT STDMETHODCALLTYPE CBandSiteBase::SetBandSiteInfo(const BANDSITEINFO *pbsinfo)
00553 {
00554     FIXME("(%p, %p)\n", this, pbsinfo);
00555     return E_NOTIMPL;
00556 }
00557 
00558 HRESULT STDMETHODCALLTYPE CBandSiteBase::GetBandSiteInfo(BANDSITEINFO *pbsinfo)
00559 {
00560     FIXME("(%p, %p)\n", this, pbsinfo);
00561     return E_NOTIMPL;
00562 }
00563 
00564 HRESULT STDMETHODCALLTYPE CBandSiteBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plrResult)
00565 {
00566     struct BandObject                       *Band;
00567 
00568     TRACE("(%p, %p, %u, %p, %p, %p)\n", this, hWnd, uMsg, wParam, lParam, plrResult);
00569 
00570     *plrResult = 0;
00571     if (fRebarWindow == NULL)
00572         return E_FAIL;
00573 
00574     if (hWnd == fRebarWindow)
00575     {
00576         /* FIXME: Just send the message? */
00577         *plrResult = SendMessageW(hWnd, uMsg, wParam, lParam);
00578         return S_OK;
00579     }
00580 
00581     Band = GetBandFromHwnd(hWnd);
00582     if (Band != NULL)
00583     {
00584         return Band->WndEvtHandler->OnWinEvent(hWnd, uMsg, wParam, lParam, plrResult);
00585     }
00586 
00587     return E_FAIL;
00588 }
00589 
00590 HRESULT STDMETHODCALLTYPE CBandSiteBase::IsWindowOwner(HWND hWnd)
00591 {
00592     struct BandObject                       *Band;
00593 
00594     TRACE("(%p, %p)\n", this, hWnd);
00595 
00596     if (fRebarWindow == NULL)
00597         return E_FAIL;
00598 
00599     Band = GetBandFromHwnd(hWnd);
00600     if (Band != NULL)
00601         return S_OK;
00602 
00603     return S_FALSE;
00604 }
00605 
00606 HRESULT STDMETHODCALLTYPE CBandSiteBase::GetWindow(HWND *phWnd)
00607 {
00608     TRACE("(%p, %p)\n", this, phWnd);
00609 
00610     *phWnd = fRebarWindow;
00611     if (fRebarWindow != NULL)
00612         return S_OK;
00613 
00614     return E_FAIL;
00615 }
00616 
00617 HRESULT STDMETHODCALLTYPE CBandSiteBase::ContextSensitiveHelp(BOOL fEnterMode)
00618 {
00619     FIXME("(%p, %d)\n", this, fEnterMode);
00620     return E_NOTIMPL;
00621 }
00622 
00623 HRESULT STDMETHODCALLTYPE CBandSiteBase::SetDeskBarSite(IUnknown *pUnk)
00624 {
00625     HWND                                    hWndParent;
00626     HRESULT                                 hRet;
00627 
00628     TRACE("(%p, %p)\n", this, pUnk);
00629 
00630     fOleWindow.Release();
00631 
00632     hRet = pUnk->QueryInterface(IID_IOleWindow, (PVOID *)&fOleWindow);
00633     if (!SUCCEEDED(hRet))
00634         return E_FAIL;
00635 
00636     hRet = fOleWindow->GetWindow(&hWndParent);
00637     if (!SUCCEEDED(hRet))
00638         return E_FAIL;
00639 
00640     fRebarWindow = CreateWindowExW(WS_EX_TOOLWINDOW,
00641                                       REBARCLASSNAMEW,
00642                                       NULL,
00643                                       WS_CHILD | WS_CLIPSIBLINGS |
00644                                           WS_CLIPCHILDREN | RBS_VARHEIGHT |
00645                                           RBS_BANDBORDERS | CCS_NODIVIDER |
00646                                           CCS_NORESIZE | CCS_NOPARENTALIGN,
00647                                       0,
00648                                       0,
00649                                       0,
00650                                       0,
00651                                       hWndParent,
00652                                       NULL,
00653                                       _AtlBaseModule.GetModuleInstance(),
00654                                       NULL);
00655     if (fRebarWindow == NULL)
00656     {
00657         fOleWindow.Release();
00658         WARN("IDeskbarClient::SetDeskBarSite() failed to create ReBar control!\n");
00659         return E_FAIL;
00660     }
00661 
00662     return S_OK;
00663 }
00664 
00665 HRESULT STDMETHODCALLTYPE CBandSiteBase::SetModeDBC(DWORD dwMode)
00666 {
00667     LONG                                    dwStyle;
00668     LONG                                    dwPrevStyle;
00669 
00670     TRACE("(%p, %x)\n", this, dwMode);
00671 
00672     if (fRebarWindow == NULL)
00673         return E_FAIL;
00674 
00675     dwStyle = dwPrevStyle = GetWindowLongPtr(fRebarWindow, GWL_STYLE);
00676     if (dwMode & DBIF_VIEWMODE_VERTICAL)
00677         dwStyle |= CCS_VERT;
00678 
00679     if (dwMode & ~DBIF_VIEWMODE_VERTICAL)
00680         FIXME("IDeskBarClient::SetModeDBC() unhandled modes: %x\n", dwStyle & ~DBIF_VIEWMODE_VERTICAL);
00681 
00682     if (dwStyle != dwPrevStyle)
00683     {
00684         SetWindowLongPtr(fRebarWindow, GWL_STYLE, dwPrevStyle);
00685     }
00686     
00687     return S_OK;
00688 }
00689 
00690 HRESULT STDMETHODCALLTYPE CBandSiteBase::UIActivateDBC(DWORD dwState)
00691 {
00692     TRACE("(%p, %x)\n", this, dwState);
00693 
00694     if (fRebarWindow == NULL)
00695         return E_FAIL;
00696 
00697     ShowWindow(fRebarWindow, (dwState & DBC_SHOW) ? SW_SHOW : SW_HIDE);
00698     FIXME("IDeskBarClient::UIActivateDBC() Properly notify bands?\n");
00699     return S_OK;
00700 }
00701 
00702 HRESULT STDMETHODCALLTYPE CBandSiteBase::GetSize(DWORD unknown1, LPRECT unknown2)
00703 {
00704     FIXME("(%p, %x, %p)\n", this, unknown1, unknown2);
00705     return E_NOTIMPL;
00706 }
00707 
00708 HRESULT STDMETHODCALLTYPE CBandSiteBase::QueryStatus(const GUID *pguidCmdGroup, DWORD cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText)
00709 {
00710     FIXME("(%p, %p, %u, %p, %p)\n", this, pguidCmdGroup, cCmds, prgCmds, pCmdText);
00711     return E_NOTIMPL;
00712 }
00713 
00714 HRESULT STDMETHODCALLTYPE CBandSiteBase::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut)
00715 {
00716     HRESULT                                 hRet = S_OK;
00717 
00718     TRACE("(%p, %p, %u, %u, %p, %p)\n", this, pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut);
00719 
00720     if (fRebarWindow == NULL)
00721         return E_FAIL;
00722 
00723     if (IsEqualIID(*pguidCmdGroup, IID_IDeskBand))
00724     {
00725         switch (nCmdID)
00726         {
00727             case DBID_BANDINFOCHANGED:
00728                 if (pvaIn == NULL)
00729                     hRet = UpdateAllBands();
00730                 else
00731                 {
00732                     /* Update a single band */
00733                     if (pvaIn->n1.n2.vt == VT_I4)
00734                         hRet = UpdateBand(pvaIn->n1.n2.n3.lVal);
00735                     else
00736                         hRet = E_FAIL;
00737                 }
00738                 break;
00739 
00740             case DBID_SHOWONLY:
00741             case DBID_MAXIMIZEBAND:
00742             case DBID_PUSHCHEVRON:
00743                 FIXME("IOleCommandTarget::Exec(): Unsupported command ID %d\n", nCmdID);
00744                 return E_NOTIMPL;
00745             default:
00746                 return E_FAIL;
00747         }
00748         return S_OK;
00749     }
00750     else
00751         WARN("IOleCommandTarget::Exec(): Unsupported command group GUID\n");
00752 
00753     return E_NOTIMPL;
00754 }
00755 
00756 HRESULT STDMETHODCALLTYPE CBandSiteBase::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
00757 {
00758     return E_NOTIMPL;
00759 }
00760 
00761 HRESULT STDMETHODCALLTYPE CBandSiteBase::HasFocusIO()
00762 {
00763     return E_NOTIMPL;
00764 }
00765 
00766 HRESULT STDMETHODCALLTYPE CBandSiteBase::TranslateAcceleratorIO(LPMSG lpMsg)
00767 {
00768     return E_NOTIMPL;
00769 }
00770 
00771 HRESULT STDMETHODCALLTYPE CBandSiteBase::OnFocusChangeIS(struct IUnknown *paramC, int param10)
00772 {
00773     return E_NOTIMPL;
00774 }
00775 
00776 HRESULT STDMETHODCALLTYPE CBandSiteBase::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
00777 {
00778     return E_NOTIMPL;
00779 }
00780 
00781 HRESULT STDMETHODCALLTYPE CBandSiteBase::GetClassID(CLSID *pClassID)
00782 {
00783     return E_NOTIMPL;
00784 }
00785 
00786 HRESULT STDMETHODCALLTYPE CBandSiteBase::IsDirty()
00787 {
00788     return E_NOTIMPL;
00789 }
00790 
00791 HRESULT STDMETHODCALLTYPE CBandSiteBase::Load(IStream *pStm)
00792 {
00793     return E_NOTIMPL;
00794 }
00795 
00796 HRESULT STDMETHODCALLTYPE CBandSiteBase::Save(IStream *pStm, BOOL fClearDirty)
00797 {
00798     return E_NOTIMPL;
00799 }
00800 
00801 HRESULT STDMETHODCALLTYPE CBandSiteBase::GetSizeMax(ULARGE_INTEGER *pcbSize)
00802 {
00803     return E_NOTIMPL;
00804 }
00805 
00806 HRESULT STDMETHODCALLTYPE CBandSiteBase::DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
00807 {
00808     return E_NOTIMPL;
00809 }
00810 
00811 HRESULT STDMETHODCALLTYPE CBandSiteBase::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
00812 {
00813     return E_NOTIMPL;
00814 }
00815 
00816 HRESULT STDMETHODCALLTYPE CBandSiteBase::DragLeave()
00817 {
00818     return E_NOTIMPL;
00819 }
00820 
00821 HRESULT STDMETHODCALLTYPE CBandSiteBase::Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
00822 {
00823     return E_NOTIMPL;
00824 }
00825 
00826 HRESULT STDMETHODCALLTYPE CBandSiteBase::LoadFromStreamBS(IStream *, const GUID &, void **)
00827 {
00828     return E_NOTIMPL;
00829 }
00830 
00831 HRESULT STDMETHODCALLTYPE CBandSiteBase::SaveToStreamBS(IUnknown *, IStream *)
00832 {
00833     return E_NOTIMPL;
00834 }

Generated on Sat May 26 2012 04:21:25 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.