Index: chrome/browser/ui/cocoa/color_chooser_mac.mm |
diff --git a/chrome/browser/ui/cocoa/color_chooser_mac.mm b/chrome/browser/ui/cocoa/color_chooser_mac.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e44e50b4284d9f7351e3cd1e51aff107d27385da |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/color_chooser_mac.mm |
@@ -0,0 +1,119 @@ |
+// 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 "chrome/browser/ui/color_chooser.h" |
+#include "chrome/browser/ui/cocoa/color_utils.h" |
+ |
+#if defined(ENABLE_INPUT_COLOR) |
+ |
+#import "base/mac/cocoa_protocols.h" |
+ |
+#import <Cocoa/Cocoa.h> |
+ |
+// A Listener class to act as a event target for NSColorPanel and send |
+// the results to the C++ class, ColorChooserImpl. |
+@interface ColorPanelBridge : NSObject<NSWindowDelegate> |
+ |
++ (ColorPanelBridge*)sharedBridge; |
+ |
+// Called from NSColorPanel |
+- (void)didChooseColor:(NSColorPanel *)panel; |
+ |
+@end |
+ |
+class ColorChooserImpl : public ColorChooser { |
+public: |
+ // Get the singleton instance of this class. |
+ static ColorChooserImpl* GetInstance(); |
+ |
+ virtual ~ColorChooserImpl(); |
+ |
+ // Called from ColorPanelBridge |
+ void didChooseColor(WebKit::WebColor color); |
+ void cleanup(); |
+ |
+protected: |
+ virtual void openImpl(Listener* listener, WebKit::WebColor initial_color); |
+ virtual void cleanupImpl(Listener* listener); |
+ void setSelectedColorImpl(WebKit::WebColor color); |
+ |
+private: |
+ ColorChooser::Listener* listener_; |
+}; |
+ |
+ColorChooser* ColorChooser::GetInstance() { |
+ return ColorChooserImpl::GetInstance(); |
+} |
+ |
+ColorChooserImpl* ColorChooserImpl::GetInstance() { |
+ return Singleton<ColorChooserImpl>::get(); |
+} |
+ |
+ColorChooserImpl::~ColorChooserImpl() |
+{ |
+ cleanupImpl(listener_); |
+} |
+ |
+void ColorChooserImpl::didChooseColor(WebKit::WebColor color) { |
+ if (!listener_) |
+ return; |
+ listener_->DidChooseColor(color); |
+} |
+ |
+void ColorChooserImpl::openImpl(Listener* listener, |
+ WebKit::WebColor initial_color) { |
+ listener_ = listener; |
+ NSColorPanel* panel = [NSColorPanel sharedColorPanel]; |
+ [panel setColor:NSColorFromWebColor(initial_color)]; |
+ [panel setShowsAlpha:NO]; |
+ [panel setDelegate:[ColorPanelBridge sharedBridge]]; |
+ [panel setTarget:[ColorPanelBridge sharedBridge]]; |
+ [panel setAction:@selector(didChooseColor:)]; |
+ [panel makeKeyAndOrderFront:NULL]; |
+} |
+ |
+void ColorChooserImpl::cleanup() { |
+ NSColorPanel* panel = [NSColorPanel sharedColorPanel]; |
+ [panel setDelegate:nil]; |
+ [panel setTarget:nil]; |
+ [panel setAction:NULL]; |
+ if (!listener_) |
+ return; |
+ listener_->DidCleanup(); |
+ listener_ = 0; |
+} |
+ |
+void ColorChooserImpl::cleanupImpl(Listener* listener) { |
+ if (listener_ != listener) |
+ return; |
+ cleanup(); |
+} |
+ |
+void ColorChooserImpl::setSelectedColorImpl(WebKit::WebColor color) { |
+ NSColorPanel* panel = [NSColorPanel sharedColorPanel]; |
+ [panel setColor:NSColorFromWebColor(color)]; |
+} |
+ |
+@implementation ColorPanelBridge |
+ |
+static ColorPanelBridge *sharedColorPanelBridge = nil; |
+ |
++ (ColorPanelBridge*)sharedBridge { |
+ if (!sharedColorPanelBridge) |
+ sharedColorPanelBridge = [[ColorPanelBridge alloc] init]; |
+ return sharedColorPanelBridge; |
+} |
+ |
+- (void)windowWillClose:(NSNotification *)notification { |
+ ColorChooserImpl::GetInstance()->cleanup(); |
+} |
+ |
+- (void)didChooseColor:(NSColorPanel *)panel { |
+ ColorChooserImpl::GetInstance()->didChooseColor(WebColorFromNSColor( |
+ [[panel color] colorUsingColorSpaceName:NSDeviceRGBColorSpace])); |
+} |
+ |
+@end |
+ |
+#endif // defined(ENABLE_INPUT_COLOR) |