• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_GTK_TABS_DRAGGED_TAB_GTK_H_
6 #define CHROME_BROWSER_UI_GTK_TABS_DRAGGED_TAB_GTK_H_
7 #pragma once
8 
9 #include <gtk/gtk.h>
10 
11 #include "base/callback.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/task.h"
14 #include "ui/base/animation/animation_delegate.h"
15 #include "ui/base/animation/slide_animation.h"
16 #include "ui/gfx/canvas.h"
17 #include "ui/gfx/point.h"
18 #include "ui/gfx/rect.h"
19 #include "ui/gfx/size.h"
20 
21 class TabContents;
22 class TabRendererGtk;
23 
24 class DraggedTabGtk : public ui::AnimationDelegate {
25  public:
26   DraggedTabGtk(TabContents* datasource,
27                 const gfx::Point& mouse_tab_offset,
28                 const gfx::Size& contents_size,
29                 bool mini);
30   virtual ~DraggedTabGtk();
31 
32   // Moves the dragged tab to the appropriate location given the mouse
33   // pointer at |screen_point|.
34   void MoveTo(const gfx::Point& screen_point);
35 
36   // Sets the offset of the mouse from the upper left corner of the tab.
set_mouse_tab_offset(const gfx::Point & offset)37   void set_mouse_tab_offset(const gfx::Point& offset) {
38     mouse_tab_offset_ = offset;
39   }
40 
41   // Notifies the dragged tab that it has become attached to a tabstrip.
42   void Attach(int selected_width);
43 
44   // Resizes the dragged tab to a width of |width|.
45   void Resize(int width);
46 
47   // Notifies the dragged tab that it has been detached from a tabstrip.
48   void Detach();
49 
50   // Notifies the dragged tab that it should update itself.
51   void Update();
52 
53   // Animates the dragged tab to the specified bounds, then calls back to
54   // |callback|.
55   typedef Callback0::Type AnimateToBoundsCallback;
56   void AnimateToBounds(const gfx::Rect& bounds,
57                        AnimateToBoundsCallback* callback);
58 
59   // Returns the size of the dragged tab. Used when attaching to a tabstrip
60   // to determine where to place the tab in the attached tabstrip.
attached_tab_size()61   const gfx::Size& attached_tab_size() const { return attached_tab_size_; }
62 
widget()63   GtkWidget* widget() const { return container_; }
64 
65  private:
66   // Overridden from ui::AnimationDelegate:
67   virtual void AnimationProgressed(const ui::Animation* animation);
68   virtual void AnimationEnded(const ui::Animation* animation);
69   virtual void AnimationCanceled(const ui::Animation* animation);
70 
71   // Arranges the contents of the dragged tab.
72   void Layout();
73 
74   // Gets the preferred size of the dragged tab.
75   gfx::Size GetPreferredSize();
76 
77   // Resizes the container to fit the content for the current attachment mode.
78   void ResizeContainer();
79 
80   // Utility for scaling a size by the current scaling factor.
81   int ScaleValue(int value);
82 
83   // Returns the bounds of the container window.
84   gfx::Rect bounds() const;
85 
86   // Sets the color map of the container window to allow the window to be
87   // transparent.
88   void SetContainerColorMap();
89 
90   // Sets full transparency for the container window.  This is used if
91   // compositing is available for the screen.
92   void SetContainerTransparency();
93 
94   // Sets the shape mask for the container window to emulate a transparent
95   // container window.  This is used if compositing is not available for the
96   // screen.
97   // |surface| represents the tab only (not the render view).
98   void SetContainerShapeMask(cairo_surface_t* surface);
99 
100   // expose-event handler that notifies when the tab needs to be redrawn.
101   static gboolean OnExposeEvent(GtkWidget* widget, GdkEventExpose* event,
102                                 DraggedTabGtk* dragged_tab);
103 
104   // The tab contents that the dragged tab contains.
105   TabContents* data_source_;
106 
107   // The window that contains the dragged tab or tab contents.
108   GtkWidget* container_;
109 
110   // The fixed widget that we use to contain the tab renderer so that the
111   // tab widget won't be resized.
112   GtkWidget* fixed_;
113 
114   // The renderer that paints the dragged tab.
115   scoped_ptr<TabRendererGtk> renderer_;
116 
117   // True if the view is currently attached to a tabstrip. Controls rendering
118   // and sizing modes.
119   bool attached_;
120 
121   // The unscaled offset of the mouse from the top left of the dragged tab.
122   // This is used to maintain an appropriate offset for the mouse pointer when
123   // dragging scaled and unscaled representations, and also to calculate the
124   // position of detached windows.
125   gfx::Point mouse_tab_offset_;
126 
127   // The size of the tab renderer when the dragged tab is attached to a
128   // tabstrip.
129   gfx::Size attached_tab_size_;
130 
131   // The dimensions of the TabContents being dragged.
132   gfx::Size contents_size_;
133 
134   // The animation used to slide the attached tab to its final location.
135   ui::SlideAnimation close_animation_;
136 
137   // A callback notified when the animation is complete.
138   scoped_ptr<Callback0::Type> animation_callback_;
139 
140   // The start and end bounds of the animation sequence.
141   gfx::Rect animation_start_bounds_;
142   gfx::Rect animation_end_bounds_;
143 
144   DISALLOW_COPY_AND_ASSIGN(DraggedTabGtk);
145 };
146 
147 #endif  // CHROME_BROWSER_UI_GTK_TABS_DRAGGED_TAB_GTK_H_
148