Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1072)

Unified Diff: chrome/views/non_client_view.h

Issue 27317: Support DWM switching.... (Closed) Base URL: svn://chrome-svn.corp.google.com/chrome/trunk/src/
Patch Set: '' Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/views/native_frame_view.cc ('k') | chrome/views/non_client_view.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « chrome/views/native_frame_view.cc ('k') | chrome/views/non_client_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698