1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#ifndef CHROME_BROWSER_UI_COCOA_GRADIENT_BUTTON_CELL_H_ 621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#define CHROME_BROWSER_UI_COCOA_GRADIENT_BUTTON_CELL_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#import <Cocoa/Cocoa.h> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_nsobject.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace ui { 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ThemeProvider; 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Base class for button cells for toolbar and bookmark bar. 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This is a button cell that handles drawing/highlighting of buttons. 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The appearance is determined by setting the cell's tag (not the 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// view's) to one of the constants below (ButtonType). 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Set this as the cell's tag. 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochenum { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kLeftButtonType = -1, 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kLeftButtonWithShadowType = -2, 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kStandardButtonType = 0, 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kRightButtonType = 1, 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMiddleButtonType = 2, 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Draws like a standard button, except when clicked where the interior 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // doesn't darken using the theme's "pressed" gradient. Instead uses the 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // normal un-pressed gradient. 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kStandardButtonTypeWithLimitedClickFeedback = 3, 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef NSInteger ButtonType; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace gradient_button_cell { 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Pulsing state for this button. 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricktypedef enum { 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Stable states. 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kPulsedOn, 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kPulsedOff, 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // In motion which will end in a stable state. 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kPulsingOn, 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kPulsingOff, 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // In continuous motion. 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kPulsingContinuous, 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} PulseState; 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch@interface GradientButtonCell : NSButtonCell { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch @private 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Custom drawing means we need to perform our own mouse tracking if 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the cell is setShowsBorderOnlyWhileMouseInside:YES. 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BOOL isMouseInside_; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_nsobject<NSTrackingArea> trackingArea_; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BOOL shouldTheme_; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CGFloat hoverAlpha_; // 0-1. Controls the alpha during mouse hover 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NSTimeInterval lastHoverUpdate_; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_nsobject<NSGradient> gradient_; 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick gradient_button_cell::PulseState pulseState_; 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CGFloat pulseMultiplier_; // for selecting pulse direction when continuous. 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CGFloat outerStrokeAlphaMult_; // For pulsing. 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_nsobject<NSImage> overlayImage_; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Turn off theming. Temporary work-around. 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch- (void)setShouldTheme:(BOOL)shouldTheme; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen- (void)drawBorderAndFillForTheme:(ui::ThemeProvider*)themeProvider 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch controlView:(NSView*)controlView 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch innerPath:(NSBezierPath*)innerPath 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch showClickedGradient:(BOOL)showClickedGradient 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch showHighlightGradient:(BOOL)showHighlightGradient 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch hoverAlpha:(CGFloat)hoverAlpha 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch active:(BOOL)active 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cellFrame:(NSRect)cellFrame 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch defaultGradient:(NSGradient*)defaultGradient; 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Let the view know when the mouse moves in and out. A timer will update 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the current hoverAlpha_ based on these events. 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch- (void)setMouseInside:(BOOL)flag animate:(BOOL)animate; 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Gets the path which tightly bounds the outside of the button. This is needed 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to produce images of clear buttons which only include the area inside, since 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the background of the button is drawn by someone else. 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch- (NSBezierPath*)clipPathForFrame:(NSRect)cellFrame 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch inView:(NSView*)controlView; 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Turn on or off continuous pulsing. When turning off continuous 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// pulsing, leave our pulse state in the correct ending position for 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// our isMouseInside_ property. Public since it's called from the 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// bookmark bubble. 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick- (void)setIsContinuousPulsing:(BOOL)continuous; 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Returns continuous pulse state. 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick- (BOOL)isContinuousPulsing; 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Safely stop continuous pulsing by turning off all timers. 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// May leave the cell in an odd state. 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Needed by an owning control's dealloc routine. 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick- (void)safelyStopPulsing; 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Actually fetches current mouse position and does a hit test. 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen- (BOOL)isMouseReallyInside; 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch@property(assign, nonatomic) CGFloat hoverAlpha; 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An image that will be drawn after the normal content of the button cell, 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// overlaying it. Never themed. 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch@property(retain, nonatomic) NSImage* overlayImage; 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch@end 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch@interface GradientButtonCell(TestingAPI) 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch- (BOOL)isMouseInside; 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick- (BOOL)pulsing; 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick- (gradient_button_cell::PulseState)pulseState; 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick- (void)setPulseState:(gradient_button_cell::PulseState)pstate; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch@end 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif // CHROME_BROWSER_UI_COCOA_GRADIENT_BUTTON_CELL_H_ 126