color_chooser_win.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 <windows.h> 6 7#include "chrome/browser/platform_util.h" 8#include "chrome/browser/ui/browser_dialogs.h" 9#include "chrome/browser/ui/views/color_chooser_dialog.h" 10#include "content/public/browser/color_chooser.h" 11#include "content/public/browser/render_view_host.h" 12#include "content/public/browser/render_widget_host_view.h" 13#include "content/public/browser/web_contents.h" 14#include "ui/views/color_chooser/color_chooser_listener.h" 15 16class ColorChooserWin : public content::ColorChooser, 17 public views::ColorChooserListener { 18 public: 19 static ColorChooserWin* Open(content::WebContents* web_contents, 20 SkColor initial_color); 21 22 ColorChooserWin(content::WebContents* web_contents, 23 SkColor initial_color); 24 ~ColorChooserWin(); 25 26 // content::ColorChooser overrides: 27 virtual void End() OVERRIDE {} 28 virtual void SetSelectedColor(SkColor color) OVERRIDE {} 29 30 // views::ColorChooserListener overrides: 31 virtual void OnColorChosen(SkColor color); 32 virtual void OnColorChooserDialogClosed(); 33 34 private: 35 static ColorChooserWin* current_color_chooser_; 36 37 // The web contents invoking the color chooser. No ownership. because it will 38 // outlive this class. 39 content::WebContents* web_contents_; 40 41 // The color chooser dialog which maintains the native color chooser UI. 42 scoped_refptr<ColorChooserDialog> color_chooser_dialog_; 43}; 44 45ColorChooserWin* ColorChooserWin::current_color_chooser_ = NULL; 46 47ColorChooserWin* ColorChooserWin::Open(content::WebContents* web_contents, 48 SkColor initial_color) { 49 if (current_color_chooser_) 50 return current_color_chooser_; 51 return new ColorChooserWin(web_contents, initial_color); 52} 53 54ColorChooserWin::ColorChooserWin(content::WebContents* web_contents, 55 SkColor initial_color) 56 : web_contents_(web_contents) { 57 gfx::NativeWindow owning_window = platform_util::GetTopLevel( 58 web_contents->GetRenderViewHost()->GetView()->GetNativeView()); 59 color_chooser_dialog_ = new ColorChooserDialog(this, 60 initial_color, 61 owning_window); 62} 63 64ColorChooserWin::~ColorChooserWin() { 65 // Always call End() before destroying. 66 DCHECK(!color_chooser_dialog_); 67} 68 69void ColorChooserWin::OnColorChosen(SkColor color) { 70 if (web_contents_) 71 web_contents_->DidChooseColorInColorChooser(color); 72} 73 74void ColorChooserWin::OnColorChooserDialogClosed() { 75 if (color_chooser_dialog_.get()) { 76 color_chooser_dialog_->ListenerDestroyed(); 77 color_chooser_dialog_ = NULL; 78 } 79 DCHECK(current_color_chooser_ == this); 80 current_color_chooser_ = NULL; 81 if (web_contents_) 82 web_contents_->DidEndColorChooser(); 83} 84 85namespace chrome { 86 87content::ColorChooser* ShowColorChooser(content::WebContents* web_contents, 88 SkColor initial_color) { 89 return ColorChooserWin::Open(web_contents, initial_color); 90} 91 92} // namespace chrome 93