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/cocoa/framed_browser_window.h" | 5 #import "chrome/browser/ui/cocoa/framed_browser_window.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/mac/sdk_forward_declarations.h" | 8 #include "base/mac/sdk_forward_declarations.h" |
9 #include "chrome/browser/global_keyboard_shortcuts_mac.h" | 9 #include "chrome/browser/global_keyboard_shortcuts_mac.h" |
10 #include "chrome/browser/profiles/profile_avatar_icon_util.h" | 10 #include "chrome/browser/profiles/profile_avatar_icon_util.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 // Implementer's note: Moving the window controls is tricky. When altering the | 22 // Implementer's note: Moving the window controls is tricky. When altering the |
23 // code, ensure that: | 23 // code, ensure that: |
24 // - accessibility hit testing works | 24 // - accessibility hit testing works |
25 // - the accessibility hierarchy is correct | 25 // - the accessibility hierarchy is correct |
26 // - close/min in the background don't bring the window forward | 26 // - close/min in the background don't bring the window forward |
27 // - rollover effects work correctly | 27 // - rollover effects work correctly |
28 | 28 |
29 namespace { | 29 namespace { |
30 | 30 |
31 const CGFloat kBrowserFrameViewPaintHeight = 60.0; | |
32 | |
33 // Size of the gradient. Empirically determined so that the gradient looks | 31 // Size of the gradient. Empirically determined so that the gradient looks |
34 // like what the heuristic does when there are just a few tabs. | 32 // like what the heuristic does when there are just a few tabs. |
35 const CGFloat kWindowGradientHeight = 24.0; | 33 const CGFloat kWindowGradientHeight = 24.0; |
36 | 34 |
37 } | 35 } |
38 | 36 |
39 @interface FramedBrowserWindow (Private) | 37 @interface FramedBrowserWindow (Private) |
40 | 38 |
41 - (void)adjustCloseButton:(NSNotification*)notification; | 39 - (void)adjustCloseButton:(NSNotification*)notification; |
42 - (void)adjustMiniaturizeButton:(NSNotification*)notification; | 40 - (void)adjustMiniaturizeButton:(NSNotification*)notification; |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 if ([bwc shouldShowAvatar] && ![bwc shouldUseNewAvatarButton]) { | 305 if ([bwc shouldShowAvatar] && ![bwc shouldUseNewAvatarButton]) { |
308 NSView* avatarButton = [[bwc avatarButtonController] view]; | 306 NSView* avatarButton = [[bwc avatarButtonController] view]; |
309 origin.x = -(NSWidth([avatarButton frame]) + 3); | 307 origin.x = -(NSWidth([avatarButton frame]) + 3); |
310 } else { | 308 } else { |
311 origin.x -= 6; | 309 origin.x -= 6; |
312 } | 310 } |
313 | 311 |
314 return origin; | 312 return origin; |
315 } | 313 } |
316 | 314 |
317 - (void)drawCustomFrameRect:(NSRect)rect forView:(NSView*)view { | |
318 // WARNING: There is an obvious optimization opportunity here that you DO NOT | |
319 // want to take. To save painting cycles, you might think it would be a good | |
320 // idea to call out to the default implementation only if no theme were | |
321 // drawn. In reality, however, if you fail to call the default | |
322 // implementation, or if you call it after a clipping path is set, the | |
323 // rounded corners at the top of the window will not draw properly. Do not | |
324 // try to be smart here. | |
325 | |
326 // Only paint the top of the window. | |
327 NSRect windowRect = [view convertRect:[self frame] fromView:nil]; | |
328 windowRect.origin = NSZeroPoint; | |
329 | |
330 NSRect paintRect = windowRect; | |
331 paintRect.origin.y = NSMaxY(paintRect) - kBrowserFrameViewPaintHeight; | |
332 paintRect.size.height = kBrowserFrameViewPaintHeight; | |
333 rect = NSIntersectionRect(paintRect, rect); | |
334 [super drawCustomFrameRect:rect forView:view]; | |
335 | |
336 // Set up our clip. | |
337 float cornerRadius = 4.0; | |
338 if ([view respondsToSelector:@selector(roundedCornerRadius)]) | |
339 cornerRadius = [view roundedCornerRadius]; | |
340 [[NSBezierPath bezierPathWithRoundedRect:windowRect | |
341 xRadius:cornerRadius | |
342 yRadius:cornerRadius] addClip]; | |
343 [[NSBezierPath bezierPathWithRect:rect] addClip]; | |
344 | |
345 // Do the theming. | |
346 BOOL themed = [FramedBrowserWindow | |
347 drawWindowThemeInDirtyRect:rect | |
348 forView:view | |
349 bounds:windowRect | |
350 forceBlackBackground:NO]; | |
351 | |
352 // If the window needs a title and we painted over the title as drawn by the | |
353 // default window paint, paint it ourselves. | |
354 if (themed && [view respondsToSelector:@selector(_titlebarTitleRect)] && | |
355 [view respondsToSelector:@selector(_drawTitleStringIn:withColor:)] && | |
356 ![self _isTitleHidden]) { | |
357 [view _drawTitleStringIn:[view _titlebarTitleRect] | |
358 withColor:[self titleColor]]; | |
359 } | |
360 | |
361 // Pinstripe the top. | |
362 if (themed) { | |
363 CGFloat lineWidth = [view cr_lineWidth]; | |
364 | |
365 windowRect = [view convertRect:[self frame] fromView:nil]; | |
366 windowRect.origin = NSZeroPoint; | |
367 windowRect.origin.y -= 0.5 * lineWidth; | |
368 windowRect.origin.x -= 0.5 * lineWidth; | |
369 windowRect.size.width += lineWidth; | |
370 [[NSColor colorWithCalibratedWhite:1.0 alpha:0.5] set]; | |
371 NSBezierPath* path = [NSBezierPath bezierPathWithRoundedRect:windowRect | |
372 xRadius:cornerRadius | |
373 yRadius:cornerRadius]; | |
374 [path setLineWidth:lineWidth]; | |
375 [path stroke]; | |
376 } | |
377 } | |
378 | |
379 + (BOOL)drawWindowThemeInDirtyRect:(NSRect)dirtyRect | 315 + (BOOL)drawWindowThemeInDirtyRect:(NSRect)dirtyRect |
380 forView:(NSView*)view | 316 forView:(NSView*)view |
381 bounds:(NSRect)bounds | 317 bounds:(NSRect)bounds |
382 forceBlackBackground:(BOOL)forceBlackBackground { | 318 forceBlackBackground:(BOOL)forceBlackBackground { |
383 ui::ThemeProvider* themeProvider = [[view window] themeProvider]; | 319 ui::ThemeProvider* themeProvider = [[view window] themeProvider]; |
384 if (!themeProvider) | 320 if (!themeProvider) |
385 return NO; | 321 return NO; |
386 | 322 |
387 ThemedWindowStyle windowStyle = [[view window] themedWindowStyle]; | 323 ThemedWindowStyle windowStyle = [[view window] themedWindowStyle]; |
388 | 324 |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 ThemedWindowStyle windowStyle = [self themedWindowStyle]; | 423 ThemedWindowStyle windowStyle = [self themedWindowStyle]; |
488 BOOL incognito = windowStyle & THEMED_INCOGNITO; | 424 BOOL incognito = windowStyle & THEMED_INCOGNITO; |
489 | 425 |
490 if (incognito) | 426 if (incognito) |
491 return [NSColor whiteColor]; | 427 return [NSColor whiteColor]; |
492 else | 428 else |
493 return [NSColor windowFrameTextColor]; | 429 return [NSColor windowFrameTextColor]; |
494 } | 430 } |
495 | 431 |
496 @end | 432 @end |
OLD | NEW |