diff --git a/atom.gyp b/atom.gyp index 6000194e0d2a..52940e144fcc 100644 --- a/atom.gyp +++ b/atom.gyp @@ -302,6 +302,8 @@ 'chromium_src/chrome/browser/speech/tts_platform.cc', 'chromium_src/chrome/browser/speech/tts_platform.h', 'chromium_src/chrome/browser/speech/tts_win.cc', + 'chromium_src/chrome/browser/ui/browser_dialogs.h', + 'chromium_src/chrome/browser/ui/cocoa/color_chooser_mac.mm', 'chromium_src/chrome/browser/ui/libgtk2ui/app_indicator_icon_menu.cc', 'chromium_src/chrome/browser/ui/libgtk2ui/app_indicator_icon_menu.h', 'chromium_src/chrome/browser/ui/libgtk2ui/gtk2_status_icon.cc', diff --git a/atom/browser/atom_browser_client.h b/atom/browser/atom_browser_client.h index c3695d86d4bd..0890c7cee165 100644 --- a/atom/browser/atom_browser_client.h +++ b/atom/browser/atom_browser_client.h @@ -18,8 +18,7 @@ class AtomBrowserClient : public brightray::BrowserClient { protected: // content::ContentBrowserClient: - void RenderProcessWillLaunch( - content::RenderProcessHost* host) override; + void RenderProcessWillLaunch(content::RenderProcessHost* host) override; content::SpeechRecognitionManagerDelegate* GetSpeechRecognitionManagerDelegate() override; content::AccessTokenStore* CreateAccessTokenStore() override; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index c583689a3bce..6e5acdc6b026 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -31,6 +31,7 @@ #include "brightray/browser/inspectable_web_contents.h" #include "brightray/browser/inspectable_web_contents_view.h" #include "chrome/browser/printing/print_view_manager_basic.h" +#include "chrome/browser/ui/browser_dialogs.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/invalidate_type.h" #include "content/public/browser/navigation_entry.h" @@ -484,6 +485,13 @@ void NativeWindow::BeforeUnloadFired(content::WebContents* tab, } } +content::ColorChooser* NativeWindow::OpenColorChooser( + content::WebContents* web_contents, + SkColor color, + const std::vector& suggestions) { + return chrome::ShowColorChooser(web_contents, color); +} + void NativeWindow::RunFileChooser(content::WebContents* web_contents, const content::FileChooserParams& params) { if (!web_dialog_helper_) diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 7af5ee9af508..0af9fbe59b2a 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -230,6 +230,10 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, void BeforeUnloadFired(content::WebContents* tab, bool proceed, bool* proceed_to_fire_unload) override; + content::ColorChooser* OpenColorChooser( + content::WebContents* web_contents, + SkColor color, + const std::vector& suggestions) override; void RunFileChooser(content::WebContents* web_contents, const content::FileChooserParams& params) override; void EnumerateDirectory(content::WebContents* web_contents, diff --git a/chromium_src/chrome/browser/ui/browser_dialogs.h b/chromium_src/chrome/browser/ui/browser_dialogs.h new file mode 100644 index 000000000000..76d6e00a4fa4 --- /dev/null +++ b/chromium_src/chrome/browser/ui/browser_dialogs.h @@ -0,0 +1,26 @@ +// Copyright (c) 2012 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. + +#ifndef CHROME_BROWSER_UI_BROWSER_DIALOGS_H_ +#define CHROME_BROWSER_UI_BROWSER_DIALOGS_H_ + +#include "third_party/skia/include/core/SkColor.h" +#include "ui/gfx/native_widget_types.h" + +class SkBitmap; + +namespace content { +class ColorChooser; +class WebContents; +} + +namespace chrome { + +// Shows a color chooser that reports to the given WebContents. +content::ColorChooser* ShowColorChooser(content::WebContents* web_contents, + SkColor initial_color); + +} // namespace chrome + +#endif // CHROME_BROWSER_UI_BROWSER_DIALOGS_H_ diff --git a/chromium_src/chrome/browser/ui/cocoa/color_chooser_mac.mm b/chromium_src/chrome/browser/ui/cocoa/color_chooser_mac.mm new file mode 100644 index 000000000000..f2ce552bfcc3 --- /dev/null +++ b/chromium_src/chrome/browser/ui/cocoa/color_chooser_mac.mm @@ -0,0 +1,161 @@ +// Copyright (c) 2012 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. + +#import + +#include "base/logging.h" +#import "base/mac/scoped_nsobject.h" +#include "chrome/browser/ui/browser_dialogs.h" +#include "content/public/browser/color_chooser.h" +#include "content/public/browser/web_contents.h" +#include "skia/ext/skia_utils_mac.h" + +class ColorChooserMac; + +// A Listener class to act as a event target for NSColorPanel and send +// the results to the C++ class, ColorChooserMac. +@interface ColorPanelCocoa : NSObject { + @private + // We don't call DidChooseColor if the change wasn't caused by the user + // interacting with the panel. + BOOL nonUserChange_; + ColorChooserMac* chooser_; // weak, owns this +} + +- (id)initWithChooser:(ColorChooserMac*)chooser; + +// Called from NSColorPanel. +- (void)didChooseColor:(NSColorPanel*)panel; + +// Sets color to the NSColorPanel as a non user change. +- (void)setColor:(NSColor*)color; + +@end + +class ColorChooserMac : public content::ColorChooser { + public: + static ColorChooserMac* Open(content::WebContents* web_contents, + SkColor initial_color); + + ColorChooserMac(content::WebContents* tab, SkColor initial_color); + virtual ~ColorChooserMac(); + + // Called from ColorPanelCocoa. + void DidChooseColorInColorPanel(SkColor color); + void DidCloseColorPabel(); + + virtual void End() OVERRIDE; + virtual void SetSelectedColor(SkColor color) OVERRIDE; + + private: + static ColorChooserMac* current_color_chooser_; + + // The web contents invoking the color chooser. No ownership because it will + // outlive this class. + content::WebContents* web_contents_; + base::scoped_nsobject panel_; +}; + +ColorChooserMac* ColorChooserMac::current_color_chooser_ = NULL; + +// static +ColorChooserMac* ColorChooserMac::Open(content::WebContents* web_contents, + SkColor initial_color) { + if (current_color_chooser_) + current_color_chooser_->End(); + DCHECK(!current_color_chooser_); + current_color_chooser_ = + new ColorChooserMac(web_contents, initial_color); + return current_color_chooser_; +} + +ColorChooserMac::ColorChooserMac(content::WebContents* web_contents, + SkColor initial_color) + : web_contents_(web_contents) { + panel_.reset([[ColorPanelCocoa alloc] initWithChooser:this]); + [panel_ setColor:gfx::SkColorToDeviceNSColor(initial_color)]; + [[NSColorPanel sharedColorPanel] makeKeyAndOrderFront:nil]; +} + +ColorChooserMac::~ColorChooserMac() { + // Always call End() before destroying. + DCHECK(!panel_); +} + +void ColorChooserMac::DidChooseColorInColorPanel(SkColor color) { + if (web_contents_) + web_contents_->DidChooseColorInColorChooser(color); +} + +void ColorChooserMac::DidCloseColorPabel() { + End(); +} + +void ColorChooserMac::End() { + panel_.reset(); + DCHECK(current_color_chooser_ == this); + current_color_chooser_ = NULL; + if (web_contents_) + web_contents_->DidEndColorChooser(); +} + +void ColorChooserMac::SetSelectedColor(SkColor color) { + [panel_ setColor:gfx::SkColorToDeviceNSColor(color)]; +} + +@implementation ColorPanelCocoa + +- (id)initWithChooser:(ColorChooserMac*)chooser { + if ((self = [super init])) { + chooser_ = chooser; + NSColorPanel* panel = [NSColorPanel sharedColorPanel]; + [panel setShowsAlpha:NO]; + [panel setDelegate:self]; + [panel setTarget:self]; + [panel setAction:@selector(didChooseColor:)]; + } + return self; +} + +- (void)dealloc { + NSColorPanel* panel = [NSColorPanel sharedColorPanel]; + if ([panel delegate] == self) { + [panel setDelegate:nil]; + [panel setTarget:nil]; + [panel setAction:nil]; + } + + [super dealloc]; +} + +- (void)windowWillClose:(NSNotification*)notification { + nonUserChange_ = NO; + chooser_->DidCloseColorPabel(); +} + +- (void)didChooseColor:(NSColorPanel*)panel { + if (nonUserChange_) { + nonUserChange_ = NO; + return; + } + chooser_->DidChooseColorInColorPanel(gfx::NSDeviceColorToSkColor( + [[panel color] colorUsingColorSpaceName:NSDeviceRGBColorSpace])); + nonUserChange_ = NO; +} + +- (void)setColor:(NSColor*)color { + nonUserChange_ = YES; + [[NSColorPanel sharedColorPanel] setColor:color]; +} + +namespace chrome { + +content::ColorChooser* ShowColorChooser(content::WebContents* web_contents, + SkColor initial_color) { + return ColorChooserMac::Open(web_contents, initial_color); +} + +} // namepace chrome + +@end