ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

basebarsite.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.