15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef ASH_FRAME_CUSTOM_FRAME_VIEW_ASH_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define ASH_FRAME_CUSTOM_FRAME_VIEW_ASH_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_export.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/non_client_view.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class FrameBorderHitTestController;
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass FrameCaptionButtonContainerView;
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ImmersiveFullscreenController;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Widget;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A NonClientFrameView used for packaged apps, dialogs and other non-browser
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// windows. It supports immersive fullscreen. When in immersive fullscreen, the
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// client view takes up the entire widget and the window header is an overlay.
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The window header overlay slides onscreen when the user hovers the mouse at
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// the top of the screen. See also views::CustomFrameView and
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// BrowserNonClientFrameViewAsh.
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class ASH_EXPORT CustomFrameViewAsh : public views::NonClientFrameView {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal class name.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kViewClassName[];
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  explicit CustomFrameViewAsh(views::Widget* frame);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~CustomFrameViewAsh();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Inits |immersive_fullscreen_controller| so that the controller reveals
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // and hides |header_view_| in immersive fullscreen.
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // CustomFrameViewAsh does not take ownership of
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |immersive_fullscreen_controller|.
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void InitImmersiveFullscreenControllerForView(
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ImmersiveFullscreenController* immersive_fullscreen_controller);
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // views::NonClientFrameView:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Rect GetBoundsForClientView() const OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Rect GetWindowBoundsForClientBounds(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& client_bounds) const OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetWindowMask(const gfx::Size& size,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             gfx::Path* window_mask) OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ResetWindowControls() OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateWindowIcon() OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateWindowTitle() OVERRIDE;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SizeConstraintsChanged() OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // views::View:
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE;
58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual const char* GetClassName() const OVERRIDE;
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE;
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetMaximumSize() const OVERRIDE;
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SchedulePaintInRect(const gfx::Rect& r) OVERRIDE;
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void VisibilityChanged(views::View* starting_from,
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 bool is_visible) OVERRIDE;
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Get the view of the header.
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::View* GetHeaderView();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const views::View* GetAvatarIconViewForTest() const;
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class OverlayView;
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  friend class TestWidgetConstraintsDelegate;
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // views::NonClientFrameView:
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool DoesIntersectRect(const views::View* target,
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 const gfx::Rect& rect) const OVERRIDE;
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Returns the container for the minimize/maximize/close buttons that is held
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // by the HeaderView. Used in testing.
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FrameCaptionButtonContainerView* GetFrameCaptionButtonContainerViewForTest();
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Height from top of window to top of client area.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NonClientTopBorderHeight() const;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not owned.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* frame_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // View which contains the title and window controls.
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class HeaderView;
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  HeaderView* header_view_;
918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Updates the hittest bounds overrides based on the window state type.
938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<FrameBorderHitTestController> frame_border_hit_test_controller_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CustomFrameViewAsh);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // ASH_FRAME_CUSTOM_FRAME_VIEW_ASH_H_
101