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__)
33 ** Fix tasks band gripper not appearing when quick launch is added
34 ** Fix hiding grippers in locked mode
35 ** The context menu should include the menu of both the site and the band
36 ** The chevron should be shown only when needed
39 CBandSiteBase::CBandSiteBase():
49 UINT
CBandSiteBase::_GetBandID(struct BandObject
*Band
)
51 return (UINT
)(Band
- m_bands
);
54 struct CBandSiteBase::BandObject
*CBandSiteBase::_GetBandByID(DWORD dwBandID
)
56 if ((LONG
)dwBandID
>= m_cBandsAllocated
)
59 if (m_bands
[dwBandID
].DeskBand
== NULL
)
62 return &m_bands
[dwBandID
];
65 void CBandSiteBase::_FreeBand(struct BandObject
*Band
)
67 ATLASSERT(Band
->DeskBand
!= NULL
);
68 ATLASSERT(Band
->OleWindow
!= NULL
);
69 ATLASSERT(Band
->WndEvtHandler
!= NULL
);
70 Band
->DeskBand
->Release();
71 Band
->OleWindow
->Release();
72 Band
->WndEvtHandler
->Release();
73 memset(Band
, 0, sizeof(*Band
));
77 DWORD
CBandSiteBase::_GetViewMode()
81 /* FIXME: What about DBIF_VIEWMODE_FLOATING and DBIF_VIEWMODE_TRANSPARENT? */
82 dwStyle
= GetWindowLongPtr(m_hwndRebar
, GWL_STYLE
);
84 if (dwStyle
& CCS_VERT
)
85 return DBIF_VIEWMODE_VERTICAL
;
87 return DBIF_VIEWMODE_NORMAL
;
90 VOID
CBandSiteBase::_BuildBandInfo(struct BandObject
*Band
, REBARBANDINFOW
*prbi
)
92 ZeroMemory(prbi
, sizeof(*prbi
));
93 prbi
->cbSize
= sizeof(*prbi
);
95 prbi
->fMask
= RBBIM_ID
;
96 prbi
->wID
= _GetBandID(Band
);
98 if (Band
->dbi
.dwMask
& DBIM_MINSIZE
)
100 prbi
->fMask
|= RBBIM_CHILDSIZE
;
101 prbi
->cxMinChild
= Band
->dbi
.ptMinSize
.x
;
102 prbi
->cyMinChild
= Band
->dbi
.ptMinSize
.y
;
105 if (Band
->dbi
.dwMask
& DBIM_MAXSIZE
)
107 prbi
->fMask
|= RBBIM_CHILDSIZE
;
108 prbi
->cyMaxChild
= Band
->dbi
.ptMaxSize
.y
;
111 if ((Band
->dbi
.dwMask
& (DBIM_INTEGRAL
| DBIM_MODEFLAGS
)) == (DBIM_INTEGRAL
| DBIM_MODEFLAGS
) &&
112 (Band
->dbi
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
))
114 prbi
->fMask
|= RBBIM_CHILDSIZE
;
115 prbi
->cyIntegral
= Band
->dbi
.ptIntegral
.y
;
118 if (Band
->dbi
.dwMask
& DBIM_ACTUAL
)
120 prbi
->fMask
|= RBBIM_IDEALSIZE
| RBBIM_SIZE
| RBBIM_CHILDSIZE
;
121 prbi
->cxIdeal
= Band
->dbi
.ptActual
.x
;
122 prbi
->cx
= Band
->dbi
.ptActual
.x
;
123 prbi
->cyChild
= Band
->dbi
.ptActual
.y
;
126 if (Band
->dbi
.dwMask
& DBIM_TITLE
)
128 prbi
->fMask
|= RBBIM_TEXT
;
129 prbi
->lpText
= Band
->dbi
.wszTitle
;
130 prbi
->cch
= wcslen(Band
->dbi
.wszTitle
);
133 if (Band
->dbi
.dwMask
& DBIM_MODEFLAGS
)
135 prbi
->fMask
|= RBBIM_STYLE
;
137 if (Band
->dbi
.dwModeFlags
& DBIMF_FIXED
)
138 prbi
->fStyle
|= RBBS_FIXEDSIZE
| RBBS_NOGRIPPER
;
139 if (Band
->dbi
.dwModeFlags
& DBIMF_FIXEDBMP
)
140 prbi
->fStyle
|= RBBS_FIXEDBMP
;
141 if (Band
->dbi
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
142 prbi
->fStyle
|= RBBS_VARIABLEHEIGHT
;
143 if (Band
->dbi
.dwModeFlags
& DBIMF_DEBOSSED
)
144 prbi
->fStyle
|= RBBS_CHILDEDGE
;
145 if (Band
->dbi
.dwModeFlags
& DBIMF_USECHEVRON
)
146 prbi
->fStyle
|= RBBS_USECHEVRON
;
147 if (Band
->dbi
.dwModeFlags
& DBIMF_BREAK
)
148 prbi
->fStyle
|= RBBS_BREAK
;
149 if (Band
->dbi
.dwModeFlags
& DBIMF_TOPALIGN
)
150 prbi
->fStyle
|= RBBS_TOPALIGN
;
151 if ((Band
->dbi
.dwModeFlags
& DBIMF_NOGRIPPER
) || (m_dwStyle
& BSIS_NOGRIPPER
))
152 prbi
->fStyle
|= RBBS_NOGRIPPER
;
153 if ((Band
->dbi
.dwModeFlags
& DBIMF_ALWAYSGRIPPER
) || (m_dwStyle
& BSIS_ALWAYSGRIPPER
))
154 prbi
->fStyle
|= RBBS_GRIPPERALWAYS
;
157 if (Band
->bHiddenTitle
|| (m_dwStyle
& BSIS_NOCAPTION
))
159 prbi
->fMask
|= RBBIM_STYLE
;
160 prbi
->fStyle
|= RBBS_HIDETITLE
;
163 if ((Band
->dbi
.dwMask
& (DBIM_BKCOLOR
| DBIM_MODEFLAGS
)) == (DBIM_BKCOLOR
| DBIM_MODEFLAGS
) &&
164 (Band
->dbi
.dwModeFlags
& DBIMF_BKCOLOR
))
166 prbi
->fMask
|= RBBIM_COLORS
;
167 prbi
->clrFore
= (COLORREF
)(COLOR_WINDOWTEXT
+ 1);
168 prbi
->clrBack
= Band
->dbi
.crBkgnd
;
172 HRESULT
CBandSiteBase::_UpdateBand(struct BandObject
*Band
)
179 ZeroMemory(&Band
->dbi
, sizeof(Band
->dbi
));
180 Band
->dbi
.dwMask
= DBIM_MINSIZE
| DBIM_MAXSIZE
| DBIM_INTEGRAL
|
181 DBIM_ACTUAL
| DBIM_TITLE
| DBIM_MODEFLAGS
| DBIM_BKCOLOR
;
183 dwViewMode
= _GetViewMode();
185 hRet
= Band
->DeskBand
->GetBandInfo((DWORD
)_GetBandID(Band
), dwViewMode
, &Band
->dbi
);
188 _BuildBandInfo(Band
, &rbi
);
189 if (SUCCEEDED(Band
->OleWindow
->GetWindow(&rbi
.hwndChild
)) &&
190 rbi
.hwndChild
!= NULL
)
192 rbi
.fMask
|= RBBIM_CHILD
;
193 WARN ("ReBar band uses child window 0x%p\n", rbi
.hwndChild
);
196 uBand
= (UINT
)SendMessageW(m_hwndRebar
, RB_IDTOINDEX
, (WPARAM
)rbi
.wID
, 0);
197 if (uBand
!= (UINT
)-1)
199 if (!SendMessageW(m_hwndRebar
, RB_SETBANDINFOW
, (WPARAM
)uBand
, reinterpret_cast<LPARAM
>(&rbi
)))
201 WARN("Failed to update the rebar band!\n");
205 WARN("Failed to map rebar band id to index!\n");
212 HRESULT
CBandSiteBase::_UpdateAllBands()
217 for (i
= 0; i
< m_cBandsAllocated
; i
++)
219 if (m_bands
[i
].DeskBand
!= NULL
)
221 hRet
= _UpdateBand(&m_bands
[i
]);
222 if (FAILED_UNEXPECTEDLY(hRet
))
230 HRESULT
CBandSiteBase::_UpdateBand(DWORD dwBandID
)
232 struct BandObject
*Band
;
234 Band
= _GetBandByID(dwBandID
);
238 return _UpdateBand(Band
);
241 HRESULT
CBandSiteBase::_IsBandDeletable(DWORD dwBandID
)
243 CComPtr
<IBandSite
> pbs
;
245 /* Use QueryInterface so that we get the outer object in case we have one */
246 HRESULT hr
= this->QueryInterface(IID_PPV_ARG(IBandSite
, &pbs
));
247 if (FAILED_UNEXPECTEDLY(hr
))
251 hr
= pbs
->QueryBand(dwBandID
, NULL
, &dwState
, NULL
, NULL
);
252 if (FAILED_UNEXPECTEDLY(hr
))
255 return ((dwState
& BSSF_UNDELETEABLE
) != 0) ? S_FALSE
: S_OK
;
258 HRESULT
CBandSiteBase::_OnContextMenu(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*plrResult
)
260 /* Find the index fo the band that was clicked */
261 int x
= GET_X_LPARAM(lParam
);
262 int y
= GET_Y_LPARAM(lParam
);
264 RBHITTESTINFO htInfo
= {{x
, y
}};
265 ScreenToClient(m_hwndRebar
, &htInfo
.pt
);
266 int iBand
= SendMessageW(m_hwndRebar
, RB_HITTEST
, 0, (LPARAM
)&htInfo
);
269 /* FIXME: what to do here? */
273 /* Now get the id of the band that was clicked */
274 REBARBANDINFOW bandInfo
= {sizeof(bandInfo
), RBBIM_ID
};
275 SendMessageW(m_hwndRebar
, RB_GETBANDINFOW
, htInfo
.iBand
, (LPARAM
)&bandInfo
);
277 /* Finally get the band */
278 DWORD dwBandID
= bandInfo
.wID
;
279 struct BandObject
*Band
= _GetBandByID(dwBandID
);
283 HMENU hMenu
= CreatePopupMenu();
285 return E_OUTOFMEMORY
;
287 /* Try to load the menu of the band */
289 CComPtr
<IContextMenu
> pcm
;
290 HRESULT hr
= Band
->DeskBand
->QueryInterface(IID_PPV_ARG(IContextMenu
, &pcm
));
293 hr
= pcm
->QueryContextMenu(hMenu
, 0, 0, UINT_MAX
, CMF_NORMAL
);
296 idBandLast
= HRESULT_CODE(hr
);
300 if (!(m_dwStyle
& BSIS_LOCKED
))
302 /* Load the static part of the menu */
303 HMENU hMenuStatic
= LoadMenuW(GetModuleHandleW(L
"browseui.dll"), MAKEINTRESOURCEW(IDM_BAND_MENU
));
307 Shell_MergeMenus(hMenu
, hMenuStatic
, UINT_MAX
, 0, UINT_MAX
, MM_DONTREMOVESEPS
| MM_SUBMENUSHAVEIDS
);
309 ::DestroyMenu(hMenuStatic
);
311 hr
= _IsBandDeletable(dwBandID
);
312 if (FAILED_UNEXPECTEDLY(hr
))
315 /* Remove the close item if it is not deletable */
316 if (hr
== S_FALSE
|| (Band
->dbi
.dwModeFlags
& DBIMF_UNDELETEABLE
) != 0)
317 DeleteMenu(hMenu
, IDM_BAND_CLOSE
, MF_BYCOMMAND
);
319 if ((Band
->dbi
.dwMask
& DBIM_TITLE
) == 0)
320 DeleteMenu(hMenu
, IDM_BAND_TITLE
, MF_BYCOMMAND
);
322 CheckMenuItem(hMenu
, IDM_BAND_TITLE
, Band
->bHiddenTitle
? MF_UNCHECKED
: MF_CHECKED
);
326 /* TODO: Query the menu of our site */
328 UINT uCommand
= ::TrackPopupMenuEx(hMenu
, TPM_RETURNCMD
, x
, y
, m_hwndRebar
, NULL
);
329 if (uCommand
< idBandLast
)
331 CMINVOKECOMMANDINFO cmi
= { sizeof(cmi
), 0, m_hwndRebar
, MAKEINTRESOURCEA(uCommand
)};
332 hr
= pcm
->InvokeCommand(&cmi
);
333 if (FAILED_UNEXPECTEDLY(hr
))
338 if (uCommand
== IDM_BAND_TITLE
)
340 Band
->bHiddenTitle
= !Band
->bHiddenTitle
;
342 hr
= _UpdateBand(dwBandID
);
343 if (FAILED_UNEXPECTEDLY(hr
))
346 else if(uCommand
== IDM_BAND_CLOSE
)
348 hr
= RemoveBand(dwBandID
);
349 if (FAILED_UNEXPECTEDLY(hr
))
357 struct CBandSiteBase::BandObject
*CBandSiteBase::_GetBandFromHwnd(HWND hwnd
)
363 for (i
= 0; i
< m_cBandsAllocated
; i
++)
365 if (m_bands
[i
].DeskBand
!= NULL
)
367 ASSERT(m_bands
[i
].OleWindow
);
370 hRet
= m_bands
[i
].OleWindow
->GetWindow(&hWndBand
);
371 if (SUCCEEDED(hRet
) && hWndBand
== hwnd
)
379 CBandSiteBase::~CBandSiteBase()
382 TRACE("destroying %p\n", this);
384 if (m_hwndRebar
!= NULL
)
386 DestroyWindow(m_hwndRebar
);
392 for (INT i
= 0; i
< m_cBandsAllocated
; i
++)
394 if (m_bands
[i
].DeskBand
!= NULL
)
395 _FreeBand(&m_bands
[i
]);
397 CoTaskMemFree(m_bands
);
402 HRESULT STDMETHODCALLTYPE
CBandSiteBase::AddBand(IUnknown
*punk
)
405 struct BandObject
*NewBand
= NULL
;
406 CComPtr
<IDeskBand
> DeskBand
;
407 CComPtr
<IObjectWithSite
> ObjWithSite
;
408 CComPtr
<IOleWindow
> OleWindow
;
409 CComPtr
<IWinEventHandler
> WndEvtHandler
;
414 TRACE("(%p, %p)\n", this, punk
);
416 if (punk
== NULL
|| m_hwndRebar
== NULL
)
419 hRet
= punk
->QueryInterface(IID_PPV_ARG(IDeskBand
, &DeskBand
));
420 if (FAILED_UNEXPECTEDLY(hRet
))
423 hRet
= punk
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &ObjWithSite
));
424 if (FAILED_UNEXPECTEDLY(hRet
))
427 hRet
= punk
->QueryInterface(IID_PPV_ARG(IOleWindow
, &OleWindow
));
428 if (FAILED_UNEXPECTEDLY(hRet
))
431 hRet
= punk
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &WndEvtHandler
));
432 if (FAILED_UNEXPECTEDLY(hRet
))
435 if (m_cBandsAllocated
> m_cBands
)
437 /* Search for a free band object */
438 for (INT i
= 0; i
< m_cBandsAllocated
; i
++)
440 if (m_bands
[i
].DeskBand
== NULL
)
442 NewBand
= &m_bands
[i
];
447 else if (m_cBandsAllocated
> 0)
449 ASSERT (m_bands
!= NULL
);
451 /* Reallocate the band object array */
452 NewAllocated
= m_cBandsAllocated
+ 8;
453 if (NewAllocated
> 0xFFFF)
454 NewAllocated
= 0xFFFF;
455 if (NewAllocated
== m_cBandsAllocated
)
457 return E_OUTOFMEMORY
;
461 NewBand
= static_cast<struct BandObject
*>(CoTaskMemAlloc(NewAllocated
* sizeof(struct BandObject
)));
464 return E_OUTOFMEMORY
;
467 /* Copy the old array */
468 memcpy(NewBand
, m_bands
, m_cBandsAllocated
* sizeof(struct BandObject
));
470 /* Initialize the added bands */
471 memset(&NewBand
[m_cBandsAllocated
], 0, (NewAllocated
- m_cBandsAllocated
) * sizeof(struct BandObject
));
473 m_cBandsAllocated
= NewAllocated
;
474 CoTaskMemFree(m_bands
);
479 ASSERT(m_bands
== NULL
);
480 ASSERT(m_cBandsAllocated
== 0);
481 ASSERT(m_cBands
== 0);
483 /* Allocate new array */
484 m_bands
= static_cast<struct BandObject
*>(CoTaskMemAlloc(8 * sizeof(struct BandObject
)));
487 return E_OUTOFMEMORY
;
490 /* Initialize the added bands */
491 memset(m_bands
, 0, 8 * sizeof(struct BandObject
));
493 m_cBandsAllocated
+= 8;
494 NewBand
= &m_bands
[0];
497 ASSERT(NewBand
!= NULL
);
500 NewBand
->DeskBand
= DeskBand
.Detach();
501 NewBand
->OleWindow
= OleWindow
.Detach();
502 NewBand
->WndEvtHandler
= WndEvtHandler
.Detach();
504 /* Create the ReBar band */
505 hRet
= ObjWithSite
->SetSite(static_cast<IOleWindow
*>(this));
509 if (SUCCEEDED(_UpdateBand(NewBand
)))
511 if (NewBand
->dbi
.dwMask
& DBIM_MODEFLAGS
)
513 if (NewBand
->dbi
.dwModeFlags
& DBIMF_ADDTOFRONT
)
518 _BuildBandInfo(NewBand
, &rbi
);
520 if (SUCCEEDED(NewBand
->OleWindow
->GetWindow(&rbi
.hwndChild
)) &&
521 rbi
.hwndChild
!= NULL
)
523 rbi
.fMask
|= RBBIM_CHILD
;
524 WARN ("ReBar band uses child window 0x%p\n", rbi
.hwndChild
);
527 if (!SendMessageW(m_hwndRebar
, RB_INSERTBANDW
, (WPARAM
)uBand
, reinterpret_cast<LPARAM
>(&rbi
)))
530 hRet
= (HRESULT
)((USHORT
)_GetBandID(NewBand
));
536 WARN("IBandSite::AddBand(): Call to IDeskBand::SetSite() failed: %x\n", hRet
);
538 /* Remove the band from the ReBar control */
539 _BuildBandInfo(NewBand
, &rbi
);
540 uBand
= (UINT
)SendMessageW(m_hwndRebar
, RB_IDTOINDEX
, (WPARAM
)rbi
.wID
, 0);
541 if (uBand
!= (UINT
)-1)
543 if (!SendMessageW(m_hwndRebar
, RB_DELETEBAND
, (WPARAM
)uBand
, 0))
545 ERR("Failed to delete band!\n");
549 ERR("Failed to map band id to index!\n");
559 HRESULT STDMETHODCALLTYPE
CBandSiteBase::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
563 TRACE("(%p, %u, %p)\n", this, uBand
, pdwBandID
);
565 if (uBand
== 0xffffffff)
566 return (UINT
)m_cBands
;
568 if (uBand
>= (UINT
)m_cBands
)
571 for (i
= 0; i
< (DWORD
)m_cBandsAllocated
; i
++)
573 if (m_bands
[i
].DeskBand
!= NULL
)
588 HRESULT STDMETHODCALLTYPE
CBandSiteBase::QueryBand(DWORD dwBandID
, IDeskBand
**ppstb
,
589 DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
591 struct BandObject
*Band
;
593 TRACE("(%p, %u, %p, %p, %p, %d)\n", this, dwBandID
, ppstb
, pdwState
, pszName
, cchName
);
595 Band
= _GetBandByID(dwBandID
);
601 Band
->DeskBand
->AddRef();
602 *ppstb
= Band
->DeskBand
;
605 if (pdwState
!= NULL
)
607 FIXME("IBandSite::QueryBand() requests band state!\n");
611 if (pszName
!= NULL
&& cchName
> 0)
613 FIXME("IBandSite::QueryBand() requests band name!\n");
619 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
621 struct BandObject
*Band
;
623 TRACE("(%p, %u, %x, %x)\n", this, dwBandID
, dwMask
, dwState
);
625 Band
= _GetBandByID(dwBandID
);
633 HRESULT STDMETHODCALLTYPE
CBandSiteBase::RemoveBand(DWORD dwBandID
)
635 struct BandObject
*Band
;
638 TRACE("(%p, %u)\n", this, dwBandID
);
640 if (m_hwndRebar
== NULL
)
643 Band
= _GetBandByID(dwBandID
);
647 uBand
= (UINT
)SendMessageW(m_hwndRebar
, RB_IDTOINDEX
, (WPARAM
)_GetBandID(Band
), 0);
648 if (uBand
!= (UINT
)-1)
650 if (!SendMessageW(m_hwndRebar
, RB_DELETEBAND
, (WPARAM
)uBand
, 0))
652 ERR("Could not delete band!\n");
656 ERR("Could not map band id to index!\n");
662 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetBandObject(DWORD dwBandID
, REFIID riid
, VOID
**ppv
)
664 struct BandObject
*Band
;
666 TRACE("(%p, %u, %s, %p)\n", this, dwBandID
, debugstr_guid(&riid
), ppv
);
668 Band
= _GetBandByID(dwBandID
);
675 return Band
->DeskBand
->QueryInterface(riid
, ppv
);
678 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
683 if ((pbsinfo
->dwMask
& BSIM_STATE
))
684 m_dwState
= pbsinfo
->dwState
;
685 if ((pbsinfo
->dwMask
& BSIM_STYLE
))
686 m_dwStyle
= pbsinfo
->dwStyle
;
692 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
697 if ((pbsinfo
->dwMask
& BSIM_STATE
))
698 pbsinfo
->dwState
= m_dwState
;
699 if ((pbsinfo
->dwMask
& BSIM_STYLE
))
700 pbsinfo
->dwStyle
= m_dwStyle
;
705 HRESULT STDMETHODCALLTYPE
CBandSiteBase::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*plrResult
)
707 struct BandObject
*Band
;
709 TRACE("(%p, %p, %u, %p, %p, %p)\n", this, hWnd
, uMsg
, wParam
, lParam
, plrResult
);
713 if (m_hwndRebar
== NULL
)
716 if (uMsg
== WM_CONTEXTMENU
)
718 HRESULT hr
= _OnContextMenu(hWnd
, uMsg
, wParam
, lParam
, plrResult
);
719 if (FAILED_UNEXPECTEDLY(hr
))
724 else if (uMsg
== WM_COMMAND
&& lParam
)
726 hWnd
= reinterpret_cast<HWND
>(lParam
);
728 else if (uMsg
== WM_NOTIFY
)
730 NMHDR
* pnmhdr
= reinterpret_cast<NMHDR
*>(lParam
);
731 if (pnmhdr
->hwndFrom
!= m_hwndRebar
)
733 hWnd
= pnmhdr
->hwndFrom
;
737 for (int i
= 0; i
< m_cBandsAllocated
; i
++)
739 if (m_bands
[i
].WndEvtHandler
&& m_bands
[i
].OleWindow
)
742 if (SUCCEEDED(m_bands
[i
].OleWindow
->GetWindow(&hwndBand
)))
744 m_bands
[i
].WndEvtHandler
->OnWinEvent(hwndBand
, uMsg
, wParam
, lParam
, plrResult
);
752 Band
= _GetBandFromHwnd(hWnd
);
755 return Band
->WndEvtHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, plrResult
);
761 HRESULT STDMETHODCALLTYPE
CBandSiteBase::IsWindowOwner(HWND hWnd
)
763 struct BandObject
*Band
;
765 TRACE("(%p, %p)\n", this, hWnd
);
767 if (m_hwndRebar
== NULL
)
770 Band
= _GetBandFromHwnd(hWnd
);
777 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetWindow(HWND
*phWnd
)
779 TRACE("(%p, %p)\n", this, phWnd
);
781 *phWnd
= m_hwndRebar
;
782 if (m_hwndRebar
!= NULL
)
788 HRESULT STDMETHODCALLTYPE
CBandSiteBase::ContextSensitiveHelp(BOOL fEnterMode
)
790 FIXME("(%p, %d)\n", this, fEnterMode
);
794 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetDeskBarSite(IUnknown
*pUnk
)
800 TRACE("(%p, %p)\n", this, pUnk
);
804 hRet
= pUnk
->QueryInterface(IID_PPV_ARG(IOleWindow
, &m_site
));
805 if (FAILED_UNEXPECTEDLY(hRet
))
808 hRet
= m_site
->GetWindow(&hWndParent
);
809 if (FAILED_UNEXPECTEDLY(hRet
))
812 style
= WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
| RBS_AUTOSIZE
|
813 RBS_BANDBORDERS
| CCS_NODIVIDER
| /*CCS_NORESIZE |*/ CCS_NOPARENTALIGN
;
815 m_hwndRebar
= CreateWindowExW(WS_EX_TOOLWINDOW
,
822 _AtlBaseModule
.GetModuleInstance(),
824 if (m_hwndRebar
== NULL
)
827 WARN("IDeskbarClient::SetDeskBarSite() failed to create ReBar control!\n");
834 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SetModeDBC(DWORD dwMode
)
839 TRACE("(%p, %x)\n", this, dwMode
);
841 if (m_hwndRebar
== NULL
)
844 dwStyle
= dwPrevStyle
= GetWindowLongPtr(m_hwndRebar
, GWL_STYLE
);
845 if (dwMode
& DBIF_VIEWMODE_VERTICAL
)
848 if (dwMode
& ~DBIF_VIEWMODE_VERTICAL
)
849 FIXME("IDeskBarClient::SetModeDBC() unhandled modes: %x\n", dwStyle
& ~DBIF_VIEWMODE_VERTICAL
);
851 if (dwStyle
!= dwPrevStyle
)
853 SetWindowLongPtr(m_hwndRebar
, GWL_STYLE
, dwPrevStyle
);
859 HRESULT STDMETHODCALLTYPE
CBandSiteBase::UIActivateDBC(DWORD dwState
)
861 TRACE("(%p, %x)\n", this, dwState
);
863 if (m_hwndRebar
== NULL
)
866 ShowWindow(m_hwndRebar
, (dwState
& DBC_SHOW
) ? SW_SHOW
: SW_HIDE
);
867 //FIXME: Properly notify bands?
871 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetSize(DWORD unknown1
, LPRECT unknown2
)
873 FIXME("(%p, %x, %p)\n", this, unknown1
, unknown2
);
877 HRESULT STDMETHODCALLTYPE
CBandSiteBase::QueryStatus(const GUID
*pguidCmdGroup
,
878 DWORD cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
880 FIXME("(%p, %p, %u, %p, %p)\n", this, pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
884 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
885 DWORD nCmdExecOpt
, VARIANTARG
*pvaIn
, VARIANTARG
*pvaOut
)
889 TRACE("(%p, %p, %u, %u, %p, %p)\n", this, pguidCmdGroup
, nCmdID
, nCmdExecOpt
, pvaIn
, pvaOut
);
891 if (m_hwndRebar
== NULL
)
894 if (IsEqualIID(*pguidCmdGroup
, IID_IDeskBand
))
898 case DBID_BANDINFOCHANGED
:
900 hRet
= _UpdateAllBands();
903 /* Update a single band */
904 if (pvaIn
->n1
.n2
.vt
== VT_I4
)
905 hRet
= _UpdateBand(pvaIn
->n1
.n2
.n3
.lVal
);
912 case DBID_MAXIMIZEBAND
:
913 case DBID_PUSHCHEVRON
:
914 FIXME("IOleCommandTarget::Exec(): Unsupported command ID %d\n", nCmdID
);
922 WARN("IOleCommandTarget::Exec(): Unsupported command group GUID\n");
927 HRESULT STDMETHODCALLTYPE
CBandSiteBase::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
932 HRESULT STDMETHODCALLTYPE
CBandSiteBase::HasFocusIO()
937 HRESULT STDMETHODCALLTYPE
CBandSiteBase::TranslateAcceleratorIO(LPMSG lpMsg
)
942 HRESULT STDMETHODCALLTYPE
CBandSiteBase::OnFocusChangeIS(struct IUnknown
*paramC
, int param10
)
947 HRESULT STDMETHODCALLTYPE
CBandSiteBase::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
952 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetClassID(CLSID
*pClassID
)
957 HRESULT STDMETHODCALLTYPE
CBandSiteBase::IsDirty()
962 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Load(IStream
*pStm
)
967 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Save(IStream
*pStm
, BOOL fClearDirty
)
972 HRESULT STDMETHODCALLTYPE
CBandSiteBase::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
977 HRESULT STDMETHODCALLTYPE
CBandSiteBase::DragEnter(
978 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
983 HRESULT STDMETHODCALLTYPE
CBandSiteBase::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
988 HRESULT STDMETHODCALLTYPE
CBandSiteBase::DragLeave()
993 HRESULT STDMETHODCALLTYPE
CBandSiteBase::Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
998 HRESULT STDMETHODCALLTYPE
CBandSiteBase::LoadFromStreamBS(IStream
*, const GUID
&, void **)
1003 HRESULT STDMETHODCALLTYPE
CBandSiteBase::SaveToStreamBS(IUnknown
*, IStream
*)
1009 HRESULT WINAPI
RSHELL_CBandSite_CreateInstance(LPUNKNOWN pUnkOuter
, REFIID riid
, void **ppv
)
1011 return CBandSite::_CreatorClass::CreateInstance(pUnkOuter
, riid
, ppv
);