Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenbasebarsite.cpp
Go to the documentation of this file.
00001 /* 00002 * ReactOS Explorer 00003 * 00004 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org> 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00019 */ 00020 00021 /* 00022 Base bar that contains a vertical or horizontal explorer band. It also 00023 provides resizing abilities. 00024 */ 00025 #include "precomp.h" 00026 00027 /* 00028 TODO: 00029 ****Fix so an already created bar will be detected and just shown instead of added again 00030 ****When a new bar is added, initiate a resize 00031 **Add owner draw for base bar 00032 **Make label text in base bar always draw in black 00033 **Make base bar show close box 00034 **Create close toolbar button 00035 **Fix to delete all CBarInfo on deletion 00036 00037 */ 00038 00039 class CBaseBarSite : 00040 public CWindowImpl<CBaseBarSite, CWindow, CControlWinTraits>, 00041 public CComObjectRootEx<CComMultiThreadModelNoCS>, 00042 // public IDockingWindowSite, 00043 public IInputObject, 00044 public IServiceProvider, 00045 public IWinEventHandler, 00046 public IInputObjectSite, 00047 public IDeskBarClient, 00048 public IOleCommandTarget, 00049 public IBandSite, 00050 // public IBandSiteHelper, 00051 // public IExplorerToolbar, 00052 public IPersistStream 00053 { 00054 private: 00055 class CBarInfo 00056 { 00057 public: 00058 CComPtr<IUnknown> fTheBar; 00059 CLSID fBarClass; // class of active bar 00060 DWORD fBandID; 00061 00062 }; 00063 CBarInfo *fCurrentActiveBar; // 00064 // HWND fRebarWindow; // rebar for top of window 00065 CComPtr<IUnknown> fDeskBarSite; 00066 DWORD fNextBandID; 00067 public: 00068 CBaseBarSite(); 00069 ~CBaseBarSite(); 00070 private: 00071 HRESULT InsertBar(IUnknown *newBar); 00072 00073 // *** IOleWindow methods *** 00074 virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); 00075 virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); 00076 00077 // *** IInputObject methods *** 00078 virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); 00079 virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); 00080 virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); 00081 00082 // *** IServiceProvider methods *** 00083 virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); 00084 00085 // *** IWinEventHandler methods *** 00086 virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); 00087 virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); 00088 00089 // *** IInputObjectSite specific methods *** 00090 virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS (IUnknown *punkObj, BOOL fSetFocus); 00091 00092 // *** IDeskBarClient methods *** 00093 virtual HRESULT STDMETHODCALLTYPE SetDeskBarSite(IUnknown *punkSite); 00094 virtual HRESULT STDMETHODCALLTYPE SetModeDBC(DWORD dwMode); 00095 virtual HRESULT STDMETHODCALLTYPE UIActivateDBC(DWORD dwState); 00096 virtual HRESULT STDMETHODCALLTYPE GetSize(DWORD dwWhich, LPRECT prc); 00097 00098 // *** IOleCommandTarget methods *** 00099 virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); 00100 virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); 00101 00102 // *** IBandSite specific methods *** 00103 virtual HRESULT STDMETHODCALLTYPE AddBand(IUnknown *punk); 00104 virtual HRESULT STDMETHODCALLTYPE EnumBands(UINT uBand, DWORD *pdwBandID); 00105 virtual HRESULT STDMETHODCALLTYPE QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName); 00106 virtual HRESULT STDMETHODCALLTYPE SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState); 00107 virtual HRESULT STDMETHODCALLTYPE RemoveBand(DWORD dwBandID); 00108 virtual HRESULT STDMETHODCALLTYPE GetBandObject(DWORD dwBandID, REFIID riid, void **ppv); 00109 virtual HRESULT STDMETHODCALLTYPE SetBandSiteInfo(const BANDSITEINFO *pbsinfo); 00110 virtual HRESULT STDMETHODCALLTYPE GetBandSiteInfo(BANDSITEINFO *pbsinfo); 00111 00112 // *** IPersist methods *** 00113 virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); 00114 00115 // *** IPersistStream methods *** 00116 virtual HRESULT STDMETHODCALLTYPE IsDirty(); 00117 virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); 00118 virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); 00119 virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); 00120 00121 // message handlers 00122 LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 00123 00124 BEGIN_MSG_MAP(CBaseBarSite) 00125 MESSAGE_HANDLER(WM_NOTIFY, OnNotify) 00126 END_MSG_MAP() 00127 00128 BEGIN_COM_MAP(CBaseBarSite) 00129 COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) 00130 // COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite) 00131 COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) 00132 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) 00133 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) 00134 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite, IInputObjectSite) 00135 COM_INTERFACE_ENTRY_IID(IID_IDeskBarClient, IDeskBarClient) 00136 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) 00137 COM_INTERFACE_ENTRY_IID(IID_IBandSite, IBandSite) 00138 // COM_INTERFACE_ENTRY_IID(IID_IBandSiteHelper, IBandSiteHelper) 00139 // COM_INTERFACE_ENTRY_IID(IID_IExplorerToolbar, IExplorerToolbar) 00140 COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) 00141 COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) 00142 END_COM_MAP() 00143 }; 00144 00145 CBaseBarSite::CBaseBarSite() 00146 { 00147 fCurrentActiveBar = NULL; 00148 fNextBandID = 1; 00149 } 00150 00151 CBaseBarSite::~CBaseBarSite() 00152 { 00153 } 00154 00155 HRESULT CBaseBarSite::InsertBar(IUnknown *newBar) 00156 { 00157 CComPtr<IPersist> persist; 00158 CComPtr<IObjectWithSite> site; 00159 CComPtr<IOleWindow> oleWindow; 00160 CComPtr<IDeskBand> deskBand; 00161 CComPtr<IDockingWindow> dockingWindow; 00162 CBarInfo *newInfo; 00163 REBARBANDINFOW bandInfo; 00164 DESKBANDINFO deskBandInfo; 00165 DWORD thisBandID; 00166 HRESULT hResult; 00167 00168 hResult = newBar->QueryInterface(IID_IPersist, (void **)&persist); 00169 if (FAILED(hResult)) 00170 return hResult; 00171 hResult = newBar->QueryInterface(IID_IObjectWithSite, (void **)&site); 00172 if (FAILED(hResult)) 00173 return hResult; 00174 hResult = newBar->QueryInterface(IID_IOleWindow, (void **)&oleWindow); 00175 if (FAILED(hResult)) 00176 return hResult; 00177 hResult = newBar->QueryInterface(IID_IDeskBand, (void **)&deskBand); 00178 if (FAILED(hResult)) 00179 return hResult; 00180 hResult = newBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); 00181 if (FAILED(hResult)) 00182 return hResult; 00183 hResult = site->SetSite((IOleWindow *)this); 00184 if (FAILED(hResult)) 00185 return hResult; 00186 newInfo = new CBarInfo; 00187 if (newInfo == NULL) 00188 return E_OUTOFMEMORY; 00189 thisBandID = fNextBandID++; 00190 newInfo->fTheBar = newBar; 00191 newInfo->fBandID = thisBandID; 00192 hResult = persist->GetClassID(&newInfo->fBarClass); 00193 deskBandInfo.dwMask = DBIM_MINSIZE | DBIM_ACTUAL | DBIM_TITLE; 00194 deskBandInfo.wszTitle[0] = 0; 00195 hResult = deskBand->GetBandInfo(0, 0, &deskBandInfo); 00196 memset(&bandInfo, 0, sizeof(bandInfo)); 00197 bandInfo.cbSize = sizeof(bandInfo); 00198 bandInfo.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_TEXT | RBBIM_LPARAM | RBBIM_ID; 00199 bandInfo.fStyle = RBBS_NOGRIPPER | RBBS_VARIABLEHEIGHT; 00200 bandInfo.lpText = deskBandInfo.wszTitle; 00201 hResult = oleWindow->GetWindow(&bandInfo.hwndChild); 00202 bandInfo.cxMinChild = 200; //deskBandInfo.ptMinSize.x; 00203 bandInfo.cyMinChild = 200; //deskBandInfo.ptMinSize.y; 00204 bandInfo.cx = 0; 00205 bandInfo.wID = thisBandID; 00206 bandInfo.cyChild = -1; //deskBandInfo.ptActual.y; 00207 bandInfo.cyMaxChild = 32000; 00208 bandInfo.cyIntegral = 1; 00209 bandInfo.cxIdeal = 0; //deskBandInfo.ptActual.x; 00210 bandInfo.lParam = (LPARAM)newInfo; 00211 SendMessage(RB_INSERTBANDW, -1, (LPARAM)&bandInfo); 00212 hResult = dockingWindow->ShowDW(TRUE); // this call is what makes the tree fill with contents 00213 if (FAILED(hResult)) 00214 return hResult; 00215 // for now 00216 fCurrentActiveBar = newInfo; 00217 return S_OK; 00218 } 00219 00220 HRESULT STDMETHODCALLTYPE CBaseBarSite::GetWindow(HWND *lphwnd) 00221 { 00222 if (lphwnd == NULL) 00223 return E_POINTER; 00224 *lphwnd = m_hWnd; 00225 return S_OK; 00226 } 00227 00228 HRESULT STDMETHODCALLTYPE CBaseBarSite::ContextSensitiveHelp(BOOL fEnterMode) 00229 { 00230 return E_NOTIMPL; 00231 } 00232 00233 HRESULT STDMETHODCALLTYPE CBaseBarSite::UIActivateIO(BOOL fActivate, LPMSG lpMsg) 00234 { 00235 return E_NOTIMPL; 00236 } 00237 00238 HRESULT STDMETHODCALLTYPE CBaseBarSite::HasFocusIO() 00239 { 00240 return E_NOTIMPL; 00241 } 00242 00243 HRESULT STDMETHODCALLTYPE CBaseBarSite::TranslateAcceleratorIO(LPMSG lpMsg) 00244 { 00245 return E_NOTIMPL; 00246 } 00247 00248 HRESULT STDMETHODCALLTYPE CBaseBarSite::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) 00249 { 00250 CComPtr<IServiceProvider> serviceProvider; 00251 HRESULT hResult; 00252 00253 if (fDeskBarSite == NULL) 00254 return E_FAIL; 00255 hResult = fDeskBarSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 00256 if (FAILED(hResult)) 00257 return hResult; 00258 // called for SID_STopLevelBrowser, IID_IBrowserService to find top level browser 00259 // called for SID_IWebBrowserApp, IID_IConnectionPointContainer 00260 // connection point called for DIID_DWebBrowserEvents2 to establish connection 00261 return serviceProvider->QueryService(guidService, riid, ppvObject); 00262 } 00263 00264 HRESULT STDMETHODCALLTYPE CBaseBarSite::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) 00265 { 00266 CComPtr<IDeskBar> deskBar; 00267 CComPtr<IWinEventHandler> winEventHandler; 00268 NMHDR *notifyHeader; 00269 RECT newBounds; 00270 HRESULT hResult; 00271 00272 hResult = S_OK; 00273 if (uMsg == WM_NOTIFY) 00274 { 00275 notifyHeader = (NMHDR *)lParam; 00276 if (notifyHeader->hwndFrom == m_hWnd && notifyHeader->code == RBN_AUTOSIZE) 00277 { 00278 hResult = fDeskBarSite->QueryInterface(IID_IDeskBar, (void **)&deskBar); 00279 GetClientRect(&newBounds); 00280 hResult = deskBar->OnPosRectChangeDB(&newBounds); 00281 } 00282 } 00283 if (fCurrentActiveBar != NULL) 00284 { 00285 hResult = fCurrentActiveBar->fTheBar->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler); 00286 if (SUCCEEDED(hResult) && winEventHandler.p != NULL) 00287 hResult = winEventHandler->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult); 00288 } 00289 return hResult; 00290 } 00291 00292 HRESULT STDMETHODCALLTYPE CBaseBarSite::IsWindowOwner(HWND hWnd) 00293 { 00294 return E_NOTIMPL; 00295 } 00296 00297 HRESULT STDMETHODCALLTYPE CBaseBarSite::OnFocusChangeIS (IUnknown *punkObj, BOOL fSetFocus) 00298 { 00299 return E_NOTIMPL; 00300 } 00301 00302 HRESULT STDMETHODCALLTYPE CBaseBarSite::SetDeskBarSite(IUnknown *punkSite) 00303 { 00304 CComPtr<IOleWindow> oleWindow; 00305 HWND ownerWindow; 00306 HRESULT hResult; 00307 00308 if (punkSite == NULL) 00309 fDeskBarSite.Release(); 00310 else 00311 { 00312 hResult = punkSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); 00313 if (FAILED(hResult)) 00314 return hResult; 00315 hResult = punkSite->QueryInterface(IID_IUnknown, (void **)&fDeskBarSite); 00316 if (FAILED(hResult)) 00317 return hResult; 00318 hResult = oleWindow->GetWindow(&ownerWindow); 00319 if (FAILED(hResult)) 00320 return hResult; 00321 m_hWnd = CreateWindow(REBARCLASSNAMEW, _T(""), WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | 00322 WS_CLIPCHILDREN | 00323 RBS_VARHEIGHT | RBS_REGISTERDROP | RBS_AUTOSIZE | RBS_VERTICALGRIPPER | RBS_DBLCLKTOGGLE | 00324 CCS_LEFT | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE, 0, 0, 0, 0, ownerWindow, NULL, 00325 _AtlBaseModule.GetModuleInstance(), NULL); 00326 SendMessage(RB_SETTEXTCOLOR, 0, CLR_DEFAULT); 00327 SendMessage(RB_SETBKCOLOR, 0, CLR_DEFAULT); 00328 } 00329 return S_OK; 00330 } 00331 00332 HRESULT STDMETHODCALLTYPE CBaseBarSite::SetModeDBC(DWORD dwMode) 00333 { 00334 return E_NOTIMPL; 00335 } 00336 00337 HRESULT STDMETHODCALLTYPE CBaseBarSite::UIActivateDBC(DWORD dwState) 00338 { 00339 return E_NOTIMPL; 00340 } 00341 00342 HRESULT STDMETHODCALLTYPE CBaseBarSite::GetSize(DWORD dwWhich, LPRECT prc) 00343 { 00344 return E_NOTIMPL; 00345 } 00346 00347 HRESULT STDMETHODCALLTYPE CBaseBarSite::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) 00348 { 00349 return E_NOTIMPL; 00350 } 00351 00352 HRESULT STDMETHODCALLTYPE CBaseBarSite::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) 00353 { 00354 if (IsEqualIID(*pguidCmdGroup, IID_IDeskBand)) 00355 { 00356 switch (nCmdID) 00357 { 00358 case 1: // insert a new band 00359 if (V_VT(pvaIn) != VT_UNKNOWN) 00360 return E_INVALIDARG; 00361 return InsertBar(V_UNKNOWN(pvaIn)); 00362 } 00363 } 00364 return E_FAIL; 00365 } 00366 00367 HRESULT STDMETHODCALLTYPE CBaseBarSite::AddBand(IUnknown *punk) 00368 { 00369 return InsertBar(punk); 00370 } 00371 00372 HRESULT STDMETHODCALLTYPE CBaseBarSite::EnumBands(UINT uBand, DWORD *pdwBandID) 00373 { 00374 if (uBand == 0xffffffff) 00375 { 00376 *pdwBandID = (DWORD)SendMessage(RB_GETBANDCOUNT, 0, 0); 00377 return S_OK; 00378 } 00379 return E_NOTIMPL; 00380 } 00381 00382 HRESULT STDMETHODCALLTYPE CBaseBarSite::QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName) 00383 { 00384 return E_NOTIMPL; 00385 } 00386 00387 HRESULT STDMETHODCALLTYPE CBaseBarSite::SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState) 00388 { 00389 return E_NOTIMPL; 00390 } 00391 00392 HRESULT STDMETHODCALLTYPE CBaseBarSite::RemoveBand(DWORD dwBandID) 00393 { 00394 return E_NOTIMPL; 00395 } 00396 00397 HRESULT STDMETHODCALLTYPE CBaseBarSite::GetBandObject(DWORD dwBandID, REFIID riid, void **ppv) 00398 { 00399 if (ppv == NULL) 00400 return E_POINTER; 00401 return E_NOTIMPL; 00402 } 00403 00404 HRESULT STDMETHODCALLTYPE CBaseBarSite::SetBandSiteInfo(const BANDSITEINFO *pbsinfo) 00405 { 00406 if (pbsinfo == NULL) 00407 return E_POINTER; 00408 return E_NOTIMPL; 00409 } 00410 00411 HRESULT STDMETHODCALLTYPE CBaseBarSite::GetBandSiteInfo(BANDSITEINFO *pbsinfo) 00412 { 00413 if (pbsinfo == NULL) 00414 return E_POINTER; 00415 return E_NOTIMPL; 00416 } 00417 00418 HRESULT STDMETHODCALLTYPE CBaseBarSite::GetClassID(CLSID *pClassID) 00419 { 00420 if (pClassID == NULL) 00421 return E_POINTER; 00422 // TODO: what class to return here? 00423 return E_NOTIMPL; 00424 } 00425 00426 HRESULT STDMETHODCALLTYPE CBaseBarSite::IsDirty() 00427 { 00428 return E_NOTIMPL; 00429 } 00430 00431 HRESULT STDMETHODCALLTYPE CBaseBarSite::Load(IStream *pStm) 00432 { 00433 return E_NOTIMPL; 00434 } 00435 00436 HRESULT STDMETHODCALLTYPE CBaseBarSite::Save(IStream *pStm, BOOL fClearDirty) 00437 { 00438 return E_NOTIMPL; 00439 } 00440 00441 HRESULT STDMETHODCALLTYPE CBaseBarSite::GetSizeMax(ULARGE_INTEGER *pcbSize) 00442 { 00443 if (pcbSize == NULL) 00444 return E_POINTER; 00445 return E_NOTIMPL; 00446 } 00447 00448 LRESULT CBaseBarSite::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 00449 { 00450 NMHDR *notifyHeader; 00451 00452 notifyHeader = (NMHDR *)lParam; 00453 if (notifyHeader->hwndFrom == m_hWnd) 00454 { 00455 } 00456 return 0; 00457 } 00458 00459 HRESULT CreateBaseBarSite(REFIID riid, void **ppv) 00460 { 00461 CComObject<CBaseBarSite> *theBaseBarSite; 00462 HRESULT hResult; 00463 00464 if (ppv == NULL) 00465 return E_POINTER; 00466 *ppv = NULL; 00467 ATLTRY (theBaseBarSite = new CComObject<CBaseBarSite>); 00468 if (theBaseBarSite == NULL) 00469 return E_OUTOFMEMORY; 00470 hResult = theBaseBarSite->QueryInterface (riid, (void **)ppv); 00471 if (FAILED (hResult)) 00472 { 00473 delete theBaseBarSite; 00474 return hResult; 00475 } 00476 return S_OK; 00477 } Generated on Sun May 27 2012 04:22:54 for ReactOS by
1.7.6.1
|