| 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 #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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 [self removeTrackingArea:closeButtonTrackingArea_.get()]; | 116 [self removeTrackingArea:closeButtonTrackingArea_.get()]; |
| 117 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 117 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
| 118 [self stopGlintAnimation]; | 118 [self stopGlintAnimation]; |
| 119 [super dealloc]; | 119 [super dealloc]; |
| 120 } | 120 } |
| 121 | 121 |
| 122 - (void)onCloseButtonClick:(id)sender { | 122 - (void)onCloseButtonClick:(id)sender { |
| 123 [controller_ closePanel]; | 123 [controller_ closePanel]; |
| 124 } | 124 } |
| 125 | 125 |
| 126 - (void)onSettingsButtonClick:(id)sender { | |
| 127 [controller_ runSettingsMenu:settingsButton_]; | |
| 128 } | |
| 129 | |
| 130 - (void)drawRect:(NSRect)rect { | 126 - (void)drawRect:(NSRect)rect { |
| 131 ThemeService* theme = | 127 ThemeService* theme = |
| 132 static_cast<ThemeService*>([[self window] themeProvider]); | 128 static_cast<ThemeService*>([[self window] themeProvider]); |
| 133 | 129 |
| 134 [title_ setAlphaValue:1.0]; | 130 [title_ setAlphaValue:1.0]; |
| 135 [icon_ setAlphaValue:1.0]; | 131 [icon_ setAlphaValue:1.0]; |
| 136 | 132 |
| 137 NSColor* strokeColor = nil; | 133 NSColor* strokeColor = nil; |
| 138 NSColor* titleColor = nil; | 134 NSColor* titleColor = nil; |
| 139 | 135 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 NSMaxY(contentFrame), | 266 NSMaxY(contentFrame), |
| 271 NSWidth(contentFrame), | 267 NSWidth(contentFrame), |
| 272 NSMaxY(rootViewBounds) - NSMaxY(contentFrame)); | 268 NSMaxY(rootViewBounds) - NSMaxY(contentFrame)); |
| 273 [self setFrame:titlebarFrame]; | 269 [self setFrame:titlebarFrame]; |
| 274 | 270 |
| 275 [title_ setWantsLayer:YES]; | 271 [title_ setWantsLayer:YES]; |
| 276 [title_ setFont:[NSFont boldSystemFontOfSize:[NSFont systemFontSize]]]; | 272 [title_ setFont:[NSFont boldSystemFontOfSize:[NSFont systemFontSize]]]; |
| 277 // This draws nice tight shadow, 'sinking' text into the background. | 273 // This draws nice tight shadow, 'sinking' text into the background. |
| 278 [[title_ cell] setBackgroundStyle:NSBackgroundStyleRaised]; | 274 [[title_ cell] setBackgroundStyle:NSBackgroundStyleRaised]; |
| 279 | 275 |
| 280 // Initialize the settings button. | |
| 281 NSImage* image = gfx::GetCachedImageWithName(@"balloon_wrench.pdf"); | |
| 282 [settingsButton_ setDefaultImage:image]; | |
| 283 [settingsButton_ setDefaultOpacity:0.6]; | |
| 284 [settingsButton_ setHoverImage:image]; | |
| 285 [settingsButton_ setHoverOpacity:0.9]; | |
| 286 [settingsButton_ setPressedImage:image]; | |
| 287 [settingsButton_ setPressedOpacity:1.0]; | |
| 288 [[settingsButton_ cell] setHighlightsBy:NSNoCellMask]; | |
| 289 [self checkMouseAndUpdateSettingsButtonVisibility]; | |
| 290 [self updateWrenchLayout]; | |
| 291 | |
| 292 [self updateCloseButtonLayout]; | 276 [self updateCloseButtonLayout]; |
| 293 | 277 |
| 294 // Set autoresizing behavior: glued to edges on left, top and right. | 278 // Set autoresizing behavior: glued to edges on left, top and right. |
| 295 [self setAutoresizingMask:(NSViewMinYMargin | NSViewWidthSizable)]; | 279 [self setAutoresizingMask:(NSViewMinYMargin | NSViewWidthSizable)]; |
| 296 | 280 |
| 297 [[NSNotificationCenter defaultCenter] | 281 [[NSNotificationCenter defaultCenter] |
| 298 addObserver:self | 282 addObserver:self |
| 299 selector:@selector(didChangeTheme:) | 283 selector:@selector(didChangeTheme:) |
| 300 name:kBrowserThemeDidChangeNotification | 284 name:kBrowserThemeDidChangeNotification |
| 301 object:nil]; | 285 object:nil]; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 328 [self addSubview:icon_ positioned:NSWindowBelow relativeTo:overlay_]; | 312 [self addSubview:icon_ positioned:NSWindowBelow relativeTo:overlay_]; |
| 329 [icon_ setWantsLayer:YES]; | 313 [icon_ setWantsLayer:YES]; |
| 330 } | 314 } |
| 331 [self updateIconAndTitleLayout]; | 315 [self updateIconAndTitleLayout]; |
| 332 } | 316 } |
| 333 | 317 |
| 334 - (NSView*)icon { | 318 - (NSView*)icon { |
| 335 return icon_; | 319 return icon_; |
| 336 } | 320 } |
| 337 | 321 |
| 338 - (void)updateWrenchLayout { | |
| 339 NSRect bounds = [self bounds]; | |
| 340 NSRect settingsButtonFrame = [settingsButtonWrapper_ frame]; | |
| 341 settingsButtonFrame.origin.x = NSWidth(bounds) - NSWidth(settingsButtonFrame); | |
| 342 settingsButtonFrame.origin.y = | |
| 343 (NSHeight(bounds) - NSHeight(settingsButtonFrame)) / 2; | |
| 344 [settingsButtonWrapper_ setFrame:settingsButtonFrame]; | |
| 345 } | |
| 346 | |
| 347 - (void)updateCloseButtonLayout { | 322 - (void)updateCloseButtonLayout { |
| 348 NSRect buttonFrame = [closeButton_ frame]; | 323 NSRect buttonFrame = [closeButton_ frame]; |
| 349 NSRect bounds = [self bounds]; | 324 NSRect bounds = [self bounds]; |
| 350 | 325 |
| 351 buttonFrame.origin.x = kButtonPadding; | 326 buttonFrame.origin.x = kButtonPadding; |
| 352 // Lower Close Button's frame 1 px to avoid it 'peeking' in MINIMIZED mode. | 327 // Lower Close Button's frame 1 px to avoid it 'peeking' in MINIMIZED mode. |
| 353 buttonFrame.origin.y = (NSHeight(bounds) - NSHeight(buttonFrame)) / 2 - 1; | 328 buttonFrame.origin.y = (NSHeight(bounds) - NSHeight(buttonFrame)) / 2 - 1; |
| 354 [closeButton_ setFrame:buttonFrame]; | 329 [closeButton_ setFrame:buttonFrame]; |
| 355 if (!closeButtonTrackingArea_.get()) { | 330 if (!closeButtonTrackingArea_.get()) { |
| 356 closeButtonTrackingArea_.reset( | 331 closeButtonTrackingArea_.reset( |
| 357 [[CrTrackingArea alloc] initWithRect:[closeButton_ bounds] | 332 [[CrTrackingArea alloc] initWithRect:[closeButton_ bounds] |
| 358 options:(NSTrackingMouseEnteredAndExited | | 333 options:(NSTrackingMouseEnteredAndExited | |
| 359 NSTrackingActiveAlways) | 334 NSTrackingActiveAlways) |
| 360 proxiedOwner:self | 335 proxiedOwner:self |
| 361 userInfo:nil]); | 336 userInfo:nil]); |
| 362 NSWindow* panelWindow = [self window]; | 337 NSWindow* panelWindow = [self window]; |
| 363 [closeButtonTrackingArea_.get() clearOwnerWhenWindowWillClose:panelWindow]; | 338 [closeButtonTrackingArea_.get() clearOwnerWhenWindowWillClose:panelWindow]; |
| 364 [closeButton_ addTrackingArea:closeButtonTrackingArea_.get()]; | 339 [closeButton_ addTrackingArea:closeButtonTrackingArea_.get()]; |
| 365 } | 340 } |
| 366 } | 341 } |
| 367 | 342 |
| 368 - (void)updateIconAndTitleLayout { | 343 - (void)updateIconAndTitleLayout { |
| 369 NSRect closeButtonFrame = [closeButton_ frame]; | 344 NSRect closeButtonFrame = [closeButton_ frame]; |
| 370 NSRect iconFrame = [icon_ frame]; | 345 NSRect iconFrame = [icon_ frame]; |
| 371 // NSTextField for title_ is set to Layout:Truncate, LineBreaks:TruncateTail | 346 // NSTextField for title_ is set to Layout:Truncate, LineBreaks:TruncateTail |
| 372 // in Interface Builder so it is sized in a single-line mode. | 347 // in Interface Builder so it is sized in a single-line mode. |
| 373 [title_ sizeToFit]; | 348 [title_ sizeToFit]; |
| 374 NSRect titleFrame = [title_ frame]; | 349 NSRect titleFrame = [title_ frame]; |
| 375 NSRect settingsButtonFrame = [settingsButtonWrapper_ frame]; | |
| 376 NSRect bounds = [self bounds]; | 350 NSRect bounds = [self bounds]; |
| 377 | 351 |
| 378 // Place the icon and title at the center of the titlebar. | 352 // Place the icon and title at the center of the titlebar. |
| 379 int iconWidthWithPadding = NSWidth(iconFrame) + kIconAndTextPadding; | 353 int iconWidthWithPadding = NSWidth(iconFrame) + kIconAndTextPadding; |
| 380 int titleWidth = NSWidth(titleFrame); | 354 int titleWidth = NSWidth(titleFrame); |
| 381 int availableWidth = NSWidth(bounds) - kButtonPadding * 4 - | 355 int availableWidth = NSWidth(bounds) - kButtonPadding * 2 - |
| 382 NSWidth(closeButtonFrame) - NSWidth(settingsButtonFrame); | 356 NSWidth(closeButtonFrame); |
| 383 if (iconWidthWithPadding + titleWidth > availableWidth) | 357 if (iconWidthWithPadding + titleWidth > availableWidth) |
| 384 titleWidth = availableWidth - iconWidthWithPadding; | 358 titleWidth = availableWidth - iconWidthWithPadding; |
| 385 int startX = kButtonPadding * 2 + NSWidth(closeButtonFrame) + | 359 int startX = kButtonPadding * 2 + NSWidth(closeButtonFrame) + |
| 386 (availableWidth - iconWidthWithPadding - titleWidth) / 2; | 360 (availableWidth - iconWidthWithPadding - titleWidth) / 2; |
| 387 | 361 |
| 388 iconFrame.origin.x = startX; | 362 iconFrame.origin.x = startX; |
| 389 iconFrame.origin.y = (NSHeight(bounds) - NSHeight(iconFrame)) / 2; | 363 iconFrame.origin.y = (NSHeight(bounds) - NSHeight(iconFrame)) / 2; |
| 390 [icon_ setFrame:iconFrame]; | 364 [icon_ setFrame:iconFrame]; |
| 391 | 365 |
| 392 titleFrame.origin.x = startX + iconWidthWithPadding; | 366 titleFrame.origin.x = startX + iconWidthWithPadding; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 408 | 382 |
| 409 - (void)mouseEntered:(NSEvent*)event { | 383 - (void)mouseEntered:(NSEvent*)event { |
| 410 [[closeButton_ cell] setHighlighted:YES]; | 384 [[closeButton_ cell] setHighlighted:YES]; |
| 411 } | 385 } |
| 412 | 386 |
| 413 - (void)mouseExited:(NSEvent*)event { | 387 - (void)mouseExited:(NSEvent*)event { |
| 414 [[closeButton_ cell] setHighlighted:NO]; | 388 [[closeButton_ cell] setHighlighted:NO]; |
| 415 } | 389 } |
| 416 | 390 |
| 417 - (void)didChangeFrame:(NSNotification*)notification { | 391 - (void)didChangeFrame:(NSNotification*)notification { |
| 418 [self updateWrenchLayout]; | |
| 419 [self updateIconAndTitleLayout]; | 392 [self updateIconAndTitleLayout]; |
| 420 } | 393 } |
| 421 | 394 |
| 422 - (void)didChangeTheme:(NSNotification*)notification { | 395 - (void)didChangeTheme:(NSNotification*)notification { |
| 423 [self setNeedsDisplay:YES]; | 396 [self setNeedsDisplay:YES]; |
| 424 } | 397 } |
| 425 | 398 |
| 426 - (void)didChangeMainWindow:(NSNotification*)notification { | 399 - (void)didChangeMainWindow:(NSNotification*)notification { |
| 427 [self setNeedsDisplay:YES]; | 400 [self setNeedsDisplay:YES]; |
| 428 [self checkMouseAndUpdateSettingsButtonVisibility]; | |
| 429 } | 401 } |
| 430 | 402 |
| 431 - (void)mouseDown:(NSEvent*)event { | 403 - (void)mouseDown:(NSEvent*)event { |
| 432 if ([controller_ isDraggable]) { | 404 if ([controller_ isDraggable]) { |
| 433 dragState_ = PANEL_DRAG_CAN_START; | 405 dragState_ = PANEL_DRAG_CAN_START; |
| 434 NSWindow* window = [self window]; | 406 NSWindow* window = [self window]; |
| 435 NSPoint mouseLocationInWindow = [event locationInWindow]; | 407 NSPoint mouseLocationInWindow = [event locationInWindow]; |
| 436 dragStartLocation_ = [window convertBaseToScreen:mouseLocationInWindow]; | 408 dragStartLocation_ = [window convertBaseToScreen:mouseLocationInWindow]; |
| 437 dragStartYOffset_ = NSMaxY([window frame]) - dragStartLocation_.y; | 409 dragStartYOffset_ = NSMaxY([window frame]) - dragStartLocation_.y; |
| 438 } | 410 } |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 } | 630 } |
| 659 | 631 |
| 660 - (void)cancelDragTitlebar { | 632 - (void)cancelDragTitlebar { |
| 661 [self endDrag:YES]; | 633 [self endDrag:YES]; |
| 662 } | 634 } |
| 663 | 635 |
| 664 - (void)finishDragTitlebar { | 636 - (void)finishDragTitlebar { |
| 665 [self endDrag:NO]; | 637 [self endDrag:NO]; |
| 666 } | 638 } |
| 667 | 639 |
| 668 - (void)updateSettingsButtonVisibility:(BOOL)mouseOverWindow { | |
| 669 // The settings button is visible if the panel is main window or the mouse is | |
| 670 // over it. | |
| 671 BOOL shouldShowSettingsButton = | |
| 672 mouseOverWindow || [[self window] isMainWindow]; | |
| 673 [[settingsButtonWrapper_ animator] | |
| 674 setAlphaValue:shouldShowSettingsButton ? 1.0 : 0.0]; | |
| 675 } | |
| 676 | |
| 677 - (void)checkMouseAndUpdateSettingsButtonVisibility { | |
| 678 BOOL mouseOverWindow = NSPointInRect([NSEvent mouseLocation], | |
| 679 [[self window] frame]); | |
| 680 [self updateSettingsButtonVisibility:mouseOverWindow]; | |
| 681 } | |
| 682 | |
| 683 @end | 640 @end |
| 684 | 641 |
| OLD | NEW |