Home | History | Annotate | Download | only in views
      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.
      4 
      5 #include "chrome/browser/ui/views/validation_message_bubble_delegate.h"
      6 
      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"
     12 
     13 // static
     14 const int ValidationMessageBubbleDelegate::kWindowMinWidth = 64;
     15 // static
     16 const int ValidationMessageBubbleDelegate::kWindowMaxWidth = 256;
     17 static const int kPadding = 0;
     18 static const int kIconTextMargin = 8;
     19 static const int kTextVerticalMargin = 4;
     20 
     21 ValidationMessageBubbleDelegate::ValidationMessageBubbleDelegate(
     22     const gfx::Rect& anchor_in_screen,
     23     const base::string16& main_text,
     24     const base::string16& sub_text,
     25     Observer* observer)
     26     : observer_(observer), width_(0), height_(0) {
     27   set_can_activate(false);
     28   set_arrow(views::BubbleBorder::TOP_LEFT);
     29   SetAnchorRect(anchor_in_screen);
     30 
     31   ui::ResourceBundle& bundle = ui::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());
     36   AddChildView(icon);
     37 
     38   views::Label* label = new views::Label(
     39       main_text, bundle.GetFontList(ui::ResourceBundle::MediumFont));
     40   label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
     41   int text_start_x = kPadding + size.width() + kIconTextMargin;
     42   int min_available = kWindowMinWidth - text_start_x - kPadding;
     43   int max_available = kWindowMaxWidth - text_start_x - kPadding;
     44   int label_width = label->GetPreferredSize().width();
     45   label->SetMultiLine(true);
     46   AddChildView(label);
     47 
     48   views::Label* sub_label = NULL;
     49   if (!sub_text.empty()) {
     50     sub_label = new views::Label(sub_text);
     51     sub_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
     52     label_width = std::max(label_width, sub_label->GetPreferredSize().width());
     53     sub_label->SetMultiLine(true);
     54     AddChildView(sub_label);
     55   }
     56 
     57   if (label_width < min_available)
     58     label_width = min_available;
     59   else if (label_width > max_available)
     60     label_width = max_available;
     61   label->SetBounds(text_start_x, kPadding,
     62                    label_width, label->GetHeightForWidth(label_width));
     63   int content_bottom = kPadding + label->height();
     64 
     65   if (sub_label) {
     66     sub_label->SetBounds(text_start_x,
     67                          content_bottom + kTextVerticalMargin,
     68                          label_width,
     69                          sub_label->GetHeightForWidth(label_width));
     70     content_bottom += kTextVerticalMargin + sub_label->height();
     71   }
     72 
     73   width_ = text_start_x + label_width + kPadding;
     74   height_ = content_bottom + kPadding;
     75 }
     76 
     77 ValidationMessageBubbleDelegate::~ValidationMessageBubbleDelegate() {}
     78 
     79 void ValidationMessageBubbleDelegate::Close() {
     80   GetWidget()->Close();
     81   observer_ = NULL;
     82 }
     83 
     84 void ValidationMessageBubbleDelegate::SetPositionRelativeToAnchor(
     85     const gfx::Rect& anchor_in_screen) {
     86   SetAnchorRect(anchor_in_screen);
     87 }
     88 
     89 gfx::Size ValidationMessageBubbleDelegate::GetPreferredSize() const {
     90   return gfx::Size(width_, height_);
     91 }
     92 
     93 void ValidationMessageBubbleDelegate::DeleteDelegate() {
     94   delete this;
     95 }
     96 
     97 void ValidationMessageBubbleDelegate::WindowClosing() {
     98   if (observer_ != NULL)
     99     observer_->WindowClosing();
    100 }
    101