Index: chrome/views/non_client_view.h |
=================================================================== |
--- chrome/views/non_client_view.h (revision 10688) |
+++ chrome/views/non_client_view.h (working copy) |
@@ -5,6 +5,7 @@ |
#ifndef CHROME_VIEWS_NON_CLIENT_VIEW_H_ |
#define CHROME_VIEWS_NON_CLIENT_VIEW_H_ |
+#include "base/task.h" |
#include "chrome/views/view.h" |
#include "chrome/views/client_view.h" |
@@ -14,21 +15,15 @@ |
namespace views { |
-/////////////////////////////////////////////////////////////////////////////// |
-// NonClientView |
+//////////////////////////////////////////////////////////////////////////////// |
+// NonClientFrameView |
// |
-// An object implementing the NonClientView interface is a View that provides |
-// the "non-client" areas of a window. This is the area that typically |
-// encompasses the window frame - title bar, sizing borders and window |
-// controls. This interface provides methods that allow a specific |
-// presentation to define non-client areas for windows hit testing, the shape |
-// of the window, and other window-related information. |
-// |
-class NonClientView : public View { |
+// An object that subclasses NonClientFrameView is a View that renders and |
+// responds to events within the frame portions of the non-client area of a |
+// window. This view does _not_ contain the ClientView, but rather is a sibling |
+// of it. |
+class NonClientFrameView : public views::View { |
public: |
- NonClientView(); |
- virtual ~NonClientView(); |
- |
// Various edges of the frame border have a 1 px shadow along their edges; in |
// a few cases we shift elements based on this amount for visual appeal. |
static const int kFrameShadowThickness; |
@@ -36,6 +31,99 @@ |
// frame border. |
static const int kClientEdgeThickness; |
+ void DisableInactiveRendering(bool disable) { |
+ paint_as_active_ = disable; |
+ if (!paint_as_active_) |
+ SchedulePaint(); |
+ } |
+ |
+ // Returns the bounds (in this View's parent's coordinates) that the client |
+ // view should be laid out within. |
+ virtual gfx::Rect GetBoundsForClientView() const = 0; |
+ |
+ // Returns true if this FrameView should always use the custom frame, |
+ // regardless of the system settings. An example is the Constrained Window, |
+ // which is a child window and must always provide its own frame. |
+ virtual bool AlwaysUseCustomFrame() const { return false; } |
+ |
+ virtual gfx::Rect GetWindowBoundsForClientBounds( |
+ const gfx::Rect& client_bounds) const = 0; |
+ virtual gfx::Point GetSystemMenuPoint() const = 0; |
+ virtual int NonClientHitTest(const gfx::Point& point) = 0; |
+ virtual void GetWindowMask(const gfx::Size& size, |
+ gfx::Path* window_mask) = 0; |
+ virtual void EnableClose(bool enable) = 0; |
+ virtual void ResetWindowControls() = 0; |
+ |
+ protected: |
+ NonClientFrameView() : paint_as_active_(false) {} |
+ |
+ |
+ // Helper for non-client view implementations to determine which area of the |
+ // window border the specified |point| falls within. The other parameters are |
+ // the size of the sizing edges, and whether or not the window can be |
+ // resized. |
+ int GetHTComponentForFrame(const gfx::Point& point, |
+ int top_resize_border_height, |
+ int resize_border_thickness, |
+ int top_resize_corner_height, |
+ int resize_corner_width, |
+ bool can_resize); |
+ |
+ // Accessor for paint_as_active_. |
+ bool paint_as_active() const { return paint_as_active_; } |
+ |
+ private: |
+ // True when the non-client view should always be rendered as if the window |
+ // were active, regardless of whether or not the top level window actually |
+ // is active. |
+ bool paint_as_active_; |
+}; |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NonClientView |
+// |
+// The NonClientView is the logical root of all Views contained within a |
+// Window, except for the RootView which is its parent and of which it is the |
+// sole child. The NonClientView has two children, the NonClientFrameView which |
+// is responsible for painting and responding to events from the non-client |
+// portions of the window, and the ClientView, which is responsible for the |
+// same for the client area of the window: |
+// |
+// +- views::Window ------------------------------------+ |
+// | +- views::RootView ------------------------------+ | |
+// | | +- views::NonClientView ---------------------+ | | |
+// | | | +- views::NonClientFrameView subclass ---+ | | | |
+// | | | | | | | | |
+// | | | | << all painting and event receiving >> | | | | |
+// | | | | << of the non-client areas of a >> | | | | |
+// | | | | << views::Window. >> | | | | |
+// | | | | | | | | |
+// | | | +----------------------------------------+ | | | |
+// | | | +- views::ClientView or subclass --------+ | | | |
+// | | | | | | | | |
+// | | | | << all painting and event receiving >> | | | | |
+// | | | | << of the client areas of a >> | | | | |
+// | | | | << views::Window. >> | | | | |
+// | | | | | | | | |
+// | | | +----------------------------------------+ | | | |
+// | | +--------------------------------------------+ | | |
+// | +------------------------------------------------+ | |
+// +----------------------------------------------------+ |
+// |
+// The NonClientFrameView and ClientView are siblings because due to theme |
+// changes the NonClientFrameView may be replaced with different |
+// implementations (e.g. during the switch from DWM/Aero-Glass to Vista Basic/ |
+// Classic rendering). |
+// |
+class NonClientView : public View { |
+ public: |
+ explicit NonClientView(Window* frame); |
+ virtual ~NonClientView(); |
+ |
+ // Replaces the current NonClientFrameView (if any) with the specified one. |
+ void SetFrameView(NonClientFrameView* frame_view); |
+ |
// Returns true if the ClientView determines that the containing window can be |
// closed, false otherwise. |
bool CanClose() const; |
@@ -43,49 +131,53 @@ |
// Called by the containing Window when it is closed. |
void WindowClosing(); |
+ // Called by the window when it receives a theme changed notification. Changes |
+ // the content of the NonClientView to match what is required for the current |
+ // system theme. |
+ void SystemThemeChanged(); |
+ |
+ // Changes the frame from native to custom depending on the value of |
+ // |use_native_frame|. |
+ void SetUseNativeFrame(bool use_native_frame); |
+ |
// Returns true if the native window frame should be used, false if the |
// NonClientView provides its own frame implementation. |
bool UseNativeFrame() const; |
- // Calculates the bounds of the client area of the window assuming the |
- // window is sized to |width| and |height|. |
- virtual gfx::Rect CalculateClientAreaBounds(int width, int height) const; |
+ // Prevents the window from being rendered as deactivated when |disable| is |
+ // true, until called with |disable| false. Used when a sub-window is to be |
+ // shown that shouldn't visually de-activate the window. |
+ // Subclasses can override this to perform additional actions when this value |
+ // changes. |
+ void DisableInactiveRendering(bool disable); |
- // Calculates the size of window required to display a client area of the |
- // specified width and height. |
- virtual gfx::Size CalculateWindowSizeForClientSize(int width, |
- int height) const; |
+ // Returns the bounds of the window required to display the content area at |
+ // the specified bounds. |
+ gfx::Rect GetWindowBoundsForClientBounds(const gfx::Rect client_bounds) const; |
// Returns the point, in screen coordinates, where the system menu should |
// be shown so it shows up anchored to the system menu icon. |
- virtual gfx::Point GetSystemMenuPoint() const; |
+ gfx::Point GetSystemMenuPoint() const; |
// Determines the windows HT* code when the mouse cursor is at the |
// specified point, in window coordinates. |
- virtual int NonClientHitTest(const gfx::Point& point); |
+ int NonClientHitTest(const gfx::Point& point); |
// Returns a mask to be used to clip the top level window for the given |
// size. This is used to create the non-rectangular window shape. |
- virtual void GetWindowMask(const gfx::Size& size, |
- gfx::Path* window_mask); |
+ void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask); |
// Toggles the enable state for the Close button (and the Close menu item in |
// the system menu). |
- virtual void EnableClose(bool enable); |
+ void EnableClose(bool enable); |
// Tells the window controls as rendered by the NonClientView to reset |
// themselves to a normal state. This happens in situations where the |
// containing window does not receive a normal sequences of messages that |
// would lead to the controls returning to this normal state naturally, e.g. |
// when the window is maximized, minimized or restored. |
- virtual void ResetWindowControls(); |
+ void ResetWindowControls(); |
- // Prevents the non-client view from rendering as inactive when called with |
- // |disable| true, until called with false. |
- void set_paint_as_active(bool paint_as_active) { |
- paint_as_active_ = paint_as_active; |
- } |
- |
// Get/Set client_view property. |
ClientView* client_view() const { return client_view_; } |
void set_client_view(ClientView* client_view) { |
@@ -100,30 +192,24 @@ |
// NonClientView, View overrides: |
virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child); |
- // Helper for non-client view implementations to determine which area of the |
- // window border the specified |point| falls within. The other parameters are |
- // the size of the sizing edges, and whether or not the window can be |
- // resized. |
- int GetHTComponentForFrame(const gfx::Point& point, |
- int top_resize_border_height, |
- int resize_border_thickness, |
- int top_resize_corner_height, |
- int resize_corner_width, |
- bool can_resize); |
+ private: |
+ // The frame that hosts this NonClientView. |
+ Window* frame_; |
- // Accessor for paint_as_active_. |
- bool paint_as_active() const { return paint_as_active_; } |
- |
- private: |
// A ClientView object or subclass, responsible for sizing the contents view |
// of the window, hit testing and perhaps other tasks depending on the |
// implementation. |
ClientView* client_view_; |
- // True when the non-client view should always be rendered as if the window |
- // were active, regardless of whether or not the top level window actually |
- // is active. |
- bool paint_as_active_; |
+ // The NonClientFrameView that renders the non-client portions of the window. |
+ // This object is not owned by the view hierarchy because it can be replaced |
+ // dynamically as the system settings change. |
+ scoped_ptr<NonClientFrameView> frame_view_; |
+ |
+ // Whether or not we should use the native frame. |
+ bool use_native_frame_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(NonClientView); |
}; |
} // namespace views |