OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 #include "app/l10n_util.h" | 5 #include "app/l10n_util.h" |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 #include "base/mac_util.h" | 7 #include "base/mac_util.h" |
8 #include "base/sys_string_conversions.h" | 8 #include "base/sys_string_conversions.h" |
9 #include "chrome/browser/bookmarks/bookmark_editor.h" | 9 #include "chrome/browser/bookmarks/bookmark_editor.h" |
10 #include "chrome/browser/bookmarks/bookmark_model.h" | 10 #include "chrome/browser/bookmarks/bookmark_model.h" |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 [folderBrowser_ setDoubleAction:@selector(browserDoubleClicked:)]; | 165 [folderBrowser_ setDoubleAction:@selector(browserDoubleClicked:)]; |
166 } | 166 } |
167 | 167 |
168 - (void)windowDidLoad { | 168 - (void)windowDidLoad { |
169 if (configuration_ == BookmarkEditor::SHOW_TREE) { | 169 if (configuration_ == BookmarkEditor::SHOW_TREE) { |
170 // Find and select the |parent| bookmark node in the folder tree browser. | 170 // Find and select the |parent| bookmark node in the folder tree browser. |
171 [self selectNodeInBrowser:parentNode_]; | 171 [self selectNodeInBrowser:parentNode_]; |
172 } | 172 } |
173 } | 173 } |
174 | 174 |
| 175 - (void)windowWillClose:(NSNotification *)notification { |
| 176 // If a folder name cell is being edited then force it to end editing |
| 177 // so that any changes are recorded. |
| 178 [[self window] makeFirstResponder:nil]; |
| 179 |
| 180 // This is probably unnecessary but it feels cleaner since the |
| 181 // delegate of a text field can be automatically registered for |
| 182 // notifications. |
| 183 [nameField_ setDelegate:nil]; |
| 184 [urlField_ setDelegate:nil]; |
| 185 [self autorelease]; |
| 186 } |
| 187 |
175 /* TODO(jrg): | 188 /* TODO(jrg): |
176 // Implementing this informal protocol allows us to open the sheet | 189 // Implementing this informal protocol allows us to open the sheet |
177 // somewhere other than at the top of the window. NOTE: this means | 190 // somewhere other than at the top of the window. NOTE: this means |
178 // that I, the controller, am also the window's delegate. | 191 // that I, the controller, am also the window's delegate. |
179 - (NSRect)window:(NSWindow*)window willPositionSheet:(NSWindow*)sheet | 192 - (NSRect)window:(NSWindow*)window willPositionSheet:(NSWindow*)sheet |
180 usingRect:(NSRect)rect { | 193 usingRect:(NSRect)rect { |
181 // adjust rect.origin.y to be the bottom of the toolbar | 194 // adjust rect.origin.y to be the bottom of the toolbar |
182 return rect; | 195 return rect; |
183 } | 196 } |
184 */ | 197 */ |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 } | 254 } |
242 | 255 |
243 #pragma mark New Folder Handler & Folder Cell Editing | 256 #pragma mark New Folder Handler & Folder Cell Editing |
244 | 257 |
245 - (void)editFolderNameInCell:(BookmarkTreeBrowserCell*)cell { | 258 - (void)editFolderNameInCell:(BookmarkTreeBrowserCell*)cell { |
246 DCHECK([cell isKindOfClass:[BookmarkTreeBrowserCell class]]); | 259 DCHECK([cell isKindOfClass:[BookmarkTreeBrowserCell class]]); |
247 [cell setEditable:YES]; | 260 [cell setEditable:YES]; |
248 [cell setTarget:self]; | 261 [cell setTarget:self]; |
249 [cell setAction:@selector(cellEditingCompleted:)]; | 262 [cell setAction:@selector(cellEditingCompleted:)]; |
250 [cell setSendsActionOnEndEditing:YES]; | 263 [cell setSendsActionOnEndEditing:YES]; |
251 currentEditCell_.reset([cell retain]); | |
252 NSMatrix* matrix = [cell matrix]; | 264 NSMatrix* matrix = [cell matrix]; |
253 // Set the delegate so that we get called when editing wants to complete. | 265 // Set the delegate so that we get called when editing wants to complete. |
254 [matrix setDelegate:self]; | 266 [matrix setDelegate:self]; |
255 [matrix selectText:self]; | 267 [matrix selectText:self]; |
256 } | 268 } |
257 | 269 |
258 - (void)cellEditingCompleted:(id)sender { | 270 - (void)cellEditingCompleted:(id)sender { |
259 DCHECK([sender isKindOfClass:[NSMatrix class]]); | 271 DCHECK([sender isKindOfClass:[NSMatrix class]]); |
260 BookmarkTreeBrowserCell* cell = [sender selectedCell]; | 272 BookmarkTreeBrowserCell* cell = [sender selectedCell]; |
261 DCHECK([cell isKindOfClass:[BookmarkTreeBrowserCell class]]); | 273 DCHECK([cell isKindOfClass:[BookmarkTreeBrowserCell class]]); |
262 [self saveFolderNameForCell:cell]; | 274 [self saveFolderNameForCell:cell]; |
263 } | 275 } |
264 | 276 |
265 - (void)saveFolderNameForCell:(BookmarkTreeBrowserCell*)cell { | 277 - (void)saveFolderNameForCell:(BookmarkTreeBrowserCell*)cell { |
266 DCHECK([cell isKindOfClass:[BookmarkTreeBrowserCell class]]); | 278 DCHECK([cell isKindOfClass:[BookmarkTreeBrowserCell class]]); |
267 // It's possible that the cell can get reused so clean things up | 279 // It's possible that the cell can get reused so clean things up |
268 // to prevent inadvertant notifications. | 280 // to prevent inadvertant notifications. |
269 [cell setTarget:nil]; | 281 [cell setTarget:nil]; |
270 [cell setAction:nil]; | 282 [cell setAction:nil]; |
271 [cell setEditable:NO]; | 283 [cell setEditable:NO]; |
272 [cell setSendsActionOnEndEditing:NO]; | 284 [cell setSendsActionOnEndEditing:NO]; |
273 // Force a responder change here to force the editing of the cell's text | 285 // Force a responder change here to force the editing of the cell's text |
274 // to complete otherwise the call to -[cell title] could return stale text. | 286 // to complete otherwise the call to -[cell title] could return stale text. |
275 [[folderBrowser_ window] makeFirstResponder:folderBrowser_]; | 287 [[folderBrowser_ window] makeFirstResponder:folderBrowser_]; |
276 const BookmarkNode* bookmarkNode = [cell bookmarkNode]; | 288 const BookmarkNode* bookmarkNode = [cell bookmarkNode]; |
277 BookmarkModel* model = profile_->GetBookmarkModel(); | 289 BookmarkModel* model = profile_->GetBookmarkModel(); |
278 NSString* newTitle = [cell title]; | 290 NSString* newTitle = [cell title]; |
279 model->SetTitle(bookmarkNode, base::SysNSStringToWide(newTitle)); | 291 model->SetTitle(bookmarkNode, base::SysNSStringToWide(newTitle)); |
280 currentEditCell_.reset(); | |
281 } | 292 } |
282 | 293 |
283 - (void)browserDoubleClicked:(id)sender { | 294 - (void)browserDoubleClicked:(id)sender { |
284 BookmarkTreeBrowserCell* cell = [folderBrowser_ selectedCell]; | 295 BookmarkTreeBrowserCell* cell = [folderBrowser_ selectedCell]; |
285 DCHECK([cell isKindOfClass:[BookmarkTreeBrowserCell class]]); | 296 DCHECK([cell isKindOfClass:[BookmarkTreeBrowserCell class]]); |
286 [self editFolderNameInCell:cell]; | 297 [self editFolderNameInCell:cell]; |
287 } | 298 } |
288 | 299 |
289 - (IBAction)newFolder:(id)sender { | 300 - (IBAction)newFolder:(id)sender { |
290 BookmarkModel* model = profile_->GetBookmarkModel(); | 301 BookmarkModel* model = profile_->GetBookmarkModel(); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 [NSApp endSheet:[self window]]; | 372 [NSApp endSheet:[self window]]; |
362 } | 373 } |
363 | 374 |
364 - (IBAction)cancel:(id)sender { | 375 - (IBAction)cancel:(id)sender { |
365 [NSApp endSheet:[self window]]; | 376 [NSApp endSheet:[self window]]; |
366 } | 377 } |
367 | 378 |
368 - (void)didEndSheet:(NSWindow*)sheet | 379 - (void)didEndSheet:(NSWindow*)sheet |
369 returnCode:(int)returnCode | 380 returnCode:(int)returnCode |
370 contextInfo:(void*)contextInfo { | 381 contextInfo:(void*)contextInfo { |
371 // If a folder name cell is being edited then force it to end editing | 382 [sheet close]; |
372 // so that any changes are recorded. | |
373 BookmarkTreeBrowserCell* currentEditCell = currentEditCell_.get(); | |
374 if (currentEditCell) { | |
375 [self saveFolderNameForCell:currentEditCell]; | |
376 currentEditCell_.reset(); | |
377 } | |
378 // This is probably unnecessary but it feels cleaner since the | |
379 // delegate of a text field can be automatically registered for | |
380 // notifications. | |
381 [nameField_ setDelegate:nil]; | |
382 [urlField_ setDelegate:nil]; | |
383 | |
384 [[self window] orderOut:self]; | |
385 | |
386 // BookmarkEditor::Show() will create us then run away. Unusually | |
387 // for a controller, we are responsible for deallocating ourself. | |
388 [self autorelease]; | |
389 } | 383 } |
390 | 384 |
391 #pragma mark For Unit Test Use Only | 385 #pragma mark For Unit Test Use Only |
392 | 386 |
393 - (NSString*)displayName { | 387 - (NSString*)displayName { |
394 return [nameField_ stringValue]; | 388 return [nameField_ stringValue]; |
395 } | 389 } |
396 | 390 |
397 - (NSString*)displayURL { | 391 - (NSString*)displayURL { |
398 return [urlField_ stringValue]; | 392 return [urlField_ stringValue]; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 DCHECK(childNode); | 457 DCHECK(childNode); |
464 BookmarkTreeBrowserCell* browserCell = | 458 BookmarkTreeBrowserCell* browserCell = |
465 static_cast<BookmarkTreeBrowserCell*>(cell); | 459 static_cast<BookmarkTreeBrowserCell*>(cell); |
466 [browserCell setTitle:base::SysWideToNSString(childNode->GetTitle())]; | 460 [browserCell setTitle:base::SysWideToNSString(childNode->GetTitle())]; |
467 [browserCell setBookmarkNode:childNode]; | 461 [browserCell setBookmarkNode:childNode]; |
468 [browserCell setMatrix:[folderBrowser_ matrixInColumn:column]]; | 462 [browserCell setMatrix:[folderBrowser_ matrixInColumn:column]]; |
469 } | 463 } |
470 | 464 |
471 @end // BookmarkEditorController | 465 @end // BookmarkEditorController |
472 | 466 |
OLD | NEW |