OLD | NEW |
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 #include "chrome/browser/ui/panels/panel_window_controller_cocoa.h" | 5 #include "chrome/browser/ui/panels/panel_window_controller_cocoa.h" |
6 | 6 |
7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
8 | 8 |
9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 #import "chrome/browser/ui/cocoa/event_utils.h" | 25 #import "chrome/browser/ui/cocoa/event_utils.h" |
26 #import "chrome/browser/ui/cocoa/find_bar/find_bar_bridge.h" | 26 #import "chrome/browser/ui/cocoa/find_bar/find_bar_bridge.h" |
27 #import "chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h" | 27 #import "chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h" |
28 #import "chrome/browser/ui/cocoa/menu_controller.h" | 28 #import "chrome/browser/ui/cocoa/menu_controller.h" |
29 #import "chrome/browser/ui/cocoa/tab_contents/favicon_util.h" | 29 #import "chrome/browser/ui/cocoa/tab_contents/favicon_util.h" |
30 #import "chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h" | 30 #import "chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h" |
31 #import "chrome/browser/ui/cocoa/tabs/throbber_view.h" | 31 #import "chrome/browser/ui/cocoa/tabs/throbber_view.h" |
32 #include "chrome/browser/ui/panels/panel_bounds_animation.h" | 32 #include "chrome/browser/ui/panels/panel_bounds_animation.h" |
33 #include "chrome/browser/ui/panels/panel_browser_window_cocoa.h" | 33 #include "chrome/browser/ui/panels/panel_browser_window_cocoa.h" |
34 #include "chrome/browser/ui/panels/panel_manager.h" | 34 #include "chrome/browser/ui/panels/panel_manager.h" |
35 #include "chrome/browser/ui/panels/panel_settings_menu_model.h" | |
36 #include "chrome/browser/ui/panels/panel_strip.h" | 35 #include "chrome/browser/ui/panels/panel_strip.h" |
37 #import "chrome/browser/ui/panels/panel_titlebar_view_cocoa.h" | 36 #import "chrome/browser/ui/panels/panel_titlebar_view_cocoa.h" |
38 #import "chrome/browser/ui/panels/panel_utils_cocoa.h" | 37 #import "chrome/browser/ui/panels/panel_utils_cocoa.h" |
39 #include "chrome/browser/ui/toolbar/encoding_menu_controller.h" | 38 #include "chrome/browser/ui/toolbar/encoding_menu_controller.h" |
40 #include "chrome/common/chrome_notification_types.h" | 39 #include "chrome/common/chrome_notification_types.h" |
41 #include "content/public/browser/notification_service.h" | 40 #include "content/public/browser/notification_service.h" |
42 #include "content/public/browser/render_widget_host_view.h" | 41 #include "content/public/browser/render_widget_host_view.h" |
43 #include "content/public/browser/web_contents.h" | 42 #include "content/public/browser/web_contents.h" |
44 #include "grit/ui_resources.h" | 43 #include "grit/ui_resources.h" |
45 #include "ui/base/resource/resource_bundle.h" | 44 #include "ui/base/resource/resource_bundle.h" |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 if ((self = [super initWithWindowNibPath:nibpath owner:self])) { | 435 if ((self = [super initWithWindowNibPath:nibpath owner:self])) { |
437 windowShim_.reset(window); | 436 windowShim_.reset(window); |
438 animateOnBoundsChange_ = YES; | 437 animateOnBoundsChange_ = YES; |
439 canBecomeKeyWindow_ = YES; | 438 canBecomeKeyWindow_ = YES; |
440 contentsController_.reset( | 439 contentsController_.reset( |
441 [[TabContentsController alloc] initWithContents:nil]); | 440 [[TabContentsController alloc] initWithContents:nil]); |
442 } | 441 } |
443 return self; | 442 return self; |
444 } | 443 } |
445 | 444 |
446 - (void)dealloc { | |
447 if (windowTrackingArea_.get()) { | |
448 [[[[self window] contentView] superview] | |
449 removeTrackingArea:windowTrackingArea_.get()]; | |
450 } | |
451 [super dealloc]; | |
452 } | |
453 | |
454 - (ui::ThemeProvider*)themeProvider { | 445 - (ui::ThemeProvider*)themeProvider { |
455 return ThemeServiceFactory::GetForProfile(windowShim_->browser()->profile()); | 446 return ThemeServiceFactory::GetForProfile(windowShim_->browser()->profile()); |
456 } | 447 } |
457 | 448 |
458 - (ThemedWindowStyle)themedWindowStyle { | 449 - (ThemedWindowStyle)themedWindowStyle { |
459 ThemedWindowStyle style = THEMED_POPUP; | 450 ThemedWindowStyle style = THEMED_POPUP; |
460 if (windowShim_->browser()->profile()->IsOffTheRecord()) | 451 if (windowShim_->browser()->profile()->IsOffTheRecord()) |
461 style |= THEMED_INCOGNITO; | 452 style |= THEMED_INCOGNITO; |
462 return style; | 453 return style; |
463 } | 454 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 NSView* superview = [[window contentView] superview]; | 491 NSView* superview = [[window contentView] superview]; |
501 NSRect bounds = [superview bounds]; | 492 NSRect bounds = [superview bounds]; |
502 overlayView_.reset( | 493 overlayView_.reset( |
503 [[PanelResizeByMouseOverlay alloc] initWithFrame:bounds | 494 [[PanelResizeByMouseOverlay alloc] initWithFrame:bounds |
504 panel:windowShim_->panel()]); | 495 panel:windowShim_->panel()]); |
505 // Set autoresizing behavior: glued to edges. | 496 // Set autoresizing behavior: glued to edges. |
506 [overlayView_ setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)]; | 497 [overlayView_ setAutoresizingMask:(NSViewHeightSizable | NSViewWidthSizable)]; |
507 [superview addSubview:overlayView_ positioned:NSWindowAbove relativeTo:nil]; | 498 [superview addSubview:overlayView_ positioned:NSWindowAbove relativeTo:nil]; |
508 } | 499 } |
509 | 500 |
510 - (void)mouseEntered:(NSEvent*)event { | |
511 [titlebar_view_ updateSettingsButtonVisibility:YES]; | |
512 } | |
513 | |
514 - (void)mouseExited:(NSEvent*)event { | |
515 // We sometimes get an exit event from a tracking area that has | |
516 // already been removed. So we need this check. | |
517 NSPoint mouse = [NSEvent mouseLocation]; | |
518 NSRect frame = [[self window] frame]; | |
519 if (!NSMouseInRect(mouse, frame, NO)) { | |
520 [titlebar_view_ updateSettingsButtonVisibility:NO]; | |
521 } | |
522 } | |
523 | |
524 - (void)disableTabContentsViewAutosizing { | 501 - (void)disableTabContentsViewAutosizing { |
525 [[[self window] contentView] setAutoresizesSubviews:NO]; | 502 [[[self window] contentView] setAutoresizesSubviews:NO]; |
526 } | 503 } |
527 | 504 |
528 - (void)enableTabContentsViewAutosizing { | 505 - (void)enableTabContentsViewAutosizing { |
529 NSView* contentView = [[self window] contentView]; | 506 NSView* contentView = [[self window] contentView]; |
530 NSView* controllerView = [contentsController_ view]; | 507 NSView* controllerView = [contentsController_ view]; |
531 | 508 |
532 DCHECK([controllerView superview] == contentView); | 509 DCHECK([controllerView superview] == contentView); |
533 DCHECK([controllerView autoresizingMask] & NSViewHeightSizable); | 510 DCHECK([controllerView autoresizingMask] & NSViewHeightSizable); |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
748 windowShim_->DidCloseNativeWindow(); | 725 windowShim_->DidCloseNativeWindow(); |
749 // Call |-autorelease| after a zero-length delay to avoid deadlock from | 726 // Call |-autorelease| after a zero-length delay to avoid deadlock from |
750 // code in the current run loop that waits on BROWSER_CLOSED notification. | 727 // code in the current run loop that waits on BROWSER_CLOSED notification. |
751 // The notification is sent when this object is freed, but this object | 728 // The notification is sent when this object is freed, but this object |
752 // cannot be freed until the current run loop completes. | 729 // cannot be freed until the current run loop completes. |
753 [self performSelector:@selector(autorelease) | 730 [self performSelector:@selector(autorelease) |
754 withObject:nil | 731 withObject:nil |
755 afterDelay:0]; | 732 afterDelay:0]; |
756 } | 733 } |
757 | 734 |
758 - (void)runSettingsMenu:(NSView*)button { | |
759 Panel* panel = windowShim_->panel(); | |
760 DCHECK(panel->GetExtension()); | |
761 | |
762 scoped_ptr<PanelSettingsMenuModel> settingsMenuModel( | |
763 new PanelSettingsMenuModel(panel)); | |
764 scoped_nsobject<MenuController> settingsMenuController( | |
765 [[MenuController alloc] initWithModel:settingsMenuModel.get() | |
766 useWithPopUpButtonCell:NO]); | |
767 | |
768 [NSMenu popUpContextMenu:[settingsMenuController menu] | |
769 withEvent:[NSApp currentEvent] | |
770 forView:button]; | |
771 } | |
772 | |
773 - (BOOL)isDraggable { | 735 - (BOOL)isDraggable { |
774 return windowShim_->panel()->draggable(); | 736 return windowShim_->panel()->draggable(); |
775 } | 737 } |
776 | 738 |
777 - (void)startDrag:(NSPoint)mouseLocation { | 739 - (void)startDrag:(NSPoint)mouseLocation { |
778 // Convert from Cocoa's screen coordinates to platform-indepedent screen | 740 // Convert from Cocoa's screen coordinates to platform-indepedent screen |
779 // coordinates because PanelManager method takes platform-indepedent screen | 741 // coordinates because PanelManager method takes platform-indepedent screen |
780 // coordinates. | 742 // coordinates. |
781 windowShim_->panel()->manager()->StartDragging( | 743 windowShim_->panel()->manager()->StartDragging( |
782 windowShim_->panel(), | 744 windowShim_->panel(), |
783 cocoa_utils::ConvertPointFromCocoaCoordinates(mouseLocation)); | 745 cocoa_utils::ConvertPointFromCocoaCoordinates(mouseLocation)); |
784 } | 746 } |
785 | 747 |
786 - (void)endDrag:(BOOL)cancelled { | 748 - (void)endDrag:(BOOL)cancelled { |
787 windowShim_->panel()->manager()->EndDragging(cancelled); | 749 windowShim_->panel()->manager()->EndDragging(cancelled); |
788 } | 750 } |
789 | 751 |
790 - (void)drag:(NSPoint)mouseLocation { | 752 - (void)drag:(NSPoint)mouseLocation { |
791 // Convert from Cocoa's screen coordinates to platform-indepedent screen | 753 // Convert from Cocoa's screen coordinates to platform-indepedent screen |
792 // coordinates because PanelManager method takes platform-indepedent screen | 754 // coordinates because PanelManager method takes platform-indepedent screen |
793 // coordinates. | 755 // coordinates. |
794 windowShim_->panel()->manager()->Drag( | 756 windowShim_->panel()->manager()->Drag( |
795 cocoa_utils::ConvertPointFromCocoaCoordinates(mouseLocation)); | 757 cocoa_utils::ConvertPointFromCocoaCoordinates(mouseLocation)); |
796 } | 758 } |
797 | 759 |
798 - (void)setPanelFrame:(NSRect)frame | 760 - (void)setPanelFrame:(NSRect)frame |
799 animate:(BOOL)animate { | 761 animate:(BOOL)animate { |
800 // Setup the whole window as the tracking area so that we can get notified | |
801 // when the mouse enters or leaves the window. This will make us be able to | |
802 // show or hide settings button accordingly. | |
803 NSRect localBounds = frame; | |
804 localBounds.origin = NSZeroPoint; | |
805 | |
806 if (windowTrackingArea_.get()) { | |
807 [[[[self window] contentView] superview] | |
808 removeTrackingArea:windowTrackingArea_.get()]; | |
809 } | |
810 | |
811 windowTrackingArea_.reset( | |
812 [[CrTrackingArea alloc] initWithRect:localBounds | |
813 options:(NSTrackingMouseEnteredAndExited | | |
814 NSTrackingActiveAlways) | |
815 proxiedOwner:self | |
816 userInfo:nil]); | |
817 [windowTrackingArea_.get() clearOwnerWhenWindowWillClose:[self window]]; | |
818 [[[[self window] contentView] superview] | |
819 addTrackingArea:windowTrackingArea_.get()]; | |
820 | |
821 BOOL jumpToDestination = (!animateOnBoundsChange_ || !animate); | 762 BOOL jumpToDestination = (!animateOnBoundsChange_ || !animate); |
822 | 763 |
823 // If no animation is in progress, apply bounds change instantly. | 764 // If no animation is in progress, apply bounds change instantly. |
824 if (jumpToDestination && ![self isAnimatingBounds]) { | 765 if (jumpToDestination && ![self isAnimatingBounds]) { |
825 [[self window] setFrame:frame display:YES animate:NO]; | 766 [[self window] setFrame:frame display:YES animate:NO]; |
826 return; | 767 return; |
827 } | 768 } |
828 | 769 |
829 NSDictionary *windowResize = [NSDictionary dictionaryWithObjectsAndKeys: | 770 NSDictionary *windowResize = [NSDictionary dictionaryWithObjectsAndKeys: |
830 [self window], NSViewAnimationTargetKey, | 771 [self window], NSViewAnimationTargetKey, |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1084 if (![self isWindowLoaded]) | 1025 if (![self isWindowLoaded]) |
1085 return; | 1026 return; |
1086 [[self window] invalidateCursorRectsForView:overlayView_]; | 1027 [[self window] invalidateCursorRectsForView:overlayView_]; |
1087 } | 1028 } |
1088 | 1029 |
1089 - (BOOL)isActivationByClickingTitlebarEnabled { | 1030 - (BOOL)isActivationByClickingTitlebarEnabled { |
1090 return !windowShim_->panel()->always_on_top(); | 1031 return !windowShim_->panel()->always_on_top(); |
1091 } | 1032 } |
1092 | 1033 |
1093 @end | 1034 @end |
OLD | NEW |