// Copyright (c) 2011 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_TOUCH_TABS_TOUCH_TAB_H_
#define CHROME_BROWSER_UI_TOUCH_TABS_TOUCH_TAB_H_
#pragma once

#include <string>

#include "base/memory/scoped_ptr.h"
#include "chrome/browser/ui/views/tabs/base_tab.h"
#include "ui/gfx/point.h"

///////////////////////////////////////////////////////////////////////////////
//
// TouchTab
//
//  A View that renders a TouchTab in a TouchTabStrip
//
// TODO(wyck): Use transformable views for scrolling.
///////////////////////////////////////////////////////////////////////////////
class TouchTab : public BaseTab {
 public:
  // The menu button's class name.
  static const char kViewClassName[];

  explicit TouchTab(TabController* controller);
  virtual ~TouchTab();

  // Set the background offset used to match the image in the inactive tab
  // to the frame image.
  void set_background_offset(const gfx::Point& offset) {
    background_offset_ = offset;
  }

  // Returns the minimum possible size of a single unselected Tab.
  static gfx::Size GetMinimumUnselectedSize();

 protected:
  virtual const gfx::Rect& GetTitleBounds() const;
  virtual const gfx::Rect& GetIconBounds() const;

 private:
  // Overridden from views::View:
  virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
  virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE;
  virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE;
  virtual void OnPaint(gfx::Canvas* canvas);
  virtual void Layout();
  virtual bool HasHitTestMask() const;
  virtual void GetHitTestMask(gfx::Path* path) const;

  // Paint various portions of the Tab
  void PaintTabBackground(gfx::Canvas* canvas);
  void PaintIcon(gfx::Canvas* canvas);
  void PaintActiveTabBackground(gfx::Canvas* canvas);

  // TODO(wyck): will eventually add OnTouchEvent when the Touch Tab Strip
  // requires touch-specific event handling.

  // Performs a one-time initialization of static resources such as tab images.
  static void InitTabResources();

  // Loads the images to be used for the tab background.
  static void LoadTabImages();

  // the bounds of the title text
  gfx::Rect title_bounds_;

  // the bounds of the favicon
  gfx::Rect favicon_bounds_;

  // The offset used to paint the inactive background image.
  gfx::Point background_offset_;

  // 'l' is for left
  // 'c' is for center
  // 'r' is for right
  struct TouchTabImage {
    SkBitmap* image_l;
    SkBitmap* image_c;
    SkBitmap* image_r;
    int l_width;
    int r_width;
    int y_offset;
  };
  static TouchTabImage tab_active;
  static TouchTabImage tab_inactive;
  static TouchTabImage tab_alpha;

  DISALLOW_COPY_AND_ASSIGN(TouchTab);
};

#endif  // CHROME_BROWSER_UI_TOUCH_TABS_TOUCH_TAB_H_