15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef APPS_UI_VIEWS_APP_WINDOW_FRAME_VIEW_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define APPS_UI_VIEWS_APP_WINDOW_FRAME_VIEW_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "third_party/skia/include/core/SkColor.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/path.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/button.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/window/non_client_view.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass SkRegion; 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace extensions { 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class NativeAppWindow; 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Canvas; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Point; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Event; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImageButton; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Widget; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace apps { 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A frameless or non-Ash, non-panel NonClientFrameView for app windows. 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class AppWindowFrameView : public views::NonClientFrameView, 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public views::ButtonListener { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char kViewClassName[]; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // AppWindowFrameView is used to draw frames for app windows when a non 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // standard frame is needed. This occurs if there is no frame needed, or if 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // there is a frame color. 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // If |draw_frame| is true, the view draws its own window title area and 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // controls, using |frame_color|. If |draw_frame| is not true, no frame is 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // drawn. 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(benwells): Refactor this to split out frameless and colored frame 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // views. See http://crbug.com/359432. 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AppWindowFrameView(views::Widget* widget, 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) extensions::NativeAppWindow* window, 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool draw_frame, 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const SkColor& active_frame_color, 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const SkColor& inactive_frame_color); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~AppWindowFrameView(); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void Init(); 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void SetResizeSizes(int resize_inside_bounds_size, 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int resize_outside_bounds_size, 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int resize_area_corner_size); 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int resize_inside_bounds_size() const { 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return resize_inside_bounds_size_; 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu }; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::NonClientFrameView implementation. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Rect GetBoundsForClientView() const OVERRIDE; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Rect GetWindowBoundsForClientBounds( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& client_bounds) const OVERRIDE; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void GetWindowMask(const gfx::Size& size, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Path* window_mask) OVERRIDE; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ResetWindowControls() OVERRIDE {} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateWindowIcon() OVERRIDE {} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateWindowTitle() OVERRIDE {} 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SizeConstraintsChanged() OVERRIDE; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::View implementation. 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual const char* GetClassName() const OVERRIDE; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetMinimumSize() const OVERRIDE; 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetMaximumSize() const OVERRIDE; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::ButtonListener implementation. 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ui::Event& event) OVERRIDE; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Some button images we use depend on the color of the frame. This 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // will set these images based on the color of the frame. 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void SetButtonImagesForFrame(); 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Return the current frame color based on the active state of the window. 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SkColor CurrentFrameColor(); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) views::Widget* widget_; 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) extensions::NativeAppWindow* window_; 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool draw_frame_; 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SkColor active_frame_color_; 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SkColor inactive_frame_color_; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::ImageButton* close_button_; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::ImageButton* maximize_button_; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::ImageButton* restore_button_; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::ImageButton* minimize_button_; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Allow resize for clicks this many pixels inside the bounds. 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int resize_inside_bounds_size_; 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Allow resize for clicks this many pixels outside the bounds. 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int resize_outside_bounds_size_; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Size in pixels of the lower-right corner resize handle. 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int resize_area_corner_size_; 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AppWindowFrameView); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace apps 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // APPS_UI_VIEWS_APP_WINDOW_FRAME_VIEW_H_ 126