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 <gtk/gtk.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/color_chooser.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/gtk/gtk_signal.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_utils_gtk.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ColorChooserGtk : public content::ColorChooser {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static ColorChooserGtk* Open(content::WebContents* web_contents,
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                               SkColor initial_color);
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ColorChooserGtk(content::WebContents* web_contents, SkColor initial_color);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ColorChooserGtk();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void End() OVERRIDE;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSelectedColor(SkColor color) OVERRIDE;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static ColorChooserGtk* current_color_chooser_;
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_0(ColorChooserGtk, void, OnColorChooserOk);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_0(ColorChooserGtk, void, OnColorChooserCancel);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHROMEGTK_CALLBACK_0(ColorChooserGtk, void, OnColorChooserDestroy);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The web contents invoking the color chooser.  No ownership because it will
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // outlive this class.
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::WebContents* web_contents_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* color_selection_dialog_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ColorChooserGtk* ColorChooserGtk::current_color_chooser_ = NULL;
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ColorChooserGtk* ColorChooserGtk::Open(content::WebContents* web_contents,
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                       SkColor initial_color) {
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (current_color_chooser_)
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    current_color_chooser_->End();
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!current_color_chooser_);
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  current_color_chooser_ = new ColorChooserGtk(web_contents, initial_color);
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return current_color_chooser_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ColorChooserGtk::ColorChooserGtk(content::WebContents* web_contents,
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 SkColor initial_color)
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : web_contents_(web_contents) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  color_selection_dialog_ = gtk_color_selection_dialog_new(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF8(IDS_SELECT_COLOR_DIALOG_TITLE).c_str());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* cancel_button;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkColorSelection* color_selection;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* ok_button;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_object_get(color_selection_dialog_,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "cancel-button", &cancel_button,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "color-selection", &color_selection,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "ok-button", &ok_button,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               NULL);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_color_selection_set_has_opacity_control(color_selection, FALSE);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_signal_connect(ok_button, "clicked",
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   G_CALLBACK(OnColorChooserOkThunk), this);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_signal_connect(cancel_button, "clicked",
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   G_CALLBACK(OnColorChooserCancelThunk), this);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_signal_connect(color_selection_dialog_, "destroy",
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   G_CALLBACK(OnColorChooserDestroyThunk), this);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor gdk_color = gfx::SkColorToGdkColor(initial_color);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_color_selection_set_previous_color(color_selection, &gdk_color);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_color_selection_set_current_color(color_selection, &gdk_color);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_window_present(GTK_WINDOW(color_selection_dialog_));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_object_unref(cancel_button);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_object_unref(color_selection);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_object_unref(ok_button);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ColorChooserGtk::~ColorChooserGtk() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always call End() before destroying.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!color_selection_dialog_);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ColorChooserGtk::OnColorChooserOk(GtkWidget* widget) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor color;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkColorSelection* color_selection;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_object_get(color_selection_dialog_,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "color-selection", &color_selection, NULL);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_color_selection_get_current_color(color_selection, &color);
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (web_contents_)
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    web_contents_->DidChooseColorInColorChooser(gfx::GdkColorToSkColor(color));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_object_unref(color_selection);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_destroy(color_selection_dialog_);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ColorChooserGtk::OnColorChooserCancel(GtkWidget* widget) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_destroy(color_selection_dialog_);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ColorChooserGtk::OnColorChooserDestroy(GtkWidget* widget) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  color_selection_dialog_ = NULL;
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(current_color_chooser_ == this);
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  current_color_chooser_ = NULL;
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (web_contents_)
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    web_contents_->DidEndColorChooser();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ColorChooserGtk::End() {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!color_selection_dialog_)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_destroy(color_selection_dialog_);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ColorChooserGtk::SetSelectedColor(SkColor color) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!color_selection_dialog_)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GdkColor gdk_color = gfx::SkColorToGdkColor(color);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkColorSelection* color_selection;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_object_get(color_selection_dialog_,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "color-selection", &color_selection, NULL);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_color_selection_set_previous_color(color_selection, &gdk_color);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_color_selection_set_current_color(color_selection, &gdk_color);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_object_unref(color_selection);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace chrome {
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)content::ColorChooser* ShowColorChooser(content::WebContents* web_contents,
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                        SkColor initial_color) {
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return ColorChooserGtk::Open(web_contents, initial_color);
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace chrome
136