Chromium Code Reviews| Index: remoting/host/continue_window_mac.mm |
| diff --git a/remoting/host/continue_window_mac.mm b/remoting/host/continue_window_mac.mm |
| index 6567cc378c2eca53c13299fb5f8fd734bf203ed8..2c8796c726edf2f81eac7e04f31a6995c540fb08 100644 |
| --- a/remoting/host/continue_window_mac.mm |
| +++ b/remoting/host/continue_window_mac.mm |
| @@ -13,46 +13,77 @@ |
| #include "base/sys_string_conversions.h" |
| #include "remoting/host/chromoting_host.h" |
| -// As this is a plugin, there needs to be a way to find its bundle |
| -// so that resources are able to be found. This class exists solely so that |
| -// there is a way to get the bundle that this code file is in using |
| -// [NSBundle bundleForClass:[ContinueWindowMacClassToLocateMyBundle class]] |
| -// It is really only a name. |
| -@interface ContinueWindowMacClassToLocateMyBundle : NSObject |
| -@end |
| +// Handles the ContinueWindow. |
| +@interface ContinueWindowMacController : NSObject { |
| + @private |
| + scoped_nsobject<NSMutableArray> shades_; |
| + scoped_nsobject<NSAlert> continue_alert_; |
| + remoting::ChromotingHost* host_; |
| +} |
| -@implementation ContinueWindowMacClassToLocateMyBundle |
| +- (id)initWithHost:(remoting::ChromotingHost*)host; |
| +- (void)show; |
| +- (void)hide; |
| +- (void)onCancel:(id)sender; |
| +- (void)onContinue:(id)sender; |
| @end |
| namespace remoting { |
| +// A bridge between C++ and ObjC implementations of ContinueWindow. |
| +// Everything important occurs in ContinueWindowMacController. |
| class ContinueWindowMac : public remoting::ContinueWindow { |
| public: |
| - ContinueWindowMac() : modal_session_(NULL) {} |
| + ContinueWindowMac() {} |
| virtual ~ContinueWindowMac() {} |
| virtual void Show(remoting::ChromotingHost* host) OVERRIDE; |
| virtual void Hide() OVERRIDE; |
| private: |
| - NSModalSession modal_session_; |
| + scoped_nsobject<ContinueWindowMacController> controller_; |
| DISALLOW_COPY_AND_ASSIGN(ContinueWindowMac); |
| }; |
| void ContinueWindowMac::Show(remoting::ChromotingHost* host) { |
| base::mac::ScopedNSAutoreleasePool pool; |
| + controller_.reset([[ContinueWindowMacController alloc] initWithHost:host]); |
| + [controller_ show]; |
| + |
| +} |
| + |
| +void ContinueWindowMac::Hide() { |
| + base::mac::ScopedNSAutoreleasePool pool; |
| + [controller_ hide]; |
| +} |
| +ContinueWindow* ContinueWindow::Create() { |
| + return new ContinueWindowMac(); |
| +} |
| + |
| +} // namespace remoting |
| + |
| +@implementation ContinueWindowMacController |
| + |
| +- (id)initWithHost:(remoting::ChromotingHost*)host { |
| + if ((self = [super init])) { |
| + host_ = host; |
| + } |
| + return self; |
| +} |
| + |
| +- (void)show { |
| // Generate window shade |
| NSArray* screens = [NSScreen screens]; |
| - NSMutableArray* windows = [NSMutableArray arrayWithCapacity:[screens count]]; |
| + shades_.reset([[NSMutableArray alloc] initWithCapacity:[screens count]]); |
| for (NSScreen *screen in screens) { |
| NSWindow* window = |
|
Jamie
2011/11/01 20:56:20
Should this be renamed |shade| for consistency?
|
| - [[[NSWindow alloc] initWithContentRect:[screen frame] |
| - styleMask:NSBorderlessWindowMask |
| + [[[NSWindow alloc] initWithContentRect:[screen frame] |
| + styleMask:NSBorderlessWindowMask |
| backing:NSBackingStoreBuffered |
| - defer:NO |
| - screen:screen] autorelease]; |
| + defer:NO |
| + screen:screen] autorelease]; |
| [window setReleasedWhenClosed:NO]; |
| [window setAlphaValue:0.8]; |
| [window setOpaque:NO]; |
| @@ -62,68 +93,64 @@ void ContinueWindowMac::Show(remoting::ChromotingHost* host) { |
| // of control (like they can quit Chromium). |
| [window setLevel:NSModalPanelWindowLevel - 1]; |
| [window orderFront:nil]; |
| - [windows addObject:window]; |
| + [shades_ addObject:window]; |
| } |
| - // Put up alert |
| - const UiStrings& strings = host->ui_strings(); |
| + // Create alert. |
| + const remoting::UiStrings& strings = host_->ui_strings(); |
| NSString* message = base::SysUTF16ToNSString(strings.continue_prompt); |
| - NSString* continue_button = base::SysUTF16ToNSString( |
| + NSString* continue_button_string = base::SysUTF16ToNSString( |
| strings.continue_button_text); |
| - NSString* cancel_button = base::SysUTF16ToNSString( |
| + NSString* cancel_button_string = base::SysUTF16ToNSString( |
| strings.stop_sharing_button_text); |
| - scoped_nsobject<NSAlert> continue_alert([[NSAlert alloc] init]); |
| - [continue_alert setMessageText:message]; |
| - [continue_alert addButtonWithTitle:continue_button]; |
| - [continue_alert addButtonWithTitle:cancel_button]; |
| - |
| - // See ContinueWindowMacClassToLocateMyBundle class above for details |
| - // on this. |
| - NSBundle *bundle = |
| - [NSBundle bundleForClass:[ContinueWindowMacClassToLocateMyBundle class]]; |
| + continue_alert_.reset([[NSAlert alloc] init]); |
| + [continue_alert_ setMessageText:message]; |
| + |
| + NSButton* continue_button = |
| + [continue_alert_ addButtonWithTitle:continue_button_string]; |
| + [continue_button setAction:@selector(onContinue:)]; |
| + [continue_button setTarget:self]; |
| + |
| + NSButton* cancel_button = |
| + [continue_alert_ addButtonWithTitle:cancel_button_string]; |
| + [cancel_button setAction:@selector(onCancel:)]; |
| + [cancel_button setTarget:self]; |
| + |
| + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; |
| NSString *imagePath = [bundle pathForResource:@"chromoting128" ofType:@"png"]; |
| scoped_nsobject<NSImage> image( |
| [[NSImage alloc] initByReferencingFile:imagePath]); |
| - [continue_alert setIcon:image]; |
| - [continue_alert layout]; |
| + [continue_alert_ setIcon:image]; |
| + [continue_alert_ layout]; |
| - NSWindow* continue_window = [continue_alert window]; |
| + // Force alert to be at the proper level and location. |
| + NSWindow* continue_window = [continue_alert_ window]; |
| [continue_window center]; |
| + [continue_window setLevel:NSModalPanelWindowLevel]; |
| [continue_window orderWindow:NSWindowAbove |
| - relativeTo:[[windows lastObject] windowNumber]]; |
| + relativeTo:[[shades_ lastObject] windowNumber]]; |
| [continue_window makeKeyWindow]; |
| - NSApplication* application = [NSApplication sharedApplication]; |
| - modal_session_ = [application beginModalSessionForWindow:continue_window]; |
| - NSInteger answer = 0; |
| - do { |
| - answer = [application runModalSession:modal_session_]; |
| - } while (answer == NSRunContinuesResponse); |
| - [application endModalSession:modal_session_]; |
| - modal_session_ = NULL; |
| - |
| - [continue_window close]; |
| +} |
| +- (void)hide { |
| // Remove window shade. |
| - for (NSWindow* window in windows) { |
| + for (NSWindow* window in shades_.get()) { |
| [window close]; |
| } |
| - |
| - if (answer == NSAlertFirstButtonReturn) { |
| - host->PauseSession(false); |
| - } else { |
| - host->Shutdown(NULL); |
| - } |
| + shades_.reset(); |
| + continue_alert_.reset(); |
| } |
| -void ContinueWindowMac::Hide() { |
| - if (modal_session_) { |
| - NSApplication* application = [NSApplication sharedApplication]; |
| - [application stopModalWithCode:NSAlertFirstButtonReturn]; |
| - } |
| +- (void)onCancel:(id)sender { |
| + [self hide]; |
| + host_->Shutdown(NULL); |
| + host_ = nil; |
| } |
| -ContinueWindow* ContinueWindow::Create() { |
| - return new ContinueWindowMac(); |
| +- (void)onContinue:(id)sender { |
| + [self hide]; |
| + host_->PauseSession(false); |
| + host_ = nil; |
| } |
| -} // namespace remoting |
| +@end |