blob: 364feecc7afe37bd0595284af2bbf7b508e5ba36 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
// 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;
@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
configuration:(BookmarkEditor::Configuration)configuration
handler:(BookmarkEditor::Handler*)handler {
if ((self = [super initWithParentWindow:parentWindow
nibName:@"BookmarkEditor"
profile:profile
parent:parent
configuration:configuration
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()]
retain]);
} else {
initialUrl_.reset([@"" retain]);
}
[self setDisplayURL:initialUrl_];
[super awakeFromNib];
}
- (void)nodeRemoved:(const BookmarkNode*)node
fromParent:(const BookmarkNode*)parent
{
if (node_ == node || node_->HasAncestor(node)) {
// The node I'm editing is being deleted. Just close.
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;
}
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!
NOTREACHED();
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];
}
@end // BookmarkEditorController
|