Logo Search packages:      
Sourcecode: chromium-browser version File versions  Download package


// Copyright (c) 2009 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/cocoa/bookmark_editor_controller.h"
#include "app/l10n_util.h"
#include "base/sys_string_conversions.h"
#include "chrome/browser/bookmarks/bookmark_model.h"

@interface BookmarkEditorController (Private)

// Grab the url from the text field and convert.
- (GURL)GURLFromUrlField;


@implementation BookmarkEditorController

@synthesize displayURL = displayURL_;

+ (NSSet*)keyPathsForValuesAffectingOkEnabled {
  return [NSSet setWithObject:@"displayURL"];

- (id)initWithParentWindow:(NSWindow*)parentWindow
                    parent:(const BookmarkNode*)parent
                      node:(const BookmarkNode*)node
                   handler:(BookmarkEditor::Handler*)handler {
  if ((self = [super initWithParentWindow:parentWindow
                                  handler:handler])) {
    // "Add Page..." has no "node" so this may be NULL.
    node_ = node;
  return self;

- (void)dealloc {
  [displayURL_ release];
  [super dealloc];

- (void)awakeFromNib {
  // 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::SysWideToNSString(node_->GetTitle())];
    std::string url_string = node_->GetURL().possibly_invalid_spec();
    initialUrl_.reset([[NSString stringWithUTF8String:url_string.c_str()]
  } else {
    initialUrl_.reset([@"" retain]);
  [self setDisplayURL:initialUrl_];
  [super awakeFromNib];

- (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];
  GURL newURL = GURL([url UTF8String]);
  if (!newURL.is_valid()) {
    // Mimic observed friendliness from Windows
    newURL = GURL([[NSString stringWithFormat:@"http://%@", url] UTF8String]);
  return newURL;

// 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]];
    [urlField_ setBackgroundColor:[NSColor colorWithCalibratedRed:1.0
  return okEnabled;

// The the bookmark's URL is assumed to be valid (otherwise the OK button
// should not be enabled).  If the bookmark previously existed then it is
// removed from its old folder.  The bookmark is then added to its new
// folder.  If the folder has not changed then the bookmark stays in its
// original position (index) otherwise it is added to the end of the new
// folder.  Called by -[BookmarkEditorBaseController ok:].
- (NSNumber*)didCommit {
  NSString* name = [[self displayName] stringByTrimmingCharactersInSet:
                    [NSCharacterSet newlineCharacterSet]];
  std::wstring newTitle = base::SysNSStringToWide(name);
  const BookmarkNode* newParentNode = [self selectedNode];
  BookmarkModel* model = [self bookmarkModel];
  int newIndex = newParentNode->GetChildCount();
  GURL newURL = [self GURLFromUrlField];
  if (!newURL.is_valid()) {
    // Shouldn't be reached -- OK button should be disabled if not valid!
    return [NSNumber numberWithBool:NO];

  // Determine where the new/replacement bookmark is to go.
  const BookmarkNode* parentNode = [self parentNode];
  if (node_ && parentNode) {
    // Replace the old bookmark with the updated bookmark.
    int oldIndex = parentNode->IndexOfChild(node_);
    if (oldIndex >= 0)
      model->Remove(parentNode, oldIndex);
    if (parentNode == newParentNode)
      newIndex = oldIndex;
  // Add bookmark as new node at the end of the newly selected folder.
  const BookmarkNode* node = model->AddURL(newParentNode, newIndex,
                                           newTitle, newURL);
  // Honor handler semantics: callback on node creation.
  [self notifyHandlerCreatedNode:node];
  return [NSNumber numberWithBool:YES];

- (NSColor *)urlFieldColor {
  return [urlField_ backgroundColor];

@end  // BookmarkEditorController

Generated by  Doxygen 1.6.0   Back to index