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