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