Index: chrome/browser/chromeos/options/options_window_view.cc |
diff --git a/chrome/browser/chromeos/options/options_window_view.cc b/chrome/browser/chromeos/options/options_window_view.cc |
index d284ce342a6016cfe62220cc848f6546f808c4f8..4535e8bae79ba7abab91082f73a6f8d553255bc6 100644 |
--- a/chrome/browser/chromeos/options/options_window_view.cc |
+++ b/chrome/browser/chromeos/options/options_window_view.cc |
@@ -35,6 +35,48 @@ |
namespace chromeos { |
/////////////////////////////////////////////////////////////////////////////// |
+// GtkPreferencePageHost |
+// |
+// Hosts a GTK preference page and takes care of sizing it appropriately. |
+// |
+class GtkPreferencePageHost : public views::NativeViewHost { |
+ public: |
+ explicit GtkPreferencePageHost(GtkWidget* widget); |
+ |
+ private: |
+ // views::View overrides: |
+ virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child); |
+ virtual gfx::Size GetPreferredSize(); |
+ |
+ GtkWidget* widget_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(GtkPreferencePageHost); |
+}; |
+ |
+GtkPreferencePageHost::GtkPreferencePageHost(GtkWidget* widget) |
+ : widget_(widget) { |
+ set_background(views::Background::CreateSolidBackground(SK_ColorWHITE)); |
+} |
+ |
+void GtkPreferencePageHost::ViewHierarchyChanged(bool is_add, |
+ View* parent, |
+ View* child) { |
+ NativeViewHost::ViewHierarchyChanged(is_add, parent, child); |
+ if (is_add && child == this) |
+ Attach(widget_); |
+} |
+ |
+gfx::Size GtkPreferencePageHost::GetPreferredSize() { |
+ // We need to show the widget and its children since otherwise containers like |
+ // gtk_box don't compute the correct size. |
+ gtk_widget_show_all(widget_); |
+ GtkRequisition requisition = { 0, 0 }; |
+ gtk_widget_size_request(GTK_WIDGET(widget_), &requisition); |
+ GtkRequisition& size(widget_->requisition); |
+ return gfx::Size(size.width, size.height); |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
// OptionsWindowView |
// |
// The contents of the Options dialog window. |
@@ -214,9 +256,9 @@ void OptionsWindowView::Layout() { |
} |
gfx::Size OptionsWindowView::GetPreferredSize() { |
- return gfx::Size(views::Window::GetLocalizedContentsSize( |
- IDS_OPTIONS_DIALOG_WIDTH_CHARS, |
- IDS_OPTIONS_DIALOG_HEIGHT_LINES)); |
+ gfx::Size size(tabs_->GetPreferredSize()); |
+ size.Enlarge(2 * kDialogPadding, 2 * kDialogPadding); |
+ return size; |
} |
void OptionsWindowView::ViewHierarchyChanged(bool is_add, |
@@ -263,29 +305,23 @@ void OptionsWindowView::Init() { |
l10n_util::GetString(IDS_OPTIONS_INTERNET_TAB_LABEL), |
internet_page, false); |
- views::NativeViewHost* general_page_view = new views::NativeViewHost(); |
- general_page_view->set_background(views::Background::CreateSolidBackground( |
- SK_ColorWHITE)); |
tabs_->AddTabAtIndex(tab_index++, |
l10n_util::GetString(IDS_OPTIONS_GENERAL_TAB_LABEL), |
- general_page_view, false); |
- general_page_view->Attach(general_page_.get_page_widget()); |
+ new GtkPreferencePageHost( |
+ general_page_.get_page_widget()), |
+ false); |
- views::NativeViewHost* content_page_view = new views::NativeViewHost(); |
- content_page_view->set_background(views::Background::CreateSolidBackground( |
- SK_ColorWHITE)); |
tabs_->AddTabAtIndex(tab_index++, |
l10n_util::GetString(IDS_OPTIONS_CONTENT_TAB_LABEL), |
- content_page_view, false); |
- content_page_view->Attach(content_page_.get_page_widget()); |
+ new GtkPreferencePageHost( |
+ content_page_.get_page_widget()), |
+ false); |
- views::NativeViewHost* advanced_page_view = new views::NativeViewHost(); |
- advanced_page_view->set_background(views::Background::CreateSolidBackground( |
- SK_ColorWHITE)); |
tabs_->AddTabAtIndex(tab_index++, |
l10n_util::GetString(IDS_OPTIONS_ADVANCED_TAB_LABEL), |
- advanced_page_view, false); |
- advanced_page_view->Attach(advanced_page_.get_page_widget()); |
+ new GtkPreferencePageHost( |
+ advanced_page_.get_page_widget()), |
+ false); |
DCHECK(tabs_->GetTabCount() == OPTIONS_PAGE_COUNT); |
@@ -344,4 +380,3 @@ void ShowOptionsWindow(OptionsPage page, |
OptionsWindowView::instance_->ShowOptionsPage(page, highlight_group); |
} |
- |