| Index: chrome/browser/cocoa/bookmark_editor_controller.mm
 | 
| ===================================================================
 | 
| --- chrome/browser/cocoa/bookmark_editor_controller.mm	(revision 0)
 | 
| +++ chrome/browser/cocoa/bookmark_editor_controller.mm	(revision 0)
 | 
| @@ -0,0 +1,186 @@
 | 
| +// 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.
 | 
| +
 | 
| +#include "base/logging.h"
 | 
| +#include "base/mac_util.h"
 | 
| +#include "base/sys_string_conversions.h"
 | 
| +#include "chrome/browser/bookmarks/bookmark_editor.h"
 | 
| +#include "chrome/browser/bookmarks/bookmark_model.h"
 | 
| +#include "chrome/browser/profile.h"
 | 
| +#import "chrome/browser/cocoa/bookmark_editor_controller.h"
 | 
| +
 | 
| +@interface BookmarkEditorController(Private)
 | 
| +// Run the bookmark editor as a modal sheet.  Does not block.
 | 
| +- (void)runModal;
 | 
| +@end
 | 
| +
 | 
| +// static; implemented for each platform.
 | 
| +void BookmarkEditor::Show(gfx::NativeView parent_hwnd,
 | 
| +                          Profile* profile,
 | 
| +                          const BookmarkNode* parent,
 | 
| +                          const BookmarkNode* node,
 | 
| +                          Configuration configuration,
 | 
| +                          Handler* handler) {
 | 
| +  NSWindow* window = [parent_hwnd window];
 | 
| +  BookmarkEditorController* controller = [[BookmarkEditorController alloc]
 | 
| +                                           initWithParentWindow:window
 | 
| +                                                        profile:profile
 | 
| +                                                         parent:parent
 | 
| +                                                           node:node
 | 
| +                                                  configuration:configuration
 | 
| +                                                        handler:handler];
 | 
| +  [controller runModal];
 | 
| +}
 | 
| +
 | 
| +
 | 
| +@implementation BookmarkEditorController
 | 
| +
 | 
| +- (id)initWithParentWindow:(NSWindow*)parentWindow
 | 
| +                   profile:(Profile*)profile
 | 
| +                    parent:(const BookmarkNode*)parent
 | 
| +                      node:(const BookmarkNode*)node
 | 
| +             configuration:(BookmarkEditor::Configuration)configuration
 | 
| +                   handler:(BookmarkEditor::Handler*)handler {
 | 
| +  NSString* nibpath = [mac_util::MainAppBundle()
 | 
| +                        pathForResource:@"BookmarkEditor"
 | 
| +                        ofType:@"nib"];
 | 
| +  if ((self = [super initWithWindowNibPath:nibpath owner:self])) {
 | 
| +    parentWindow_ = parentWindow;
 | 
| +    profile_ = profile;
 | 
| +    parentNode_ = parent;
 | 
| +    // "Add Page..." has no "node" so this may be NULL.
 | 
| +    node_ = node;
 | 
| +    configuration_ = configuration;
 | 
| +    handler_.reset(handler);
 | 
| +  }
 | 
| +  return self;
 | 
| +}
 | 
| +
 | 
| +- (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_) {
 | 
| +    initialName_.reset([base::SysWideToNSString(node_->GetTitle()) retain]);
 | 
| +    std::string url_string = node_->GetURL().possibly_invalid_spec();
 | 
| +    initialUrl_.reset([[NSString stringWithUTF8String:url_string.c_str()]
 | 
| +                        retain]);
 | 
| +  } else {
 | 
| +    initialName_.reset([@"" retain]);
 | 
| +    initialUrl_.reset([@"" retain]);
 | 
| +  }
 | 
| +  [nameField_ setStringValue:initialName_];
 | 
| +  [urlField_ setStringValue:initialUrl_];
 | 
| +
 | 
| +  if (configuration_ == BookmarkEditor::SHOW_TREE) {
 | 
| +    // build the tree et al
 | 
| +    NOTIMPLEMENTED();
 | 
| +  } else {
 | 
| +    // Remember the NSBrowser's height; we will shrink our frame by that
 | 
| +    // much.
 | 
| +    NSRect frame = [[self window] frame];
 | 
| +    CGFloat browserHeight = [browser_ frame].size.height;
 | 
| +    frame.size.height -= browserHeight;
 | 
| +    frame.origin.y += browserHeight;
 | 
| +    // Remove the NSBrowser and "new folder" button.
 | 
| +    [browser_ removeFromSuperview];
 | 
| +    [newFolderButton_ removeFromSuperview];
 | 
| +    // Finally, commit the size change.
 | 
| +    [[self window] setFrame:frame display:YES];
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +/* TODO(jrg):
 | 
| +// Implementing this informal protocol allows us to open the sheet
 | 
| +// somewhere other than at the top of the window.  NOTE: this means
 | 
| +// that I, the controller, am also the window's delegate.
 | 
| +- (NSRect)window:(NSWindow*)window willPositionSheet:(NSWindow*)sheet
 | 
| +        usingRect:(NSRect)rect {
 | 
| +  // adjust rect.origin.y to be the bottom of the toolbar
 | 
| +  return rect;
 | 
| +}
 | 
| +*/
 | 
| +
 | 
| +// TODO(jrg): consider NSModalSession.
 | 
| +- (void)runModal {
 | 
| +  [NSApp beginSheet:[self window]
 | 
| +     modalForWindow:parentWindow_
 | 
| +      modalDelegate:self
 | 
| +     didEndSelector:@selector(didEndSheet:returnCode:contextInfo:)
 | 
| +        contextInfo:nil];
 | 
| +}
 | 
| +
 | 
| +// TODO(jrg)
 | 
| +- (IBAction)newFolder:(id)sender {
 | 
| +  NOTIMPLEMENTED();
 | 
| +}
 | 
| +
 | 
| +- (IBAction)cancel:(id)sender {
 | 
| +  [NSApp endSheet:[self window]];
 | 
| +}
 | 
| +
 | 
| +// TODO(jrg): Once the tree is available edits may be more extensive
 | 
| +// than just name/url.
 | 
| +- (IBAction)ok:(id)sender {
 | 
| +  NSString *name = [nameField_ stringValue];
 | 
| +  NSString *url = [urlField_ stringValue];
 | 
| +
 | 
| +  if ((![name isEqual:initialName_]) ||
 | 
| +      (![url isEqual:initialUrl_])) {
 | 
| +    std::wstring newTitle = base::SysNSStringToWide(name);
 | 
| +    GURL newURL = GURL([url UTF8String]);
 | 
| +    if (!newURL.is_valid()) {
 | 
| +      // Mimic observed friendliness from Windows
 | 
| +      newURL = GURL([[NSString stringWithFormat:@"http://%@", url] UTF8String]);
 | 
| +    }
 | 
| +    if (!newURL.is_valid()) {
 | 
| +      // Silently ignoring a bad URL is unfriendly.
 | 
| +      newURL = GURL();
 | 
| +    }
 | 
| +    int index = 0;
 | 
| +    BookmarkModel* model = profile_->GetBookmarkModel();
 | 
| +    if (node_) {
 | 
| +      index = parentNode_->IndexOfChild(node_);
 | 
| +      model->Remove(parentNode_, index);
 | 
| +    } else {
 | 
| +      index = parentNode_->GetChildCount();
 | 
| +    }
 | 
| +    const BookmarkNode* node = model->AddURL(parentNode_, index,
 | 
| +                                             newTitle, newURL);
 | 
| +    // Honor handler semantics: callback on node creation
 | 
| +    if (handler_.get())
 | 
| +      handler_->NodeCreated(node);
 | 
| +  }
 | 
| +
 | 
| +  [NSApp endSheet:[self window]];
 | 
| +}
 | 
| +
 | 
| +- (void)didEndSheet:(NSWindow*)sheet
 | 
| +         returnCode:(int)returnCode
 | 
| +        contextInfo:(void*)contextInfo {
 | 
| +  [[self window] orderOut:self];
 | 
| +
 | 
| +  // BookmarkEditor::Show() will create us then run away.  Unusually
 | 
| +  // for a controller, we are responsible for deallocating ourself.
 | 
| +  [self autorelease];
 | 
| +}
 | 
| +
 | 
| +
 | 
| +- (NSString*)displayName {
 | 
| +  return [nameField_ stringValue];
 | 
| +}
 | 
| +
 | 
| +- (NSString*)displayURL {
 | 
| +  return [urlField_ stringValue];
 | 
| +}
 | 
| +
 | 
| +- (void)setDisplayName:(NSString*)name {
 | 
| +  [nameField_ setStringValue:name];
 | 
| +}
 | 
| +
 | 
| +- (void)setDisplayURL:(NSString*)name {
 | 
| +  [urlField_ setStringValue:name];
 | 
| +}
 | 
| +
 | 
| +@end  // BookmarkEditorController
 | 
| +
 | 
| 
 | 
| Property changes on: chrome/browser/cocoa/bookmark_editor_controller.mm
 | 
| ___________________________________________________________________
 | 
| Name: svn:eol-style
 | 
|    + LF
 | 
| 
 | 
| 
 |