Index: chrome/browser/ui/gtk/color_chooser_gtk.cc |
diff --git a/chrome/browser/ui/gtk/color_chooser_gtk.cc b/chrome/browser/ui/gtk/color_chooser_gtk.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aad4c254abf07edcd11d71266d279053de2f80a7 |
--- /dev/null |
+++ b/chrome/browser/ui/gtk/color_chooser_gtk.cc |
@@ -0,0 +1,133 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <gtk/gtk.h> |
+ |
+#include "chrome/browser/ui/color_chooser.h" |
+ |
+#include "grit/generated_resources.h" |
+#include "ui/base/gtk/gtk_signal.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+#if defined(ENABLE_INPUT_COLOR) |
+ |
+GdkColor GdkColorFromWebColor(WebKit::WebColor color) { |
+ uint8 r = (color >> 16) & 0xFF; |
+ uint8 g = (color >> 8) & 0xFF; |
+ uint8 b = (color >> 0) & 0xFF; |
+ GdkColor gdk_color = {1, r * 257, g * 257, b * 257}; |
+ return gdk_color; |
+} |
+ |
+WebKit::WebColor WebColorFromGdkColor(GdkColor color) { |
+ uint8 r = color.red / 257; |
+ uint8 g = color.green / 257; |
+ uint8 b = color.blue / 257; |
+ return ((255 << 24) | (r << 16) | (g << 8) | b); |
+} |
+ |
+class ColorChooserImpl : public ColorChooser { |
+ public: |
+ // Get the single instance of this class. |
+ static ColorChooserImpl* GetInstance(); |
+ |
+ protected: |
+ virtual void openImpl(Listener* listener, WebKit::WebColor initial_color); |
+ virtual void cleanupImpl(Listener* listener); |
+ virtual void setSelectedColorImpl(WebKit::WebColor color); |
+ |
+ private: |
+ GtkColorSelection* colorSelection(); |
+ |
+ CHROMEGTK_CALLBACK_0(ColorChooserImpl, void, OnColorChooserOk); |
+ CHROMEGTK_CALLBACK_0(ColorChooserImpl, void, OnColorChooserCancel); |
+ CHROMEGTK_CALLBACK_0(ColorChooserImpl, void, OnColorChooserDestroy); |
+ |
+ ColorChooser::Listener* listener_; |
+ GtkWidget* color_selecting_dialog_; |
+}; |
+ |
+ColorChooser* ColorChooser::GetInstance() { |
+ return ColorChooserImpl::GetInstance(); |
+} |
+ |
+ColorChooserImpl* ColorChooserImpl::GetInstance() { |
+ return Singleton<ColorChooserImpl>::get(); |
+} |
+ |
+GtkColorSelection* ColorChooserImpl::colorSelection() { |
+ if (!color_selecting_dialog_) |
+ return 0; |
+ return GTK_COLOR_SELECTION( |
+ GTK_COLOR_SELECTION_DIALOG(color_selecting_dialog_)->colorsel); |
+} |
+ |
+void ColorChooserImpl::OnColorChooserOk(GtkWidget* widget) { |
+ GdkColor color; |
+ gtk_color_selection_get_current_color(colorSelection(), &color); |
+ listener_->DidChooseColor(WebColorFromGdkColor(color)); |
+ |
+ gtk_widget_destroy(color_selecting_dialog_); |
+ listener_ = 0; |
+ color_selecting_dialog_ = 0; |
+} |
+ |
+void ColorChooserImpl::OnColorChooserCancel(GtkWidget* widget) { |
+ gtk_widget_destroy(color_selecting_dialog_); |
+ listener_ = 0; |
+ color_selecting_dialog_ = 0; |
+} |
+ |
+void ColorChooserImpl::OnColorChooserDestroy(GtkWidget* widget) { |
+ listener_ = 0; |
+ color_selecting_dialog_ = 0; |
+} |
+ |
+void ColorChooserImpl::openImpl(Listener* listener, |
+ WebKit::WebColor initial_color) { |
+ listener_ = listener; |
+ if (!color_selecting_dialog_) { |
+ color_selecting_dialog_ = gtk_color_selection_dialog_new( |
+ l10n_util::GetStringUTF8(IDS_SELECT_COLOR_DIALOG_TITLE).c_str()); |
+ gtk_color_selection_set_has_opacity_control(colorSelection(), FALSE); |
+ g_signal_connect(G_OBJECT( |
+ GTK_COLOR_SELECTION_DIALOG(color_selecting_dialog_)->ok_button), |
+ "clicked", G_CALLBACK(OnColorChooserOkThunk), this); |
+ g_signal_connect(G_OBJECT( |
+ GTK_COLOR_SELECTION_DIALOG(color_selecting_dialog_)->cancel_button), |
+ "clicked", G_CALLBACK(OnColorChooserCancelThunk), this); |
+ g_signal_connect(G_OBJECT(color_selecting_dialog_), "destroy", |
+ G_CALLBACK(OnColorChooserDestroyThunk), this); |
+ } |
+ GdkColor gdk_color = GdkColorFromWebColor(initial_color); |
+ gtk_color_selection_set_previous_color(colorSelection(), &gdk_color); |
+ gtk_color_selection_set_current_color(colorSelection(), &gdk_color); |
+ if (color_selecting_dialog_) |
+ gtk_window_present(GTK_WINDOW(color_selecting_dialog_)); |
+ else |
+ gtk_widget_show(color_selecting_dialog_); |
+} |
+ |
+void ColorChooserImpl::cleanupImpl(Listener* listener) { |
+ if (!color_selecting_dialog_) |
+ return; |
+ |
+ if (listener_ != listener) |
+ return; |
+ |
+ gtk_widget_destroy(color_selecting_dialog_); |
+ listener_ = 0; |
+ color_selecting_dialog_ = 0; |
+} |
+ |
+void ColorChooserImpl::setSelectedColorImpl(WebKit::WebColor color) { |
+ if (!color_selecting_dialog_) |
+ return; |
+ GdkColor gdk_color = GdkColorFromWebColor(color); |
+ gtk_color_selection_set_previous_color(colorSelection(), &gdk_color); |
+ gtk_color_selection_set_current_color(colorSelection(), &gdk_color); |
+} |
+ |
+#endif // defined(ENABLE_INPUT_COLOR) |
+ |