Fix Debug building on Windows
[platform/framework/web/crosswalk-tizen.git] / chromium_src / chrome / browser / ui / views / color_chooser_dialog.cc
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 "chrome/browser/ui/views/color_chooser_dialog.h"
6
7 #include <commdlg.h>
8
9 #include "base/bind.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/threading/thread.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "skia/ext/skia_utils_win.h"
14 #include "ui/views/color_chooser/color_chooser_listener.h"
15 #include "ui/views/win/hwnd_util.h"
16
17 using content::BrowserThread;
18
19 // static
20 COLORREF ColorChooserDialog::g_custom_colors[16];
21
22 ColorChooserDialog::ExecuteOpenParams::ExecuteOpenParams(SkColor color,
23                                                          RunState run_state,
24                                                          HWND owner)
25     : color(color),
26       run_state(run_state),
27       owner(owner) {
28 }
29
30 ColorChooserDialog::ColorChooserDialog(views::ColorChooserListener* listener,
31                                        SkColor initial_color,
32                                        gfx::NativeWindow owning_window)
33     : listener_(listener) {
34   DCHECK(listener_);
35   CopyCustomColors(g_custom_colors, custom_colors_);
36   HWND owning_hwnd = views::HWNDForNativeWindow(owning_window);
37   ExecuteOpenParams execute_params(initial_color, BeginRun(owning_hwnd),
38                                    owning_hwnd);
39   execute_params.run_state.dialog_thread->task_runner()->PostTask(FROM_HERE,
40       base::Bind(&ColorChooserDialog::ExecuteOpen, this, execute_params));
41 }
42
43 ColorChooserDialog::~ColorChooserDialog() {
44 }
45
46 bool ColorChooserDialog::IsRunning(gfx::NativeWindow owning_window) const {
47   return listener_ && IsRunningDialogForOwner(
48       views::HWNDForNativeWindow(owning_window));
49 }
50
51 void ColorChooserDialog::ListenerDestroyed() {
52   // Our associated listener has gone away, so we shouldn't call back to it if
53   // our worker thread returns after the listener is dead.
54   listener_ = NULL;
55 }
56
57 void ColorChooserDialog::ExecuteOpen(const ExecuteOpenParams& params) {
58   CHOOSECOLOR cc;
59   cc.lStructSize = sizeof(CHOOSECOLOR);
60   cc.hwndOwner = params.owner;
61   cc.rgbResult = skia::SkColorToCOLORREF(params.color);
62   cc.lpCustColors = custom_colors_;
63   cc.Flags = CC_ANYCOLOR | CC_FULLOPEN | CC_RGBINIT;
64   bool success = !!ChooseColor(&cc);
65   DisableOwner(cc.hwndOwner);
66   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
67       base::Bind(&ColorChooserDialog::DidCloseDialog, this, success,
68                  skia::COLORREFToSkColor(cc.rgbResult), params.run_state));
69 }
70
71 void ColorChooserDialog::DidCloseDialog(bool chose_color,
72                                         SkColor color,
73                                         RunState run_state) {
74   EndRun(run_state);
75   CopyCustomColors(custom_colors_, g_custom_colors);
76   if (listener_) {
77     if (chose_color)
78       listener_->OnColorChosen(color);
79     listener_->OnColorChooserDialogClosed();
80   }
81 }
82
83 void ColorChooserDialog::CopyCustomColors(COLORREF* src, COLORREF* dst) {
84   memcpy(dst, src, sizeof(COLORREF) * arraysize(g_custom_colors));
85 }