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/controls/single_split_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/skia_utils_win.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/cursor/cursor.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/background.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/single_split_view_listener.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/native_cursor.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char SingleSplitView::kViewClassName[] = "SingleSplitView"; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Size of the divider in pixels. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDividerSize = 4; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SingleSplitView::SingleSplitView(View* leading, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* trailing, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Orientation orientation, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SingleSplitViewListener* listener) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : is_horizontal_(orientation == HORIZONTAL_SPLIT), 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_offset_(-1), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resize_leading_on_bounds_change_(true), 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resize_disabled_(false), 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_(listener) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(leading); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(trailing); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_background( 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Background::CreateSolidBackground( 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skia::COLORREFToSkColor(GetSysColor(COLOR_3DFACE)))); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SingleSplitView::Layout() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect leading_bounds; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect trailing_bounds; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateChildrenBounds(bounds(), &leading_bounds, &trailing_bounds); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_children()) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_at(0)->visible()) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_at(0)->SetBoundsRect(leading_bounds); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_count() > 1) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_at(1)->visible()) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_at(1)->SetBoundsRect(trailing_bounds); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoke super's implementation so that the children are layed out. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View::Layout(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* SingleSplitView::GetClassName() const { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kViewClassName; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SingleSplitView::GetAccessibleState(ui::AXViewState* state) { 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->role = ui::AX_ROLE_GROUP; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->name = accessible_name_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size SingleSplitView::GetPreferredSize() const { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width = 0; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height = 0; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2 && i < child_count(); ++i) { 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const View* view = child_at(i); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size pref = view->GetPreferredSize(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_horizontal_) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width += pref.width(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) height = std::max(height, pref.height()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width = std::max(width, pref.width()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) height += pref.height(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_horizontal_) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) width += GetDividerSize(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) height += GetDividerSize(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(width, height); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor SingleSplitView::GetCursor(const ui::MouseEvent& event) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsPointInDivider(event.location())) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::kNullCursor; 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return is_horizontal_ ? GetNativeEastWestResizeCursor() 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : GetNativeNorthSouthResizeCursor(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int SingleSplitView::GetDividerSize() const { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool both_visible = child_count() > 1 && child_at(0)->visible() && 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(1)->visible(); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return both_visible && !resize_disabled_ ? kDividerSize : 0; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SingleSplitView::CalculateChildrenBounds( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* leading_bounds, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* trailing_bounds) const { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_leading_visible = has_children() && child_at(0)->visible(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_trailing_visible = child_count() > 1 && child_at(1)->visible(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_leading_visible && !is_trailing_visible) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *leading_bounds = gfx::Rect(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *trailing_bounds = gfx::Rect(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int divider_at; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_trailing_visible) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_at = GetPrimaryAxisSize(bounds.width(), bounds.height()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!is_leading_visible) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_at = 0; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_at = 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateDividerOffset(divider_offset_, this->bounds(), bounds); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_at = NormalizeDividerOffset(divider_at, bounds); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int divider_size = GetDividerSize(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_horizontal_) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *leading_bounds = gfx::Rect(0, 0, divider_at, bounds.height()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *trailing_bounds = 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect(divider_at + divider_size, 0, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(0, bounds.width() - divider_at - divider_size), 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.height()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *leading_bounds = gfx::Rect(0, 0, bounds.width(), divider_at); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *trailing_bounds = 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect(0, divider_at + divider_size, bounds.width(), 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(0, bounds.height() - divider_at - divider_size)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SingleSplitView::SetAccessibleName(const base::string16& name) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accessible_name_ = name; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SingleSplitView::OnMousePressed(const ui::MouseEvent& event) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsPointInDivider(event.location())) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_info_.initial_mouse_offset = GetPrimaryAxisSize(event.x(), event.y()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_info_.initial_divider_offset = 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NormalizeDividerOffset(divider_offset_, bounds()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SingleSplitView::OnMouseDragged(const ui::MouseEvent& event) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_count() < 2) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_offset = GetPrimaryAxisSize(event.x(), event.y()) - 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_info_.initial_mouse_offset; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_horizontal_ && base::i18n::IsRTL()) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_offset *= -1; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Honor the first child's minimum size when resizing. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size min = child_at(0)->GetMinimumSize(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_size = std::max(GetPrimaryAxisSize(min.width(), min.height()), 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_info_.initial_divider_offset + delta_offset); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Honor the second child's minimum size, and don't let the view 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // get bigger than our width. 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min = child_at(1)->GetMinimumSize(); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_size = std::min(GetPrimaryAxisSize() - kDividerSize - 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrimaryAxisSize(min.width(), min.height()), new_size); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_size != divider_offset_) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_divider_offset(new_size); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!listener_ || listener_->SplitHandleMoved(this)) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SingleSplitView::OnMouseCaptureLost() { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_count() < 2) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_info_.initial_divider_offset != divider_offset_) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_divider_offset(drag_info_.initial_divider_offset); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!listener_ || listener_->SplitHandleMoved(this)) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SingleSplitView::OnBoundsChanged(const gfx::Rect& previous_bounds) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_offset_ = CalculateDividerOffset(divider_offset_, previous_bounds, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SingleSplitView::IsPointInDivider(const gfx::Point& p) { 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (resize_disabled_) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_count() < 2) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!child_at(0)->visible() || !child_at(1)->visible()) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int divider_relative_offset; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_horizontal_) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_relative_offset = 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.x() - child_at(base::i18n::IsRTL() ? 1 : 0)->width(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_relative_offset = p.y() - child_at(0)->height(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (divider_relative_offset >= 0 && 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) divider_relative_offset < GetDividerSize()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SingleSplitView::CalculateDividerOffset( 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int divider_offset, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& previous_bounds, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& new_bounds) const { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (resize_leading_on_bounds_change_ && divider_offset != -1) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We do not update divider_offset on minimize (to zero) and on restore 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (to largest value). As a result we get back to the original value upon 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window restore. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_minimize_or_restore = 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_bounds.height() == 0 || new_bounds.height() == 0; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_minimize_or_restore) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_horizontal_) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_offset += new_bounds.width() - previous_bounds.width(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divider_offset += new_bounds.height() - previous_bounds.height(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (divider_offset < 0) 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) divider_offset = GetDividerSize(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return divider_offset; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SingleSplitView::NormalizeDividerOffset(int divider_offset, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds) const { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int primary_axis_size = GetPrimaryAxisSize(bounds.width(), bounds.height()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (divider_offset < 0) 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // primary_axis_size may < GetDividerSize during initial layout. 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::max(0, (primary_axis_size - GetDividerSize()) / 2); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::min(divider_offset, 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::max(primary_axis_size - GetDividerSize(), 0)); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 254