diff options
Diffstat (limited to 'chrome_frame/infobars/infobar_manager.cc')
-rw-r--r-- | chrome_frame/infobars/infobar_manager.cc | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/chrome_frame/infobars/infobar_manager.cc b/chrome_frame/infobars/infobar_manager.cc new file mode 100644 index 0000000..7d8e072 --- /dev/null +++ b/chrome_frame/infobars/infobar_manager.cc @@ -0,0 +1,102 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome_frame/infobars/infobar_manager.h" + +#include "base/logging.h" +#include "base/scoped_ptr.h" +#include "chrome_frame/infobars/internal/host_window_manager.h" +#include "chrome_frame/infobars/internal/infobar_window.h" + +// Connects InfobarWindow to HostWindowManager, and exposes the result as an +// InfobarManager. +class InfobarManagerImpl + : public InfobarManager, + public InfobarWindow::Host, + public HostWindowManager::Delegate { + public: + explicit InfobarManagerImpl(HostWindowManager* manager); + + // Implementation of InfobarManager + virtual bool Show(InfobarContent* content, InfobarType type); + virtual void Hide(InfobarType type); + virtual void HideAll(); + + // Implementation of HostWindowManager::Delegate + virtual void AdjustDisplacedWindowDimensions(RECT* rect); + + // Implementation of InfobarWindow::Host + virtual HWND GetContainerWindow(); + virtual void UpdateLayout(); + + private: + // Not owned by this instance. + HostWindowManager* manager_; + // Infobar windows. + scoped_ptr<InfobarWindow> infobars_[END_OF_INFOBAR_TYPE]; + DISALLOW_COPY_AND_ASSIGN(InfobarManagerImpl); +}; // class InfobarManagerImpl + +InfobarManagerImpl::InfobarManagerImpl(HostWindowManager* manager) + : manager_(manager) { + for (int index = 0; index < END_OF_INFOBAR_TYPE; ++index) { + infobars_[index].reset( + new InfobarWindow(static_cast<InfobarType>(index))); + infobars_[index]->SetHost(this); + } +} + +bool InfobarManagerImpl::Show(InfobarContent* content, InfobarType type) { + DCHECK(type >= FIRST_INFOBAR_TYPE && type < END_OF_INFOBAR_TYPE); + return infobars_[type]->Show(content); +} + +void InfobarManagerImpl::Hide(InfobarType type) { + DCHECK(type >= FIRST_INFOBAR_TYPE && type < END_OF_INFOBAR_TYPE); + infobars_[type]->Hide(); +} + +void InfobarManagerImpl::HideAll() { + for (int index = 0; index < END_OF_INFOBAR_TYPE; ++index) + Hide(static_cast<InfobarType>(index)); +} + +void InfobarManagerImpl::AdjustDisplacedWindowDimensions(RECT* rect) { + for (int index = 0; index < END_OF_INFOBAR_TYPE; ++index) { + if (infobars_[index] != NULL) + infobars_[index]->ReserveSpace(rect); + } +} + +HWND InfobarManagerImpl::GetContainerWindow() { + return *manager_; +} + +void InfobarManagerImpl::UpdateLayout() { + manager_->UpdateLayout(); +} + +InfobarManager::~InfobarManager() { +} + +InfobarManager* InfobarManager::Get(HWND tab_window) { + HostWindowManager::Delegate* delegate = + HostWindowManager::GetDelegateForHwnd(tab_window); + + if (delegate != NULL) + return static_cast<InfobarManagerImpl*>(delegate); + + scoped_ptr<HostWindowManager> host_manager(new HostWindowManager()); + + // Transferred to host_manager in call to Initialize. + InfobarManagerImpl* infobar_manager = new InfobarManagerImpl( + host_manager.get()); + + if (host_manager->Initialize(tab_window, infobar_manager)) { + host_manager.release(); // takes ownership of itself + return infobar_manager; + } + + return NULL; +} |