color_chooser_aura.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
1// Copyright (c) 2012 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/browser_dialogs.h"
6#include "content/public/browser/color_chooser.h"
7#include "content/public/browser/web_contents.h"
8#include "content/public/browser/web_contents_view.h"
9#include "ui/views/color_chooser/color_chooser_listener.h"
10#include "ui/views/color_chooser/color_chooser_view.h"
11#include "ui/views/widget/widget.h"
12
13
14namespace {
15
16class ColorChooserAura : public content::ColorChooser,
17                         public views::ColorChooserListener {
18 public:
19  static ColorChooserAura* Open(content::WebContents* web_contents,
20                                SkColor initial_color);
21
22  ColorChooserAura(content::WebContents* web_contents, SkColor initial_color);
23
24 private:
25  static ColorChooserAura* current_color_chooser_;
26
27  // content::ColorChooser overrides:
28  virtual void End() OVERRIDE;
29  virtual void SetSelectedColor(SkColor color) OVERRIDE;
30
31  // views::ColorChooserListener overrides:
32  virtual void OnColorChosen(SkColor color) OVERRIDE;
33  virtual void OnColorChooserDialogClosed() OVERRIDE;
34
35  void DidEndColorChooser();
36
37  // The actual view of the color chooser.  No ownership because its parent
38  // view will take care of its lifetime.
39  views::ColorChooserView* view_;
40
41  // The widget for the color chooser.  No ownership because it's released
42  // automatically when closed.
43  views::Widget* widget_;
44
45  // The web contents invoking the color chooser.  No ownership because it will
46  // outlive this class.
47  content::WebContents* web_contents_;
48
49  DISALLOW_COPY_AND_ASSIGN(ColorChooserAura);
50};
51
52ColorChooserAura* ColorChooserAura::current_color_chooser_ = NULL;
53
54ColorChooserAura::ColorChooserAura(content::WebContents* web_contents,
55                                   SkColor initial_color)
56    : web_contents_(web_contents) {
57  view_ = new views::ColorChooserView(this, initial_color);
58  widget_ = views::Widget::CreateWindowWithContext(
59      view_, web_contents->GetView()->GetNativeView());
60  widget_->SetAlwaysOnTop(true);
61  widget_->Show();
62}
63
64void ColorChooserAura::OnColorChosen(SkColor color) {
65  if (web_contents_)
66    web_contents_->DidChooseColorInColorChooser(color);
67}
68
69void ColorChooserAura::OnColorChooserDialogClosed() {
70  view_ = NULL;
71  widget_ = NULL;
72  DidEndColorChooser();
73}
74
75void ColorChooserAura::End() {
76  if (widget_ && widget_->IsVisible()) {
77    view_->set_listener(NULL);
78    widget_->Close();
79    view_ = NULL;
80    widget_ = NULL;
81    // DidEndColorChooser will invoke Browser::DidEndColorChooser, which deletes
82    // this. Take care of the call order.
83    DidEndColorChooser();
84  }
85}
86
87void ColorChooserAura::DidEndColorChooser() {
88  DCHECK(current_color_chooser_ == this);
89  current_color_chooser_ = NULL;
90  if (web_contents_)
91    web_contents_->DidEndColorChooser();
92}
93
94void ColorChooserAura::SetSelectedColor(SkColor color) {
95  if (view_)
96    view_->OnColorChanged(color);
97}
98
99// static
100ColorChooserAura* ColorChooserAura::Open(
101    content::WebContents* web_contents, SkColor initial_color) {
102  if (current_color_chooser_)
103    current_color_chooser_->End();
104  DCHECK(current_color_chooser_);
105  current_color_chooser_ = new ColorChooserAura(web_contents, initial_color);
106  return current_color_chooser_;
107}
108
109}  // namespace
110
111namespace chrome {
112
113content::ColorChooser* ShowColorChooser(content::WebContents* web_contents,
114                                        SkColor initial_color) {
115  return ColorChooserAura::Open(web_contents, initial_color);
116}
117
118}  // namespace chrome
119