summaryrefslogtreecommitdiffstats
path: root/chrome/browser/external_tab_container.cc
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-27 17:28:24 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-27 17:28:24 +0000
commit9095e9890efaa0b745438abfbd42634fbad32b04 (patch)
tree2f0cdbe3d2f4ac611c4d67e2b199d9c85ddc2355 /chrome/browser/external_tab_container.cc
parent6366e200ed57ccb7609533c8cd7230cff4d5bf8e (diff)
downloadchromium_src-9095e9890efaa0b745438abfbd42634fbad32b04.zip
chromium_src-9095e9890efaa0b745438abfbd42634fbad32b04.tar.gz
chromium_src-9095e9890efaa0b745438abfbd42634fbad32b04.tar.bz2
ExternalTabContainer should subclass WidgetWin rather than Widget and ATL CWindowImpl. This makes it much easier to extend the API of Widget.
Cleans up ExternalTabContainer to better match chrome style. BUG=none TEST=run ui tests, verify ExternalTabContainer tests pass. Review URL: http://codereview.chromium.org/113892 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16996 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/external_tab_container.cc')
-rw-r--r--chrome/browser/external_tab_container.cc233
1 files changed, 81 insertions, 152 deletions
diff --git a/chrome/browser/external_tab_container.cc b/chrome/browser/external_tab_container.cc
index 608b34e..24fb0c0 100644
--- a/chrome/browser/external_tab_container.cc
+++ b/chrome/browser/external_tab_container.cc
@@ -18,8 +18,6 @@
#include "chrome/common/chrome_constants.h"
#include "chrome/common/notification_service.h"
#include "chrome/test/automation/automation_messages.h"
-// Included for SetRootViewForHWND.
-#include "views/widget/widget_win.h"
static const wchar_t kWindowObjectKey[] = L"ChromeWindowObject";
@@ -29,7 +27,6 @@ static const wchar_t kWindowObjectKey[] = L"ChromeWindowObject";
ExternalTabContainer::ExternalTabContainer(
AutomationProvider* automation)
: automation_(automation),
- root_view_(this),
tab_contents_(NULL),
external_accel_table_(NULL),
external_accel_entry_count_(0),
@@ -39,34 +36,27 @@ ExternalTabContainer::ExternalTabContainer(
}
ExternalTabContainer::~ExternalTabContainer() {
- Uninitialize(m_hWnd);
+ Uninitialize(GetNativeView());
}
-bool ExternalTabContainer::Init(Profile* profile, HWND parent,
- const gfx::Rect& dimensions,
- unsigned int style) {
+bool ExternalTabContainer::Init(Profile* profile,
+ HWND parent,
+ const gfx::Rect& bounds,
+ DWORD style) {
if (IsWindow()) {
NOTREACHED();
return false;
}
- // First create the container window
- if (!Create(NULL, dimensions.ToRECT())) {
- NOTREACHED();
- return false;
- }
+ set_window_style(WS_POPUP);
+ views::WidgetWin::Init(parent, bounds, true);
// We don't ever remove the prop because the lifetime of this object
// is the same as the lifetime of the window
- SetProp(*this, kWindowObjectKey, this);
+ SetProp(GetNativeView(), kWindowObjectKey, this);
- views::SetRootViewForHWND(m_hWnd, &root_view_);
- // CreateFocusManager will subclass this window and delete the FocusManager
- // instance when this window goes away.
views::FocusManager* focus_manager =
- views::FocusManager::CreateFocusManager(m_hWnd, GetRootView());
-
- DCHECK(focus_manager);
+ views::FocusManager::GetFocusManager(GetNativeView());
focus_manager->AddKeystrokeListener(this);
tab_contents_ = new TabContents(profile, NULL, MSG_ROUTING_NONE, NULL);
@@ -76,7 +66,8 @@ bool ExternalTabContainer::Init(Profile* profile, HWND parent,
// Create a TabContentsContainer to handle focus cycling using Tab and
// Shift-Tab.
tab_contents_container_ = new TabContentsContainer;
- root_view_.AddChildView(tab_contents_container_);
+ SetContentsView(tab_contents_container_);
+
// Note that SetTabContents must be called after AddChildView is called
tab_contents_container_->ChangeTabContents(tab_contents_);
@@ -98,58 +89,62 @@ bool ExternalTabContainer::Init(Profile* profile, HWND parent,
// Note that it's important to do this before we call SetParent since
// during the SetParent call we will otherwise get a WA_ACTIVATE call
// that causes us to steal the current focus.
- ModifyStyle(WS_POPUP, style, 0);
+ SetWindowLong(GWL_STYLE, (GetWindowLong(GWL_STYLE) & ~WS_POPUP) | style);
// Now apply the parenting and style
if (parent)
- SetParent(parent);
+ SetParent(GetNativeView(), parent);
::ShowWindow(tab_contents_->GetNativeView(), SW_SHOWNA);
return true;
}
-bool ExternalTabContainer::Uninitialize(HWND window) {
- if (::IsWindow(window)) {
- views::FocusManager* focus_manager =
- views::FocusManager::GetFocusManager(window);
- if (focus_manager) {
- focus_manager->RemoveKeystrokeListener(this);
- }
- }
+void ExternalTabContainer::SetAccelerators(HACCEL accel_table,
+ int accel_table_entry_count) {
+ external_accel_table_ = accel_table;
+ external_accel_entry_count_ = accel_table_entry_count;
+}
- root_view_.RemoveAllChildViews(true);
- if (tab_contents_) {
- NotificationService::current()->Notify(
- NotificationType::EXTERNAL_TAB_CLOSED,
- Source<NavigationController>(&tab_contents_->controller()),
- Details<ExternalTabContainer>(this));
+void ExternalTabContainer::ProcessUnhandledAccelerator(const MSG& msg) {
+ // We just received an accelerator key that we had sent to external host
+ // back. Since the external host was not interested in handling this, we
+ // need to dispatch this message as if we had just peeked this out. (we
+ // also need to call TranslateMessage to generate a WM_CHAR if needed).
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+}
- delete tab_contents_;
- tab_contents_ = NULL;
+void ExternalTabContainer::SetInitialFocus(bool reverse) {
+ DCHECK(tab_contents_);
+ if (tab_contents_) {
+ static_cast<TabContents*>(tab_contents_)->Focus();
+ static_cast<TabContents*>(tab_contents_)->SetInitialFocus(reverse);
}
-
- return true;
}
-void ExternalTabContainer::OnFinalMessage(HWND window) {
- delete this;
+// static
+bool ExternalTabContainer::IsExternalTabContainer(HWND window) {
+ std::wstring class_name = win_util::GetClassName(window);
+ return _wcsicmp(class_name.c_str(), chrome::kExternalTabWindowClass) == 0;
}
-LRESULT ExternalTabContainer::OnSize(UINT, WPARAM, LPARAM, BOOL& handled) {
- if (tab_contents_) {
- RECT client_rect = {0};
- GetClientRect(&client_rect);
- ::SetWindowPos(tab_contents_->GetNativeView(), NULL, client_rect.left,
- client_rect.top, client_rect.right - client_rect.left,
- client_rect.bottom - client_rect.top, SWP_NOZORDER);
+// static
+ExternalTabContainer* ExternalTabContainer::GetContainerForTab(
+ HWND tab_window) {
+ HWND parent_window = ::GetParent(tab_window);
+ if (!::IsWindow(parent_window)) {
+ return NULL;
}
- return 0;
+ if (!IsExternalTabContainer(parent_window)) {
+ return NULL;
+ }
+ ExternalTabContainer* container = reinterpret_cast<ExternalTabContainer*>(
+ GetProp(parent_window, kWindowObjectKey));
+ return container;
}
-LRESULT ExternalTabContainer::OnDestroy(UINT, WPARAM, LPARAM, BOOL& handled) {
- Uninitialize(m_hWnd);
- return 0;
-}
+////////////////////////////////////////////////////////////////////////////////
+// ExternalTabContainer, TabContentsDelegate implementation:
void ExternalTabContainer::OpenURLFromTab(TabContents* source,
const GURL& url,
@@ -241,6 +236,12 @@ void ExternalTabContainer::ForwardMessageToExternalHost(
}
}
+ExtensionFunctionDispatcher* ExternalTabContainer::
+ CreateExtensionFunctionDispatcher(RenderViewHost* render_view_host,
+ const std::string& extension_id) {
+ return new ExtensionFunctionDispatcher(render_view_host, NULL, extension_id);
+}
+
bool ExternalTabContainer::TakeFocus(bool reverse) {
if (automation_) {
views::FocusManager* focus_manager =
@@ -256,6 +257,9 @@ bool ExternalTabContainer::TakeFocus(bool reverse) {
return true;
}
+////////////////////////////////////////////////////////////////////////////////
+// ExternalTabContainer, NotificationObserver implementation:
+
void ExternalTabContainer::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
@@ -316,64 +320,16 @@ void ExternalTabContainer::Observe(NotificationType type,
}
}
-void ExternalTabContainer::GetBounds(gfx::Rect* out,
- bool including_frame) const {
- CRect crect;
- GetWindowRect(&crect);
- *out = gfx::Rect(crect);
-}
-
-void ExternalTabContainer::SetBounds(const gfx::Rect& bounds) {
- SetBounds(bounds, NULL);
-}
-
-void ExternalTabContainer::SetBounds(const gfx::Rect& bounds,
- gfx::NativeView other_window) {
- NOTIMPLEMENTED();
-}
+////////////////////////////////////////////////////////////////////////////////
+// ExternalTabContainer, views::WidgetWin overrides:
-void ExternalTabContainer::Close() {
- NOTIMPLEMENTED();
+void ExternalTabContainer::OnDestroy() {
+ Uninitialize(GetNativeView());
+ WidgetWin::OnDestroy();
}
-void ExternalTabContainer::CloseNow() {
- NOTIMPLEMENTED();
-}
-
-void ExternalTabContainer::Show() {
- NOTIMPLEMENTED();
-}
-
-void ExternalTabContainer::Hide() {
- NOTIMPLEMENTED();
-}
-
-gfx::NativeView ExternalTabContainer::GetNativeView() const {
- return m_hWnd;
-}
-
-void ExternalTabContainer::PaintNow(const gfx::Rect& update_rect) {
- RECT native_update_rect = update_rect.ToRECT();
- RedrawWindow(&native_update_rect,
- NULL,
- RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_NOERASE);
-}
-
-void ExternalTabContainer::SetOpacity(unsigned char opacity) {
- NOTIMPLEMENTED();
-}
-
-views::RootView* ExternalTabContainer::GetRootView() {
- return const_cast<views::RootView*>(&root_view_);
-}
-
-bool ExternalTabContainer::IsVisible() const {
- return !!::IsWindowVisible(*this);
-}
-
-bool ExternalTabContainer::IsActive() const {
- return win_util::IsWindowActive(*this);
-}
+////////////////////////////////////////////////////////////////////////////////
+// ExternalTabContainer, views::KeystrokeListener implementation:
bool ExternalTabContainer::ProcessKeyStroke(HWND window, UINT message,
WPARAM wparam, LPARAM lparam) {
@@ -412,52 +368,25 @@ bool ExternalTabContainer::ProcessKeyStroke(HWND window, UINT message,
return false;
}
-void ExternalTabContainer::SetAccelerators(HACCEL accel_table,
- int accel_table_entry_count) {
- external_accel_table_ = accel_table;
- external_accel_entry_count_ = accel_table_entry_count;
-}
+////////////////////////////////////////////////////////////////////////////////
+// ExternalTabContainer, private:
-void ExternalTabContainer::ProcessUnhandledAccelerator(const MSG& msg) {
- // We just received an accelerator key that we had sent to external host
- // back. Since the external host was not interested in handling this, we
- // need to dispatch this message as if we had just peeked this out. (we
- // also need to call TranslateMessage to generate a WM_CHAR if needed).
- TranslateMessage(&msg);
- DispatchMessage(&msg);
-}
-
-void ExternalTabContainer::SetInitialFocus(bool reverse) {
- DCHECK(tab_contents_);
- if (tab_contents_) {
- static_cast<TabContents*>(tab_contents_)->Focus();
- static_cast<TabContents*>(tab_contents_)->SetInitialFocus(reverse);
+void ExternalTabContainer::Uninitialize(HWND window) {
+ if (::IsWindow(window)) {
+ views::FocusManager* focus_manager =
+ views::FocusManager::GetFocusManager(window);
+ if (focus_manager)
+ focus_manager->RemoveKeystrokeListener(this);
}
-}
-
-// static
-bool ExternalTabContainer::IsExternalTabContainer(HWND window) {
- std::wstring class_name = win_util::GetClassName(window);
- return _wcsicmp(class_name.c_str(), chrome::kExternalTabWindowClass) == 0;
-}
-ExtensionFunctionDispatcher* ExternalTabContainer::
- CreateExtensionFunctionDispatcher(RenderViewHost* render_view_host,
- const std::string& extension_id) {
- return new ExtensionFunctionDispatcher(render_view_host, NULL, extension_id);
-}
+ if (tab_contents_) {
+ NotificationService::current()->Notify(
+ NotificationType::EXTERNAL_TAB_CLOSED,
+ Source<NavigationController>(&tab_contents_->controller()),
+ Details<ExternalTabContainer>(this));
-// static
-ExternalTabContainer* ExternalTabContainer::GetContainerForTab(
- HWND tab_window) {
- HWND parent_window = ::GetParent(tab_window);
- if (!::IsWindow(parent_window)) {
- return NULL;
- }
- if (!IsExternalTabContainer(parent_window)) {
- return NULL;
+ delete tab_contents_;
+ tab_contents_ = NULL;
}
- ExternalTabContainer* container = reinterpret_cast<ExternalTabContainer*>(
- GetProp(parent_window, kWindowObjectKey));
- return container;
}
+