- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / gradient_button_cell.h
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_UI_COCOA_GRADIENT_BUTTON_CELL_H_
6 #define CHROME_BROWSER_UI_COCOA_GRADIENT_BUTTON_CELL_H_
7
8 #import <Cocoa/Cocoa.h>
9
10 #include "base/mac/scoped_nsobject.h"
11
12 namespace ui {
13 class ThemeProvider;
14 }
15
16 // Base class for button cells for toolbar and bookmark bar.
17 //
18 // This is a button cell that handles drawing/highlighting of buttons.
19 // The appearance is determined by setting the cell's tag (not the
20 // view's) to one of the constants below (ButtonType).
21
22 // Set this as the cell's tag.
23 enum {
24   kLeftButtonType = -1,
25   kLeftButtonWithShadowType = -2,
26   kStandardButtonType = 0,
27   kRightButtonType = 1,
28   kMiddleButtonType = 2,
29   // Draws like a standard button, except when clicked where the interior
30   // doesn't darken using the theme's "pressed" gradient. Instead uses the
31   // normal un-pressed gradient.
32   kStandardButtonTypeWithLimitedClickFeedback = 3,
33 };
34 typedef NSInteger ButtonType;
35
36 namespace gradient_button_cell {
37
38 // Pulsing state for this button.
39 typedef enum {
40   // Stable states.
41   kPulsedOn,
42   kPulsedOff,
43   // In motion which will end in a stable state.
44   kPulsingOn,
45   kPulsingOff,
46   // In continuous motion.
47   kPulsingContinuous,
48 } PulseState;
49
50 };
51
52
53 @interface GradientButtonCell : NSButtonCell {
54  @private
55   // Custom drawing means we need to perform our own mouse tracking if
56   // the cell is setShowsBorderOnlyWhileMouseInside:YES.
57   BOOL isMouseInside_;
58   base::scoped_nsobject<NSTrackingArea> trackingArea_;
59   BOOL shouldTheme_;
60   CGFloat hoverAlpha_;  // 0-1. Controls the alpha during mouse hover
61   NSTimeInterval lastHoverUpdate_;
62   base::scoped_nsobject<NSGradient> gradient_;
63   gradient_button_cell::PulseState pulseState_;
64   CGFloat pulseMultiplier_;  // for selecting pulse direction when continuous.
65   CGFloat outerStrokeAlphaMult_;  // For pulsing.
66   base::scoped_nsobject<NSImage> overlayImage_;
67 }
68
69 // Turn off theming.  Temporary work-around.
70 - (void)setShouldTheme:(BOOL)shouldTheme;
71
72 - (void)drawBorderAndFillForTheme:(ui::ThemeProvider*)themeProvider
73                       controlView:(NSView*)controlView
74                         innerPath:(NSBezierPath*)innerPath
75               showClickedGradient:(BOOL)showClickedGradient
76             showHighlightGradient:(BOOL)showHighlightGradient
77                        hoverAlpha:(CGFloat)hoverAlpha
78                            active:(BOOL)active
79                         cellFrame:(NSRect)cellFrame
80                   defaultGradient:(NSGradient*)defaultGradient;
81
82 // Let the view know when the mouse moves in and out. A timer will update
83 // the current hoverAlpha_ based on these events.
84 - (void)setMouseInside:(BOOL)flag animate:(BOOL)animate;
85
86 // Gets the path which tightly bounds the outside of the button. This is needed
87 // to produce images of clear buttons which only include the area inside, since
88 // the background of the button is drawn by someone else.
89 - (NSBezierPath*)clipPathForFrame:(NSRect)cellFrame
90                            inView:(NSView*)controlView;
91
92 // Turn on or off continuous pulsing.  When turning off continuous
93 // pulsing, leave our pulse state in the correct ending position for
94 // our isMouseInside_ property.  Public since it's called from the
95 // bookmark bubble.
96 - (void)setIsContinuousPulsing:(BOOL)continuous;
97
98 // Returns continuous pulse state.
99 - (BOOL)isContinuousPulsing;
100
101 // Safely stop continuous pulsing by turning off all timers.
102 // May leave the cell in an odd state.
103 // Needed by an owning control's dealloc routine.
104 - (void)safelyStopPulsing;
105
106 // Actually fetches current mouse position and does a hit test.
107 - (BOOL)isMouseReallyInside;
108
109 // Defines the top offset of text within the cell. Used by drawTitle and can
110 // be overriden by objects that inherit this class for placement of text.
111 - (int)verticalTextOffset;
112
113 @property(assign, nonatomic) CGFloat hoverAlpha;
114
115 // An image that will be drawn after the normal content of the button cell,
116 // overlaying it.  Never themed.
117 @property(retain, nonatomic) NSImage* overlayImage;
118
119 @end
120
121 @interface GradientButtonCell(TestingAPI)
122 - (BOOL)isMouseInside;
123 - (BOOL)pulsing;
124 - (gradient_button_cell::PulseState)pulseState;
125 - (void)setPulseState:(gradient_button_cell::PulseState)pstate;
126 @end
127
128 #endif  // CHROME_BROWSER_UI_COCOA_GRADIENT_BUTTON_CELL_H_