color_chooser_aura.cc revision f2477e01787aa58f445919b809d89e252beef54f
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/views/color_chooser_aura.h"
6
7#include "chrome/browser/ui/browser_dialogs.h"
8#include "chrome/browser/ui/browser_finder.h"
9#include "chrome/browser/ui/browser_window.h"
10#include "content/public/browser/web_contents.h"
11#include "ui/views/color_chooser/color_chooser_view.h"
12#include "ui/views/widget/widget.h"
13
14ColorChooserAura* ColorChooserAura::current_color_chooser_ = NULL;
15
16ColorChooserAura::ColorChooserAura(content::WebContents* web_contents,
17                                   SkColor initial_color)
18    : web_contents_(web_contents) {
19  view_ = new views::ColorChooserView(this, initial_color);
20  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
21  widget_ = views::Widget::CreateWindowWithParent(
22      view_, browser->window()->GetNativeWindow());
23  widget_->Show();
24}
25
26void ColorChooserAura::OnColorChosen(SkColor color) {
27  if (web_contents_)
28    web_contents_->DidChooseColorInColorChooser(color);
29}
30
31void ColorChooserAura::OnColorChooserDialogClosed() {
32  view_ = NULL;
33  widget_ = NULL;
34  DidEndColorChooser();
35}
36
37void ColorChooserAura::End() {
38  if (widget_ && widget_->IsVisible()) {
39    view_->set_listener(NULL);
40    widget_->Close();
41    view_ = NULL;
42    widget_ = NULL;
43    // DidEndColorChooser will invoke Browser::DidEndColorChooser, which deletes
44    // this. Take care of the call order.
45    DidEndColorChooser();
46  }
47}
48
49void ColorChooserAura::DidEndColorChooser() {
50  DCHECK(current_color_chooser_ == this);
51  current_color_chooser_ = NULL;
52  if (web_contents_)
53    web_contents_->DidEndColorChooser();
54}
55
56void ColorChooserAura::SetSelectedColor(SkColor color) {
57  if (view_)
58    view_->OnColorChanged(color);
59}
60
61// static
62ColorChooserAura* ColorChooserAura::Open(
63    content::WebContents* web_contents, SkColor initial_color) {
64  if (current_color_chooser_)
65    current_color_chooser_->End();
66  DCHECK(!current_color_chooser_);
67  current_color_chooser_ = new ColorChooserAura(web_contents, initial_color);
68  return current_color_chooser_;
69}
70
71#if !defined(OS_WIN)
72namespace chrome {
73
74content::ColorChooser* ShowColorChooser(content::WebContents* web_contents,
75                                        SkColor initial_color) {
76  return ColorChooserAura::Open(web_contents, initial_color);
77}
78
79}  // namespace chrome
80#endif  // OS_WIN
81