| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "views/controls/single_split_view.h" | 5 #include "views/controls/single_split_view.h" |
| 6 | 6 |
| 7 #if defined(OS_LINUX) | 7 #if defined(OS_LINUX) |
| 8 #include <gdk/gdk.h> | 8 #include <gdk/gdk.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 AddChildView(leading); | 32 AddChildView(leading); |
| 33 AddChildView(trailing); | 33 AddChildView(trailing); |
| 34 #if defined(OS_WIN) | 34 #if defined(OS_WIN) |
| 35 set_background( | 35 set_background( |
| 36 views::Background::CreateSolidBackground( | 36 views::Background::CreateSolidBackground( |
| 37 skia::COLORREFToSkColor(GetSysColor(COLOR_3DFACE)))); | 37 skia::COLORREFToSkColor(GetSysColor(COLOR_3DFACE)))); |
| 38 #endif | 38 #endif |
| 39 } | 39 } |
| 40 | 40 |
| 41 void SingleSplitView::OnBoundsChanged() { | 41 void SingleSplitView::OnBoundsChanged() { |
| 42 divider_offset_ = CalculateDividerOffset(divider_offset_, previous_bounds_, bo
unds()); | 42 divider_offset_ = CalculateDividerOffset(divider_offset_, previous_bounds_, |
| 43 bounds()); |
| 43 View::OnBoundsChanged(); | 44 View::OnBoundsChanged(); |
| 44 previous_bounds_ = bounds(); | 45 previous_bounds_ = bounds(); |
| 45 } | 46 } |
| 46 | 47 |
| 47 void SingleSplitView::Layout() { | 48 void SingleSplitView::Layout() { |
| 48 gfx::Rect leading_bounds; | 49 gfx::Rect leading_bounds; |
| 49 gfx::Rect trailing_bounds; | 50 gfx::Rect trailing_bounds; |
| 50 CalculateChildrenBounds(bounds(), &leading_bounds, &trailing_bounds); | 51 CalculateChildrenBounds(bounds(), &leading_bounds, &trailing_bounds); |
| 51 | 52 |
| 52 if (GetChildViewCount() > 0) { | 53 if (has_children()) { |
| 53 if (GetChildViewAt(0)->IsVisible()) | 54 if (GetChildViewAt(0)->IsVisible()) |
| 54 GetChildViewAt(0)->SetBoundsRect(leading_bounds); | 55 GetChildViewAt(0)->SetBoundsRect(leading_bounds); |
| 55 if (GetChildViewCount() > 1) { | 56 if (child_count() > 1) { |
| 56 if (GetChildViewAt(1)->IsVisible()) | 57 if (GetChildViewAt(1)->IsVisible()) |
| 57 GetChildViewAt(1)->SetBoundsRect(trailing_bounds); | 58 GetChildViewAt(1)->SetBoundsRect(trailing_bounds); |
| 58 } | 59 } |
| 59 } | 60 } |
| 60 | 61 |
| 61 SchedulePaint(); | 62 SchedulePaint(); |
| 62 | 63 |
| 63 // Invoke super's implementation so that the children are layed out. | 64 // Invoke super's implementation so that the children are layed out. |
| 64 View::Layout(); | 65 View::Layout(); |
| 65 } | 66 } |
| 66 | 67 |
| 67 AccessibilityTypes::Role SingleSplitView::GetAccessibleRole() { | 68 AccessibilityTypes::Role SingleSplitView::GetAccessibleRole() { |
| 68 return AccessibilityTypes::ROLE_GROUPING; | 69 return AccessibilityTypes::ROLE_GROUPING; |
| 69 } | 70 } |
| 70 | 71 |
| 71 gfx::Size SingleSplitView::GetPreferredSize() { | 72 gfx::Size SingleSplitView::GetPreferredSize() { |
| 72 int width = 0; | 73 int width = 0; |
| 73 int height = 0; | 74 int height = 0; |
| 74 for (int i = 0; i < 2 && i < GetChildViewCount(); ++i) { | 75 for (size_t i = 0; i < 2 && i < child_count(); ++i) { |
| 75 View* view = GetChildViewAt(i); | 76 View* view = GetChildViewAt(i); |
| 76 gfx::Size pref = view->GetPreferredSize(); | 77 gfx::Size pref = view->GetPreferredSize(); |
| 77 if (is_horizontal_) { | 78 if (is_horizontal_) { |
| 78 width += pref.width(); | 79 width += pref.width(); |
| 79 height = std::max(height, pref.height()); | 80 height = std::max(height, pref.height()); |
| 80 } else { | 81 } else { |
| 81 width = std::max(width, pref.width()); | 82 width = std::max(width, pref.width()); |
| 82 height += pref.height(); | 83 height += pref.height(); |
| 83 } | 84 } |
| 84 } | 85 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 103 GDK_SB_V_DOUBLE_ARROW); | 104 GDK_SB_V_DOUBLE_ARROW); |
| 104 #endif | 105 #endif |
| 105 } | 106 } |
| 106 return NULL; | 107 return NULL; |
| 107 } | 108 } |
| 108 | 109 |
| 109 void SingleSplitView::CalculateChildrenBounds( | 110 void SingleSplitView::CalculateChildrenBounds( |
| 110 const gfx::Rect& bounds, | 111 const gfx::Rect& bounds, |
| 111 gfx::Rect* leading_bounds, | 112 gfx::Rect* leading_bounds, |
| 112 gfx::Rect* trailing_bounds) const { | 113 gfx::Rect* trailing_bounds) const { |
| 113 bool is_leading_visible = | 114 bool is_leading_visible = has_children() && GetChildViewAt(0)->IsVisible(); |
| 114 GetChildViewCount() > 0 && GetChildViewAt(0)->IsVisible(); | |
| 115 bool is_trailing_visible = | 115 bool is_trailing_visible = |
| 116 GetChildViewCount() > 1 && GetChildViewAt(1)->IsVisible(); | 116 child_count() > 1 && GetChildViewAt(1)->IsVisible(); |
| 117 | 117 |
| 118 if (!is_leading_visible && !is_trailing_visible) { | 118 if (!is_leading_visible && !is_trailing_visible) { |
| 119 *leading_bounds = gfx::Rect(); | 119 *leading_bounds = gfx::Rect(); |
| 120 *trailing_bounds = gfx::Rect(); | 120 *trailing_bounds = gfx::Rect(); |
| 121 return; | 121 return; |
| 122 } | 122 } |
| 123 | 123 |
| 124 int divider_at; | 124 int divider_at; |
| 125 | 125 |
| 126 if (!is_trailing_visible) { | 126 if (!is_trailing_visible) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 153 bool SingleSplitView::OnMousePressed(const MouseEvent& event) { | 153 bool SingleSplitView::OnMousePressed(const MouseEvent& event) { |
| 154 if (!IsPointInDivider(event.location())) | 154 if (!IsPointInDivider(event.location())) |
| 155 return false; | 155 return false; |
| 156 drag_info_.initial_mouse_offset = GetPrimaryAxisSize(event.x(), event.y()); | 156 drag_info_.initial_mouse_offset = GetPrimaryAxisSize(event.x(), event.y()); |
| 157 drag_info_.initial_divider_offset = | 157 drag_info_.initial_divider_offset = |
| 158 NormalizeDividerOffset(divider_offset_, bounds()); | 158 NormalizeDividerOffset(divider_offset_, bounds()); |
| 159 return true; | 159 return true; |
| 160 } | 160 } |
| 161 | 161 |
| 162 bool SingleSplitView::OnMouseDragged(const MouseEvent& event) { | 162 bool SingleSplitView::OnMouseDragged(const MouseEvent& event) { |
| 163 if (GetChildViewCount() < 2) | 163 if (child_count() < 2) |
| 164 return false; | 164 return false; |
| 165 | 165 |
| 166 int delta_offset = GetPrimaryAxisSize(event.x(), event.y()) - | 166 int delta_offset = GetPrimaryAxisSize(event.x(), event.y()) - |
| 167 drag_info_.initial_mouse_offset; | 167 drag_info_.initial_mouse_offset; |
| 168 if (is_horizontal_ && base::i18n::IsRTL()) | 168 if (is_horizontal_ && base::i18n::IsRTL()) |
| 169 delta_offset *= -1; | 169 delta_offset *= -1; |
| 170 // Honor the minimum size when resizing. | 170 // Honor the minimum size when resizing. |
| 171 gfx::Size min = GetChildViewAt(0)->GetMinimumSize(); | 171 gfx::Size min = GetChildViewAt(0)->GetMinimumSize(); |
| 172 int new_size = std::max(GetPrimaryAxisSize(min.width(), min.height()), | 172 int new_size = std::max(GetPrimaryAxisSize(min.width(), min.height()), |
| 173 drag_info_.initial_divider_offset + delta_offset); | 173 drag_info_.initial_divider_offset + delta_offset); |
| 174 | 174 |
| 175 // And don't let the view get bigger than our width. | 175 // And don't let the view get bigger than our width. |
| 176 new_size = std::min(GetPrimaryAxisSize() - kDividerSize, new_size); | 176 new_size = std::min(GetPrimaryAxisSize() - kDividerSize, new_size); |
| 177 | 177 |
| 178 if (new_size != divider_offset_) { | 178 if (new_size != divider_offset_) { |
| 179 set_divider_offset(new_size); | 179 set_divider_offset(new_size); |
| 180 if (!observer_ || observer_->SplitHandleMoved(this)) | 180 if (!observer_ || observer_->SplitHandleMoved(this)) |
| 181 Layout(); | 181 Layout(); |
| 182 } | 182 } |
| 183 return true; | 183 return true; |
| 184 } | 184 } |
| 185 | 185 |
| 186 void SingleSplitView::OnMouseReleased(const MouseEvent& event, bool canceled) { | 186 void SingleSplitView::OnMouseReleased(const MouseEvent& event, bool canceled) { |
| 187 if (GetChildViewCount() < 2) | 187 if (child_count() < 2) |
| 188 return; | 188 return; |
| 189 | 189 |
| 190 if (canceled && drag_info_.initial_divider_offset != divider_offset_) { | 190 if (canceled && drag_info_.initial_divider_offset != divider_offset_) { |
| 191 set_divider_offset(drag_info_.initial_divider_offset); | 191 set_divider_offset(drag_info_.initial_divider_offset); |
| 192 if (!observer_ || observer_->SplitHandleMoved(this)) | 192 if (!observer_ || observer_->SplitHandleMoved(this)) |
| 193 Layout(); | 193 Layout(); |
| 194 } | 194 } |
| 195 } | 195 } |
| 196 | 196 |
| 197 bool SingleSplitView::IsPointInDivider(const gfx::Point& p) { | 197 bool SingleSplitView::IsPointInDivider(const gfx::Point& p) { |
| 198 if (GetChildViewCount() < 2) | 198 if (child_count() < 2) |
| 199 return false; | 199 return false; |
| 200 | 200 |
| 201 if (!GetChildViewAt(0)->IsVisible() || !GetChildViewAt(1)->IsVisible()) | 201 if (!GetChildViewAt(0)->IsVisible() || !GetChildViewAt(1)->IsVisible()) |
| 202 return false; | 202 return false; |
| 203 | 203 |
| 204 int divider_relative_offset; | 204 int divider_relative_offset; |
| 205 if (is_horizontal_) { | 205 if (is_horizontal_) { |
| 206 divider_relative_offset = | 206 divider_relative_offset = |
| 207 p.x() - GetChildViewAt(base::i18n::IsRTL() ? 1 : 0)->width(); | 207 p.x() - GetChildViewAt(base::i18n::IsRTL() ? 1 : 0)->width(); |
| 208 } else { | 208 } else { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 238 int SingleSplitView::NormalizeDividerOffset(int divider_offset, | 238 int SingleSplitView::NormalizeDividerOffset(int divider_offset, |
| 239 const gfx::Rect& bounds) const { | 239 const gfx::Rect& bounds) const { |
| 240 int primary_axis_size = GetPrimaryAxisSize(bounds.width(), bounds.height()); | 240 int primary_axis_size = GetPrimaryAxisSize(bounds.width(), bounds.height()); |
| 241 if (divider_offset < 0) | 241 if (divider_offset < 0) |
| 242 return (primary_axis_size - kDividerSize) / 2; | 242 return (primary_axis_size - kDividerSize) / 2; |
| 243 return std::min(divider_offset, | 243 return std::min(divider_offset, |
| 244 std::max(primary_axis_size - kDividerSize, 0)); | 244 std::max(primary_axis_size - kDividerSize, 0)); |
| 245 } | 245 } |
| 246 | 246 |
| 247 } // namespace views | 247 } // namespace views |
| OLD | NEW |