1 // Copyright (c) 2012 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 UI_VIEWS_WINDOW_CUSTOM_FRAME_VIEW_H_ 6 #define UI_VIEWS_WINDOW_CUSTOM_FRAME_VIEW_H_ 7 8 #include "base/basictypes.h" 9 #include "base/compiler_specific.h" 10 #include "base/memory/scoped_ptr.h" 11 #include "ui/views/controls/button/button.h" 12 #include "ui/views/window/frame_buttons.h" 13 #include "ui/views/window/non_client_view.h" 14 15 namespace gfx { 16 class ImageSkia; 17 } 18 19 namespace views { 20 21 class FrameBackground; 22 class ImageButton; 23 class Widget; 24 25 /////////////////////////////////////////////////////////////////////////////// 26 // 27 // CustomFrameView 28 // 29 // A view that provides the non client frame for Windows. This means 30 // rendering the non-standard window caption, border, and controls. 31 // 32 //////////////////////////////////////////////////////////////////////////////// 33 class VIEWS_EXPORT CustomFrameView : public NonClientFrameView, 34 public ButtonListener { 35 public: 36 CustomFrameView(); 37 virtual ~CustomFrameView(); 38 39 void Init(Widget* frame); 40 41 // Overridden from NonClientFrameView: 42 virtual gfx::Rect GetBoundsForClientView() const OVERRIDE; 43 virtual gfx::Rect GetWindowBoundsForClientBounds( 44 const gfx::Rect& client_bounds) const OVERRIDE; 45 virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE; 46 virtual void GetWindowMask(const gfx::Size& size, 47 gfx::Path* window_mask) OVERRIDE; 48 virtual void ResetWindowControls() OVERRIDE; 49 virtual void UpdateWindowIcon() OVERRIDE; 50 virtual void UpdateWindowTitle() OVERRIDE; 51 virtual void SizeConstraintsChanged() OVERRIDE; 52 53 // Overridden from View: 54 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 55 virtual void Layout() OVERRIDE; 56 virtual gfx::Size GetPreferredSize() const OVERRIDE; 57 virtual gfx::Size GetMinimumSize() const OVERRIDE; 58 virtual gfx::Size GetMaximumSize() const OVERRIDE; 59 60 // Overridden from ButtonListener: 61 virtual void ButtonPressed(Button* sender, const ui::Event& event) OVERRIDE; 62 63 private: 64 friend class CustomFrameViewTest; 65 66 // Returns the thickness of the border that makes up the window frame edges. 67 // This does not include any client edge. 68 int FrameBorderThickness() const; 69 70 // Returns the thickness of the entire nonclient left, right, and bottom 71 // borders, including both the window frame and any client edge. 72 int NonClientBorderThickness() const; 73 74 // Returns the height of the entire nonclient top border, including the window 75 // frame, any title area, and any connected client edge. 76 int NonClientTopBorderHeight() const; 77 78 // Returns the y-coordinate of the caption buttons. 79 int CaptionButtonY() const; 80 81 // Returns the thickness of the nonclient portion of the 3D edge along the 82 // bottom of the titlebar. 83 int TitlebarBottomThickness() const; 84 85 // Returns the size of the titlebar icon. This is used even when the icon is 86 // not shown, e.g. to set the titlebar height. 87 int IconSize() const; 88 89 // Returns the bounds of the titlebar icon (or where the icon would be if 90 // there was one). 91 gfx::Rect IconBounds() const; 92 93 // Returns true if the title bar, caption buttons, and frame border should be 94 // drawn. If false, the client view occupies the full area of this view. 95 bool ShouldShowTitleBarAndBorder() const; 96 97 // Returns true if the client edge should be drawn. This is true if 98 // the window is not maximized. 99 bool ShouldShowClientEdge() const; 100 101 // Paint various sub-components of this view. 102 void PaintRestoredFrameBorder(gfx::Canvas* canvas); 103 void PaintMaximizedFrameBorder(gfx::Canvas* canvas); 104 void PaintTitleBar(gfx::Canvas* canvas); 105 void PaintRestoredClientEdge(gfx::Canvas* canvas); 106 107 // Compute aspects of the frame needed to paint the frame background. 108 SkColor GetFrameColor() const; 109 const gfx::ImageSkia* GetFrameImage() const; 110 111 // Performs the layout for the window control buttons based on the 112 // configuration specified in WindowButtonOrderProvider. The sizing and 113 // positions of the buttons affects LayoutTitleBar, call this beforehand. 114 void LayoutWindowControls(); 115 116 // Calculations depend on the positions of the window controls. Always call 117 // LayoutWindowControls beforehand. 118 void LayoutTitleBar(); 119 void LayoutClientView(); 120 121 // Creates, adds and returns a new window caption button (e.g, minimize, 122 // maximize, restore). 123 ImageButton* InitWindowCaptionButton(int accessibility_string_id, 124 int normal_image_id, 125 int hot_image_id, 126 int pushed_image_id); 127 128 // Returns the window caption button for the given FrameButton type, if it 129 // should be visible. Otherwise NULL. 130 ImageButton* GetImageButton(views::FrameButton button); 131 132 // The bounds of the client view, in this view's coordinates. 133 gfx::Rect client_view_bounds_; 134 135 // The layout rect of the title, if visible. 136 gfx::Rect title_bounds_; 137 138 // Not owned. 139 Widget* frame_; 140 141 // The icon of this window. May be NULL. 142 ImageButton* window_icon_; 143 144 // Window caption buttons. 145 ImageButton* minimize_button_; 146 ImageButton* maximize_button_; 147 ImageButton* restore_button_; 148 ImageButton* close_button_; 149 150 // Background painter for the window frame. 151 scoped_ptr<FrameBackground> frame_background_; 152 153 // The horizontal boundaries for the title bar to layout within. Restricted 154 // by the space used by the leading and trailing buttons. 155 int minimum_title_bar_x_; 156 int maximum_title_bar_x_; 157 158 DISALLOW_COPY_AND_ASSIGN(CustomFrameView); 159 }; 160 161 } // namespace views 162 163 #endif // UI_VIEWS_WINDOW_CUSTOM_FRAME_VIEW_H_ 164