• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 ASH_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_
6 #define ASH_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_
7 
8 #include <map>
9 
10 #include "ash/ash_export.h"
11 #include "ash/frame/caption_buttons/frame_size_button_delegate.h"
12 #include "ui/gfx/animation/animation_delegate.h"
13 #include "ui/views/controls/button/button.h"
14 #include "ui/views/view.h"
15 
16 namespace gfx {
17 class SlideAnimation;
18 }
19 
20 namespace views {
21 class Widget;
22 }
23 
24 namespace ash {
25 
26 // Container view for the frame caption buttons. It performs the appropriate
27 // action when a caption button is clicked.
28 class ASH_EXPORT FrameCaptionButtonContainerView
29     : public views::View,
30       public views::ButtonListener,
31       public FrameSizeButtonDelegate,
32       public gfx::AnimationDelegate {
33  public:
34   static const char kViewClassName[];
35 
36   // Whether the frame can be minimized (either via the maximize/restore button
37   // or via a dedicated button).
38   enum MinimizeAllowed {
39     MINIMIZE_ALLOWED,
40     MINIMIZE_DISALLOWED
41   };
42 
43   // |frame| is the views::Widget that the caption buttons act on.
44   // |minimize_allowed| indicates whether the frame can be minimized (either via
45   // the maximize/restore button or via a dedicated button).
46   FrameCaptionButtonContainerView(views::Widget* frame,
47                                   MinimizeAllowed minimize_allowed);
48   virtual ~FrameCaptionButtonContainerView();
49 
50   // For testing.
51   class ASH_EXPORT TestApi {
52    public:
TestApi(FrameCaptionButtonContainerView * container_view)53     explicit TestApi(FrameCaptionButtonContainerView* container_view)
54         : container_view_(container_view) {
55     }
56 
57     void EndAnimations();
58 
minimize_button()59     FrameCaptionButton* minimize_button() const {
60       return container_view_->minimize_button_;
61     }
62 
size_button()63     FrameCaptionButton* size_button() const {
64       return container_view_->size_button_;
65     }
66 
close_button()67     FrameCaptionButton* close_button() const {
68       return container_view_->close_button_;
69     }
70 
71    private:
72     FrameCaptionButtonContainerView* container_view_;
73 
74     DISALLOW_COPY_AND_ASSIGN(TestApi);
75   };
76 
77   // Sets the resource ids of the images to paint the button for |icon|. The
78   // FrameCaptionButtonContainerView will keep track of the images to use for
79   // |icon| even if none of the buttons currently use |icon|.
80   void SetButtonImages(CaptionButtonIcon icon,
81                        int icon_image_id,
82                        int inactive_icon_image_id,
83                        int hovered_background_image_id,
84                        int pressed_background_image_id);
85 
86   // Sets whether the buttons should be painted as active. Does not schedule
87   // a repaint.
88   void SetPaintAsActive(bool paint_as_active);
89 
90   // Tell the window controls to reset themselves to the normal state.
91   void ResetWindowControls();
92 
93   // Determines the window HT* code for the caption button at |point|. Returns
94   // HTNOWHERE if |point| is not over any of the caption buttons. |point| must
95   // be in the coordinates of the FrameCaptionButtonContainerView.
96   int NonClientHitTest(const gfx::Point& point) const;
97 
98   // Updates the size button's visibility based on whether |frame_| can be
99   // maximized and if maximize mode is enabled. A parent view should relayout
100   // to reflect the change in visibility.
101   void UpdateSizeButtonVisibility();
102 
103   // views::View:
104   virtual gfx::Size GetPreferredSize() const OVERRIDE;
105   virtual void Layout() OVERRIDE;
106   virtual const char* GetClassName() const OVERRIDE;
107 
108   // Overridden from gfx::AnimationDelegate:
109   virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
110   virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
111 
112  private:
113   friend class FrameCaptionButtonContainerViewTest;
114 
115   struct ButtonIconIds {
116     ButtonIconIds();
117     ButtonIconIds(int icon_id,
118                   int inactive_icon_id,
119                   int hovered_background_id,
120                   int pressed_background_id);
121     ~ButtonIconIds();
122 
123     int icon_image_id;
124     int inactive_icon_image_id;
125     int hovered_background_image_id;
126     int pressed_background_image_id;
127   };
128 
129   // Sets |button|'s icon to |icon|. If |animate| is ANIMATE_YES, the button
130   // will crossfade to the new icon. If |animate| is ANIMATE_NO and
131   // |icon| == |button|->icon(), the crossfade animation is progressed to the
132   // end.
133   void SetButtonIcon(FrameCaptionButton* button,
134                      CaptionButtonIcon icon,
135                      Animate animate);
136 
137   // Returns true if maximize mode is not enabled, and |frame_| widget delegate
138   // can be maximized.
139   bool ShouldSizeButtonBeVisible() const;
140 
141   // views::ButtonListener:
142   virtual void ButtonPressed(views::Button* sender,
143                              const ui::Event& event) OVERRIDE;
144 
145   // FrameSizeButtonDelegate:
146   virtual bool IsMinimizeButtonVisible() const OVERRIDE;
147   virtual void SetButtonsToNormal(Animate animate) OVERRIDE;
148   virtual void SetButtonIcons(CaptionButtonIcon minimize_button_icon,
149                               CaptionButtonIcon close_button_icon,
150                               Animate animate) OVERRIDE;
151   virtual const FrameCaptionButton* GetButtonClosestTo(
152       const gfx::Point& position_in_screen) const OVERRIDE;
153   virtual void SetHoveredAndPressedButtons(
154       const FrameCaptionButton* to_hover,
155       const FrameCaptionButton* to_press) OVERRIDE;
156 
157   // The widget that the buttons act on.
158   views::Widget* frame_;
159 
160   // The buttons. In the normal button style, at most one of |minimize_button_|
161   // and |size_button_| is visible.
162   FrameCaptionButton* minimize_button_;
163   FrameCaptionButton* size_button_;
164   FrameCaptionButton* close_button_;
165 
166   // Mapping of the images needed to paint a button for each of the values of
167   // CaptionButtonIcon.
168   std::map<CaptionButtonIcon, ButtonIconIds> button_icon_id_map_;
169 
170   // Animation that affects the position of |minimize_button_| and the
171   // visibility of |size_button_|.
172   scoped_ptr<gfx::SlideAnimation> maximize_mode_animation_;
173 
174   DISALLOW_COPY_AND_ASSIGN(FrameCaptionButtonContainerView);
175 };
176 
177 }  // namespace ash
178 
179 #endif  // ASH_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_
180