Home | History | Annotate | Download | only in tabs
      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_VIEWS_TABS_TAB_H_
      6 #define CHROME_BROWSER_UI_VIEWS_TABS_TAB_H_
      7 #pragma once
      8 
      9 #include <string>
     10 
     11 #include "base/memory/scoped_ptr.h"
     12 #include "chrome/browser/ui/views/tabs/base_tab.h"
     13 #include "ui/gfx/point.h"
     14 
     15 namespace ui {
     16 class MultiAnimation;
     17 class SlideAnimation;
     18 }
     19 
     20 ///////////////////////////////////////////////////////////////////////////////
     21 //
     22 // TabRenderer
     23 //
     24 //  A View that renders a Tab, either in a TabStrip or in a DraggedTabView.
     25 //
     26 ///////////////////////////////////////////////////////////////////////////////
     27 class Tab : public BaseTab {
     28  public:
     29   // The menu button's class name.
     30   static const char kViewClassName[];
     31 
     32   explicit Tab(TabController* controller);
     33   virtual ~Tab();
     34 
     35   // Start/stop the mini-tab title animation.
     36   void StartMiniTabTitleAnimation();
     37   void StopMiniTabTitleAnimation();
     38 
     39   // Set the background offset used to match the image in the inactive tab
     40   // to the frame image.
     41   void set_background_offset(const gfx::Point& offset) {
     42     background_offset_ = offset;
     43   }
     44 
     45   // Returns the minimum possible size of a single unselected Tab.
     46   static gfx::Size GetMinimumUnselectedSize();
     47   // Returns the minimum possible size of a selected Tab. Selected tabs must
     48   // always show a close button and have a larger minimum size than unselected
     49   // tabs.
     50   static gfx::Size GetMinimumSelectedSize();
     51   // Returns the preferred size of a single Tab, assuming space is
     52   // available.
     53   static gfx::Size GetStandardSize();
     54 
     55   // Returns the width for mini-tabs. Mini-tabs always have this width.
     56   static int GetMiniWidth();
     57 
     58  protected:
     59   // BaseTab overrides:
     60   virtual const gfx::Rect& GetTitleBounds() const OVERRIDE;
     61   virtual const gfx::Rect& GetIconBounds() const OVERRIDE;
     62   virtual void DataChanged(const TabRendererData& old) OVERRIDE;
     63 
     64  private:
     65   // Overridden from views::View:
     66   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
     67   virtual void Layout() OVERRIDE;
     68   virtual void OnThemeChanged() OVERRIDE;
     69   virtual std::string GetClassName() const OVERRIDE;
     70   virtual bool HasHitTestMask() const OVERRIDE;
     71   virtual void GetHitTestMask(gfx::Path* path) const OVERRIDE;
     72   virtual bool GetTooltipTextOrigin(const gfx::Point& p,
     73                                     gfx::Point* origin) OVERRIDE;
     74   virtual void OnMouseMoved(const views::MouseEvent& event) OVERRIDE;
     75 
     76   // Paint various portions of the Tab
     77   void PaintTabBackground(gfx::Canvas* canvas);
     78   void PaintInactiveTabBackgroundWithTitleChange(gfx::Canvas* canvas);
     79   void PaintInactiveTabBackground(gfx::Canvas* canvas);
     80   void PaintActiveTabBackground(gfx::Canvas* canvas);
     81   SkBitmap DrawHoverGlowBitmap(int width, int height);
     82 
     83   // Returns the number of favicon-size elements that can fit in the tab's
     84   // current size.
     85   int IconCapacity() const;
     86 
     87   // Returns whether the Tab should display a favicon.
     88   bool ShouldShowIcon() const;
     89 
     90   // Returns whether the Tab should display a close button.
     91   bool ShouldShowCloseBox() const;
     92 
     93   // Gets the throb value for the tab. When a tab is not selected the
     94   // active background is drawn at |GetThrobValue()|%. This is used for hover,
     95   // mini tab title change and pulsing.
     96   double GetThrobValue();
     97 
     98   // Performs a one-time initialization of static resources such as tab images.
     99   static void InitTabResources();
    100 
    101   // Loads the images to be used for the tab background.
    102   static void LoadTabImages();
    103 
    104   // The bounds of various sections of the display.
    105   gfx::Rect favicon_bounds_;
    106   gfx::Rect title_bounds_;
    107 
    108   // The offset used to paint the inactive background image.
    109   gfx::Point background_offset_;
    110 
    111   // The center point for the radial hover glow.
    112   gfx::Point hover_point_;
    113 
    114   // Animation used when the title of an inactive mini tab changes.
    115   scoped_ptr<ui::MultiAnimation> mini_title_animation_;
    116 
    117   struct TabImage {
    118     SkBitmap* image_l;
    119     SkBitmap* image_c;
    120     SkBitmap* image_r;
    121     int l_width;
    122     int r_width;
    123     int y_offset;
    124   };
    125   static TabImage tab_active_;
    126   static TabImage tab_inactive_;
    127   static TabImage tab_alpha_;
    128 
    129   // Whether we're showing the icon. It is cached so that we can detect when it
    130   // changes and layout appropriately.
    131   bool showing_icon_;
    132 
    133   // Whether we are showing the close button. It is cached so that we can
    134   // detect when it changes and layout appropriately.
    135   bool showing_close_button_;
    136 
    137   // The current color of the close button.
    138   SkColor close_button_color_;
    139 
    140   static bool initialized_;
    141 
    142   DISALLOW_COPY_AND_ASSIGN(Tab);
    143 };
    144 
    145 #endif  // CHROME_BROWSER_UI_VIEWS_TABS_TAB_H_
    146