Index: ui/views/window/dialog_client_view.cc |
diff --git a/ui/views/window/dialog_client_view.cc b/ui/views/window/dialog_client_view.cc |
index 3401fbda2c5a5a0f67286cd7ebf8a22ee2811d1d..b600fadcc023445c229d657e1008edae5511f3e6 100644 |
--- a/ui/views/window/dialog_client_view.cc |
+++ b/ui/views/window/dialog_client_view.cc |
@@ -24,6 +24,7 @@ |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/font.h" |
#include "ui/views/controls/button/text_button.h" |
+#include "ui/views/controls/button/chrome_style.h" |
#include "ui/views/layout/layout_constants.h" |
#include "ui/views/widget/root_view.h" |
#include "ui/views/widget/widget.h" |
@@ -50,7 +51,7 @@ const gfx::Font& GetDialogButtonFont() { |
} |
// Updates any of the standard buttons according to the delegate. |
-void UpdateButtonHelper(NativeTextButton* button_view, |
+void UpdateButtonHelper(TextButton* button_view, |
DialogDelegate* delegate, |
ui::DialogButton button) { |
string16 label = delegate->GetDialogButtonLabel(button); |
@@ -62,20 +63,22 @@ void UpdateButtonHelper(NativeTextButton* button_view, |
// DialogButton ---------------------------------------------------------------- |
-// DialogButtons is used for the ok/cancel buttons of the window. DialogButton |
-// forwards AcceleratorPressed to the delegate. |
+// DialogButton forwards AcceleratorPressed to the delegate. It is used |
+// for the ok/cancel buttons of the window. |
-class DialogButton : public NativeTextButton { |
+template <class ButtonBase> |
+class DialogButton : public ButtonBase { |
public: |
+ // The button's class name. |
+ static const char kViewClassName[]; |
+ |
DialogButton(ButtonListener* listener, |
Widget* owner, |
ui::DialogButton type, |
- const string16& title, |
- bool is_default) |
- : NativeTextButton(listener, title), |
+ const string16& title) |
+ : ButtonBase(listener, title), |
owner_(owner), |
type_(type) { |
- SetIsDefault(is_default); |
} |
// Overridden to forward to the delegate. |
@@ -84,7 +87,12 @@ class DialogButton : public NativeTextButton { |
AreAcceleratorsEnabled(type_)) { |
return false; |
} |
- return NativeTextButton::AcceleratorPressed(accelerator); |
+ return ButtonBase::AcceleratorPressed(accelerator); |
+ } |
+ |
+ // Overridden from TextButton: |
+ virtual std::string GetClassName() const { |
+ return kViewClassName; |
} |
private: |
@@ -94,13 +102,30 @@ class DialogButton : public NativeTextButton { |
DISALLOW_COPY_AND_ASSIGN(DialogButton); |
}; |
+template <> const char DialogButton<NativeTextButton>::kViewClassName[] = |
+ "NativeDialogButton"; |
+ |
+template <> const char DialogButton<TextButton>::kViewClassName[] = |
+ "TextDialogButton"; |
} // namespace |
/////////////////////////////////////////////////////////////////////////////// |
// DialogClientView, public: |
-DialogClientView::DialogClientView(Widget* owner, View* contents_view) |
+DialogClientView::StyleParams::StyleParams() |
+ : button_vedge_margin(kButtonVEdgeMargin), |
+ button_hedge_margin(kButtonHEdgeMargin), |
+ min_button_width(kDialogMinButtonWidth), |
+ button_label_spacing(kDialogButtonLabelSpacing), |
+ button_content_spacing(kDialogButtonContentSpacing), |
+ text_button_factory(&DialogClientView::CreateNativeStyleDialogButton) { |
+} |
+ |
+DialogClientView::DialogClientView(Widget* owner, |
+ View* contents_view, |
+ const StyleParams ¶ms) |
: ClientView(owner, contents_view), |
+ style_params_(params), |
ok_button_(NULL), |
cancel_button_(NULL), |
default_button_(NULL), |
@@ -109,6 +134,9 @@ DialogClientView::DialogClientView(Widget* owner, View* contents_view) |
notified_delegate_(false), |
listening_to_focus_(false), |
saved_focus_manager_(NULL) { |
+ SkColor bg_color = ui::NativeTheme::instance()->GetSystemColor( |
+ ui::NativeTheme::kColorId_DialogBackground); |
+ set_background(views::Background::CreateSolidBackground(bg_color)); |
} |
DialogClientView::~DialogClientView() { |
@@ -123,14 +151,15 @@ void DialogClientView::ShowDialogButtons() { |
label = l10n_util::GetStringUTF16(IDS_APP_OK); |
bool is_default_button = |
(dd->GetDefaultDialogButton() & ui::DIALOG_BUTTON_OK) != 0; |
- ok_button_ = new DialogButton(this, |
- GetWidget(), |
- ui::DIALOG_BUTTON_OK, |
- label, |
- is_default_button); |
+ ok_button_ = style_params_.text_button_factory(this, |
+ GetWidget(), |
+ ui::DIALOG_BUTTON_OK, |
+ label); |
ok_button_->SetGroup(kButtonGroup); |
- if (is_default_button) |
+ if (is_default_button) { |
default_button_ = ok_button_; |
+ default_button_->SetIsDefault(true); |
+ } |
if (!(buttons & ui::DIALOG_BUTTON_CANCEL)) |
ok_button_->AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); |
AddChildView(ok_button_); |
@@ -148,16 +177,18 @@ void DialogClientView::ShowDialogButtons() { |
bool is_default_button = |
(dd->GetDefaultDialogButton() & ui::DIALOG_BUTTON_CANCEL) |
!= 0; |
- cancel_button_ = new DialogButton(this, |
- GetWidget(), |
- ui::DIALOG_BUTTON_CANCEL, |
- label, |
- is_default_button); |
+ cancel_button_ = |
+ style_params_.text_button_factory(this, |
+ GetWidget(), |
+ ui::DIALOG_BUTTON_CANCEL, |
+ label); |
cancel_button_->SetGroup(kButtonGroup); |
cancel_button_->AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, |
ui::EF_NONE)); |
- if (is_default_button) |
- default_button_ = ok_button_; |
+ if (is_default_button) { |
+ default_button_ = cancel_button_; |
+ default_button_->SetIsDefault(true); |
+ } |
AddChildView(cancel_button_); |
} |
if (!buttons) { |
@@ -167,7 +198,7 @@ void DialogClientView::ShowDialogButtons() { |
} |
} |
-void DialogClientView::SetDefaultButton(NativeTextButton* new_default_button) { |
+void DialogClientView::SetDefaultButton(TextButton* new_default_button) { |
if (default_button_ && default_button_ != new_default_button) { |
default_button_->SetIsDefault(false); |
default_button_ = NULL; |
@@ -181,10 +212,17 @@ void DialogClientView::SetDefaultButton(NativeTextButton* new_default_button) { |
void DialogClientView::OnWillChangeFocus(View* focused_before, |
View* focused_now) { |
- NativeTextButton* new_default_button = NULL; |
+ TextButton* new_default_button = NULL; |
+ // TODO(wittman): Identify TextButtons in a better way than |
+ // enumerating every possible subclass. |
if (focused_now && |
- focused_now->GetClassName() == NativeTextButton::kViewClassName) { |
- new_default_button = static_cast<NativeTextButton*>(focused_now); |
+ ((focused_now->GetClassName() == NativeTextButton::kViewClassName) || |
+ (focused_now->GetClassName() == TextButton::kViewClassName) || |
+ (focused_now->GetClassName() == |
+ DialogButton<NativeTextButton>::kViewClassName) || |
+ (focused_now->GetClassName() == |
+ DialogButton<TextButton>::kViewClassName))) { |
+ new_default_button = static_cast<TextButton*>(focused_now); |
} else { |
// The focused view is not a button, get the default button from the |
// delegate. |
@@ -237,6 +275,29 @@ void DialogClientView::CancelWindow() { |
Close(); |
} |
+// static |
+TextButton* DialogClientView::CreateNativeStyleDialogButton( |
+ ButtonListener* listener, |
+ Widget* owner, |
+ ui::DialogButton type, |
+ const string16& title) |
+{ |
+ return new DialogButton<NativeTextButton>(listener, owner, type, title); |
+} |
+ |
+// static |
+TextButton* DialogClientView::CreateChromeStyleDialogButton( |
+ ButtonListener* listener, |
+ Widget* owner, |
+ ui::DialogButton type, |
+ const string16& title) |
+{ |
+ DialogButton<TextButton>* button = |
+ new DialogButton<TextButton>(listener, owner, type, title); |
+ ApplyChromeStyle(button); |
+ return button; |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
// DialogClientView, View overrides: |
@@ -293,12 +354,6 @@ const DialogClientView* DialogClientView::AsDialogClientView() const { |
//////////////////////////////////////////////////////////////////////////////// |
// DialogClientView, View overrides: |
-void DialogClientView::OnPaint(gfx::Canvas* canvas) { |
- SkColor bg_color = ui::NativeTheme::instance()->GetSystemColor( |
- ui::NativeTheme::kColorId_DialogBackground); |
- canvas->FillRect(GetLocalBounds(), bg_color); |
-} |
- |
void DialogClientView::PaintChildren(gfx::Canvas* canvas) { |
View::PaintChildren(canvas); |
if (!GetWidget()->IsMaximized() && !GetWidget()->IsMinimized()) |
@@ -350,7 +405,7 @@ gfx::Size DialogClientView::GetPreferredSize() { |
width += kRelatedButtonHSpacing; |
} |
if (width > 0) { |
- width += 2 * kButtonHEdgeMargin; |
+ width += 2 * style_params_.button_hedge_margin; |
prefsize.set_width(std::max(prefsize.width(), width)); |
} |
} |
@@ -419,8 +474,8 @@ int DialogClientView::GetButtonWidth(int button) const { |
string16 button_label = dd->GetDialogButtonLabel( |
static_cast<ui::DialogButton>(button)); |
int string_width = GetDialogButtonFont().GetStringWidth(button_label); |
- return std::max(string_width + kDialogButtonLabelSpacing, |
- kDialogMinButtonWidth); |
+ return std::max(string_width + style_params_.button_label_spacing, |
+ style_params_.min_button_width); |
} |
int DialogClientView::GetButtonsHeight() const { |
@@ -436,19 +491,21 @@ int DialogClientView::GetButtonsHeight() const { |
int DialogClientView::GetDialogButtonsAreaHeight() const { |
return !has_dialog_buttons() ? 0 : |
- GetButtonsHeight() + kDialogButtonContentSpacing + kButtonVEdgeMargin; |
+ GetButtonsHeight() + style_params_.button_content_spacing + |
+ style_params_.button_vedge_margin; |
} |
void DialogClientView::LayoutDialogButtons() { |
gfx::Rect lb = GetContentsBounds(); |
gfx::Rect extra_bounds; |
- int bottom_y = lb.bottom() - kButtonVEdgeMargin; |
+ int bottom_y = lb.bottom() - style_params_.button_vedge_margin; |
int button_height = GetButtonsHeight(); |
if (cancel_button_) { |
gfx::Size ps = cancel_button_->GetPreferredSize(); |
int button_width = std::max( |
GetButtonWidth(ui::DIALOG_BUTTON_CANCEL), ps.width()); |
- int button_x = lb.right() - button_width - kButtonHEdgeMargin; |
+ int button_x = lb.right() - button_width - |
+ style_params_.button_hedge_margin; |
int button_y = bottom_y - ps.height(); |
cancel_button_->SetBounds(button_x, button_y, button_width, ps.height()); |
// The extra view bounds are dependent on this button. |
@@ -459,7 +516,7 @@ void DialogClientView::LayoutDialogButtons() { |
gfx::Size ps = ok_button_->GetPreferredSize(); |
int button_width = std::max( |
GetButtonWidth(ui::DIALOG_BUTTON_OK), ps.width()); |
- int ok_button_right = lb.right() - kButtonHEdgeMargin; |
+ int ok_button_right = lb.right() - style_params_.button_hedge_margin; |
if (cancel_button_) |
ok_button_right = cancel_button_->x() - kRelatedButtonHSpacing; |
int button_x = ok_button_right - button_width; |
@@ -472,7 +529,7 @@ void DialogClientView::LayoutDialogButtons() { |
} |
if (extra_view_) { |
gfx::Size ps = extra_view_->GetPreferredSize(); |
- extra_bounds.set_x(lb.x() + kButtonHEdgeMargin); |
+ extra_bounds.set_x(lb.x() + style_params_.button_hedge_margin); |
int height = size_extra_view_height_to_buttons_ ? |
std::max(ps.height(), button_height) : ps.height(); |
extra_bounds.set_height(height); |