1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_VIEWS_WINDOW_CLIENT_VIEW_H_
#define UI_VIEWS_WINDOW_CLIENT_VIEW_H_
#include "base/memory/raw_ptr.h"
#include "ui/gfx/geometry/rounded_corners_f.h"
#include "ui/views/metadata/view_factory.h"
#include "ui/views/view.h"
namespace views {
class Widget;
enum class CloseRequestResult;
///////////////////////////////////////////////////////////////////////////////
// ClientView
//
// A ClientView is a View subclass that is used to occupy the "client area"
// of a widget. It provides basic information to the widget that contains it
// such as non-client hit testing information, sizing etc. Sub-classes of
// ClientView are used to create more elaborate contents.
class VIEWS_EXPORT ClientView : public View {
METADATA_HEADER(ClientView, View)
public:
// Constructs a ClientView object for the specified widget with the specified
// contents. Since this object is created during the process of creating
// |widget|, |contents_view| must be valid if you want the initial size of
// the widget to be based on |contents_view|'s preferred size.
ClientView(Widget* widget, View* contents_view);
~ClientView() override = default;
// Returned value signals whether the Widget can be closed. Specialized
// ClientView subclasses can override this default behavior to allow the
// close to be blocked until the user corrects mistakes, accepts a warning
// dialog, etc.
//
// DEPRECATED. Don't use this. See Widget::MakeCloseSynchronous().
virtual CloseRequestResult OnWindowCloseRequested();
// Notification that the widget is closing.
virtual void WidgetClosing();
// Tests to see if the specified point (in view coordinates) is within the
// bounds of this view. If so, it returns HTCLIENT in this default
// implementation. If it is outside the bounds of this view, this must return
// HTNOWHERE to tell the caller to do further processing to determine where
// in the non-client area it is (if it is).
// Subclasses of ClientView can extend this logic by overriding this method
// to detect if regions within the client area count as parts of the "non-
// client" area. A good example of this is the size box at the bottom right
// corner of resizable dialog boxes.
virtual int NonClientHitTest(const gfx::Point& point);
// Updates the ClientView's contents as part of rounding the window.
// Some platforms, such as ChromeOS, do not have borders surrounding
// ClientView part of the NonClientFrameView. Therefore, the
// NonClientFrameView has to delegate part of the rounding logic to the
// ClientView.
virtual void UpdateWindowRoundedCorners(
const gfx::RoundedCornersF& window_radii);
// Overridden from View:
gfx::Size CalculatePreferredSize(
const SizeBounds& available_size) const override;
gfx::Size GetMinimumSize() const override;
gfx::Size GetMaximumSize() const override;
protected:
// Overridden from View:
void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
void ViewHierarchyChanged(
const ViewHierarchyChangedDetails& details) override;
// Accessors for private data members.
View* contents_view() const { return contents_view_; }
void set_contents_view(View* contents_view) {
contents_view_ = contents_view;
}
private:
// The View that this ClientView contains. This can temporarily dangle during
// teardown of the Widget in some hard-to-resolve cases. Specifically, if the
// contents view is also a WidgetDelegate (which happens with the
// DialogDelegateView subclasses) *and* that WidgetDelegate is marked as owned
// by the widget, the WidgetDelegate can be destroyed earlier during Widget
// teardown than the View tree is, which can allow `this` to outlive the View
// pointed to by `contents_view_`, even though `contents_view_` was previously
// a child view of `this`.
//
// TODO(crbug.com/40279653): Fix that. Good luck!
raw_ptr<View, DisableDanglingPtrDetection> contents_view_;
};
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, ClientView, View)
END_VIEW_BUILDER
} // namespace views
DEFINE_VIEW_BUILDER(VIEWS_EXPORT, ClientView)
#endif // UI_VIEWS_WINDOW_CLIENT_VIEW_H_
|