Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenbandsite.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
1.7.6.1
|