blob: be7955fae50677c22f8feafe152672e0bc1062c0 [file] [log] [blame]
// 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