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

Side by Side Diff: chrome/browser/cocoa/tab_view.mm

Issue 102010: Implement dropping of tabs into an existing tab strip from another window. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 7 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
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/cocoa/tab_view.h" 5 #include "chrome/browser/cocoa/tab_view.h"
6 #include "chrome/browser/cocoa/tab_window_controller.h" 6 #include "chrome/browser/cocoa/tab_window_controller.h"
7 7
8 @implementation TabView 8 @implementation TabView
9 9
10 - (id)initWithFrame:(NSRect)frame { 10 - (id)initWithFrame:(NSRect)frame {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 TabWindowController* sourceController = [sourceWindow windowController]; 63 TabWindowController* sourceController = [sourceWindow windowController];
64 64
65 // We don't want to "tear off" a tab if there's only one in the window. Treat 65 // We don't want to "tear off" a tab if there's only one in the window. Treat
66 // it like we're dragging around a tab we've already detached. Note that 66 // it like we're dragging around a tab we've already detached. Note that
67 // unit tests might have |-numberOfTabs| reporting zero since the model 67 // unit tests might have |-numberOfTabs| reporting zero since the model
68 // won't be fully hooked up. We need to be prepared for that and not send 68 // won't be fully hooked up. We need to be prepared for that and not send
69 // them into the "magnetic" codepath. 69 // them into the "magnetic" codepath.
70 BOOL isLastRemainingTab = [sourceController numberOfTabs] <= 1; 70 BOOL isLastRemainingTab = [sourceController numberOfTabs] <= 1;
71 71
72 BOOL dragging = YES; 72 BOOL dragging = YES;
73 BOOL moved = NO; 73 BOOL moveBetweenWindows = NO;
74 74
75 NSPoint lastPoint = 75 NSPoint lastPoint =
76 [[theEvent window] convertBaseToScreen:[theEvent locationInWindow]]; 76 [[theEvent window] convertBaseToScreen:[theEvent locationInWindow]];
77 77
78 // First, go through the magnetic drag cycle. We break out of this if 78 // First, go through the magnetic drag cycle. We break out of this if
79 // "stretchiness" ever exceeds the a set amount. 79 // "stretchiness" ever exceeds the a set amount.
80 NSRect frame = [self frame]; 80 NSRect frame = [self frame];
81 if (!isLastRemainingTab) { 81 if (!isLastRemainingTab) {
82 while (dragging) { 82 while (dragging) {
83 theEvent = 83 theEvent =
(...skipping 12 matching lines...) Expand all
96 CGFloat tearForce = fabs(thisPoint.y - lastPoint.y); 96 CGFloat tearForce = fabs(thisPoint.y - lastPoint.y);
97 if (tearForce > kTearDistance) break; 97 if (tearForce > kTearDistance) break;
98 if ([theEvent type] == NSLeftMouseUp) { 98 if ([theEvent type] == NSLeftMouseUp) {
99 // Mouse up, break out of the drag event tracking loop 99 // Mouse up, break out of the drag event tracking loop
100 dragging = NO; 100 dragging = NO;
101 break; 101 break;
102 } 102 }
103 } 103 }
104 } 104 }
105 105
106 [sourceController removePlaceholder]; 106 if (dragging)
107 [sourceController removePlaceholder];
107 108
108 TabWindowController* draggedController = nil; 109 TabWindowController* draggedController = nil;
109 TabWindowController* targetController = nil; 110 TabWindowController* targetController = nil;
110 111
111 NSWindow* dragWindow = nil; 112 NSWindow* dragWindow = nil;
112 NSWindow* dragOverlay = nil; 113 NSWindow* dragOverlay = nil;
113 114
114 // Do not start dragging until the user has "torn" the tab off by 115 // Do not start dragging until the user has "torn" the tab off by
115 // moving more than 3 pixels. 116 // moving more than 3 pixels.
116 BOOL torn = NO; 117 BOOL torn = NO;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 // If we're now targeting a new window, re-layout the tabs in the old 172 // If we're now targeting a new window, re-layout the tabs in the old
172 // target and reset how long we've been hovering over this new one. 173 // target and reset how long we've been hovering over this new one.
173 if (targetController != newTarget) { 174 if (targetController != newTarget) {
174 targetDwellDate = [NSDate date]; 175 targetDwellDate = [NSDate date];
175 [targetController removePlaceholder]; 176 [targetController removePlaceholder];
176 targetController = newTarget; 177 targetController = newTarget;
177 } 178 }
178 179
179 NSEventType type = [theEvent type]; 180 NSEventType type = [theEvent type];
180 if (type == NSLeftMouseDragged) { 181 if (type == NSLeftMouseDragged) {
181 moved = YES; 182 moveBetweenWindows = YES;
182 if (!draggedController) { 183 if (!draggedController) {
183 if (isLastRemainingTab) { 184 if (isLastRemainingTab) {
184 draggedController = sourceController; 185 draggedController = sourceController;
185 dragWindow = [draggedController window]; 186 dragWindow = [draggedController window];
186 } else { 187 } else {
187 // Detach from the current window and put it in a new window. 188 // Detach from the current window and put it in a new window.
188 draggedController = [sourceController detachTabToNewWindow:self]; 189 draggedController = [sourceController detachTabToNewWindow:self];
189 dragWindow = [draggedController window]; 190 dragWindow = [draggedController window];
190 [dragWindow setAlphaValue:0.0]; 191 [dragWindow setAlphaValue:0.0];
191 } 192 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 setAlphaValue:targetController ? 0.85 : 1.0]; 251 setAlphaValue:targetController ? 0.85 : 1.0];
251 } else if (type == NSLeftMouseUp) { 252 } else if (type == NSLeftMouseUp) {
252 // Mouse up, break out of the drag event tracking loop 253 // Mouse up, break out of the drag event tracking loop
253 dragging = NO; 254 dragging = NO;
254 } 255 }
255 lastPoint = thisPoint; 256 lastPoint = thisPoint;
256 } // while tracking mouse 257 } // while tracking mouse
257 258
258 // The drag/click is done. If the user dragged the mouse, finalize the drag 259 // The drag/click is done. If the user dragged the mouse, finalize the drag
259 // and clean up. 260 // and clean up.
260 if (moved) { 261 if (moveBetweenWindows) {
261 TabWindowController *dropController = targetController; 262 // Move between windows. If |targetController| is nil, we're not dropping
262 #if 1 263 // into any existing window.
263 dropController = nil; // Don't allow drops on other windows for now 264 TabWindowController* dropController = targetController;
264 #endif
265 if (dropController) { 265 if (dropController) {
266 // TODO(alcor/pinkerton): hookup drops on existing windows 266 // The ordering here is important. We need to be able to get from the
267 NSRect adjustedFrame = [self bounds]; 267 // TabView in the |draggedController| to whatever is needed by the tab
268 NSRect dropTabFrame = [[dropController tabStripView] frame]; 268 // model. To do so, it still has to be in the model, so we have to call
269 adjustedFrame.origin = [self convertPointToBase:NSZeroPoint]; 269 // "drop" before we call "detach".
270 adjustedFrame.origin = 270 NSView* draggedTabView = [draggedController selectedTabView];
271 [sourceWindow convertBaseToScreen:adjustedFrame.origin]; 271 [draggedController removeOverlay];
272 adjustedFrame.origin.x = adjustedFrame.origin.x - dropTabFrame.origin.x; 272 [dropController dropTabView:draggedTabView
273 //adjustedFrame.origin.y = adjustedFrame.origin.y - dropTabFrame.origin.y; 273 fromController:draggedController];
274 //adjustedFrame.size.height += adjustedFrame.origin.y; 274 [draggedController detachTabView:draggedTabView];
275 adjustedFrame.origin.y = 0;
276 // TODO(alcor): get add tab stuff working
277 // [dropController addTab:tab_];
278 [self setFrame:adjustedFrame];
279 [dropController layoutTabs];
280 [draggedController close];
281 [dropController showWindow:nil]; 275 [dropController showWindow:nil];
282 } else { 276 } else {
283 [targetController removePlaceholder]; 277 [targetController removePlaceholder];
284 [[dragWindow animator] setAlphaValue:1.0]; 278 [[dragWindow animator] setAlphaValue:1.0];
285 [dragOverlay setHasShadow:NO]; 279 [dragOverlay setHasShadow:NO];
286 [dragWindow setHasShadow:YES]; 280 [dragWindow setHasShadow:YES];
287 [draggedController removeOverlay]; 281 [draggedController removeOverlay];
288 [dragWindow makeKeyAndOrderFront:nil]; 282 [dragWindow makeKeyAndOrderFront:nil];
289 283
290 [[draggedController window] setLevel:NSNormalWindowLevel]; 284 [[draggedController window] setLevel:NSNormalWindowLevel];
291 [draggedController layoutTabs]; 285 [draggedController layoutTabs];
292 } 286 }
293 [sourceController layoutTabs]; 287 [sourceController layoutTabs];
288 } else {
289 // Move or click within a window. We need to differentiate between a
290 // click on the tab and a drag by checking against the initial x position.
291 NSPoint currentPoint = [NSEvent mouseLocation];
292 BOOL wasDrag = fabs(currentPoint.x - lastPoint.x) > kDragStartDistance;
293 if (wasDrag) {
294 // Move tab to new location.
295 TabWindowController* dropController = sourceController;
296 [dropController dropTabView:[dropController selectedTabView]
297 fromController:nil];
298 }
294 } 299 }
300
301 [sourceController removePlaceholder];
295 } 302 }
296 303
297 @end 304 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698