| 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)
|
| +
|
|
|