15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/color_chooser_dialog.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/color_chooser.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/web_contents_view.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/color_chooser/color_chooser_listener.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_ASH)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/color_chooser_aura.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ColorChooserWin : public content::ColorChooser,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        public views::ColorChooserListener {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static ColorChooserWin* Open(content::WebContents* web_contents,
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                               SkColor initial_color);
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ColorChooserWin(content::WebContents* web_contents,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  SkColor initial_color);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ColorChooserWin();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::ColorChooser overrides:
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void End() OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSelectedColor(SkColor color) OVERRIDE {}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // views::ColorChooserListener overrides:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnColorChosen(SkColor color);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnColorChooserDialogClosed();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static ColorChooserWin* current_color_chooser_;
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The web contents invoking the color chooser.  No ownership. because it will
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // outlive this class.
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::WebContents* web_contents_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The color chooser dialog which maintains the native color chooser UI.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ColorChooserDialog> color_chooser_dialog_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ColorChooserWin* ColorChooserWin::current_color_chooser_ = NULL;
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ColorChooserWin* ColorChooserWin::Open(content::WebContents* web_contents,
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       SkColor initial_color) {
5581843c7b1423e241009db79d34acf2450330fcc5Torne (Richard Coles)  if (current_color_chooser_)
5681843c7b1423e241009db79d34acf2450330fcc5Torne (Richard Coles)    return NULL;
5781843c7b1423e241009db79d34acf2450330fcc5Torne (Richard Coles)  current_color_chooser_ = new ColorChooserWin(web_contents, initial_color);
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return current_color_chooser_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ColorChooserWin::ColorChooserWin(content::WebContents* web_contents,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 SkColor initial_color)
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : web_contents_(web_contents) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeWindow owning_window = platform_util::GetTopLevel(
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      web_contents->GetRenderViewHost()->GetView()->GetNativeView());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  color_chooser_dialog_ = new ColorChooserDialog(this,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 initial_color,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 owning_window);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ColorChooserWin::~ColorChooserWin() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always call End() before destroying.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!color_chooser_dialog_);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ColorChooserWin::End() {
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The ColorChooserDialog's listener is going away.  Ideally we'd
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // programmatically close the dialog at this point.  Since that's impossible,
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // we instead tell the dialog its listener is going away, so that the dialog
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // doesn't try to communicate with a destroyed listener later.  (We also tell
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // the renderer the dialog is closed, since from the renderer's perspective
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // it effectively is.)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  OnColorChooserDialogClosed();
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ColorChooserWin::OnColorChosen(SkColor color) {
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (web_contents_)
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    web_contents_->DidChooseColorInColorChooser(color);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ColorChooserWin::OnColorChooserDialogClosed() {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (color_chooser_dialog_.get()) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    color_chooser_dialog_->ListenerDestroyed();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    color_chooser_dialog_ = NULL;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(current_color_chooser_ == this);
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  current_color_chooser_ = NULL;
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (web_contents_)
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    web_contents_->DidEndColorChooser();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace chrome {
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)content::ColorChooser* ShowColorChooser(content::WebContents* web_contents,
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                        SkColor initial_color) {
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_ASH)
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::NativeView native_view = web_contents->GetView()->GetNativeView();
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (GetHostDesktopTypeForNativeView(native_view) == HOST_DESKTOP_TYPE_ASH)
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return ColorChooserAura::Open(web_contents, initial_color);
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return ColorChooserWin::Open(web_contents, initial_color);
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace chrome
115