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
;
53 virtual ~CTaskBand() { }
55 /*****************************************************************************/
57 virtual HRESULT STDMETHODCALLTYPE
GetWindow(OUT HWND
*phwnd
)
67 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(
70 /* FIXME: Implement */
74 virtual HRESULT STDMETHODCALLTYPE
ShowDW(
77 /* We don't do anything... */
81 virtual HRESULT STDMETHODCALLTYPE
CloseDW(
84 /* We don't do anything... */
88 virtual HRESULT STDMETHODCALLTYPE
ResizeBorderDW(
90 IUnknown
*punkToolbarSite
,
93 /* No need to implement this method */
97 virtual HRESULT STDMETHODCALLTYPE
GetBandInfo(
100 IN OUT DESKBANDINFO
*pdbi
)
102 TRACE("CTaskBand::GetBandInfo(0x%x,0x%x,0x%p) hWnd=0x%p\n", dwBandID
, dwViewMode
, pdbi
, m_hWnd
);
106 /* The task band never has a title */
107 pdbi
->dwMask
&= ~DBIM_TITLE
;
109 /* NOTE: We don't return DBIMF_UNDELETEABLE here, the band site will
110 handle us differently and add this flag for us. The reason for
111 this is future changes that might allow it to be deletable.
112 We want the band site to be in charge of this decision rather
114 /* FIXME: What about DBIMF_NOGRIPPER and DBIMF_ALWAYSGRIPPER */
115 pdbi
->dwModeFlags
= DBIMF_VARIABLEHEIGHT
;
117 if (dwViewMode
& DBIF_VIEWMODE_VERTICAL
)
119 pdbi
->ptIntegral
.y
= 1;
120 pdbi
->ptMinSize
.y
= 1;
121 /* FIXME: Get the button metrics from the task bar object!!! */
122 pdbi
->ptMinSize
.x
= (3 * GetSystemMetrics(SM_CXEDGE
) / 2) + /* FIXME: Might be wrong if only one column! */
123 GetSystemMetrics(SM_CXSIZE
) + (2 * GetSystemMetrics(SM_CXEDGE
)); /* FIXME: Min button size, query!!! */
127 pdbi
->ptMinSize
.y
= GetSystemMetrics(SM_CYSIZE
) + (2 * GetSystemMetrics(SM_CYEDGE
)); /* FIXME: Query */
128 pdbi
->ptIntegral
.y
= pdbi
->ptMinSize
.y
+ (3 * GetSystemMetrics(SM_CYEDGE
) / 2); /* FIXME: Query metrics */
129 /* We're not going to allow task bands where not even the minimum button size fits into the band */
130 pdbi
->ptMinSize
.x
= pdbi
->ptIntegral
.y
;
133 /* Ignored: pdbi->ptMaxSize.x */
134 pdbi
->ptMaxSize
.y
= -1;
136 /* FIXME: We should query the height from the task bar object!!! */
137 pdbi
->ptActual
.y
= GetSystemMetrics(SM_CYSIZE
) + (2 * GetSystemMetrics(SM_CYEDGE
));
139 /* Save the band ID for future use in case we need to check whether a given band
143 TRACE("H: %d, Min: %d,%d, Integral.y: %d Actual: %d,%d\n", (dwViewMode
& DBIF_VIEWMODE_VERTICAL
) == 0,
144 pdbi
->ptMinSize
.x
, pdbi
->ptMinSize
.y
, pdbi
->ptIntegral
.y
,
145 pdbi
->ptActual
.x
, pdbi
->ptActual
.y
);
153 /*****************************************************************************/
154 // *** IOleCommandTarget methods ***
155 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
161 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
163 if (IsEqualIID(*pguidCmdGroup
, IID_IBandSite
))
168 if (IsEqualIID(*pguidCmdGroup
, IID_IDeskBand
))
177 /*****************************************************************************/
179 virtual HRESULT STDMETHODCALLTYPE
SetClient(
180 IN IUnknown
*punkClient
)
182 TRACE("IDeskBar::SetClient(0x%p)\n", punkClient
);
186 virtual HRESULT STDMETHODCALLTYPE
GetClient(
187 OUT IUnknown
**ppunkClient
)
189 TRACE("IDeskBar::GetClient(0x%p)\n", ppunkClient
);
193 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChangeDB(
196 TRACE("IDeskBar::OnPosRectChangeDB(0x%p=(%d,%d,%d,%d))\n", prc
, prc
->left
, prc
->top
, prc
->right
, prc
->bottom
);
197 if (prc
->bottom
- prc
->top
== 0)
203 /*****************************************************************************/
205 virtual HRESULT STDMETHODCALLTYPE
GetClassID(
208 TRACE("CTaskBand::GetClassID(0x%p)\n", pClassID
);
209 /* We're going to return the (internal!) CLSID of the task band interface */
210 *pClassID
= CLSID_ITaskBand
;
214 virtual HRESULT STDMETHODCALLTYPE
IsDirty()
216 /* The object hasn't changed since the last save! */
220 virtual HRESULT STDMETHODCALLTYPE
Load(
223 TRACE("CTaskBand::Load called\n");
228 virtual HRESULT STDMETHODCALLTYPE
Save(
236 virtual HRESULT STDMETHODCALLTYPE
GetSizeMax(
237 OUT ULARGE_INTEGER
*pcbSize
)
239 TRACE("CTaskBand::GetSizeMax called\n");
240 /* We don't need any space for the task band */
241 pcbSize
->QuadPart
= 0;
245 /*****************************************************************************/
247 virtual HRESULT STDMETHODCALLTYPE
SetSite(IUnknown
*pUnkSite
)
252 TRACE("CTaskBand::SetSite(0x%p)\n", pUnkSite
);
254 hRet
= IUnknown_GetWindow(pUnkSite
, &hwndSite
);
257 TRACE("Querying site window failed: 0x%x\n", hRet
);
261 TRACE("CreateTaskSwitchWnd(Parent: 0x%p)\n", hwndSite
);
263 HWND hwndTaskSwitch
= CreateTaskSwitchWnd(hwndSite
, m_Tray
);
266 ERR("CreateTaskSwitchWnd failed");
271 m_hWnd
= hwndTaskSwitch
;
276 virtual HRESULT STDMETHODCALLTYPE
GetSite(
280 TRACE("CTaskBand::GetSite(0x%p,0x%p)\n", riid
, ppvSite
);
284 return m_Site
->QueryInterface(riid
, ppvSite
);
291 /*****************************************************************************/
293 virtual HRESULT STDMETHODCALLTYPE
ProcessMessage(
298 OUT LRESULT
*plrResult
)
300 TRACE("CTaskBand: IWinEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p)\n", hWnd
, uMsg
, wParam
, lParam
, plrResult
);
304 virtual HRESULT STDMETHODCALLTYPE
ContainsWindow(
307 if (hWnd
== m_hWnd
||
308 IsChild(m_hWnd
, hWnd
))
310 TRACE("CTaskBand::ContainsWindow(0x%p) returns S_OK\n", hWnd
);
317 virtual HRESULT STDMETHODCALLTYPE
OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
323 virtual HRESULT STDMETHODCALLTYPE
IsWindowOwner(HWND hWnd
)
325 return (hWnd
== m_hWnd
) ? S_OK
: S_FALSE
;
328 /*****************************************************************************/
330 HRESULT STDMETHODCALLTYPE
Initialize(IN OUT ITrayWindow
*tray
)
333 m_BandID
= (DWORD
) -1;
337 DECLARE_NOT_AGGREGATABLE(CTaskBand
)
339 DECLARE_PROTECT_FINAL_CONSTRUCT()
340 BEGIN_COM_MAP(CTaskBand
)
341 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDeskBand
)
342 COM_INTERFACE_ENTRY_IID(IID_IDeskBand
, IDeskBand
)
343 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
344 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
345 COM_INTERFACE_ENTRY_IID(IID_IPersistStream
, IPersistStream
)
346 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler
, IWinEventHandler
)
347 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
351 HRESULT
CTaskBand_CreateInstance(IN ITrayWindow
*Tray
, REFIID riid
, void **ppv
)
353 return ShellObjectCreatorInit
<CTaskBand
>(Tray
, riid
, ppv
);