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