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