15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/infobars/infobar_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/infobars/internal/host_window_manager.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/infobars/internal/infobar_window.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Connects InfobarWindow to HostWindowManager, and exposes the result as an
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InfobarManager.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InfobarManagerImpl
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public InfobarManager,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public InfobarWindow::Host,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public HostWindowManager::Delegate {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit InfobarManagerImpl(HostWindowManager* manager);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementation of InfobarManager
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Show(InfobarContent* content, InfobarType type);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Hide(InfobarType type);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void HideAll();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementation of HostWindowManager::Delegate
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AdjustDisplacedWindowDimensions(RECT* rect);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementation of InfobarWindow::Host
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HWND GetContainerWindow();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateLayout();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not owned by this instance.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostWindowManager* manager_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Infobar windows.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<InfobarWindow> infobars_[END_OF_INFOBAR_TYPE];
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InfobarManagerImpl);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};  // class InfobarManagerImpl
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InfobarManagerImpl::InfobarManagerImpl(HostWindowManager* manager)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : manager_(manager) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int index = 0; index < END_OF_INFOBAR_TYPE; ++index) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    infobars_[index].reset(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new InfobarWindow(static_cast<InfobarType>(index)));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    infobars_[index]->SetHost(this);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InfobarManagerImpl::Show(InfobarContent* content, InfobarType type) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type >= FIRST_INFOBAR_TYPE && type < END_OF_INFOBAR_TYPE);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return infobars_[type]->Show(content);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InfobarManagerImpl::Hide(InfobarType type) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type >= FIRST_INFOBAR_TYPE && type < END_OF_INFOBAR_TYPE);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  infobars_[type]->Hide();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InfobarManagerImpl::HideAll() {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int index = 0; index < END_OF_INFOBAR_TYPE; ++index)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Hide(static_cast<InfobarType>(index));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InfobarManagerImpl::AdjustDisplacedWindowDimensions(RECT* rect) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int index = 0; index < END_OF_INFOBAR_TYPE; ++index) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (infobars_[index] != NULL)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      infobars_[index]->ReserveSpace(rect);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HWND InfobarManagerImpl::GetContainerWindow() {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *manager_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InfobarManagerImpl::UpdateLayout() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->UpdateLayout();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InfobarManager::~InfobarManager() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InfobarManager* InfobarManager::Get(HWND tab_window) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostWindowManager::Delegate* delegate =
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HostWindowManager::GetDelegateForHwnd(tab_window);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate != NULL)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<InfobarManagerImpl*>(delegate);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HostWindowManager> host_manager(new HostWindowManager());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transferred to host_manager in call to Initialize.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InfobarManagerImpl* infobar_manager = new InfobarManagerImpl(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_manager.get());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_manager->Initialize(tab_window, infobar_manager)) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_manager.release();  // takes ownership of itself
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return infobar_manager;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
103