// Copyright (c) 2011 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/memory/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;
}