| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.h" | 5 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.h" |
| 6 | 6 |
| 7 #include "base/mac/bundle_locations.h" | 7 #include "base/mac/bundle_locations.h" |
| 8 #include "base/mac/mac_util.h" | 8 #include "base/mac/mac_util.h" |
| 9 #include "base/strings/sys_string_conversions.h" | 9 #include "base/strings/sys_string_conversions.h" |
| 10 #include "chrome/browser/bookmarks/bookmark_model.h" | 10 #include "chrome/browser/bookmarks/bookmark_model.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 static ChooseAnotherFolder* object = nil; | 44 static ChooseAnotherFolder* object = nil; |
| 45 if (!object) { | 45 if (!object) { |
| 46 object = [[ChooseAnotherFolder alloc] init]; | 46 object = [[ChooseAnotherFolder alloc] init]; |
| 47 } | 47 } |
| 48 return object; | 48 return object; |
| 49 } | 49 } |
| 50 | 50 |
| 51 - (id)initWithParentWindow:(NSWindow*)parentWindow | 51 - (id)initWithParentWindow:(NSWindow*)parentWindow |
| 52 model:(BookmarkModel*)model | 52 model:(BookmarkModel*)model |
| 53 node:(const BookmarkNode*)node | 53 node:(const BookmarkNode*)node |
| 54 alreadyBookmarked:(BOOL)alreadyBookmarked { | 54 alreadyBookmarked:(BOOL)alreadyBookmarked { |
| 55 DCHECK(model); |
| 56 DCHECK(node); |
| 55 if ((self = [super initWithWindowNibPath:@"BookmarkBubble" | 57 if ((self = [super initWithWindowNibPath:@"BookmarkBubble" |
| 56 parentWindow:parentWindow | 58 parentWindow:parentWindow |
| 57 anchoredAt:NSZeroPoint])) { | 59 anchoredAt:NSZeroPoint])) { |
| 58 model_ = model; | 60 model_ = model; |
| 59 node_ = node; | 61 node_ = node; |
| 60 alreadyBookmarked_ = alreadyBookmarked; | 62 alreadyBookmarked_ = alreadyBookmarked; |
| 61 } | 63 } |
| 62 return self; | 64 return self; |
| 63 } | 65 } |
| 64 | 66 |
| 65 - (void)awakeFromNib { | 67 - (void)awakeFromNib { |
| 66 [super awakeFromNib]; | 68 [super awakeFromNib]; |
| 67 | 69 |
| 68 [[nameTextField_ cell] setUsesSingleLineMode:YES]; | 70 [[nameTextField_ cell] setUsesSingleLineMode:YES]; |
| 69 } | 71 } |
| 70 | 72 |
| 71 // If this is a new bookmark somewhere visible (e.g. on the bookmark | 73 // If this is a new bookmark somewhere visible (e.g. on the bookmark |
| 72 // bar), pulse it. Else, call ourself recursively with our parent | 74 // bar), pulse it. Else, call ourself recursively with our parent |
| 73 // until we find something visible to pulse. | 75 // until we find something visible to pulse. |
| 74 - (void)startPulsingBookmarkButton:(const BookmarkNode*)node { | 76 - (void)startPulsingBookmarkButton:(const BookmarkNode*)node { |
| 75 while (node) { | 77 while (node) { |
| 76 if ((node->parent() == model_->bookmark_bar_node()) || | 78 if ((node->parent() == model_->bookmark_bar_node()) || |
| 77 (node == model_->other_node())) { | 79 (node == model_->other_node())) { |
| 78 pulsingBookmarkNode_ = node; | 80 pulsingBookmarkNode_ = node; |
| 81 bookmarkObserver_->StartObservingNode(pulsingBookmarkNode_); |
| 79 NSValue *value = [NSValue valueWithPointer:node]; | 82 NSValue *value = [NSValue valueWithPointer:node]; |
| 80 NSDictionary *dict = [NSDictionary | 83 NSDictionary *dict = [NSDictionary |
| 81 dictionaryWithObjectsAndKeys:value, | 84 dictionaryWithObjectsAndKeys:value, |
| 82 bookmark_button::kBookmarkKey, | 85 bookmark_button::kBookmarkKey, |
| 83 [NSNumber numberWithBool:YES], | 86 [NSNumber numberWithBool:YES], |
| 84 bookmark_button::kBookmarkPulseFlagKey, | 87 bookmark_button::kBookmarkPulseFlagKey, |
| 85 nil]; | 88 nil]; |
| 86 [[NSNotificationCenter defaultCenter] | 89 [[NSNotificationCenter defaultCenter] |
| 87 postNotificationName:bookmark_button::kPulseBookmarkButtonNotification | 90 postNotificationName:bookmark_button::kPulseBookmarkButtonNotification |
| 88 object:self | 91 object:self |
| 89 userInfo:dict]; | 92 userInfo:dict]; |
| 90 return; | 93 return; |
| 91 } | 94 } |
| 92 node = node->parent(); | 95 node = node->parent(); |
| 93 } | 96 } |
| 94 } | 97 } |
| 95 | 98 |
| 96 - (void)stopPulsingBookmarkButton { | 99 - (void)stopPulsingBookmarkButton { |
| 97 if (!pulsingBookmarkNode_) | 100 if (!pulsingBookmarkNode_) |
| 98 return; | 101 return; |
| 99 NSValue *value = [NSValue valueWithPointer:pulsingBookmarkNode_]; | 102 NSValue *value = [NSValue valueWithPointer:pulsingBookmarkNode_]; |
| 103 if (bookmarkObserver_) |
| 104 bookmarkObserver_->StopObservingNode(pulsingBookmarkNode_); |
| 100 pulsingBookmarkNode_ = NULL; | 105 pulsingBookmarkNode_ = NULL; |
| 101 NSDictionary *dict = [NSDictionary | 106 NSDictionary *dict = [NSDictionary |
| 102 dictionaryWithObjectsAndKeys:value, | 107 dictionaryWithObjectsAndKeys:value, |
| 103 bookmark_button::kBookmarkKey, | 108 bookmark_button::kBookmarkKey, |
| 104 [NSNumber numberWithBool:NO], | 109 [NSNumber numberWithBool:NO], |
| 105 bookmark_button::kBookmarkPulseFlagKey, | 110 bookmark_button::kBookmarkPulseFlagKey, |
| 106 nil]; | 111 nil]; |
| 107 [[NSNotificationCenter defaultCenter] | 112 [[NSNotificationCenter defaultCenter] |
| 108 postNotificationName:bookmark_button::kPulseBookmarkButtonNotification | 113 postNotificationName:bookmark_button::kPulseBookmarkButtonNotification |
| 109 object:self | 114 object:self |
| 110 userInfo:dict]; | 115 userInfo:dict]; |
| 111 } | 116 } |
| 112 | 117 |
| 113 // Close the bookmark bubble without changing anything. Unlike a | 118 // Close the bookmark bubble without changing anything. Unlike a |
| 114 // typical dialog's OK/Cancel, where Cancel is "do nothing", all | 119 // typical dialog's OK/Cancel, where Cancel is "do nothing", all |
| 115 // buttons on the bubble have the capacity to change the bookmark | 120 // buttons on the bubble have the capacity to change the bookmark |
| 116 // model. This is an IBOutlet-looking entry point to remove the | 121 // model. This is an IBOutlet-looking entry point to remove the |
| 117 // dialog without touching the model. | 122 // dialog without touching the model. |
| 118 - (void)dismissWithoutEditing:(id)sender { | 123 - (void)dismissWithoutEditing:(id)sender { |
| 119 [self close]; | 124 [self close]; |
| 120 } | 125 } |
| 121 | 126 |
| 122 - (void)windowWillClose:(NSNotification*)notification { | 127 - (void)windowWillClose:(NSNotification*)notification { |
| 123 // We caught a close so we don't need to watch for the parent closing. | 128 // We caught a close so we don't need to watch for the parent closing. |
| 124 bookmark_observer_.reset(NULL); | 129 bookmarkObserver_.reset(); |
| 125 [self stopPulsingBookmarkButton]; | 130 [self stopPulsingBookmarkButton]; |
| 126 [super windowWillClose:notification]; | 131 [super windowWillClose:notification]; |
| 127 } | 132 } |
| 128 | 133 |
| 129 // Override -[BaseBubbleController showWindow:] to tweak bubble location and | 134 // Override -[BaseBubbleController showWindow:] to tweak bubble location and |
| 130 // set up UI elements. | 135 // set up UI elements. |
| 131 - (void)showWindow:(id)sender { | 136 - (void)showWindow:(id)sender { |
| 132 NSWindow* window = [self window]; // Force load the NIB. | 137 NSWindow* window = [self window]; // Force load the NIB. |
| 133 NSWindow* parentWindow = self.parentWindow; | 138 NSWindow* parentWindow = self.parentWindow; |
| 134 BrowserWindowController* bwc = | 139 BrowserWindowController* bwc = |
| (...skipping 21 matching lines...) Expand all Loading... |
| 156 l10n_util::GetNSString(IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARKED); | 161 l10n_util::GetNSString(IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARKED); |
| 157 [bigTitle_ setStringValue:title]; | 162 [bigTitle_ setStringValue:title]; |
| 158 } | 163 } |
| 159 | 164 |
| 160 [self fillInFolderList]; | 165 [self fillInFolderList]; |
| 161 | 166 |
| 162 // Ping me when things change out from under us. Unlike a normal | 167 // Ping me when things change out from under us. Unlike a normal |
| 163 // dialog, the bookmark bubble's cancel: means "don't add this as a | 168 // dialog, the bookmark bubble's cancel: means "don't add this as a |
| 164 // bookmark", not "cancel editing". We must take extra care to not | 169 // bookmark", not "cancel editing". We must take extra care to not |
| 165 // touch the bookmark in this selector. | 170 // touch the bookmark in this selector. |
| 166 bookmark_observer_.reset(new BookmarkModelObserverForCocoa( | 171 bookmarkObserver_.reset(new BookmarkModelObserverForCocoa( |
| 167 node_, model_, | 172 model_, |
| 168 self, | 173 ^(BOOL nodeWasDeleted) { |
| 169 @selector(dismissWithoutEditing:))); | 174 // If a watched node was deleted, the pointer to the pulsing button |
| 175 // is likely stale. |
| 176 if (nodeWasDeleted) |
| 177 pulsingBookmarkNode_ = NULL; |
| 178 [self dismissWithoutEditing:nil]; |
| 179 })); |
| 180 bookmarkObserver_->StartObservingNode(node_); |
| 170 | 181 |
| 171 // Pulse something interesting on the bookmark bar. | 182 // Pulse something interesting on the bookmark bar. |
| 172 [self startPulsingBookmarkButton:node_]; | 183 [self startPulsingBookmarkButton:node_]; |
| 173 | 184 |
| 174 [parentWindow addChildWindow:window ordered:NSWindowAbove]; | 185 [parentWindow addChildWindow:window ordered:NSWindowAbove]; |
| 175 [window makeKeyAndOrderFront:self]; | 186 [window makeKeyAndOrderFront:self]; |
| 176 [self registerKeyStateEventTap]; | 187 [self registerKeyStateEventTap]; |
| 177 } | 188 } |
| 178 | 189 |
| 179 - (void)close { | 190 - (void)close { |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 NSInteger idx = [menu indexOfItemWithRepresentedObject:parentValue]; | 363 NSInteger idx = [menu indexOfItemWithRepresentedObject:parentValue]; |
| 353 DCHECK(idx != -1); | 364 DCHECK(idx != -1); |
| 354 [folderPopUpButton_ selectItemAtIndex:idx]; | 365 [folderPopUpButton_ selectItemAtIndex:idx]; |
| 355 } | 366 } |
| 356 | 367 |
| 357 - (NSPopUpButton*)folderPopUpButton { | 368 - (NSPopUpButton*)folderPopUpButton { |
| 358 return folderPopUpButton_; | 369 return folderPopUpButton_; |
| 359 } | 370 } |
| 360 | 371 |
| 361 @end // implementation BookmarkBubbleController(ExposedForUnitTesting) | 372 @end // implementation BookmarkBubbleController(ExposedForUnitTesting) |
| OLD | NEW |