[SHELL] Reapply r65476 (rename explorer to explorer-old).
[reactos.git] / reactos / base / shell / explorer / startmnu.cpp
1 /*
2 * ReactOS Explorer
3 *
4 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
5 *
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.
10 *
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.
15 *
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
19 */
20
21 #include "precomp.h"
22
23 HRESULT
24 UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
25 IN HBITMAP hbmBanner OPTIONAL,
26 IN BOOL bSmallIcons)
27 {
28 CComPtr<IBanneredBar> pbb;
29 HRESULT hRet;
30
31 hRet = pMenuPopup->QueryInterface(IID_PPV_ARG(IBanneredBar, &pbb));
32 if (SUCCEEDED(hRet))
33 {
34 hRet = pbb->SetBitmap(hbmBanner);
35
36 /* Update the icon size */
37 hRet = pbb->SetIconSize(bSmallIcons ? BMICON_SMALL : BMICON_LARGE);
38 }
39
40 return hRet;
41 }
42
43 IMenuPopup *
44 CreateStartMenu(IN ITrayWindow *Tray,
45 OUT IMenuBand **ppMenuBand,
46 IN HBITMAP hbmBanner OPTIONAL,
47 IN BOOL bSmallIcons)
48 {
49 HRESULT hr;
50 IObjectWithSite *pOws = NULL;
51 IMenuPopup *pMp = NULL;
52 IUnknown *pSms = NULL;
53 IMenuBand *pMb = NULL;
54 IInitializeObject *pIo;
55 IUnknown *pUnk = NULL;
56 IBandSite *pBs = NULL;
57 DWORD dwBandId = 0;
58
59 hr = CreateStartMenuSite(Tray, IID_PPV_ARG(IUnknown, &pSms));
60 if (FAILED_UNEXPECTEDLY(hr))
61 return NULL;
62
63 #if 0
64 hr = CoCreateInstance(&CLSID_StartMenu,
65 NULL,
66 CLSCTX_INPROC_SERVER,
67 &IID_IMenuPopup,
68 (PVOID *)&pMp);
69 #else
70 hr = _CStartMenu_Constructor(IID_PPV_ARG(IMenuPopup, &pMp));
71 #endif
72 if (FAILED_UNEXPECTEDLY(hr))
73 {
74 TRACE("CoCreateInstance failed: %x\n", hr);
75 goto cleanup;
76 }
77
78 hr = pMp->QueryInterface(IID_PPV_ARG(IObjectWithSite, &pOws));
79 if (FAILED_UNEXPECTEDLY(hr))
80 {
81 TRACE("IMenuPopup_QueryInterface failed: %x\n", hr);
82 goto cleanup;
83 }
84
85 /* Set the menu site so we can handle messages */
86 hr = pOws->SetSite(pSms);
87 if (FAILED_UNEXPECTEDLY(hr))
88 {
89 TRACE("IObjectWithSite_SetSite failed: %x\n", hr);
90 goto cleanup;
91 }
92
93 /* Initialize the menu object */
94 hr = pMp->QueryInterface(IID_PPV_ARG(IInitializeObject, &pIo));
95 if (SUCCEEDED(hr))
96 {
97 hr = pIo->Initialize();
98 pIo->Release();
99 }
100 else
101 hr = S_OK;
102
103 /* Everything is initialized now. Let's get the IMenuBand interface. */
104 if (FAILED_UNEXPECTEDLY(hr))
105 {
106 TRACE("IMenuPopup_QueryInterface failed: %x\n", hr);
107 goto cleanup;
108 }
109
110 hr = pMp->GetClient(&pUnk);
111 if (FAILED_UNEXPECTEDLY(hr))
112 {
113 TRACE("IMenuPopup_GetClient failed: %x\n", hr);
114 goto cleanup;
115 }
116
117 hr = pUnk->QueryInterface(IID_PPV_ARG(IBandSite, &pBs));
118 if (FAILED_UNEXPECTEDLY(hr))
119 {
120 TRACE("IUnknown_QueryInterface pBs failed: %x\n", hr);
121 goto cleanup;
122 }
123
124 /* Finally we have the IBandSite interface, there's only one
125 band in it that apparently provides the IMenuBand interface */
126 hr = pBs->EnumBands(0, &dwBandId);
127 if (FAILED_UNEXPECTEDLY(hr))
128 {
129 TRACE("IBandSite_EnumBands failed: %x\n", hr);
130 goto cleanup;
131 }
132
133 hr = pBs->GetBandObject(dwBandId, IID_PPV_ARG(IMenuBand, &pMb));
134 if (FAILED_UNEXPECTEDLY(hr))
135 {
136 TRACE("IBandSite_GetBandObject failed: %x\n", hr);
137 goto cleanup;
138 }
139
140 UpdateStartMenu(pMp,
141 hbmBanner,
142 bSmallIcons);
143
144 cleanup:
145 if (SUCCEEDED(hr))
146 *ppMenuBand = pMb;
147 else if (pMb != NULL)
148 pMb->Release();
149
150 if (pBs != NULL)
151 pBs->Release();
152 if (pUnk != NULL)
153 pUnk->Release();
154 if (pOws != NULL)
155 pOws->Release();
156 if (pMp != NULL)
157 pMp->Release();
158 if (pSms != NULL)
159 pSms->Release();
160
161 if (FAILED_UNEXPECTEDLY(hr))
162 return NULL;
163 return pMp;
164 }