1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h" 6 7 #include "base/string16.h" 8 #include "base/sys_string_conversions.h" 9 #include "chrome/browser/bookmarks/bookmark_model.h" 10 #include "ui/base/l10n/l10n_util.h" 11 12 @interface BookmarkEditorController (Private) 13 14 // Grab the url from the text field and convert. 15 - (GURL)GURLFromUrlField; 16 17 @end 18 19 @implementation BookmarkEditorController 20 21 @synthesize displayURL = displayURL_; 22 23 + (NSSet*)keyPathsForValuesAffectingOkEnabled { 24 return [NSSet setWithObject:@"displayURL"]; 25 } 26 27 - (id)initWithParentWindow:(NSWindow*)parentWindow 28 profile:(Profile*)profile 29 parent:(const BookmarkNode*)parent 30 node:(const BookmarkNode*)node 31 configuration:(BookmarkEditor::Configuration)configuration { 32 if ((self = [super initWithParentWindow:parentWindow 33 nibName:@"BookmarkEditor" 34 profile:profile 35 parent:parent 36 configuration:configuration])) { 37 // "Add Page..." has no "node" so this may be NULL. 38 node_ = node; 39 } 40 return self; 41 } 42 43 - (void)dealloc { 44 [displayURL_ release]; 45 [super dealloc]; 46 } 47 48 - (void)awakeFromNib { 49 // Set text fields to match our bookmark. If the node is NULL we 50 // arrived here from an "Add Page..." item in a context menu. 51 if (node_) { 52 [self setInitialName:base::SysUTF16ToNSString(node_->GetTitle())]; 53 std::string url_string = node_->GetURL().possibly_invalid_spec(); 54 initialUrl_.reset([[NSString stringWithUTF8String:url_string.c_str()] 55 retain]); 56 } else { 57 initialUrl_.reset([@"" retain]); 58 } 59 [self setDisplayURL:initialUrl_]; 60 [super awakeFromNib]; 61 } 62 63 - (void)nodeRemoved:(const BookmarkNode*)node 64 fromParent:(const BookmarkNode*)parent 65 { 66 // Be conservative; it is needed (e.g. "Add Page...") 67 node_ = NULL; 68 [self cancel:self]; 69 } 70 71 #pragma mark Bookmark Editing 72 73 // If possible, return a valid GURL from the URL text field. 74 - (GURL)GURLFromUrlField { 75 NSString* url = [self displayURL]; 76 GURL newURL = GURL([url UTF8String]); 77 if (!newURL.is_valid()) { 78 // Mimic observed friendliness from Windows 79 newURL = GURL([[NSString stringWithFormat:@"http://%@", url] UTF8String]); 80 } 81 return newURL; 82 } 83 84 // Enable the OK button if there is a valid URL. 85 - (BOOL)okEnabled { 86 BOOL okEnabled = NO; 87 if ([[self displayURL] length]) { 88 GURL newURL = [self GURLFromUrlField]; 89 okEnabled = (newURL.is_valid()) ? YES : NO; 90 } 91 if (okEnabled) 92 [urlField_ setBackgroundColor:[NSColor whiteColor]]; 93 else 94 [urlField_ setBackgroundColor:[NSColor colorWithCalibratedRed:1.0 95 green:0.67 96 blue:0.67 97 alpha:1.0]]; 98 return okEnabled; 99 } 100 101 // The the bookmark's URL is assumed to be valid (otherwise the OK button 102 // should not be enabled). Previously existing bookmarks for which the 103 // parent has not changed are updated in-place. Those for which the parent 104 // has changed are removed with a new node created under the new parent. 105 // Called by -[BookmarkEditorBaseController ok:]. 106 - (NSNumber*)didCommit { 107 NSString* name = [[self displayName] stringByTrimmingCharactersInSet: 108 [NSCharacterSet newlineCharacterSet]]; 109 string16 newTitle = base::SysNSStringToUTF16(name); 110 const BookmarkNode* newParentNode = [self selectedNode]; 111 GURL newURL = [self GURLFromUrlField]; 112 if (!newURL.is_valid()) { 113 // Shouldn't be reached -- OK button should be disabled if not valid! 114 NOTREACHED(); 115 return [NSNumber numberWithBool:NO]; 116 } 117 118 // Determine where the new/replacement bookmark is to go. 119 BookmarkModel* model = [self bookmarkModel]; 120 // If there was an old node then we update the node, and move it to its new 121 // parent if the parent has changed (rather than deleting it from the old 122 // parent and adding to the new -- which also prevents the 'poofing' that 123 // occurs when a node is deleted). 124 if (node_) { 125 model->SetURL(node_, newURL); 126 model->SetTitle(node_, newTitle); 127 const BookmarkNode* oldParentNode = [self parentNode]; 128 if (newParentNode != oldParentNode) 129 model->Move(node_, newParentNode, newParentNode->child_count()); 130 } else { 131 // Otherwise, add a new bookmark at the end of the newly selected folder. 132 model->AddURL(newParentNode, newParentNode->child_count(), newTitle, 133 newURL); 134 } 135 return [NSNumber numberWithBool:YES]; 136 } 137 138 - (NSColor *)urlFieldColor { 139 return [urlField_ backgroundColor]; 140 } 141 142 @end // BookmarkEditorController 143 144