4 * Copyright 2007 Hervé Poussineau
5 * Copyright 2009 Andrew Hill
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "shellbars.h"
25 #define ASSERT(cond) \
27 ERR ("ASSERTION %s AT %s:%d FAILED!\n", #cond, __FILE__, __LINE__)
30 CBandSiteBase::CBandSiteBase()
38 UINT
CBandSiteBase::GetBandID(struct BandObject
*Band
)
40 return (UINT
)(Band
- fBands
);
43 struct CBandSiteBase::BandObject
*CBandSiteBase::GetBandByID(DWORD dwBandID
)
45 if ((LONG
)dwBandID
>= fBandsAllocated
)
48 if (fBands
[dwBandID
].DeskBand
== NULL
)
51 return &fBands
[dwBandID
];
54 void CBandSiteBase::FreeBand(struct BandObject
*Band
)
56 ATLASSERT(Band
->DeskBand
!= NULL
);
57 ATLASSERT(Band
->OleWindow
!= NULL
);
58 ATLASSERT(Band
->WndEvtHandler
!= NULL
);
59 Band
->DeskBand
->Release();
60 Band
->OleWindow
->Release();
61 Band
->WndEvtHandler
->Release();
62 memset(Band
, 0, sizeof(*Band
));
66 DWORD
CBandSiteBase::GetBandSiteViewMode()
70 /* FIXME: What about DBIF_VIEWMODE_FLOATING and DBIF_VIEWMODE_TRANSPARENT? */
71 dwStyle
= GetWindowLongPtr(fRebarWindow
, GWL_STYLE
);
73 if (dwStyle
& CCS_VERT
)
74 return DBIF_VIEWMODE_VERTICAL
;
76 return DBIF_VIEWMODE_NORMAL
;
79 VOID
CBandSiteBase::BuildRebarBandInfo(struct BandObject
*Band
, REBARBANDINFOW
*prbi
)
81 ZeroMemory(prbi
, sizeof(*prbi
));
82 prbi
->cbSize
= sizeof(*prbi
);
84 prbi
->fMask
= RBBIM_ID
;
85 prbi
->wID
= GetBandID(Band
);
87 if (Band
->dbi
.dwMask
& DBIM_MINSIZE
)
89 prbi
->fMask
|= RBBIM_CHILDSIZE
;
90 prbi
->cxMinChild
= Band
->dbi
.ptMinSize
.x
;
91 prbi
->cyMinChild
= Band
->dbi
.ptMinSize
.y
;
94 if (Band
->dbi
.dwMask
& DBIM_MAXSIZE
)
96 prbi
->fMask
|= RBBIM_CHILDSIZE
;
97 prbi
->cyMaxChild
= Band
->dbi
.ptMaxSize
.y
;
100 if ((Band
->dbi
.dwMask
& (DBIM_INTEGRAL
| DBIM_MODEFLAGS
)) == (DBIM_INTEGRAL
| DBIM_MODEFLAGS
) &&
101 (Band
->dbi
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
))
103 prbi
->fMask
|= RBBIM_CHILDSIZE
;
104 prbi
->cyIntegral
= Band
->dbi
.ptIntegral
.y
;
107 if (Band
->dbi
.dwMask
& DBIM_ACTUAL
)
109 prbi
->fMask
|= RBBIM_IDEALSIZE
| RBBIM_SIZE
| RBBIM_CHILDSIZE
;
110 prbi
->cxIdeal
= Band
->dbi
.ptActual
.x
;
111 prbi
->cx
= Band
->dbi
.ptActual
.x
;
112 prbi
->cyChild
= Band
->dbi
.ptActual
.y
;
115 if (Band
->dbi
.dwMask
& DBIM_TITLE
)
117 prbi
->fMask
|= RBBIM_TEXT
;
118 prbi
->lpText
= Band
->dbi
.wszTitle
;
119 prbi
->cch
= wcslen(Band
->dbi
.wszTitle
);
122 if (Band
->dbi
.dwMask
& DBIM_MODEFLAGS
)
124 prbi
->fMask
|= RBBIM_STYLE
;
126 if (Band
->dbi
.dwModeFlags
& DBIMF_FIXED
)
127 prbi
->fStyle
|= RBBS_FIXEDSIZE
| RBBS_NOGRIPPER
;
128 if (Band
->dbi
.dwModeFlags
& DBIMF_FIXEDBMP
)
129 prbi
->fStyle
|= RBBS_FIXEDBMP
;
130 if (Band
->dbi
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
131 prbi
->fStyle
|= RBBS_VARIABLEHEIGHT
;
132 if (Band
->dbi
.dwModeFlags
& DBIMF_DEBOSSED
)
133 prbi
->fStyle
|= RBBS_CHILDEDGE
;
134 if (Band
->dbi
.dwModeFlags
& DBIMF_USECHEVRON
)
135 prbi
->fStyle
|= RBBS_USECHEVRON
;
136 if (Band
->dbi
.dwModeFlags
& DBIMF_BREAK
)
137 prbi
->fStyle
|= RBBS_BREAK
;
138 if (Band
->dbi
.dwModeFlags
& DBIMF_TOPALIGN
)
139 prbi
->fStyle
|= RBBS_TOPALIGN
;
140 if (Band
->dbi
.dwModeFlags
& DBIMF_NOGRIPPER
)
141 prbi
->fStyle
|= RBBS_NOGRIPPER
;
142 if (Band
->dbi
.dwModeFlags
& DBIMF_ALWAYSGRIPPER
)
143 prbi
->fStyle
|= RBBS_GRIPPERALWAYS
;
146 if (Band
->bHiddenTitle
)
148 prbi
->fMask
|= RBBIM_STYLE
;
149 prbi
->fStyle
|= RBBS_HIDETITLE
;
152 if ((Band
->dbi
.dwMask
& (DBIM_BKCOLOR
| DBIM_MODEFLAGS
)) == (DBIM_BKCOLOR
| DBIM_MODEFLAGS
) &&
153 (Band
->dbi
.dwModeFlags
& DBIMF_BKCOLOR
))
155 prbi
->fMask
|= RBBIM_COLORS
;
156 prbi
->clrFore
= (COLORREF
)(COLOR_WINDOWTEXT
+ 1);
157 prbi
->clrBack
= Band
->dbi
.crBkgnd
;
161 HRESULT
CBandSiteBase::UpdateSingleBand(struct BandObject
*Band
)
168 ZeroMemory(&Band
->dbi
, sizeof(Band
->dbi
));
169 Band
->dbi
.dwMask
= DBIM_MINSIZE
| DBIM_MAXSIZE
| DBIM_INTEGRAL
|
170 DBIM_ACTUAL
| DBIM_TITLE
| DBIM_MODEFLAGS
| DBIM_BKCOLOR
;
172 dwViewMode
= GetBandSiteViewMode();
174 hRet
= Band
->DeskBand
->GetBandInfo((DWORD
)GetBandID(Band
), dwViewMode
, &Band
->dbi
);
177 BuildRebarBandInfo(Band
, &rbi
);
178 if (SUCCEEDED(Band
->OleWindow
->GetWindow(&rbi
.hwndChild
)) &&
179 rbi
.hwndChild
!= NULL
)
181 rbi
.fMask
|= RBBIM_CHILD
;
182 WARN ("ReBar band uses child window 0x%p\n", rbi
.hwndChild
);
185 uBand
= (UINT
)SendMessageW(fRebarWindow
, RB_IDTOINDEX
, (WPARAM
)rbi
.wID
, 0);
186 if (uBand
!= (UINT
)-1)
188 if (!SendMessageW(fRebarWindow
, RB_SETBANDINFOW
, (WPARAM
)uBand
, reinterpret_cast<LPARAM
>(&rbi
)))
190 WARN("Failed to update the rebar band!\n");
194 WARN("Failed to map rebar band id to index!\n");
201 HRESULT
CBandSiteBase::UpdateAllBands()
206 for (i
= 0; i
< fBandsAllocated
; i
++)
208 if (fBands
[i
].DeskBand
!= NULL
)
210 hRet
= UpdateSingleBand(&fBands
[i
]);
211 if (FAILED_UNEXPECTEDLY(hRet
))
219 HRESULT
CBandSiteBase::UpdateBand(DWORD dwBandID
)
221 struct BandObject
*Band
;
223 Band
= GetBandByID(dwBandID
);
227 return UpdateSingleBand(Band
);
230 HRESULT
CBandSiteBase::_IsBandDeletable(DWORD dwBandID
)
232 CComPtr
<IBandSite
> pbs
;
234 /* Use QueryInterface so that we get the outer object in case we have one */
235 HRESULT hr
= this->QueryInterface(IID_PPV_ARG(IBandSite
, &pbs
));
236 if (FAILED_UNEXPECTEDLY(hr
))
240 hr
= pbs
->QueryBand(dwBandID
, NULL
, &dwState
, NULL
, NULL
);
241 if (FAILED_UNEXPECTEDLY(hr
))
244 return ((dwState
& BSSF_UNDELETEABLE
) != 0) ? S_FALSE
: S_OK
;
247 HRESULT
CBandSiteBase::OnContextMenu(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*plrResult
)
249 /* Find the index fo the band that was clicked */
250 int x
= GET_X_LPARAM(lParam
);
251 int y
= GET_Y_LPARAM(lParam
);
253 RBHITTESTINFO htInfo
= {{x
, y
}};
254 ScreenToClient(fRebarWindow
, &htInfo
.pt
);
255 int iBand
= SendMessageW(fRebarWindow
, RB_HITTEST
, 0, (LPARAM
)&htInfo
);
258 /* FIXME: what to do here? */
262 /* Now get the id of the band that was clicked */
263 REBARBANDINFOW bandInfo
= {sizeof(bandInfo
), RBBIM_ID
};
264 SendMessageW(fRebarWindow
, RB_GETBANDINFOW
, htInfo
.iBand
, (LPARAM
)&bandInfo
);
266 /* Finally get the band */
267 DWORD dwBandID
= bandInfo
.wID
;
268 struct BandObject
*Band
= GetBandByID(dwBandID
);
272 HMENU hMenu
= CreatePopupMenu();
274 return E_OUTOFMEMORY
;
276 /* Try to load the menu of the band */
278 CComPtr
<IContextMenu
> pcm
;
279 HRESULT hr
= Band
->DeskBand
->QueryInterface(IID_PPV_ARG(IContextMenu
, &pcm
));
282 hr
= pcm
->QueryContextMenu(hMenu
, 0, 0, UINT_MAX
, CMF_NORMAL
);
285 idBandLast
= HRESULT_CODE(hr
);
289 /* Load the static part of the menu */
290 HMENU hMenuStatic
= LoadMenuW(GetModuleHandleW(L
"browseui.dll"), MAKEINTRESOURCEW(IDM_BAND_MENU
));
294 Shell_MergeMenus(hMenu
, hMenuStatic
, UINT_MAX
, 0, UINT_MAX
, MM_DONTREMOVESEPS
| MM_SUBMENUSHAVEIDS
);
296 ::DestroyMenu(hMenuStatic
);
298 hr
= _IsBandDeletable(dwBandID
);
299 if (FAILED_UNEXPECTEDLY(hr
))
302 /* Remove the close item if it is not deletable */
303 if (hr
== S_FALSE
|| (Band
->dbi
.dwModeFlags
& DBIMF_UNDELETEABLE
) != 0)
304 DeleteMenu(hMenu
, IDM_BAND_CLOSE
, MF_BYCOMMAND
);
306 if ((Band
->dbi
.dwMask
& DBIM_TITLE
) == 0)
307 DeleteMenu(hMenu
, IDM_BAND_TITLE
, MF_BYCOMMAND
);
309 CheckMenuItem(hMenu
, IDM_BAND_TITLE
, Band
->bHiddenTitle
? MF_UNCHECKED
: MF_CHECKED
);
312 /* TODO: Query the menu of our site */
314 UINT uCommand
= ::TrackPopupMenuEx(hMenu
, TPM_RETURNCMD
, x
, y
, fRebarWindow
, NULL
);
315 if (uCommand
< idBandLast
)
317 CMINVOKECOMMANDINFO cmi
= { sizeof(cmi
), 0, fRebarWindow
, MAKEINTRESOURCEA(uCommand
)};
318 hr
= pcm
->InvokeCommand(&cmi
);
319 if (FAILED_UNEXPECTEDLY(hr
))
324 if (uCommand
== IDM_BAND_TITLE
)
326 Band
->bHiddenTitle
= !Band
->bHiddenTitle
;
328 hr
= UpdateBand(dwBandID
);
329 if (FAILED_UNEXPECTEDLY(hr
))
332 else if(uCommand
== IDM_BAND_CLOSE
)
334 hr
= RemoveBand(dwBandID
);
335 if (FAILED_UNEXPECTEDLY(hr
))
343 struct CBandSiteBase::BandObject
*CBandSiteBase::GetBandFromHwnd(HWND hwnd
)
349 for (i
= 0; i
< fBandsAllocated
; i
++)
351 if (fBands
[i
].DeskBand
!= NULL
)
353 ASSERT(fBands
[i
].OleWindow
);
356 hRet
= fBands
[i
].OleWindow
->GetWindow(&hWndBand
);
357 if (SUCCEEDED(hRet
) && hWndBand
== hwnd
)
365 CBandSiteBase::~CBandSiteBase()
368 TRACE("destroying %p\n", this);
370 if (fRebarWindow
!= NULL
)
372 DestroyWindow(fRebarWindow
);
378 for (INT i
= 0; i
< fBandsAllocated
; i
++)
380 if (fBands
[i
].DeskBand
!= NULL
)
381 FreeBand(&fBands
[i
]);
383 CoTaskMemFree(fBands
);
388 HRESULT STDMETHODCALLTYPE
CBandSiteBase::AddBand(IUnknown
*punk
)
391 struct BandObject
*NewBand
= NULL
;
392 CComPtr
<IDeskBand
> DeskBand
;
393 CComPtr
<IObjectWithSite
> ObjWithSite
;
394 CComPtr
<IOleWindow
> OleWindow
;
395 CComPtr
<IWinEventHandler
> WndEvtHandler
;
400 TRACE("(%p, %p)\n", this, punk
);
402 if (punk
== NULL
|| fRebarWindow
== NULL
)
405 hRet
= punk
->QueryInterface(IID_PPV_ARG(IDeskBand
, &DeskBand
));
406 if (!SUCCEEDED(hRet
) || DeskBand
== NULL
)
408 hRet
= punk
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &ObjWithSite
));
409 if (!SUCCEEDED(hRet
) || ObjWithSite
== NULL
)
411 hRet
= punk
->QueryInterface(IID_PPV_ARG(IOleWindow
, &OleWindow
));
412 if (!SUCCEEDED(hRet
) || OleWindow
== NULL
)
414 hRet
= punk
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &WndEvtHandler
));
415 if (!SUCCEEDED(hRet
) || WndEvtHandler
== NULL
)
419 if (fBandsAllocated
> fBandsCount
)
421 /* Search for a free band object */
422 for (INT i
= 0; i
< fBandsAllocated
; i
++)
424 if (fBands
[i
].DeskBand
== NULL
)
426 NewBand
= &fBands
[i
];
431 else if (fBandsAllocated
> 0)
433 ASSERT (fBands
!= NULL
);
435 /* Reallocate the band object array */
436 NewAllocated
= fBandsAllocated
+ 8;
437 if (NewAllocated
> 0xFFFF)
438 NewAllocated
= 0xFFFF;
439 if (NewAllocated
== fBandsAllocated
)
441 hRet
= E_OUTOFMEMORY
;
446 NewBand
= static_cast<struct BandObject
*>(CoTaskMemAlloc(NewAllocated
* sizeof(struct BandObject
)));
449 hRet
= E_OUTOFMEMORY
;
453 /* Copy the old array */
454 memcpy(NewBand
, fBands
, fBandsAllocated
* sizeof(struct BandObject
));
456 /* Initialize the added bands */
457 memset(&NewBand
[fBandsAllocated
], 0, (NewAllocated
- fBandsAllocated
) * sizeof(struct BandObject
));
459 fBandsAllocated
= NewAllocated
;
460 CoTaskMemFree(fBands
);
465 ASSERT(fBands
== NULL
);
466 ASSERT(fBandsAllocated
== 0);
467 ASSERT(fBandsCount
== 0);
469 /* Allocate new array */
470 fBands
= static_cast<struct BandObject
*>(CoTaskMemAlloc(8 * sizeof(struct BandObject
)));
473 hRet
= E_OUTOFMEMORY
;
477 /* Initialize the added bands */
478 memset(fBands
, 0, 8 * sizeof(struct BandObject
));
480 fBandsAllocated
+= 8;
481 NewBand
= &fBands
[0];
486 ASSERT(NewBand
!= NULL
);
489 NewBand
->DeskBand
= DeskBand
.Detach();
490 NewBand
->OleWindow
= OleWindow
.Detach();
491 NewBand
->WndEvtHandler
= WndEvtHandler
.Detach();
493 /* Create the ReBar band */
494 hRet
= ObjWithSite
->SetSite(static_cast<IOleWindow
*>(this));
498 if (SUCCEEDED(UpdateSingleBand(NewBand
)))
500 if (NewBand
->dbi
.dwMask
& DBIM_MODEFLAGS
)
502 if (NewBand
->dbi
.dwModeFlags
& DBIMF_ADDTOFRONT
)
507 BuildRebarBandInfo(NewBand
, &rbi
);
509 if (SUCCEEDED(NewBand
->OleWindow
->GetWindow(&rbi
.hwndChild
)) &&
510 rbi
.hwndChild
!= NULL
)
512 rbi
.fMask
|= RBBIM_CHILD
;
513 WARN ("ReBar band uses child window 0x%p\n", rbi
.hwndChild
);
516 if (!SendMessageW(fRebarWindow
, RB_INSERTBANDW
, (WPARAM
)uBand
, reinterpret_cast<LPARAM
>(&rbi
)))
519 hRet
= (HRESULT
)((USHORT
)GetBandID(NewBand
));
523 WARN("IBandSite::AddBand(): Call to IDeskBand::SetSite() failed: %x\n", hRet
);
525 /* Remove the band from the ReBar control */
526 BuildRebarBandInfo(NewBand
, &rbi
);
527 uBand
= (UINT
)SendMessageW(fRebarWindow
, RB_IDTOINDEX
, (WPARAM
)rbi
.wID
, 0);
528 if (uBand
!= (UINT
)-1)
530 if (!SendMessageW(fRebarWindow
, RB_DELETEBAND
, (WPARAM
)uBand
, 0))
532 ERR("Failed to delete band!\n");
536 ERR("Failed to map band id to index!\n");
548 HRESULT STDMETHODCALLTYPE
CBandSiteBase::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
552 TRACE("(%p, %u, %p)\n", this, uBand
, pdwBandID
);
554 if (uBand
== 0xffffffff)
555 return (UINT
)fBandsCount
;
557 if (uBand
>= (UINT
)fBandsCount
)
560 for (i
= 0; i
< (DWORD
)fBandsAllocated
; i
++)
562 if (fBands
[i
].DeskBand
!= NULL
)
577 HRESULT STDMETHODCALLTYPE
CBandSiteBase::QueryBand(DWORD dwBandID
, IDeskBand
**ppstb
,
578 DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
580 struct BandObject
*Band
;
582 TRACE("(%p, %u, %p, %p, %p, %d)\n", this, dwBandID
, ppstb
, pdwState
, pszName
, cchName
);
584 Band
= GetBandByID(dwBandID
);
590 Band
->DeskBand
->AddRef();
591 *ppstb
= Band
->DeskBand
;
594 if (pdwState
!= NULL
)
596 FIXME("IBandSite::QueryBand() requests band state!\n");
600 if (pszName
!= NULL
&& cchName
> 0)
602 FIXME("IBandSite::QueryBand() requests band name!\n");
608 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
610 struct BandObject
*Band
;
612 TRACE("(%p, %u, %x, %x)\n", this, dwBandID
, dwMask
, dwState
);
614 Band
= GetBandByID(dwBandID
);
622 HRESULT STDMETHODCALLTYPE
CBandSiteBase::RemoveBand(DWORD dwBandID
)
624 struct BandObject
*Band
;
627 TRACE("(%p, %u)\n", this, dwBandID
);
629 if (fRebarWindow
== NULL
)
632 Band
= GetBandByID(dwBandID
);
636 uBand
= (UINT
)SendMessageW(fRebarWindow
, RB_IDTOINDEX
, (WPARAM
)GetBandID(Band
), 0);
637 if (uBand
!= (UINT
)-1)
639 if (!SendMessageW(fRebarWindow
, RB_DELETEBAND
, (WPARAM
)uBand
, 0))
641 ERR("Could not delete band!\n");
645 ERR("Could not map band id to index!\n");
651 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetBandObject(DWORD dwBandID
, REFIID riid
, VOID
**ppv
)
653 struct BandObject
*Band
;
655 TRACE("(%p, %u, %s, %p)\n", this, dwBandID
, debugstr_guid(&riid
), ppv
);
657 Band
= GetBandByID(dwBandID
);
664 return Band
->DeskBand
->QueryInterface(riid
, ppv
);
667 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
669 FIXME("(%p, %p)\n", this, pbsinfo
);
673 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
675 FIXME("(%p, %p)\n", this, pbsinfo
);
679 HRESULT STDMETHODCALLTYPE
CBandSiteBase::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*plrResult
)
681 struct BandObject
*Band
;
683 TRACE("(%p, %p, %u, %p, %p, %p)\n", this, hWnd
, uMsg
, wParam
, lParam
, plrResult
);
686 if (fRebarWindow
== NULL
)
689 if (uMsg
== WM_CONTEXTMENU
)
691 HRESULT hr
= OnContextMenu(hWnd
, uMsg
, wParam
, lParam
, plrResult
);
692 if (FAILED_UNEXPECTEDLY(hr
))
698 if (hWnd
== fRebarWindow
)
700 /* FIXME: Just send the message? */
701 *plrResult
= SendMessageW(hWnd
, uMsg
, wParam
, lParam
);
705 Band
= GetBandFromHwnd(hWnd
);
708 return Band
->WndEvtHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, plrResult
);
714 HRESULT STDMETHODCALLTYPE
CBandSiteBase::IsWindowOwner(HWND hWnd
)
716 struct BandObject
*Band
;
718 TRACE("(%p, %p)\n", this, hWnd
);
720 if (fRebarWindow
== NULL
)
723 Band
= GetBandFromHwnd(hWnd
);
730 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetWindow(HWND
*phWnd
)
732 TRACE("(%p, %p)\n", this, phWnd
);
734 *phWnd
= fRebarWindow
;
735 if (fRebarWindow
!= NULL
)
741 HRESULT STDMETHODCALLTYPE
CBandSiteBase::ContextSensitiveHelp(BOOL fEnterMode
)
743 FIXME("(%p, %d)\n", this, fEnterMode
);
747 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetDeskBarSite(IUnknown
*pUnk
)
753 TRACE("(%p, %p)\n", this, pUnk
);
755 fOleWindow
.Release();
757 hRet
= pUnk
->QueryInterface(IID_PPV_ARG(IOleWindow
, &fOleWindow
));
758 if (FAILED_UNEXPECTEDLY(hRet
))
761 hRet
= fOleWindow
->GetWindow(&hWndParent
);
762 if (FAILED_UNEXPECTEDLY(hRet
))
765 style
= WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
| RBS_AUTOSIZE
|
766 RBS_BANDBORDERS
| CCS_NODIVIDER
| /*CCS_NORESIZE |*/ CCS_NOPARENTALIGN
;
768 fRebarWindow
= CreateWindowExW(WS_EX_TOOLWINDOW
,
775 _AtlBaseModule
.GetModuleInstance(),
777 if (fRebarWindow
== NULL
)
779 fOleWindow
.Release();
780 WARN("IDeskbarClient::SetDeskBarSite() failed to create ReBar control!\n");
787 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetModeDBC(DWORD dwMode
)
792 TRACE("(%p, %x)\n", this, dwMode
);
794 if (fRebarWindow
== NULL
)
797 dwStyle
= dwPrevStyle
= GetWindowLongPtr(fRebarWindow
, GWL_STYLE
);
798 if (dwMode
& DBIF_VIEWMODE_VERTICAL
)
801 if (dwMode
& ~DBIF_VIEWMODE_VERTICAL
)
802 FIXME("IDeskBarClient::SetModeDBC() unhandled modes: %x\n", dwStyle
& ~DBIF_VIEWMODE_VERTICAL
);
804 if (dwStyle
!= dwPrevStyle
)
806 SetWindowLongPtr(fRebarWindow
, GWL_STYLE
, dwPrevStyle
);
812 HRESULT STDMETHODCALLTYPE
CBandSiteBase::UIActivateDBC(DWORD dwState
)
814 TRACE("(%p, %x)\n", this, dwState
);
816 if (fRebarWindow
== NULL
)
819 ShowWindow(fRebarWindow
, (dwState
& DBC_SHOW
) ? SW_SHOW
: SW_HIDE
);
820 FIXME("IDeskBarClient::UIActivateDBC() Properly notify bands?\n");
824 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetSize(DWORD unknown1
, LPRECT unknown2
)
826 FIXME("(%p, %x, %p)\n", this, unknown1
, unknown2
);
830 HRESULT STDMETHODCALLTYPE
CBandSiteBase::QueryStatus(const GUID
*pguidCmdGroup
,
831 DWORD cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
833 FIXME("(%p, %p, %u, %p, %p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
837 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
838 DWORD nCmdExecOpt
, VARIANTARG
*pvaIn
, VARIANTARG
*pvaOut
)
842 TRACE("(%p, %p, %u, %u, %p, %p)\n", this, pguidCmdGroup
, nCmdID
, nCmdExecOpt
, pvaIn
, pvaOut
);
844 if (fRebarWindow
== NULL
)
847 if (IsEqualIID(*pguidCmdGroup
, IID_IDeskBand
))
851 case DBID_BANDINFOCHANGED
:
853 hRet
= UpdateAllBands();
856 /* Update a single band */
857 if (pvaIn
->n1
.n2
.vt
== VT_I4
)
858 hRet
= UpdateBand(pvaIn
->n1
.n2
.n3
.lVal
);
865 case DBID_MAXIMIZEBAND
:
866 case DBID_PUSHCHEVRON
:
867 FIXME("IOleCommandTarget::Exec(): Unsupported command ID %d\n", nCmdID
);
875 WARN("IOleCommandTarget::Exec(): Unsupported command group GUID\n");
880 HRESULT STDMETHODCALLTYPE
CBandSiteBase::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
885 HRESULT STDMETHODCALLTYPE
CBandSiteBase::HasFocusIO()
890 HRESULT STDMETHODCALLTYPE
CBandSiteBase::TranslateAcceleratorIO(LPMSG lpMsg
)
895 HRESULT STDMETHODCALLTYPE
CBandSiteBase::OnFocusChangeIS(struct IUnknown
*paramC
, int param10
)
900 HRESULT STDMETHODCALLTYPE
CBandSiteBase::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
905 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetClassID(CLSID
*pClassID
)
910 HRESULT STDMETHODCALLTYPE
CBandSiteBase::IsDirty()
915 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Load(IStream
*pStm
)
920 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Save(IStream
*pStm
, BOOL fClearDirty
)
925 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
930 HRESULT STDMETHODCALLTYPE
CBandSiteBase::DragEnter(
931 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
936 HRESULT STDMETHODCALLTYPE
CBandSiteBase::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
941 HRESULT STDMETHODCALLTYPE
CBandSiteBase::DragLeave()
946 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
951 HRESULT STDMETHODCALLTYPE
CBandSiteBase::LoadFromStreamBS(IStream
*, const GUID
&, void **)
956 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SaveToStreamBS(IUnknown
*, IStream
*)
962 HRESULT WINAPI
RSHELL_CBandSite_CreateInstance(LPUNKNOWN pUnkOuter
, REFIID riid
, void **ppv
)
964 return CBandSite::_CreatorClass::CreateInstance(pUnkOuter
, riid
, ppv
);