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