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