Chromium Code Reviews| Index: chrome/browser/ui/views/apps/glass_app_window_frame_view.cc |
| diff --git a/chrome/browser/ui/views/apps/glass_app_window_frame_view.cc b/chrome/browser/ui/views/apps/glass_app_window_frame_view.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..2a61e55f9563d9b0655ed8b5d22d517d0a4af894 |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/apps/glass_app_window_frame_view.cc |
| @@ -0,0 +1,129 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/ui/views/apps/glass_app_window_frame_view.h" |
| + |
| +#include "apps/ui/native_app_window.h" |
| +#include "ui/base/hit_test.h" |
| +#include "ui/views/widget/widget.h" |
| +#include "ui/views/widget/widget_delegate.h" |
| + |
| +namespace { |
| + |
| +const int kResizeAreaCornerSize = 16; |
| + |
| +} // namespace |
| + |
| +namespace apps { |
| + |
| +const char GlassAppWindowFrameView::kViewClassName[] = |
| + "browser/ui/views/extensions/GlassAppWindowFrameView"; |
|
tapted
2014/04/03 19:40:24
should this be ui/views/apps/..?
benwells
2014/04/04 06:50:43
Done.
|
| + |
| +GlassAppWindowFrameView::GlassAppWindowFrameView(NativeAppWindow* window, |
| + views::Widget* widget) |
| + : window_(window), widget_(widget) {} |
| + |
| +GlassAppWindowFrameView::~GlassAppWindowFrameView() {} |
| + |
| +gfx::Insets GlassAppWindowFrameView::GetGlassInsets() const { |
| + // If 1 is not subtraced, they are too big. There is possibly some reason |
|
tapted
2014/04/03 19:40:24
nit: subtraced -> subtracted
benwells
2014/04/04 06:50:43
Done.
|
| + // for that. |
| + int caption_height = |
| + GetSystemMetrics(SM_CYSMICON) + GetSystemMetrics(SM_CYSIZEFRAME) - 1; |
| + int frame_size = GetSystemMetrics(SM_CXSIZEFRAME) - 1; |
|
tapted
2014/04/03 19:40:24
Can GetSystemMetrics ever fail/ return 0?
benwells
2014/04/04 06:50:43
According to MSDN if it fails it will return 0. It
tapted
2014/04/04 16:15:19
cool - wild conjecture: maybe this is the explanat
|
| + return gfx::Insets( |
| + frame_size + caption_height, frame_size, frame_size, frame_size); |
| +} |
| + |
| +gfx::Rect GlassAppWindowFrameView::GetBoundsForClientView() const { |
| + if (widget_->IsFullscreen()) |
| + return bounds(); |
| + |
| + gfx::Insets insets = GetGlassInsets(); |
| + return gfx::Rect(insets.left(), |
| + insets.top(), |
| + std::max(0, width() - insets.left() - insets.right()), |
| + std::max(0, height() - insets.top() - insets.bottom())); |
| +} |
| + |
| +gfx::Rect GlassAppWindowFrameView::GetWindowBoundsForClientBounds( |
| + const gfx::Rect& client_bounds) const { |
| + gfx::Insets insets = GetGlassInsets(); |
| + return gfx::Rect(client_bounds.x() - insets.left(), |
| + client_bounds.y() - insets.top(), |
| + client_bounds.width() + insets.left() + insets.right(), |
| + client_bounds.height() + insets.top() + insets.bottom()); |
| +} |
| + |
| +int GlassAppWindowFrameView::NonClientHitTest(const gfx::Point& point) { |
| + if (widget_->IsFullscreen()) |
| + return HTCLIENT; |
|
tapted
2014/04/03 19:40:24
This API isn't too familiar to me, so this might b
benwells
2014/04/04 06:50:43
It should do. This function is only called if the
|
| + |
| + if (!bounds().Contains(point)) |
| + return HTNOWHERE; |
| + |
| + // Check the frame first, as we allow a small area overlapping the contents |
| + // to be used for resize handles. |
| + bool can_ever_resize = widget_->widget_delegate() |
| + ? widget_->widget_delegate()->CanResize() |
| + : false; |
| + // Don't allow overlapping resize handles when the window is maximized or |
| + // fullscreen, as it can't be resized in those states. |
| + int resize_border = GetSystemMetrics(SM_CXSIZEFRAME); |
| + int frame_component = |
| + GetHTComponentForFrame(point, |
| + resize_border, |
| + resize_border, |
| + kResizeAreaCornerSize - resize_border, |
| + kResizeAreaCornerSize - resize_border, |
| + can_ever_resize); |
| + if (frame_component != HTNOWHERE) |
| + return frame_component; |
| + |
| + int client_component = widget_->client_view()->NonClientHitTest(point); |
| + if (client_component != HTNOWHERE) |
| + return client_component; |
| + |
| + // Caption is a safe default. |
| + return HTCAPTION; |
| +} |
| + |
| +void GlassAppWindowFrameView::GetWindowMask(const gfx::Size& size, |
| + gfx::Path* window_mask) { |
| + // We got nothing to say about no window mask. |
| +} |
| + |
| +gfx::Size GlassAppWindowFrameView::GetPreferredSize() { |
| + gfx::Size pref = widget_->client_view()->GetPreferredSize(); |
| + gfx::Rect bounds(0, 0, pref.width(), pref.height()); |
| + return widget_->non_client_view() |
| + ->GetWindowBoundsForClientBounds(bounds) |
| + .size(); |
| +} |
| + |
| +const char* GlassAppWindowFrameView::GetClassName() const { |
| + return kViewClassName; |
| +} |
| + |
| +gfx::Size GlassAppWindowFrameView::GetMinimumSize() { |
| + gfx::Size min_size = widget_->client_view()->GetMinimumSize(); |
| + gfx::Rect client_bounds = GetBoundsForClientView(); |
| + min_size.Enlarge(0, client_bounds.y()); |
|
tapted
2014/04/03 19:40:24
why just the y? (should x always be 0?)
tapted
2014/04/04 16:15:19
there was one last question :). But I think I grok
|
| + return min_size; |
| +} |
| + |
| +gfx::Size GlassAppWindowFrameView::GetMaximumSize() { |
| + gfx::Size max_size = widget_->client_view()->GetMaximumSize(); |
| + |
| + // Add to the client maximum size the height of any title bar and borders. |
| + gfx::Size client_size = GetBoundsForClientView().size(); |
| + if (max_size.width()) |
| + max_size.Enlarge(width() - client_size.width(), 0); |
| + if (max_size.height()) |
| + max_size.Enlarge(0, height() - client_size.height()); |
| + |
| + return max_size; |
| +} |
| + |
| +} // namespace apps |