Index: chrome/browser/ui/views/shell_dialogs_win.cc |
diff --git a/chrome/browser/ui/views/shell_dialogs_win.cc b/chrome/browser/ui/views/shell_dialogs_win.cc |
index 0ce04a0d25dd4a3499c2be7fa07e519c61d5b043..f69a1c2355cdb6eb11e19246ec7474550a73df9b 100644 |
--- a/chrome/browser/ui/views/shell_dialogs_win.cc |
+++ b/chrome/browser/ui/views/shell_dialogs_win.cc |
@@ -21,6 +21,7 @@ |
#include "base/win/registry.h" |
#include "base/win/scoped_comptr.h" |
#include "base/win/windows_version.h" |
+#include "chrome/browser/ui/color_chooser_dialog.h" |
#include "content/browser/browser_thread.h" |
#include "grit/generated_resources.h" |
#include "grit/ui_strings.h" |
@@ -940,3 +941,113 @@ bool SelectFileDialogImpl::RunOpenMultiFileDialog( |
SelectFileDialog* SelectFileDialog::Create(Listener* listener) { |
return new SelectFileDialogImpl(listener); |
} |
+ |
+#if defined(ENABLE_INPUT_COLOR) |
+ |
+COLORREF COLORREFFromWebColor(WebKit::WebColor color) { |
+ uint8 r = (color >> 16) & 0xFF; |
yosin_UTC9
2011/12/06 07:31:50
Could you use static_cast<uint8>(color >> 16) inst
|
+ uint8 g = (color >> 8) & 0xFF; |
+ uint8 b = (color >> 0) & 0xFF; |
+ return RGB(r, g, b); |
+} |
+ |
+WebKit::WebColor WebColorFromCOLORREF(COLORREF color) { |
+ uint8 b = (color >> 16) & 0xFF; |
yosin_UTC9
2011/12/06 07:31:50
It is better to use BYTE GetBValue(COLORREF), GetG
|
+ uint8 g = (color >> 8) & 0xFF; |
+ uint8 r = (color >> 0) & 0xFF; |
+ return ((255 << 24) | (r << 16) | (g << 8) | b); |
+} |
+ |
+class ColorChooserDialogImpl |
+ : public ColorChooserDialog, |
+ public BaseShellDialogImpl { |
+ public: |
+ explicit ColorChooserDialogImpl(Listener* listener); |
+ |
+ virtual bool IsRunning(HWND owning_hwnd) const; |
yosin_UTC9
2011/12/06 07:31:50
Please put "OVERRIDE" before semi-colon for overri
|
+ virtual void ListenerDestroyed(); |
+ |
+ virtual void SelectColor(WebKit::WebColor initial_color, |
+ gfx::NativeWindow owning_window); |
+ |
+ private: |
+ virtual ~ColorChooserDialogImpl(); |
+ |
+ struct ExecuteOpenParams { |
+ ExecuteOpenParams(WebKit::WebColor color, |
+ RunState run_state, |
+ HWND owner) |
+ : color(color), |
+ run_state(run_state), |
+ owner(owner) { |
+ } |
+ WebKit::WebColor color; |
+ RunState run_state; |
+ HWND owner; |
+ }; |
+ void ExecuteOpen(const ExecuteOpenParams& params); |
+ void DidChooseColor(WebKit::WebColor color, RunState run_state); |
+ |
+ COLORREF custom_colors_[16]; |
yosin_UTC9
2011/12/06 07:31:50
Where does number 16 come from? We may want to hav
|
+ Listener* listener_; |
+}; |
+ |
+ColorChooserDialogImpl::ColorChooserDialogImpl(Listener* listener) |
+ : listener_(listener), |
+ BaseShellDialogImpl() { |
+ DCHECK(listener_); |
+} |
+ |
+ColorChooserDialogImpl::~ColorChooserDialogImpl() { |
+} |
+ |
+bool ColorChooserDialogImpl::IsRunning(HWND owning_hwnd) const { |
+ return listener_ && IsRunningDialogForOwner(owning_hwnd); |
+} |
+ |
+void ColorChooserDialogImpl::ListenerDestroyed() { |
+ // Our associated listener has gone away, so we shouldn't call back to it if |
+ // our worker thread returns after the listener is dead. |
+ listener_ = NULL; |
+} |
+ |
+void ColorChooserDialogImpl::SelectColor(WebKit::WebColor initial_color, |
+ gfx::NativeWindow owning_window) { |
+ ExecuteOpenParams execute_params(initial_color, BeginRun(owning_window), |
+ owning_window); |
+ execute_params.run_state.dialog_thread->message_loop()->PostTask(FROM_HERE, |
+ NewRunnableMethod(this, &ColorChooserDialogImpl::ExecuteOpen, |
+ execute_params)); |
+} |
+ |
+void ColorChooserDialogImpl::ExecuteOpen(const ExecuteOpenParams& params) { |
+ COLORREF color = COLORREFFromWebColor(params.color); |
+ CHOOSECOLOR cc; |
+ cc.lStructSize = sizeof(CHOOSECOLOR); |
+ cc.hwndOwner = params.owner; |
+ cc.rgbResult = color; |
+ cc.lpCustColors = custom_colors_; |
+ cc.Flags = CC_FULLOPEN | CC_RGBINIT; |
+ bool success = !!ChooseColor(&cc); |
+ DisableOwner(cc.hwndOwner); |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
+ NewRunnableMethod(this, &ColorChooserDialogImpl::DidChooseColor, |
+ WebColorFromCOLORREF(cc.rgbResult), |
+ params.run_state)); |
+} |
+ |
+void ColorChooserDialogImpl::DidChooseColor(WebKit::WebColor color, |
+ RunState run_state) { |
+ if (!listener_) |
+ return; |
+ listener_->DidChooseColor(color); |
+ EndRun(run_state); |
+} |
+ |
+// static |
+ColorChooserDialog* ColorChooserDialog::Create(Listener* listener) { |
+ return new ColorChooserDialogImpl(listener); |
+} |
+ |
+#endif // defined(ENABLE_INPUT_COLOR) |
+ |