| Index: chrome/browser/ui/cocoa/create_application_shortcut_cocoa.mm
|
| diff --git a/chrome/browser/ui/cocoa/create_application_shortcut_cocoa.mm b/chrome/browser/ui/cocoa/create_application_shortcut_cocoa.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1a064725da102ab1549d08f963a1ce29b71cf1a0
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/cocoa/create_application_shortcut_cocoa.mm
|
| @@ -0,0 +1,135 @@
|
| +// Copyright 2016 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 <Cocoa/Cocoa.h>
|
| +
|
| +#import "base/mac/scoped_nsobject.h"
|
| +#import "chrome/browser/web_applications/web_app_mac.h"
|
| +#import "ui/base/l10n/l10n_util_mac.h"
|
| +#include "base/bind.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/ui/cocoa/key_equivalent_constants.h"
|
| +#include "chrome/grit/generated_resources.h"
|
| +#include "grit/components_strings.h"
|
| +#include "ui/gfx/image/image.h"
|
| +
|
| +@interface CrCreateAppShortcutCheckboxObserver : NSObject {
|
| + @private
|
| + NSButton* checkbox_;
|
| + NSButton* continueButton_;
|
| +}
|
| +
|
| +- (id)initWithCheckbox:(NSButton*)checkbox
|
| + continueButton:(NSButton*)continueButton;
|
| +- (void)startObserving;
|
| +- (void)stopObserving;
|
| +@end
|
| +
|
| +@implementation CrCreateAppShortcutCheckboxObserver
|
| +
|
| +- (id)initWithCheckbox:(NSButton*)checkbox
|
| + continueButton:(NSButton*)continueButton {
|
| + if ((self = [super init])) {
|
| + checkbox_ = checkbox;
|
| + continueButton_ = continueButton;
|
| + }
|
| + return self;
|
| +}
|
| +
|
| +- (void)startObserving {
|
| + [checkbox_ addObserver:self forKeyPath:@"cell.state" options:0 context:nil];
|
| +}
|
| +
|
| +- (void)stopObserving {
|
| + [checkbox_ removeObserver:self forKeyPath:@"cell.state"];
|
| +}
|
| +
|
| +- (void)observeValueForKeyPath:(NSString*)keyPath
|
| + ofObject:(id)object
|
| + change:(NSDictionary*)change
|
| + context:(void*)context {
|
| + [continueButton_ setEnabled:([checkbox_ state] == NSOnState)];
|
| +}
|
| +
|
| +@end
|
| +
|
| +namespace {
|
| +
|
| +// Called when the app's ShortcutInfo (with icon) is loaded when creating app
|
| +// shortcuts.
|
| +void CreateAppShortcutInfoLoaded(
|
| + Profile* profile,
|
| + const extensions::Extension* app,
|
| + const base::Callback<void(bool)>& close_callback,
|
| + std::unique_ptr<web_app::ShortcutInfo> shortcut_info) {
|
| + base::scoped_nsobject<NSAlert> alert([[NSAlert alloc] init]);
|
| +
|
| + NSButton* continue_button = [alert
|
| + addButtonWithTitle:l10n_util::GetNSString(IDS_CREATE_SHORTCUTS_COMMIT)];
|
| + [continue_button setKeyEquivalent:kKeyEquivalentReturn];
|
| +
|
| + NSButton* cancel_button =
|
| + [alert addButtonWithTitle:l10n_util::GetNSString(IDS_CANCEL)];
|
| + [cancel_button setKeyEquivalent:kKeyEquivalentEscape];
|
| +
|
| + [alert setMessageText:l10n_util::GetNSString(IDS_CREATE_SHORTCUTS_LABEL)];
|
| + [alert setAlertStyle:NSInformationalAlertStyle];
|
| +
|
| + base::scoped_nsobject<NSButton> application_folder_checkbox(
|
| + [[NSButton alloc] initWithFrame:NSZeroRect]);
|
| + [application_folder_checkbox setButtonType:NSSwitchButton];
|
| + [application_folder_checkbox
|
| + setTitle:l10n_util::GetNSString(IDS_CREATE_SHORTCUTS_APP_FOLDER_CHKBOX)];
|
| + [application_folder_checkbox setState:NSOnState];
|
| + [application_folder_checkbox sizeToFit];
|
| +
|
| + base::scoped_nsobject<CrCreateAppShortcutCheckboxObserver> checkbox_observer(
|
| + [[CrCreateAppShortcutCheckboxObserver alloc]
|
| + initWithCheckbox:application_folder_checkbox
|
| + continueButton:continue_button]);
|
| + [checkbox_observer startObserving];
|
| +
|
| + [alert setAccessoryView:application_folder_checkbox];
|
| +
|
| + const int kIconPreviewSizePixels = 128;
|
| + const int kIconPreviewTargetSize = 64;
|
| + const gfx::Image* icon = shortcut_info->favicon.GetBest(
|
| + kIconPreviewSizePixels, kIconPreviewSizePixels);
|
| +
|
| + if (icon && !icon->IsEmpty()) {
|
| + NSImage* icon_image = icon->ToNSImage();
|
| + [icon_image
|
| + setSize:NSMakeSize(kIconPreviewTargetSize, kIconPreviewTargetSize)];
|
| + [alert setIcon:icon_image];
|
| + }
|
| +
|
| + bool dialog_accepted = false;
|
| + if ([alert runModal] == NSAlertFirstButtonReturn &&
|
| + [application_folder_checkbox state] == NSOnState) {
|
| + dialog_accepted = true;
|
| + CreateShortcuts(web_app::SHORTCUT_CREATION_BY_USER,
|
| + web_app::ShortcutLocations(), profile, app);
|
| + }
|
| +
|
| + [checkbox_observer stopObserving];
|
| +
|
| + if (!close_callback.is_null())
|
| + close_callback.Run(dialog_accepted);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace chrome {
|
| +
|
| +void ShowCreateChromeAppShortcutsDialog(
|
| + gfx::NativeWindow /*parent_window*/,
|
| + Profile* profile,
|
| + const extensions::Extension* app,
|
| + const base::Callback<void(bool)>& close_callback) {
|
| + web_app::GetShortcutInfoForApp(
|
| + app, profile,
|
| + base::Bind(&CreateAppShortcutInfoLoaded, profile, app, close_callback));
|
| +}
|
| +
|
| +} // namespace chrome
|
|
|