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 52 // Overridden from View: 53 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 54 virtual void Layout() OVERRIDE; 55 virtual gfx::Size GetPreferredSize() const OVERRIDE; 56 virtual gfx::Size GetMinimumSize() const OVERRIDE; 57 virtual gfx::Size GetMaximumSize() const OVERRIDE; 58 59 // Overridden from ButtonListener: 60 virtual void ButtonPressed(Button* sender, const ui::Event& event) OVERRIDE; 61 62 private: 63 friend class CustomFrameViewTest; 64 65 // Returns the thickness of the border that makes up the window frame edges. 66 // This does not include any client edge. 67 int FrameBorderThickness() const; 68 69 // Returns the thickness of the entire nonclient left, right, and bottom 70 // borders, including both the window frame and any client edge. 71 int NonClientBorderThickness() const; 72 73 // Returns the height of the entire nonclient top border, including the window 74 // frame, any title area, and any connected client edge. 75 int NonClientTopBorderHeight() const; 76 77 // Returns the y-coordinate of the caption buttons. 78 int CaptionButtonY() const; 79 80 // Returns the thickness of the nonclient portion of the 3D edge along the 81 // bottom of the titlebar. 82 int TitlebarBottomThickness() const; 83 84 // Returns the size of the titlebar icon. This is used even when the icon is 85 // not shown, e.g. to set the titlebar height. 86 int IconSize() const; 87 88 // Returns the bounds of the titlebar icon (or where the icon would be if 89 // there was one). 90 gfx::Rect IconBounds() const; 91 92 // Returns true if the title bar, caption buttons, and frame border should be 93 // drawn. If false, the client view occupies the full area of this view. 94 bool ShouldShowTitleBarAndBorder() const; 95 96 // Returns true if the client edge should be drawn. This is true if 97 // the window is not maximized. 98 bool ShouldShowClientEdge() const; 99 100 // Paint various sub-components of this view. 101 void PaintRestoredFrameBorder(gfx::Canvas* canvas); 102 void PaintMaximizedFrameBorder(gfx::Canvas* canvas); 103 void PaintTitleBar(gfx::Canvas* canvas); 104 void PaintRestoredClientEdge(gfx::Canvas* canvas); 105 106 // Compute aspects of the frame needed to paint the frame background. 107 SkColor GetFrameColor() const; 108 const gfx::ImageSkia* GetFrameImage() const; 109 110 // Performs the layout for the window control buttons based on the 111 // configuration specified in WindowButtonOrderProvider. The sizing and 112 // positions of the buttons affects LayoutTitleBar, call this beforehand. 113 void LayoutWindowControls(); 114 115 // Calculations depend on the positions of the window controls. Always call 116 // LayoutWindowControls beforehand. 117 void LayoutTitleBar(); 118 void LayoutClientView(); 119 120 // Creates, adds and returns a new window caption button (e.g, minimize, 121 // maximize, restore). 122 ImageButton* InitWindowCaptionButton(int accessibility_string_id, 123 int normal_image_id, 124 int hot_image_id, 125 int pushed_image_id); 126 127 // Returns the window caption button for the given FrameButton type, if it 128 // should be visible. Otherwise NULL. 129 ImageButton* GetImageButton(views::FrameButton button); 130 131 // The bounds of the client view, in this view's coordinates. 132 gfx::Rect client_view_bounds_; 133 134 // The layout rect of the title, if visible. 135 gfx::Rect title_bounds_; 136 137 // Not owned. 138 Widget* frame_; 139 140 // The icon of this window. May be NULL. 141 ImageButton* window_icon_; 142 143 // Window caption buttons. 144 ImageButton* minimize_button_; 145 ImageButton* maximize_button_; 146 ImageButton* restore_button_; 147 ImageButton* close_button_; 148 149 // Should maximize button be shown? 150 bool should_show_maximize_button_; 151 152 // Background painter for the window frame. 153 scoped_ptr<FrameBackground> frame_background_; 154 155 // The horizontal boundaries for the title bar to layout within. Restricted 156 // by the space used by the leading and trailing buttons. 157 int minimum_title_bar_x_; 158 int maximum_title_bar_x_; 159 160 DISALLOW_COPY_AND_ASSIGN(CustomFrameView); 161 }; 162 163 } // namespace views 164 165 #endif // UI_VIEWS_WINDOW_CUSTOM_FRAME_VIEW_H_ 166