4 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 /*****************************************************************************
24 ** CTaskBand ****************************************************************
25 *****************************************************************************/
27 const GUID CLSID_ITaskBand
= { 0x68284FAA, 0x6A48, 0x11D0, { 0x8C, 0x78, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xB4 } };
30 public CComCoClass
<CTaskBand
>,
31 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
32 public IObjectWithSite
,
35 public IPersistStream
,
36 public IWinEventHandler
,
37 public IOleCommandTarget
39 CComPtr
<ITrayWindow
> m_Tray
;
40 CComPtr
<IUnknown
> m_Site
;
43 HWND m_hWndStartButton
;
54 virtual ~CTaskBand() { }
56 /*****************************************************************************/
58 virtual HRESULT STDMETHODCALLTYPE
GetWindow(OUT HWND
*phwnd
)
68 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(
71 /* FIXME: Implement */
75 virtual HRESULT STDMETHODCALLTYPE
ShowDW(
78 /* We don't do anything... */
82 virtual HRESULT STDMETHODCALLTYPE
CloseDW(
85 /* We don't do anything... */
89 virtual HRESULT STDMETHODCALLTYPE
ResizeBorderDW(
91 IUnknown
*punkToolbarSite
,
94 /* No need to implement this method */
98 virtual HRESULT STDMETHODCALLTYPE
GetBandInfo(
101 IN OUT DESKBANDINFO
*pdbi
)
103 TRACE("CTaskBand::GetBandInfo(0x%x,0x%x,0x%p) hWnd=0x%p\n", dwBandID
, dwViewMode
, pdbi
, m_hWnd
);
107 /* The task band never has a title */
108 pdbi
->dwMask
&= ~DBIM_TITLE
;
110 /* NOTE: We don't return DBIMF_UNDELETEABLE here, the band site will
111 handle us differently and add this flag for us. The reason for
112 this is future changes that might allow it to be deletable.
113 We want the band site to be in charge of this decision rather
115 /* FIXME: What about DBIMF_NOGRIPPER and DBIMF_ALWAYSGRIPPER */
116 pdbi
->dwModeFlags
= DBIMF_VARIABLEHEIGHT
;
118 if (dwViewMode
& DBIF_VIEWMODE_VERTICAL
)
120 pdbi
->ptIntegral
.y
= 1;
121 pdbi
->ptMinSize
.y
= 1;
122 /* FIXME: Get the button metrics from the task bar object!!! */
123 pdbi
->ptMinSize
.x
= (3 * GetSystemMetrics(SM_CXEDGE
) / 2) + /* FIXME: Might be wrong if only one column! */
124 GetSystemMetrics(SM_CXSIZE
) + (2 * GetSystemMetrics(SM_CXEDGE
)); /* FIXME: Min button size, query!!! */
128 /* When the band is horizontal its minimum height is the height of the start button */
130 GetWindowRect(m_hWndStartButton
, &rcButton
);
131 pdbi
->ptMinSize
.y
= rcButton
.bottom
- rcButton
.top
;
132 pdbi
->ptIntegral
.y
= pdbi
->ptMinSize
.y
+ (3 * GetSystemMetrics(SM_CYEDGE
) / 2); /* FIXME: Query metrics */
133 /* We're not going to allow task bands where not even the minimum button size fits into the band */
134 pdbi
->ptMinSize
.x
= pdbi
->ptIntegral
.y
;
137 /* Ignored: pdbi->ptMaxSize.x */
138 pdbi
->ptMaxSize
.y
= -1;
140 /* FIXME: We should query the height from the task bar object!!! */
141 pdbi
->ptActual
.y
= GetSystemMetrics(SM_CYSIZE
) + (2 * GetSystemMetrics(SM_CYEDGE
));
143 /* Save the band ID for future use in case we need to check whether a given band
147 TRACE("H: %d, Min: %d,%d, Integral.y: %d Actual: %d,%d\n", (dwViewMode
& DBIF_VIEWMODE_VERTICAL
) == 0,
148 pdbi
->ptMinSize
.x
, pdbi
->ptMinSize
.y
, pdbi
->ptIntegral
.y
,
149 pdbi
->ptActual
.x
, pdbi
->ptActual
.y
);
157 /*****************************************************************************/
158 // *** IOleCommandTarget methods ***
159 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
165 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
167 if (IsEqualIID(*pguidCmdGroup
, IID_IBandSite
))
172 if (IsEqualIID(*pguidCmdGroup
, IID_IDeskBand
))
181 /*****************************************************************************/
183 virtual HRESULT STDMETHODCALLTYPE
SetClient(
184 IN IUnknown
*punkClient
)
186 TRACE("IDeskBar::SetClient(0x%p)\n", punkClient
);
190 virtual HRESULT STDMETHODCALLTYPE
GetClient(
191 OUT IUnknown
**ppunkClient
)
193 TRACE("IDeskBar::GetClient(0x%p)\n", ppunkClient
);
197 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChangeDB(
200 TRACE("IDeskBar::OnPosRectChangeDB(0x%p=(%d,%d,%d,%d))\n", prc
, prc
->left
, prc
->top
, prc
->right
, prc
->bottom
);
201 if (prc
->bottom
- prc
->top
== 0)
207 /*****************************************************************************/
209 virtual HRESULT STDMETHODCALLTYPE
GetClassID(
212 TRACE("CTaskBand::GetClassID(0x%p)\n", pClassID
);
213 /* We're going to return the (internal!) CLSID of the task band interface */
214 *pClassID
= CLSID_ITaskBand
;
218 virtual HRESULT STDMETHODCALLTYPE
IsDirty()
220 /* The object hasn't changed since the last save! */
224 virtual HRESULT STDMETHODCALLTYPE
Load(
227 TRACE("CTaskBand::Load called\n");
232 virtual HRESULT STDMETHODCALLTYPE
Save(
240 virtual HRESULT STDMETHODCALLTYPE
GetSizeMax(
241 OUT ULARGE_INTEGER
*pcbSize
)
243 TRACE("CTaskBand::GetSizeMax called\n");
244 /* We don't need any space for the task band */
245 pcbSize
->QuadPart
= 0;
249 /*****************************************************************************/
251 virtual HRESULT STDMETHODCALLTYPE
SetSite(IUnknown
*pUnkSite
)
256 TRACE("CTaskBand::SetSite(0x%p)\n", pUnkSite
);
258 hRet
= IUnknown_GetWindow(pUnkSite
, &hwndSite
);
261 TRACE("Querying site window failed: 0x%x\n", hRet
);
265 TRACE("CreateTaskSwitchWnd(Parent: 0x%p)\n", hwndSite
);
267 HWND hwndTaskSwitch
= CreateTaskSwitchWnd(hwndSite
, m_Tray
);
270 ERR("CreateTaskSwitchWnd failed");
275 m_hWnd
= hwndTaskSwitch
;
280 virtual HRESULT STDMETHODCALLTYPE
GetSite(
284 TRACE("CTaskBand::GetSite(0x%p,0x%p)\n", riid
, ppvSite
);
288 return m_Site
->QueryInterface(riid
, ppvSite
);
295 /*****************************************************************************/
297 virtual HRESULT STDMETHODCALLTYPE
ProcessMessage(
302 OUT LRESULT
*plrResult
)
304 TRACE("CTaskBand: IWinEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p)\n", hWnd
, uMsg
, wParam
, lParam
, plrResult
);
308 virtual HRESULT STDMETHODCALLTYPE
ContainsWindow(
311 if (hWnd
== m_hWnd
||
312 IsChild(m_hWnd
, hWnd
))
314 TRACE("CTaskBand::ContainsWindow(0x%p) returns S_OK\n", hWnd
);
321 virtual HRESULT STDMETHODCALLTYPE
OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
327 virtual HRESULT STDMETHODCALLTYPE
IsWindowOwner(HWND hWnd
)
329 return (hWnd
== m_hWnd
) ? S_OK
: S_FALSE
;
332 /*****************************************************************************/
334 HRESULT STDMETHODCALLTYPE
Initialize(IN OUT ITrayWindow
*tray
, HWND hWndStartButton
)
337 m_BandID
= (DWORD
) -1;
338 m_hWndStartButton
= hWndStartButton
;
342 DECLARE_NOT_AGGREGATABLE(CTaskBand
)
344 DECLARE_PROTECT_FINAL_CONSTRUCT()
345 BEGIN_COM_MAP(CTaskBand
)
346 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDeskBand
)
347 COM_INTERFACE_ENTRY_IID(IID_IDeskBand
, IDeskBand
)
348 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
349 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
350 COM_INTERFACE_ENTRY_IID(IID_IPersistStream
, IPersistStream
)
351 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler
, IWinEventHandler
)
352 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
356 HRESULT
CTaskBand_CreateInstance(IN ITrayWindow
*Tray
, HWND hWndStartButton
, REFIID riid
, void **ppv
)
358 return ShellObjectCreatorInit
<CTaskBand
>(Tray
, hWndStartButton
, riid
, ppv
);