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

Side by Side Diff: chrome/browser/ui/panels/panel_titlebar_view_cocoa.mm

Issue 9546001: Support detaching/attaching panels via inter-strip drags. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #import "chrome/browser/ui/panels/panel_titlebar_view_cocoa.h" 5 #import "chrome/browser/ui/panels/panel_titlebar_view_cocoa.h"
6 6
7 #include <Carbon/Carbon.h> // kVK_Escape 7 #include <Carbon/Carbon.h> // kVK_Escape
8 #import <Cocoa/Cocoa.h> 8 #import <Cocoa/Cocoa.h>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 } 385 }
386 386
387 - (void)didChangeMainWindow:(NSNotification*)notification { 387 - (void)didChangeMainWindow:(NSNotification*)notification {
388 [self setNeedsDisplay:YES]; 388 [self setNeedsDisplay:YES];
389 [self checkMouseAndUpdateSettingsButtonVisibility]; 389 [self checkMouseAndUpdateSettingsButtonVisibility];
390 } 390 }
391 391
392 - (void)mouseDown:(NSEvent*)event { 392 - (void)mouseDown:(NSEvent*)event {
393 if ([controller_ isDraggable]) { 393 if ([controller_ isDraggable]) {
394 dragState_ = PANEL_DRAG_CAN_START; 394 dragState_ = PANEL_DRAG_CAN_START;
395 dragStartLocation_ = [event locationInWindow]; 395 dragStartLocation_ = [NSEvent mouseLocation];
396 } 396 }
397 } 397 }
398 398
399 - (void)mouseUp:(NSEvent*)event { 399 - (void)mouseUp:(NSEvent*)event {
400 DCHECK(dragState_ != PANEL_DRAG_IN_PROGRESS); 400 DCHECK(dragState_ != PANEL_DRAG_IN_PROGRESS);
401 401
402 if ([event clickCount] == 1) 402 if ([event clickCount] == 1)
403 [controller_ onTitlebarMouseClicked]; 403 [controller_ onTitlebarMouseClicked];
404 } 404 }
405 405
406 - (BOOL)exceedsDragThreshold:(NSPoint)mouseLocation { 406 - (BOOL)exceedsDragThreshold:(NSPoint)mouseLocation {
407 float deltaX = dragStartLocation_.x - mouseLocation.x; 407 float deltaX = dragStartLocation_.x - mouseLocation.x;
408 float deltaY = dragStartLocation_.y - mouseLocation.y; 408 float deltaY = dragStartLocation_.y - mouseLocation.y;
409 return deltaX > kDragThreshold || deltaY > kDragThreshold; 409 return fabs(deltaX) > kDragThreshold || fabs(deltaY) > kDragThreshold;
410 } 410 }
411 411
412 - (void)mouseDragged:(NSEvent*)event { 412 - (void)mouseDragged:(NSEvent*)event {
413 if (dragState_ == PANEL_DRAG_SUPPRESSED) 413 if (dragState_ == PANEL_DRAG_SUPPRESSED)
414 return; 414 return;
415 415
416 // In addition to events needed to control the drag operation, fetch the right 416 // In addition to events needed to control the drag operation, fetch the right
417 // mouse click events and key down events and ignore them, to prevent their 417 // mouse click events and key down events and ignore them, to prevent their
418 // accumulation in the queue and "playing out" when the mouse is released. 418 // accumulation in the queue and "playing out" when the mouse is released.
419 const NSUInteger mask = 419 const NSUInteger mask =
420 NSLeftMouseUpMask | NSLeftMouseDraggedMask | NSKeyUpMask | 420 NSLeftMouseUpMask | NSLeftMouseDraggedMask | NSKeyUpMask |
421 NSRightMouseDownMask | NSKeyDownMask ; 421 NSRightMouseDownMask | NSKeyDownMask ;
422 BOOL keepGoing = YES; 422 BOOL keepGoing = YES;
423 423
424 while (keepGoing) { 424 while (keepGoing) {
425 base::mac::ScopedNSAutoreleasePool autorelease_pool; 425 base::mac::ScopedNSAutoreleasePool autorelease_pool;
426 426
427 NSEvent* event = [NSApp nextEventMatchingMask:mask 427 NSEvent* event = [NSApp nextEventMatchingMask:mask
428 untilDate:[NSDate distantFuture] 428 untilDate:[NSDate distantFuture]
429 inMode:NSDefaultRunLoopMode 429 inMode:NSDefaultRunLoopMode
430 dequeue:YES]; 430 dequeue:YES];
431 431
432 switch ([event type]) { 432 switch ([event type]) {
433 case NSLeftMouseDragged: 433 case NSLeftMouseDragged:
434 if (dragState_ == PANEL_DRAG_CAN_START) { 434 if (dragState_ == PANEL_DRAG_CAN_START) {
435 if (![self exceedsDragThreshold:[event locationInWindow]]) 435 if (![self exceedsDragThreshold:[NSEvent mouseLocation]])
436 return; // Don't start real drag yet. 436 return; // Don't start real drag yet.
437 [self startDrag]; 437 [self startDrag:dragStartLocation_];
438 } 438 }
439 [self dragWithDeltaX:[event deltaX] 439 if (dragState_ == PANEL_DRAG_IN_PROGRESS)
440 deltaY:[event deltaY]]; 440 [self drag:[NSEvent mouseLocation]];
441 break; 441 break;
442 442
443 case NSKeyUp: 443 case NSKeyUp:
444 if ([event keyCode] == kVK_Escape) { 444 if ([event keyCode] == kVK_Escape) {
445 [self endDrag:YES]; 445 [self endDrag:YES];
446 keepGoing = NO; 446 keepGoing = NO;
447 } 447 }
448 break; 448 break;
449 449
450 case NSLeftMouseUp: 450 case NSLeftMouseUp:
(...skipping 10 matching lines...) Expand all
461 default: 461 default:
462 // Dequeue and ignore other mouse and key events so the Chrome context 462 // Dequeue and ignore other mouse and key events so the Chrome context
463 // menu does not come after right click on a page during Panel 463 // menu does not come after right click on a page during Panel
464 // rearrangement, or the keystrokes are not 'accumulated' and entered 464 // rearrangement, or the keystrokes are not 'accumulated' and entered
465 // at once when the drag ends. 465 // at once when the drag ends.
466 break; 466 break;
467 } 467 }
468 } 468 }
469 } 469 }
470 470
471 - (void)startDrag { 471 - (void)startDrag:(NSPoint)mouseLocation {
472 DCHECK(dragState_ == PANEL_DRAG_CAN_START); 472 DCHECK(dragState_ == PANEL_DRAG_CAN_START);
473 dragState_ = PANEL_DRAG_IN_PROGRESS; 473 dragState_ = PANEL_DRAG_IN_PROGRESS;
474 [controller_ startDrag]; 474 [controller_ startDrag:mouseLocation];
475 } 475 }
476 476
477 - (void)endDrag:(BOOL)cancelled { 477 - (void)endDrag:(BOOL)cancelled {
478 if (dragState_ == PANEL_DRAG_IN_PROGRESS) 478 if (dragState_ == PANEL_DRAG_IN_PROGRESS)
479 [controller_ endDrag:cancelled]; 479 [controller_ endDrag:cancelled];
480 dragState_ = PANEL_DRAG_SUPPRESSED; 480 dragState_ = PANEL_DRAG_SUPPRESSED;
481 } 481 }
482 482
483 - (void)dragWithDeltaX:(int)deltaX 483 - (void)drag:(NSPoint)mouseLocation {
484 deltaY:(int)deltaY {
485 if (dragState_ != PANEL_DRAG_IN_PROGRESS) 484 if (dragState_ != PANEL_DRAG_IN_PROGRESS)
486 return; 485 return;
487 [controller_ dragWithDeltaX:deltaX 486 [controller_ drag:mouseLocation];
488 deltaY:deltaY];
489 } 487 }
490 488
491 - (void)drawAttention { 489 - (void)drawAttention {
492 if (isDrawingAttention_) 490 if (isDrawingAttention_)
493 return; 491 return;
494 isDrawingAttention_ = YES; 492 isDrawingAttention_ = YES;
495 493
496 [self startGlintAnimation]; 494 [self startGlintAnimation];
497 } 495 }
498 496
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 } 560 }
563 561
564 - (NSTextField*)title { 562 - (NSTextField*)title {
565 return title_; 563 return title_;
566 } 564 }
567 565
568 - (void)simulateCloseButtonClick { 566 - (void)simulateCloseButtonClick {
569 [[closeButton_ cell] performClick:closeButton_]; 567 [[closeButton_ cell] performClick:closeButton_];
570 } 568 }
571 569
572 - (void)pressLeftMouseButtonTitlebar { 570 - (void)pressLeftMouseButtonTitlebar:(NSPoint)mouseLocation {
573 NSEvent* event = MakeMouseEvent(NSLeftMouseDown, NSZeroPoint, 0); 571 NSEvent* event = MakeMouseEvent(NSLeftMouseDown,
572 [self convertPoint:mouseLocation fromView:nil], 0);
574 [self mouseDown:event]; 573 [self mouseDown:event];
575 } 574 }
576 575
577 - (void)releaseLeftMouseButtonTitlebar { 576 - (void)releaseLeftMouseButtonTitlebar {
578 NSEvent* event = MakeMouseEvent(NSLeftMouseUp, NSZeroPoint, 1); 577 NSEvent* event = MakeMouseEvent(NSLeftMouseUp, NSZeroPoint, 1);
579 [self mouseUp:event]; 578 [self mouseUp:event];
580 } 579 }
581 580
582 - (void)dragTitlebarDeltaX:(double)delta_x 581 - (void)dragTitlebar:(NSPoint)mouseLocation {
583 deltaY:(double)delta_y {
584 if (dragState_ == PANEL_DRAG_CAN_START) 582 if (dragState_ == PANEL_DRAG_CAN_START)
585 [self startDrag]; 583 [self startDrag:dragStartLocation_];
586 [self dragWithDeltaX:delta_x 584 [self drag:mouseLocation];
587 deltaY:delta_y];
588 } 585 }
589 586
590 - (void)cancelDragTitlebar { 587 - (void)cancelDragTitlebar {
591 [self endDrag:YES]; 588 [self endDrag:YES];
592 } 589 }
593 590
594 - (void)finishDragTitlebar { 591 - (void)finishDragTitlebar {
595 [self endDrag:NO]; 592 [self endDrag:NO];
596 } 593 }
597 594
598 - (void)updateSettingsButtonVisibility:(BOOL)mouseOverWindow { 595 - (void)updateSettingsButtonVisibility:(BOOL)mouseOverWindow {
599 // The settings button is visible if the panel is main window or the mouse is 596 // The settings button is visible if the panel is main window or the mouse is
600 // over it. 597 // over it.
601 BOOL shouldShowSettingsButton = 598 BOOL shouldShowSettingsButton =
602 mouseOverWindow || [[self window] isMainWindow]; 599 mouseOverWindow || [[self window] isMainWindow];
603 [[settingsButtonWrapper_ animator] 600 [[settingsButtonWrapper_ animator]
604 setAlphaValue:shouldShowSettingsButton ? 1.0 : 0.0]; 601 setAlphaValue:shouldShowSettingsButton ? 1.0 : 0.0];
605 } 602 }
606 603
607 - (void)checkMouseAndUpdateSettingsButtonVisibility { 604 - (void)checkMouseAndUpdateSettingsButtonVisibility {
608 BOOL mouseOverWindow = NSPointInRect([NSEvent mouseLocation], 605 BOOL mouseOverWindow = NSPointInRect([NSEvent mouseLocation],
609 [[self window] frame]); 606 [[self window] frame]);
610 [self updateSettingsButtonVisibility:mouseOverWindow]; 607 [self updateSettingsButtonVisibility:mouseOverWindow];
611 } 608 }
612 609
613 @end 610 @end
614 611
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698