1 // Copyright (c) 2013 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/browser/ui/views/validation_message_bubble_delegate.h"
7 #include "grit/theme_resources.h"
8 #include "ui/base/resource/resource_bundle.h"
9 #include "ui/views/controls/image_view.h"
10 #include "ui/views/controls/label.h"
11 #include "ui/views/widget/widget.h"
14 const int ValidationMessageBubbleDelegate::kWindowMinWidth
= 64;
16 const int ValidationMessageBubbleDelegate::kWindowMaxWidth
= 256;
17 static const int kPadding
= 0;
18 static const int kIconTextMargin
= 8;
19 static const int kTextVerticalMargin
= 4;
21 ValidationMessageBubbleDelegate::ValidationMessageBubbleDelegate(
22 const gfx::Rect
& anchor_in_screen
,
23 const string16
& main_text
,
24 const string16
& sub_text
,
26 : observer_(observer
), width_(0), height_(0) {
27 set_use_focusless(true);
28 set_arrow(views::BubbleBorder::TOP_LEFT
);
29 set_anchor_rect(anchor_in_screen
);
31 ResourceBundle
& bundle
= ResourceBundle::GetSharedInstance();
32 views::ImageView
* icon
= new views::ImageView();
33 icon
->SetImage(*bundle
.GetImageSkiaNamed(IDR_INPUT_ALERT
));
34 gfx::Size size
= icon
->GetPreferredSize();
35 icon
->SetBounds(kPadding
, kPadding
, size
.width(), size
.height());
38 views::Label
* label
= new views::Label(main_text
);
39 label
->SetHorizontalAlignment(gfx::ALIGN_LEFT
);
40 label
->SetFont(bundle
.GetFont(ResourceBundle::MediumFont
));
41 label
->set_directionality_mode(views::Label::AUTO_DETECT_DIRECTIONALITY
);
42 int text_start_x
= kPadding
+ size
.width() + kIconTextMargin
;
43 int min_available
= kWindowMinWidth
- text_start_x
- kPadding
;
44 int max_available
= kWindowMaxWidth
- text_start_x
- kPadding
;
45 int label_width
= label
->GetPreferredSize().width();
46 label
->SetMultiLine(true);
49 views::Label
* sub_label
= NULL
;
50 if (!sub_text
.empty()) {
51 sub_label
= new views::Label(sub_text
);
52 sub_label
->SetHorizontalAlignment(gfx::ALIGN_LEFT
);
53 sub_label
->set_directionality_mode(
54 views::Label::AUTO_DETECT_DIRECTIONALITY
);
55 label_width
= std::max(label_width
, sub_label
->GetPreferredSize().width());
56 sub_label
->SetMultiLine(true);
57 AddChildView(sub_label
);
60 if (label_width
< min_available
)
61 label_width
= min_available
;
62 else if (label_width
> max_available
)
63 label_width
= max_available
;
64 label
->SetBounds(text_start_x
, kPadding
,
65 label_width
, label
->GetHeightForWidth(label_width
));
66 int content_bottom
= kPadding
+ label
->height();
69 sub_label
->SetBounds(text_start_x
,
70 content_bottom
+ kTextVerticalMargin
,
72 sub_label
->GetHeightForWidth(label_width
));
73 content_bottom
+= kTextVerticalMargin
+ sub_label
->height();
76 width_
= text_start_x
+ label_width
+ kPadding
;
77 height_
= content_bottom
+ kPadding
;
80 ValidationMessageBubbleDelegate::~ValidationMessageBubbleDelegate() {}
82 void ValidationMessageBubbleDelegate::Close() {
87 void ValidationMessageBubbleDelegate::SetPositionRelativeToAnchor(
88 const gfx::Rect
& anchor_in_screen
) {
89 set_anchor_rect(anchor_in_screen
);
90 GetWidget()->SetBounds(GetBubbleBounds());
93 gfx::Size
ValidationMessageBubbleDelegate::GetPreferredSize() {
94 return gfx::Size(width_
, height_
);
97 void ValidationMessageBubbleDelegate::DeleteDelegate() {
101 void ValidationMessageBubbleDelegate::WindowClosing() {
102 if (observer_
!= NULL
)
103 observer_
->WindowClosing();