1 // Copyright 2014 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 APPS_UI_VIEWS_APP_WINDOW_FRAME_VIEW_H_ 6 #define APPS_UI_VIEWS_APP_WINDOW_FRAME_VIEW_H_ 7 8 #include <string> 9 10 #include "third_party/skia/include/core/SkColor.h" 11 #include "ui/gfx/path.h" 12 #include "ui/gfx/rect.h" 13 #include "ui/gfx/size.h" 14 #include "ui/views/controls/button/button.h" 15 #include "ui/views/window/non_client_view.h" 16 17 class SkRegion; 18 19 namespace gfx { 20 class Canvas; 21 class Point; 22 } 23 24 namespace ui { 25 class Event; 26 } 27 28 namespace views { 29 class ImageButton; 30 class Widget; 31 } 32 33 namespace apps { 34 35 class NativeAppWindow; 36 37 // A frameless or non-Ash, non-panel NonClientFrameView for app windows. 38 class AppWindowFrameView : public views::NonClientFrameView, 39 public views::ButtonListener { 40 public: 41 static const char kViewClassName[]; 42 43 // AppWindowFrameView is used to draw frames for app windows when a non 44 // standard frame is needed. This occurs if there is no frame needed, or if 45 // there is a frame color. 46 // If |draw_frame| is true, the view draws its own window title area and 47 // controls, using |frame_color|. If |draw_frame| is not true, no frame is 48 // drawn. 49 // TODO(benwells): Refactor this to split out frameless and colored frame 50 // views. See http://crbug.com/359432. 51 AppWindowFrameView(views::Widget* widget, 52 NativeAppWindow* window, 53 bool draw_frame, 54 const SkColor& active_frame_color, 55 const SkColor& inactive_frame_color); 56 virtual ~AppWindowFrameView(); 57 58 void Init(); 59 60 void SetResizeSizes(int resize_inside_bounds_size, 61 int resize_outside_bounds_size, 62 int resize_area_corner_size); 63 int resize_inside_bounds_size() const { 64 return resize_inside_bounds_size_; 65 }; 66 67 private: 68 // views::NonClientFrameView implementation. 69 virtual gfx::Rect GetBoundsForClientView() const OVERRIDE; 70 virtual gfx::Rect GetWindowBoundsForClientBounds( 71 const gfx::Rect& client_bounds) const OVERRIDE; 72 virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE; 73 virtual void GetWindowMask(const gfx::Size& size, 74 gfx::Path* window_mask) OVERRIDE; 75 virtual void ResetWindowControls() OVERRIDE {} 76 virtual void UpdateWindowIcon() OVERRIDE {} 77 virtual void UpdateWindowTitle() OVERRIDE {} 78 79 // views::View implementation. 80 virtual gfx::Size GetPreferredSize() const OVERRIDE; 81 virtual void Layout() OVERRIDE; 82 virtual const char* GetClassName() const OVERRIDE; 83 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 84 virtual gfx::Size GetMinimumSize() const OVERRIDE; 85 virtual gfx::Size GetMaximumSize() const OVERRIDE; 86 87 // views::ButtonListener implementation. 88 virtual void ButtonPressed(views::Button* sender, 89 const ui::Event& event) OVERRIDE; 90 91 // Some button images we use depend on the color of the frame. This 92 // will set these images based on the color of the frame. 93 void SetButtonImagesForFrame(); 94 95 // Return the current frame color based on the active state of the window. 96 SkColor CurrentFrameColor(); 97 98 views::Widget* widget_; 99 NativeAppWindow* window_; 100 bool draw_frame_; 101 SkColor active_frame_color_; 102 SkColor inactive_frame_color_; 103 views::ImageButton* close_button_; 104 views::ImageButton* maximize_button_; 105 views::ImageButton* restore_button_; 106 views::ImageButton* minimize_button_; 107 108 // Allow resize for clicks this many pixels inside the bounds. 109 int resize_inside_bounds_size_; 110 111 // Allow resize for clicks this many pixels outside the bounds. 112 int resize_outside_bounds_size_; 113 114 // Size in pixels of the lower-right corner resize handle. 115 int resize_area_corner_size_; 116 117 DISALLOW_COPY_AND_ASSIGN(AppWindowFrameView); 118 }; 119 120 } // namespace apps 121 122 #endif // APPS_UI_VIEWS_APP_WINDOW_FRAME_VIEW_H_ 123