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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/client_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char ClientView::kViewClassName[] =
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ui/views/window/ClientView";
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ClientView, public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientView::ClientView(Widget* widget, View* contents_view)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : contents_view_(contents_view) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ClientView::NonClientHitTest(const gfx::Point& point) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bounds().Contains(point) ? HTCLIENT : HTNOWHERE;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DialogClientView* ClientView::AsDialogClientView() {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const DialogClientView* ClientView::AsDialogClientView() const {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ClientView::CanClose() {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClientView::WidgetClosing() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ClientView, View overrides:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ClientView::GetPreferredSize() const {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |contents_view_| is allowed to be NULL up until the point where this view
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is attached to a Container.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_view_ ? contents_view_->GetPreferredSize() : gfx::Size();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ClientView::GetMaximumSize() const {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |contents_view_| is allowed to be NULL up until the point where this view
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is attached to a Container.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_view_ ? contents_view_->GetMaximumSize() : gfx::Size();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ClientView::GetMinimumSize() const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |contents_view_| is allowed to be NULL up until the point where this view
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is attached to a Container.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return contents_view_ ? contents_view_->GetMinimumSize() : gfx::Size();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClientView::Layout() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |contents_view_| is allowed to be NULL up until the point where this view
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is attached to a Container.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (contents_view_)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contents_view_->SetBounds(0, 0, width(), height());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* ClientView::GetClassName() const {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kViewClassName;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ClientView::GetAccessibleState(ui::AXViewState* state) {
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  state->role = ui::AX_ROLE_CLIENT;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClientView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden to do nothing. The NonClientView manually calls Layout on the
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ClientView when it is itself laid out, see comment in
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NonClientView::Layout.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void ClientView::ViewHierarchyChanged(
88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const ViewHierarchyChangedDetails& details) {
89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (details.is_add && details.child == this) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(GetWidget());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(contents_view_); // |contents_view_| must be valid now!
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Insert |contents_view_| at index 0 so it is first in the focus chain.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (the OK/Cancel buttons are inserted before contents_view_)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildViewAt(contents_view_, 0);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
99