1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 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 "components/strings/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
|