| // Copyright (c) 2011 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 "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h" |
| |
| #include "base/prefs/pref_service.h" |
| #include "base/strings/string16.h" |
| #include "base/strings/sys_string_conversions.h" |
| #include "chrome/browser/bookmarks/bookmark_expanded_state_tracker.h" |
| #include "chrome/browser/bookmarks/bookmark_model.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/bookmarks/bookmark_utils.h" |
| #include "chrome/common/net/url_fixer_upper.h" |
| #include "components/user_prefs/user_prefs.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| @interface BookmarkEditorController (Private) |
| |
| // Grab the url from the text field and convert. |
| - (GURL)GURLFromUrlField; |
| |
| @end |
| |
| @implementation BookmarkEditorController |
| |
| @synthesize displayURL = displayURL_; |
| |
| + (NSSet*)keyPathsForValuesAffectingOkEnabled { |
| return [NSSet setWithObject:@"displayURL"]; |
| } |
| |
| - (id)initWithParentWindow:(NSWindow*)parentWindow |
| profile:(Profile*)profile |
| parent:(const BookmarkNode*)parent |
| node:(const BookmarkNode*)node |
| url:(const GURL&)url |
| title:(const base::string16&)title |
| configuration:(BookmarkEditor::Configuration)configuration { |
| if ((self = [super initWithParentWindow:parentWindow |
| nibName:@"BookmarkEditor" |
| profile:profile |
| parent:parent |
| url:url |
| title:title |
| configuration:configuration])) { |
| // "Add Page..." has no "node" so this may be NULL. |
| node_ = node; |
| } |
| return self; |
| } |
| |
| - (void)dealloc { |
| [displayURL_ release]; |
| [super dealloc]; |
| } |
| |
| - (void)awakeFromNib { |
| // Check if NSTextFieldCell supports the method. This check is in place as |
| // only 10.6 and greater support the setUsesSingleLineMode method. |
| // TODO(kushi.p): Remove this when the project hits a 10.6+ only state. |
| NSTextFieldCell* nameFieldCell_ = [nameTextField_ cell]; |
| if ([nameFieldCell_ |
| respondsToSelector:@selector(setUsesSingleLineMode:)]) { |
| [nameFieldCell_ setUsesSingleLineMode:YES]; |
| } |
| |
| // Set text fields to match our bookmark. If the node is NULL we |
| // arrived here from an "Add Page..." item in a context menu. |
| if (node_) { |
| [self setInitialName:base::SysUTF16ToNSString(node_->GetTitle())]; |
| PrefService* prefs = [self profile] ? |
| user_prefs::UserPrefs::Get([self profile]) : |
| NULL; |
| base::string16 urlString = |
| chrome::FormatBookmarkURLForDisplay(node_->url(), prefs); |
| initialUrl_.reset([base::SysUTF16ToNSString(urlString) retain]); |
| } else { |
| GURL url = [self url]; |
| [self setInitialName:base::SysUTF16ToNSString([self title])]; |
| if (url.is_valid()) |
| initialUrl_.reset([[NSString stringWithUTF8String:url.spec().c_str()] |
| retain]); |
| } |
| [self setDisplayURL:initialUrl_]; |
| [super awakeFromNib]; |
| [self expandNodes: |
| [self bookmarkModel]->expanded_state_tracker()->GetExpandedNodes()]; |
| } |
| |
| - (void)nodeRemoved:(const BookmarkNode*)node |
| fromParent:(const BookmarkNode*)parent |
| { |
| // Be conservative; it is needed (e.g. "Add Page...") |
| node_ = NULL; |
| [self cancel:self]; |
| } |
| |
| #pragma mark Bookmark Editing |
| |
| // If possible, return a valid GURL from the URL text field. |
| - (GURL)GURLFromUrlField { |
| NSString* url = [self displayURL]; |
| return URLFixerUpper::FixupURL([url UTF8String], std::string()); |
| } |
| |
| // Enable the OK button if there is a valid URL. |
| - (BOOL)okEnabled { |
| BOOL okEnabled = NO; |
| if ([[self displayURL] length]) { |
| GURL newURL = [self GURLFromUrlField]; |
| okEnabled = (newURL.is_valid()) ? YES : NO; |
| } |
| if (okEnabled) |
| [urlField_ setBackgroundColor:[NSColor whiteColor]]; |
| else |
| [urlField_ setBackgroundColor:[NSColor colorWithCalibratedRed:1.0 |
| green:0.67 |
| blue:0.67 |
| alpha:1.0]]; |
| return okEnabled; |
| } |
| |
| // The bookmark's URL is assumed to be valid (otherwise the OK button |
| // should not be enabled). Previously existing bookmarks for which the |
| // parent has not changed are updated in-place. Those for which the parent |
| // has changed are removed with a new node created under the new parent. |
| // Called by -[BookmarkEditorBaseController ok:]. |
| - (NSNumber*)didCommit { |
| NSString* name = [[self displayName] stringByTrimmingCharactersInSet: |
| [NSCharacterSet newlineCharacterSet]]; |
| base::string16 newTitle = base::SysNSStringToUTF16(name); |
| const BookmarkNode* newParentNode = [self selectedNode]; |
| GURL newURL = [self GURLFromUrlField]; |
| if (!newURL.is_valid()) { |
| // Shouldn't be reached -- OK button should be disabled if not valid! |
| NOTREACHED(); |
| return [NSNumber numberWithBool:NO]; |
| } |
| |
| // Determine where the new/replacement bookmark is to go. |
| BookmarkModel* model = [self bookmarkModel]; |
| // If there was an old node then we update the node, and move it to its new |
| // parent if the parent has changed (rather than deleting it from the old |
| // parent and adding to the new -- which also prevents the 'poofing' that |
| // occurs when a node is deleted). |
| if (node_) { |
| model->SetURL(node_, newURL); |
| model->SetTitle(node_, newTitle); |
| const BookmarkNode* oldParentNode = [self parentNode]; |
| if (newParentNode != oldParentNode) |
| model->Move(node_, newParentNode, newParentNode->child_count()); |
| } else { |
| // Otherwise, add a new bookmark at the end of the newly selected folder. |
| model->AddURL(newParentNode, newParentNode->child_count(), newTitle, |
| newURL); |
| } |
| |
| // Update the expanded state. |
| BookmarkExpandedStateTracker::Nodes expanded_nodes = [self getExpandedNodes]; |
| [self bookmarkModel]->expanded_state_tracker()-> |
| SetExpandedNodes(expanded_nodes); |
| return [NSNumber numberWithBool:YES]; |
| } |
| |
| - (NSColor *)urlFieldColor { |
| return [urlField_ backgroundColor]; |
| } |
| |
| @end // BookmarkEditorController |
| |