summaryrefslogtreecommitdiffstats
path: root/chrome_frame/infobars/infobar_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome_frame/infobars/infobar_manager.cc')
-rw-r--r--chrome_frame/infobars/infobar_manager.cc102
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;
+}