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/validation_message_bubble.h"
      6 
      7 #include "chrome/browser/ui/views/validation_message_bubble_delegate.h"
      8 #include "content/public/browser/render_widget_host.h"
      9 #include "content/public/browser/render_widget_host_view.h"
     10 #include "ui/views/widget/widget.h"
     11 
     12 namespace {
     13 
     14 // A ValidationMessageBubble implementation for Views.
     15 class ValidationMessageBubbleImpl
     16     : public chrome::ValidationMessageBubble,
     17       public ValidationMessageBubbleDelegate::Observer {
     18  public:
     19   ValidationMessageBubbleImpl(const gfx::Rect& anchor_in_screen,
     20                               const string16& main_text,
     21                               const string16& sub_text);
     22 
     23   virtual ~ValidationMessageBubbleImpl() {
     24     if (delegate_ != NULL)
     25       delegate_->Close();
     26   }
     27 
     28   virtual void SetPositionRelativeToAnchor(
     29       content::RenderWidgetHost* widget_host,
     30       const gfx::Rect& anchor_in_root_view) OVERRIDE {
     31     if (!delegate_)
     32       return;
     33     delegate_->SetPositionRelativeToAnchor(anchor_in_root_view +
     34         widget_host->GetView()->GetViewBounds().origin().OffsetFromOrigin());
     35   }
     36 
     37   // ValidationMessageBubbleDelegate::Observer override:
     38   virtual void WindowClosing() OVERRIDE {
     39     delegate_ = NULL;
     40   }
     41 
     42  private:
     43   ValidationMessageBubbleDelegate* delegate_;
     44 
     45   DISALLOW_COPY_AND_ASSIGN(ValidationMessageBubbleImpl);
     46 };
     47 
     48 ValidationMessageBubbleImpl::ValidationMessageBubbleImpl(
     49     const gfx::Rect& anchor_in_screen,
     50     const string16& main_text,
     51     const string16& sub_text) {
     52   delegate_ = new ValidationMessageBubbleDelegate(
     53       anchor_in_screen, main_text, sub_text, this);
     54   views::BubbleDelegateView::CreateBubble(delegate_);
     55   delegate_->GetWidget()->ShowInactive();
     56 }
     57 
     58 }  // namespace
     59 
     60 namespace chrome {
     61 
     62 scoped_ptr<ValidationMessageBubble> ValidationMessageBubble::CreateAndShow(
     63     content::RenderWidgetHost* widget_host,
     64     const gfx::Rect& anchor_in_root_view,
     65     const string16& main_text,
     66     const string16& sub_text) {
     67   const gfx::Rect anchor_in_screen = anchor_in_root_view
     68       + widget_host->GetView()->GetViewBounds().origin().OffsetFromOrigin();
     69   scoped_ptr<ValidationMessageBubble> bubble(
     70       new ValidationMessageBubbleImpl(anchor_in_screen, main_text, sub_text));
     71   return bubble.Pass();
     72 }
     73 
     74 }  // namespace chrome
     75