summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/gradient_button_cell.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/cocoa/gradient_button_cell.h')
-rw-r--r--chrome/browser/ui/cocoa/gradient_button_cell.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/chrome/browser/ui/cocoa/gradient_button_cell.h b/chrome/browser/ui/cocoa/gradient_button_cell.h
new file mode 100644
index 0000000..a1e905f
--- /dev/null
+++ b/chrome/browser/ui/cocoa/gradient_button_cell.h
@@ -0,0 +1,120 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_COCOA_GRADIENT_BUTTON_CELL_H_
+#define CHROME_BROWSER_UI_COCOA_GRADIENT_BUTTON_CELL_H_
+#pragma once
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/scoped_nsobject.h"
+
+class ThemeProvider;
+
+// Base class for button cells for toolbar and bookmark bar.
+//
+// This is a button cell that handles drawing/highlighting of buttons.
+// The appearance is determined by setting the cell's tag (not the
+// view's) to one of the constants below (ButtonType).
+
+// Set this as the cell's tag.
+enum {
+ kLeftButtonType = -1,
+ kLeftButtonWithShadowType = -2,
+ kStandardButtonType = 0,
+ kRightButtonType = 1,
+ kMiddleButtonType = 2,
+ // Draws like a standard button, except when clicked where the interior
+ // doesn't darken using the theme's "pressed" gradient. Instead uses the
+ // normal un-pressed gradient.
+ kStandardButtonTypeWithLimitedClickFeedback = 3,
+};
+typedef NSInteger ButtonType;
+
+namespace gradient_button_cell {
+
+// Pulsing state for this button.
+typedef enum {
+ // Stable states.
+ kPulsedOn,
+ kPulsedOff,
+ // In motion which will end in a stable state.
+ kPulsingOn,
+ kPulsingOff,
+ // In continuous motion.
+ kPulsingContinuous,
+} PulseState;
+
+};
+
+
+@interface GradientButtonCell : NSButtonCell {
+ @private
+ // Custom drawing means we need to perform our own mouse tracking if
+ // the cell is setShowsBorderOnlyWhileMouseInside:YES.
+ BOOL isMouseInside_;
+ scoped_nsobject<NSTrackingArea> trackingArea_;
+ BOOL shouldTheme_;
+ CGFloat hoverAlpha_; // 0-1. Controls the alpha during mouse hover
+ NSTimeInterval lastHoverUpdate_;
+ scoped_nsobject<NSGradient> gradient_;
+ gradient_button_cell::PulseState pulseState_;
+ CGFloat pulseMultiplier_; // for selecting pulse direction when continuous.
+ CGFloat outerStrokeAlphaMult_; // For pulsing.
+ scoped_nsobject<NSImage> overlayImage_;
+}
+
+// Turn off theming. Temporary work-around.
+- (void)setShouldTheme:(BOOL)shouldTheme;
+
+- (void)drawBorderAndFillForTheme:(ThemeProvider*)themeProvider
+ controlView:(NSView*)controlView
+ innerPath:(NSBezierPath*)innerPath
+ showClickedGradient:(BOOL)showClickedGradient
+ showHighlightGradient:(BOOL)showHighlightGradient
+ hoverAlpha:(CGFloat)hoverAlpha
+ active:(BOOL)active
+ cellFrame:(NSRect)cellFrame
+ defaultGradient:(NSGradient*)defaultGradient;
+
+// Let the view know when the mouse moves in and out. A timer will update
+// the current hoverAlpha_ based on these events.
+- (void)setMouseInside:(BOOL)flag animate:(BOOL)animate;
+
+// Gets the path which tightly bounds the outside of the button. This is needed
+// to produce images of clear buttons which only include the area inside, since
+// the background of the button is drawn by someone else.
+- (NSBezierPath*)clipPathForFrame:(NSRect)cellFrame
+ inView:(NSView*)controlView;
+
+// Turn on or off continuous pulsing. When turning off continuous
+// pulsing, leave our pulse state in the correct ending position for
+// our isMouseInside_ property. Public since it's called from the
+// bookmark bubble.
+- (void)setIsContinuousPulsing:(BOOL)continuous;
+
+// Returns continuous pulse state.
+- (BOOL)isContinuousPulsing;
+
+// Safely stop continuous pulsing by turning off all timers.
+// May leave the cell in an odd state.
+// Needed by an owning control's dealloc routine.
+- (void)safelyStopPulsing;
+
+@property(assign, nonatomic) CGFloat hoverAlpha;
+
+// An image that will be drawn after the normal content of the button cell,
+// overlaying it. Never themed.
+@property(retain, nonatomic) NSImage* overlayImage;
+
+@end
+
+@interface GradientButtonCell(TestingAPI)
+- (BOOL)isMouseInside;
+- (BOOL)pulsing;
+- (gradient_button_cell::PulseState)pulseState;
+- (void)setPulseState:(gradient_button_cell::PulseState)pstate;
+@end
+
+#endif // CHROME_BROWSER_UI_COCOA_GRADIENT_BUTTON_CELL_H_