Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(781)

Side by Side Diff: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm

Issue 8141003: [Mac] Restore the old bookmark menus now that the experiment is over. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.h"
6
7 #include "chrome/browser/bookmarks/bookmark_pasteboard_helper_mac.h"
8 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h"
9 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h"
10 #include "content/browser/user_metrics.h"
11
12 #import "third_party/mozilla/NSPasteboard+Utils.h"
13
14 @interface BookmarkBarFolderView()
15
16 @property(readonly, nonatomic) id<BookmarkButtonControllerProtocol> controller;
17
18 @end
19
20 @implementation BookmarkBarFolderView
21
22 - (void)awakeFromNib {
23 NSArray* types = [NSArray arrayWithObjects:
24 NSStringPboardType,
25 NSHTMLPboardType,
26 NSURLPboardType,
27 kBookmarkButtonDragType,
28 kBookmarkDictionaryListPboardType,
29 nil];
30 [self registerForDraggedTypes:types];
31 }
32
33 - (void)dealloc {
34 [self unregisterDraggedTypes];
35 [super dealloc];
36 }
37
38 - (id<BookmarkButtonControllerProtocol>)controller {
39 // When needed for testing, set the local data member |controller_| to
40 // the test controller.
41 return controller_ ? controller_ : [[self window] windowController];
42 }
43
44 - (void)drawRect:(NSRect)rect {
45 // TODO(jrg): copied from bookmark_bar_view but orientation changed.
46 // Code dup sucks but I'm not sure I can take 16 lines and make it
47 // generic for horiz vs vertical while keeping things simple.
48 // TODO(jrg): when throwing it all away and using animations, try
49 // hard to make a common routine for both.
50 // http://crbug.com/35966, http://crbug.com/35968
51
52 // Draw the bookmark-button-dragging drop indicator if necessary.
53 if (dropIndicatorShown_) {
54 const CGFloat kBarHeight = 1;
55 const CGFloat kBarHorizPad = 4;
56 const CGFloat kBarOpacity = 0.85;
57
58 NSRect uglyBlackBar =
59 NSMakeRect(kBarHorizPad, dropIndicatorPosition_,
60 NSWidth([self bounds]) - 2*kBarHorizPad,
61 kBarHeight);
62 NSColor* uglyBlackBarColor = [NSColor blackColor];
63 [[uglyBlackBarColor colorWithAlphaComponent:kBarOpacity] setFill];
64 [[NSBezierPath bezierPathWithRect:uglyBlackBar] fill];
65 }
66 }
67
68 // TODO(mrossetti,jrg): Identical to -[BookmarkBarView
69 // dragClipboardContainsBookmarks]. http://crbug.com/35966
70 // Shim function to assist in unit testing.
71 - (BOOL)dragClipboardContainsBookmarks {
72 return bookmark_pasteboard_helper_mac::DragClipboardContainsBookmarks();
73 }
74
75 // Virtually identical to [BookmarkBarView draggingEntered:].
76 // TODO(jrg): find a way to share code. Lack of multiple inheritance
77 // makes things more of a pain but there should be no excuse for laziness.
78 // http://crbug.com/35966
79 - (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info {
80 inDrag_ = YES;
81 if (![[self controller] draggingAllowed:info])
82 return NSDragOperationNone;
83 if ([[info draggingPasteboard] dataForType:kBookmarkButtonDragType] ||
84 [self dragClipboardContainsBookmarks] ||
85 [[info draggingPasteboard] containsURLData]) {
86 // Find the position of the drop indicator.
87 BOOL showIt = [[self controller]
88 shouldShowIndicatorShownForPoint:[info draggingLocation]];
89 if (!showIt) {
90 if (dropIndicatorShown_) {
91 dropIndicatorShown_ = NO;
92 [self setNeedsDisplay:YES];
93 }
94 } else {
95 CGFloat y =
96 [[self controller]
97 indicatorPosForDragToPoint:[info draggingLocation]];
98
99 // Need an update if the indicator wasn't previously shown or if it has
100 // moved.
101 if (!dropIndicatorShown_ || dropIndicatorPosition_ != y) {
102 dropIndicatorShown_ = YES;
103 dropIndicatorPosition_ = y;
104 [self setNeedsDisplay:YES];
105 }
106 }
107
108 [[self controller] draggingEntered:info]; // allow hover-open to work
109 return [info draggingSource] ? NSDragOperationMove : NSDragOperationCopy;
110 }
111 return NSDragOperationNone;
112 }
113
114 - (void)draggingExited:(id<NSDraggingInfo>)info {
115 [[self controller] draggingExited:info];
116
117 // Regardless of the type of dragging which ended, we need to get rid of the
118 // drop indicator if one was shown.
119 if (dropIndicatorShown_) {
120 dropIndicatorShown_ = NO;
121 [self setNeedsDisplay:YES];
122 }
123 }
124
125 - (void)draggingEnded:(id<NSDraggingInfo>)info {
126 // Awkwardness since views open and close out from under us.
127 if (inDrag_) {
128 inDrag_ = NO;
129 }
130
131 [self draggingExited:info];
132 }
133
134 - (BOOL)wantsPeriodicDraggingUpdates {
135 // TODO(jrg): This should probably return |YES| and the controller should
136 // slide the existing bookmark buttons interactively to the side to make
137 // room for the about-to-be-dropped bookmark.
138 // http://crbug.com/35968
139 return NO;
140 }
141
142 - (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info {
143 // For now it's the same as draggingEntered:.
144 // TODO(jrg): once we return YES for wantsPeriodicDraggingUpdates,
145 // this should ping the [self controller] to perform animations.
146 // http://crbug.com/35968
147 return [self draggingEntered:info];
148 }
149
150 - (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)info {
151 return YES;
152 }
153
154 // This code is practically identical to the same function in BookmarkBarView
155 // with the only difference being how the controller is retrieved.
156 // TODO(mrossetti,jrg): http://crbug.com/35966
157 // Implement NSDraggingDestination protocol method
158 // performDragOperation: for URLs.
159 - (BOOL)performDragOperationForURL:(id<NSDraggingInfo>)info {
160 NSPasteboard* pboard = [info draggingPasteboard];
161 DCHECK([pboard containsURLData]);
162
163 NSArray* urls = nil;
164 NSArray* titles = nil;
165 [pboard getURLs:&urls andTitles:&titles convertingFilenames:YES];
166
167 return [[self controller] addURLs:urls
168 withTitles:titles
169 at:[info draggingLocation]];
170 }
171
172 // This code is practically identical to the same function in BookmarkBarView
173 // with the only difference being how the controller is retrieved.
174 // http://crbug.com/35966
175 // Implement NSDraggingDestination protocol method
176 // performDragOperation: for bookmark buttons.
177 - (BOOL)performDragOperationForBookmarkButton:(id<NSDraggingInfo>)info {
178 BOOL doDrag = NO;
179 NSData* data = [[info draggingPasteboard]
180 dataForType:kBookmarkButtonDragType];
181 // [info draggingSource] is nil if not the same application.
182 if (data && [info draggingSource]) {
183 BookmarkButton* button = nil;
184 [data getBytes:&button length:sizeof(button)];
185 BOOL copy = !([info draggingSourceOperationMask] & NSDragOperationMove);
186 doDrag = [[self controller] dragButton:button
187 to:[info draggingLocation]
188 copy:copy];
189 UserMetrics::RecordAction(UserMetricsAction("BookmarkBarFolder_DragEnd"));
190 }
191 return doDrag;
192 }
193
194 - (BOOL)performDragOperation:(id<NSDraggingInfo>)info {
195 if ([[self controller] dragBookmarkData:info])
196 return YES;
197 NSPasteboard* pboard = [info draggingPasteboard];
198 if ([pboard dataForType:kBookmarkButtonDragType] &&
199 [self performDragOperationForBookmarkButton:info])
200 return YES;
201 if ([pboard containsURLData] && [self performDragOperationForURL:info])
202 return YES;
203 return NO;
204 }
205
206 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698