| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/scrollbar/bitmap_scroll_bar.h" | 5 #include "views/controls/scrollbar/bitmap_scroll_bar.h" |
| 6 | 6 |
| 7 #if defined(OS_LINUX) | 7 #if defined(OS_LINUX) |
| 8 #include "views/screen.h" | 8 #include "views/screen.h" |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 public: | 47 public: |
| 48 AutorepeatButton(ButtonListener* listener) | 48 AutorepeatButton(ButtonListener* listener) |
| 49 : ImageButton(listener), | 49 : ImageButton(listener), |
| 50 ALLOW_THIS_IN_INITIALIZER_LIST(repeater_( | 50 ALLOW_THIS_IN_INITIALIZER_LIST(repeater_( |
| 51 NewCallback<AutorepeatButton>(this, | 51 NewCallback<AutorepeatButton>(this, |
| 52 &AutorepeatButton::NotifyClick))) { | 52 &AutorepeatButton::NotifyClick))) { |
| 53 } | 53 } |
| 54 virtual ~AutorepeatButton() {} | 54 virtual ~AutorepeatButton() {} |
| 55 | 55 |
| 56 protected: | 56 protected: |
| 57 virtual bool OnMousePressed(const MouseEvent& event) { | 57 virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE { |
| 58 Button::NotifyClick(event); | 58 Button::NotifyClick(event); |
| 59 repeater_.Start(); | 59 repeater_.Start(); |
| 60 return true; | 60 return true; |
| 61 } | 61 } |
| 62 | 62 |
| 63 virtual void OnMouseReleased(const MouseEvent& event, bool canceled) { | 63 virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE { |
| 64 OnMouseCaptureLost(); |
| 65 } |
| 66 |
| 67 virtual void OnMouseCaptureLost() OVERRIDE { |
| 64 repeater_.Stop(); | 68 repeater_.Stop(); |
| 65 View::OnMouseReleased(event, canceled); | |
| 66 } | 69 } |
| 67 | 70 |
| 68 private: | 71 private: |
| 69 void NotifyClick() { | 72 void NotifyClick() { |
| 70 #if defined(OS_WIN) | 73 #if defined(OS_WIN) |
| 71 DWORD pos = GetMessagePos(); | 74 DWORD pos = GetMessagePos(); |
| 72 POINTS points = MAKEPOINTS(pos); | 75 POINTS points = MAKEPOINTS(pos); |
| 73 gfx::Point cursor_point(points.x, points.y); | 76 gfx::Point cursor_point(points.x, points.y); |
| 74 #elif defined(OS_LINUX) | 77 #elif defined(OS_LINUX) |
| 75 gfx::Point cursor_point = Screen::GetCursorScreenPoint(); | 78 gfx::Point cursor_point = Screen::GetCursorScreenPoint(); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 | 145 |
| 143 // Gets the position of the thumb on the x or y axis. | 146 // Gets the position of the thumb on the x or y axis. |
| 144 int GetPosition() const { | 147 int GetPosition() const { |
| 145 gfx::Rect track_bounds = scroll_bar_->GetTrackBounds(); | 148 gfx::Rect track_bounds = scroll_bar_->GetTrackBounds(); |
| 146 if (scroll_bar_->IsHorizontal()) | 149 if (scroll_bar_->IsHorizontal()) |
| 147 return x() - track_bounds.x(); | 150 return x() - track_bounds.x(); |
| 148 return y() - track_bounds.y(); | 151 return y() - track_bounds.y(); |
| 149 } | 152 } |
| 150 | 153 |
| 151 // View overrides: | 154 // View overrides: |
| 152 virtual gfx::Size GetPreferredSize() { | 155 virtual gfx::Size GetPreferredSize() OVERRIDE { |
| 153 return gfx::Size(background_bitmap()->width(), | 156 return gfx::Size(background_bitmap()->width(), |
| 154 start_cap_bitmap()->height() + | 157 start_cap_bitmap()->height() + |
| 155 end_cap_bitmap()->height() + | 158 end_cap_bitmap()->height() + |
| 156 grippy_bitmap()->height()); | 159 grippy_bitmap()->height()); |
| 157 } | 160 } |
| 158 | 161 |
| 159 protected: | 162 protected: |
| 160 // View overrides: | 163 // View overrides: |
| 161 virtual void Paint(gfx::Canvas* canvas) { | 164 virtual void Paint(gfx::Canvas* canvas) OVERRIDE { |
| 162 canvas->DrawBitmapInt(*start_cap_bitmap(), 0, 0); | 165 canvas->DrawBitmapInt(*start_cap_bitmap(), 0, 0); |
| 163 int top_cap_height = start_cap_bitmap()->height(); | 166 int top_cap_height = start_cap_bitmap()->height(); |
| 164 int bottom_cap_height = end_cap_bitmap()->height(); | 167 int bottom_cap_height = end_cap_bitmap()->height(); |
| 165 int thumb_body_height = height() - top_cap_height - bottom_cap_height; | 168 int thumb_body_height = height() - top_cap_height - bottom_cap_height; |
| 166 canvas->TileImageInt(*background_bitmap(), 0, top_cap_height, | 169 canvas->TileImageInt(*background_bitmap(), 0, top_cap_height, |
| 167 background_bitmap()->width(), thumb_body_height); | 170 background_bitmap()->width(), thumb_body_height); |
| 168 canvas->DrawBitmapInt(*end_cap_bitmap(), 0, | 171 canvas->DrawBitmapInt(*end_cap_bitmap(), 0, |
| 169 height() - bottom_cap_height); | 172 height() - bottom_cap_height); |
| 170 | 173 |
| 171 // Paint the grippy over the track. | 174 // Paint the grippy over the track. |
| 172 int grippy_x = (width() - grippy_bitmap()->width()) / 2; | 175 int grippy_x = (width() - grippy_bitmap()->width()) / 2; |
| 173 int grippy_y = (thumb_body_height - grippy_bitmap()->height()) / 2; | 176 int grippy_y = (thumb_body_height - grippy_bitmap()->height()) / 2; |
| 174 canvas->DrawBitmapInt(*grippy_bitmap(), grippy_x, grippy_y); | 177 canvas->DrawBitmapInt(*grippy_bitmap(), grippy_x, grippy_y); |
| 175 } | 178 } |
| 176 | 179 |
| 177 virtual void OnMouseEntered(const MouseEvent& event) { | 180 virtual void OnMouseEntered(const MouseEvent& event) OVERRIDE { |
| 178 SetState(CustomButton::BS_HOT); | 181 SetState(CustomButton::BS_HOT); |
| 179 } | 182 } |
| 180 | 183 |
| 181 virtual void OnMouseExited(const MouseEvent& event) { | 184 virtual void OnMouseExited(const MouseEvent& event) OVERRIDE { |
| 182 SetState(CustomButton::BS_NORMAL); | 185 SetState(CustomButton::BS_NORMAL); |
| 183 } | 186 } |
| 184 | 187 |
| 185 virtual bool OnMousePressed(const MouseEvent& event) { | 188 virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE { |
| 186 mouse_offset_ = scroll_bar_->IsHorizontal() ? event.x() : event.y(); | 189 mouse_offset_ = scroll_bar_->IsHorizontal() ? event.x() : event.y(); |
| 187 drag_start_position_ = GetPosition(); | 190 drag_start_position_ = GetPosition(); |
| 188 SetState(CustomButton::BS_PUSHED); | 191 SetState(CustomButton::BS_PUSHED); |
| 189 return true; | 192 return true; |
| 190 } | 193 } |
| 191 | 194 |
| 192 virtual bool OnMouseDragged(const MouseEvent& event) { | 195 virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE { |
| 193 // If the user moves the mouse more than |kScrollThumbDragOutSnap| outside | 196 // If the user moves the mouse more than |kScrollThumbDragOutSnap| outside |
| 194 // the bounds of the thumb, the scrollbar will snap the scroll back to the | 197 // the bounds of the thumb, the scrollbar will snap the scroll back to the |
| 195 // point it was at before the drag began. | 198 // point it was at before the drag began. |
| 196 if (scroll_bar_->IsHorizontal()) { | 199 if (scroll_bar_->IsHorizontal()) { |
| 197 if ((event.y() < y() - kScrollThumbDragOutSnap) || | 200 if ((event.y() < y() - kScrollThumbDragOutSnap) || |
| 198 (event.y() > (y() + height() + kScrollThumbDragOutSnap))) { | 201 (event.y() > (y() + height() + kScrollThumbDragOutSnap))) { |
| 199 scroll_bar_->ScrollToThumbPosition(drag_start_position_, false); | 202 scroll_bar_->ScrollToThumbPosition(drag_start_position_, false); |
| 200 return true; | 203 return true; |
| 201 } | 204 } |
| 202 } else { | 205 } else { |
| 203 if ((event.x() < x() - kScrollThumbDragOutSnap) || | 206 if ((event.x() < x() - kScrollThumbDragOutSnap) || |
| 204 (event.x() > (x() + width() + kScrollThumbDragOutSnap))) { | 207 (event.x() > (x() + width() + kScrollThumbDragOutSnap))) { |
| 205 scroll_bar_->ScrollToThumbPosition(drag_start_position_, false); | 208 scroll_bar_->ScrollToThumbPosition(drag_start_position_, false); |
| 206 return true; | 209 return true; |
| 207 } | 210 } |
| 208 } | 211 } |
| 209 if (scroll_bar_->IsHorizontal()) { | 212 if (scroll_bar_->IsHorizontal()) { |
| 210 int thumb_x = event.x() - mouse_offset_; | 213 int thumb_x = event.x() - mouse_offset_; |
| 211 scroll_bar_->ScrollToThumbPosition(x() + thumb_x, false); | 214 scroll_bar_->ScrollToThumbPosition(x() + thumb_x, false); |
| 212 } else { | 215 } else { |
| 213 int thumb_y = event.y() - mouse_offset_; | 216 int thumb_y = event.y() - mouse_offset_; |
| 214 scroll_bar_->ScrollToThumbPosition(y() + thumb_y, false); | 217 scroll_bar_->ScrollToThumbPosition(y() + thumb_y, false); |
| 215 } | 218 } |
| 216 return true; | 219 return true; |
| 217 } | 220 } |
| 218 | 221 |
| 219 virtual void OnMouseReleased(const MouseEvent& event, | 222 virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE { |
| 220 bool canceled) { | 223 OnMouseCaptureLost(); |
| 224 } |
| 225 |
| 226 virtual void OnMouseCaptureLost() OVERRIDE { |
| 221 SetState(CustomButton::BS_HOT); | 227 SetState(CustomButton::BS_HOT); |
| 222 View::OnMouseReleased(event, canceled); | |
| 223 } | 228 } |
| 224 | 229 |
| 225 private: | 230 private: |
| 226 // Returns the bitmap rendered at the start of the thumb. | 231 // Returns the bitmap rendered at the start of the thumb. |
| 227 SkBitmap* start_cap_bitmap() const { | 232 SkBitmap* start_cap_bitmap() const { |
| 228 return scroll_bar_->images_[BitmapScrollBar::THUMB_START_CAP][state_]; | 233 return scroll_bar_->images_[BitmapScrollBar::THUMB_START_CAP][state_]; |
| 229 } | 234 } |
| 230 | 235 |
| 231 // Returns the bitmap rendered at the end of the thumb. | 236 // Returns the bitmap rendered at the end of the thumb. |
| 232 SkBitmap* end_cap_bitmap() const { | 237 SkBitmap* end_cap_bitmap() const { |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 } else if (event.y() > thumb_bounds.bottom()) { | 469 } else if (event.y() > thumb_bounds.bottom()) { |
| 465 last_scroll_amount_ = SCROLL_NEXT_PAGE; | 470 last_scroll_amount_ = SCROLL_NEXT_PAGE; |
| 466 } | 471 } |
| 467 } | 472 } |
| 468 TrackClicked(); | 473 TrackClicked(); |
| 469 repeater_.Start(); | 474 repeater_.Start(); |
| 470 } | 475 } |
| 471 return true; | 476 return true; |
| 472 } | 477 } |
| 473 | 478 |
| 474 void BitmapScrollBar::OnMouseReleased(const MouseEvent& event, bool canceled) { | 479 void BitmapScrollBar::OnMouseReleased(const MouseEvent& event) { |
| 480 OnMouseCaptureLost(); |
| 481 } |
| 482 |
| 483 void BitmapScrollBar::OnMouseCaptureLost() { |
| 475 SetThumbTrackState(CustomButton::BS_NORMAL); | 484 SetThumbTrackState(CustomButton::BS_NORMAL); |
| 476 repeater_.Stop(); | 485 repeater_.Stop(); |
| 477 View::OnMouseReleased(event, canceled); | |
| 478 } | 486 } |
| 479 | 487 |
| 480 bool BitmapScrollBar::OnKeyPressed(const KeyEvent& event) { | 488 bool BitmapScrollBar::OnKeyPressed(const KeyEvent& event) { |
| 481 ScrollAmount amount = SCROLL_NONE; | 489 ScrollAmount amount = SCROLL_NONE; |
| 482 switch (event.key_code()) { | 490 switch (event.key_code()) { |
| 483 case ui::VKEY_UP: | 491 case ui::VKEY_UP: |
| 484 if (!IsHorizontal()) | 492 if (!IsHorizontal()) |
| 485 amount = SCROLL_PREV_LINE; | 493 amount = SCROLL_PREV_LINE; |
| 486 break; | 494 break; |
| 487 case ui::VKEY_DOWN: | 495 case ui::VKEY_DOWN: |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 719 thumb_position = thumb_position - (thumb_->GetSize() / 2); | 727 thumb_position = thumb_position - (thumb_->GetSize() / 2); |
| 720 return (thumb_position * contents_size_) / GetTrackSize(); | 728 return (thumb_position * contents_size_) / GetTrackSize(); |
| 721 } | 729 } |
| 722 | 730 |
| 723 void BitmapScrollBar::SetThumbTrackState(CustomButton::ButtonState state) { | 731 void BitmapScrollBar::SetThumbTrackState(CustomButton::ButtonState state) { |
| 724 thumb_track_state_ = state; | 732 thumb_track_state_ = state; |
| 725 SchedulePaint(); | 733 SchedulePaint(); |
| 726 } | 734 } |
| 727 | 735 |
| 728 } // namespace views | 736 } // namespace views |
| OLD | NEW |