// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include "chrome/browser/views/options/options_group_view.h" #include "app/gfx/canvas.h" #include "app/gfx/font.h" #include "app/l10n_util.h" #include "app/resource_bundle.h" #include "base/gfx/native_theme.h" #include "grit/locale_settings.h" #include "grit/generated_resources.h" #include "views/grid_layout.h" #include "views/controls/label.h" #include "views/controls/separator.h" #include "views/standard_layout.h" static const int kLeftColumnWidthChars = 20; static const int kOptionsGroupViewColumnSpacing = 30; /////////////////////////////////////////////////////////////////////////////// // OptionsGroupView, public: OptionsGroupView::OptionsGroupView(views::View* contents, const std::wstring& title, const std::wstring& description, bool show_separator) : contents_(contents), title_label_(new views::Label(title)), description_label_(new views::Label(description)), separator_(NULL), show_separator_(show_separator), highlighted_(false) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); gfx::Font title_font = rb.GetFont(ResourceBundle::BaseFont).DeriveFont(0, gfx::Font::BOLD); title_label_->SetFont(title_font); SkColor title_color = gfx::NativeTheme::instance()->GetThemeColorWithDefault( gfx::NativeTheme::BUTTON, BP_GROUPBOX, GBS_NORMAL, TMT_TEXTCOLOR, COLOR_WINDOWTEXT); title_label_->SetColor(title_color); title_label_->SetMultiLine(true); title_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); description_label_->SetMultiLine(true); description_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); } void OptionsGroupView::SetHighlighted(bool highlighted) { highlighted_ = highlighted; SchedulePaint(); } int OptionsGroupView::GetContentsWidth() const { return contents_->width(); } /////////////////////////////////////////////////////////////////////////////// // OptionsGroupView, views::View overrides: void OptionsGroupView::Paint(gfx::Canvas* canvas) { if (highlighted_) { COLORREF infocolor = GetSysColor(COLOR_INFOBK); SkColor background_color = SkColorSetRGB(GetRValue(infocolor), GetGValue(infocolor), GetBValue(infocolor)); int y_offset = kUnrelatedControlVerticalSpacing / 2; canvas->FillRectInt(background_color, 0, 0, width(), height() - y_offset); } } void OptionsGroupView::ViewHierarchyChanged(bool is_add, views::View* parent, views::View* child) { if (is_add && child == this) Init(); } /////////////////////////////////////////////////////////////////////////////// // OptionsGroupView, private: void OptionsGroupView::Init() { using views::GridLayout; using views::ColumnSet; GridLayout* layout = new GridLayout(this); SetLayoutManager(layout); ResourceBundle& rb = ResourceBundle::GetSharedInstance(); gfx::Font font = rb.GetFont(ResourceBundle::BaseFont); std::wstring left_column_chars = l10n_util::GetString(IDS_OPTIONS_DIALOG_LEFT_COLUMN_WIDTH_CHARS); int left_column_width = font.GetExpectedTextWidth(_wtoi(left_column_chars.c_str())); const int two_column_layout_id = 0; ColumnSet* column_set = layout->AddColumnSet(two_column_layout_id); column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0, GridLayout::FIXED, left_column_width, 0); column_set->AddPaddingColumn(0, kOptionsGroupViewColumnSpacing); column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 1, GridLayout::USE_PREF, 0, 0); column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); layout->StartRow(0, two_column_layout_id); // We need to do this so that the label can calculate an appropriate // preferred size (width * height) based on this width constraint. Otherwise // Label::GetPreferredSize will return 0,0 as the preferred size. title_label_->SetBounds(0, 0, left_column_width, 0); layout->AddView(title_label_); layout->AddView(contents_, 1, 3, GridLayout::FILL, GridLayout::FILL); layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); layout->StartRow(1, two_column_layout_id); // See comment above for title_label_. description_label_->SetBounds(0, 0, left_column_width, 0); layout->AddView(description_label_); layout->AddPaddingRow(0, kUnrelatedControlVerticalSpacing); if (show_separator_) { const int single_column_layout_id = 1; column_set = layout->AddColumnSet(single_column_layout_id); column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, GridLayout::USE_PREF, 0, 0); separator_ = new views::Separator; layout->StartRow(0, single_column_layout_id); layout->AddView(separator_); } }