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 |