1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome_frame/infobars/infobar_manager.h"
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "chrome_frame/infobars/internal/host_window_manager.h"
10 #include "chrome_frame/infobars/internal/infobar_window.h"
12 // Connects InfobarWindow to HostWindowManager, and exposes the result as an
14 class InfobarManagerImpl
15 : public InfobarManager
,
16 public InfobarWindow::Host
,
17 public HostWindowManager::Delegate
{
19 explicit InfobarManagerImpl(HostWindowManager
* manager
);
21 // Implementation of InfobarManager
22 virtual bool Show(InfobarContent
* content
, InfobarType type
);
23 virtual void Hide(InfobarType type
);
24 virtual void HideAll();
26 // Implementation of HostWindowManager::Delegate
27 virtual void AdjustDisplacedWindowDimensions(RECT
* rect
);
29 // Implementation of InfobarWindow::Host
30 virtual HWND
GetContainerWindow();
31 virtual void UpdateLayout();
34 // Not owned by this instance.
35 HostWindowManager
* manager_
;
37 scoped_ptr
<InfobarWindow
> infobars_
[END_OF_INFOBAR_TYPE
];
38 DISALLOW_COPY_AND_ASSIGN(InfobarManagerImpl
);
39 }; // class InfobarManagerImpl
41 InfobarManagerImpl::InfobarManagerImpl(HostWindowManager
* manager
)
43 for (int index
= 0; index
< END_OF_INFOBAR_TYPE
; ++index
) {
44 infobars_
[index
].reset(
45 new InfobarWindow(static_cast<InfobarType
>(index
)));
46 infobars_
[index
]->SetHost(this);
50 bool InfobarManagerImpl::Show(InfobarContent
* content
, InfobarType type
) {
51 DCHECK(type
>= FIRST_INFOBAR_TYPE
&& type
< END_OF_INFOBAR_TYPE
);
52 return infobars_
[type
]->Show(content
);
55 void InfobarManagerImpl::Hide(InfobarType type
) {
56 DCHECK(type
>= FIRST_INFOBAR_TYPE
&& type
< END_OF_INFOBAR_TYPE
);
57 infobars_
[type
]->Hide();
60 void InfobarManagerImpl::HideAll() {
61 for (int index
= 0; index
< END_OF_INFOBAR_TYPE
; ++index
)
62 Hide(static_cast<InfobarType
>(index
));
65 void InfobarManagerImpl::AdjustDisplacedWindowDimensions(RECT
* rect
) {
66 for (int index
= 0; index
< END_OF_INFOBAR_TYPE
; ++index
) {
67 if (infobars_
[index
] != NULL
)
68 infobars_
[index
]->ReserveSpace(rect
);
72 HWND
InfobarManagerImpl::GetContainerWindow() {
76 void InfobarManagerImpl::UpdateLayout() {
77 manager_
->UpdateLayout();
80 InfobarManager::~InfobarManager() {
83 InfobarManager
* InfobarManager::Get(HWND tab_window
) {
84 HostWindowManager::Delegate
* delegate
=
85 HostWindowManager::GetDelegateForHwnd(tab_window
);
88 return static_cast<InfobarManagerImpl
*>(delegate
);
90 scoped_ptr
<HostWindowManager
> host_manager(new HostWindowManager());
92 // Transferred to host_manager in call to Initialize.
93 InfobarManagerImpl
* infobar_manager
= new InfobarManagerImpl(
96 if (host_manager
->Initialize(tab_window
, infobar_manager
)) {
97 host_manager
.release(); // takes ownership of itself
98 return infobar_manager
;