Index: chrome/browser/views/download_tab_view.cc |
=================================================================== |
--- chrome/browser/views/download_tab_view.cc (revision 6493) |
+++ chrome/browser/views/download_tab_view.cc (working copy) |
@@ -184,6 +184,10 @@ |
show_->SetController(this); |
show_->SetFont(font); |
AddChildView(show_); |
+ |
+ SetFocusable(true); |
+ |
+ SetContextMenuController(this); |
} |
DownloadItemTabView::~DownloadItemTabView() { |
@@ -689,6 +693,25 @@ |
} |
} |
+bool DownloadItemTabView::CanProcessTabKeyEvents() { |
+ return true; |
+} |
+ |
+bool DownloadItemTabView::OnKeyPressed(const views::KeyEvent& event) { |
+ // When you press DOWN or TAB select the next item in the downloads, otherwise |
+ // when you press SHIFT+TAB or UP select the previous item. Note that the |
+ // first download index is always in reverse, hence last index. |
+ if (event.GetCharacter() == VK_DOWN || (GetKeyState(VK_SHIFT) >= 0 && |
+ event.GetCharacter() == VK_TAB)) { |
+ parent_->SelectItemAtIndex(parent_->selected_index() - 1); |
+ } |
+ else if (event.GetCharacter() == VK_UP || (GetKeyState(VK_SHIFT) < 0 && |
+ event.GetCharacter() == VK_TAB)) { |
+ parent_->SelectItemAtIndex(parent_->selected_index() + 1); |
+ } |
+ return true; |
+} |
+ |
bool DownloadItemTabView::OnMousePressed(const views::MouseEvent& event) { |
gfx::Point point(event.location()); |
@@ -707,6 +730,11 @@ |
gfx::Rect mirrored_rect(select_rect); |
select_rect.set_x(MirroredLeftPointForRect(mirrored_rect)); |
if (select_rect.Contains(point)) { |
+ // Request Focus if not present to allow keyboard events to work and context |
+ // menu to function properly. |
+ if (!HasFocus()) |
+ RequestFocus(); |
+ |
parent_->ItemBecameSelected(model_); |
// Don't show the right-click menu if we are prompting the user for a |
@@ -731,13 +759,13 @@ |
model_->safety_state() == DownloadItem::DANGEROUS) |
return false; |
- CPoint point(event.x(), event.y()); |
+ gfx::Point point(event.x(), event.y()); |
// In order to make sure drag and drop works as expected when the UI is |
// mirrored, we can either flip the mouse X coordinate or flip the X position |
// of the drag rectangle. Flipping the mouse X coordinate is easier. |
- point.x = MirroredXCoordinateInsideView(point.x); |
- CRect drag_rect(kDownloadIconOffset - |
+ point.set_x(MirroredXCoordinateInsideView(point.x())); |
+ gfx::Rect drag_rect(kDownloadIconOffset - |
parent_->big_icon_offset(), |
0, |
kDownloadIconOffset - |
@@ -746,7 +774,7 @@ |
kFilenameSize, |
parent_->big_icon_size()); |
- if (drag_rect.PtInRect(point)) { |
+ if (drag_rect.Contains(point)) { |
SkBitmap* icon = parent_->LookupIcon(model_); |
if (icon) |
download_util::DragDownload(model_, icon); |
@@ -755,6 +783,18 @@ |
return true; |
} |
+void DownloadItemTabView::ShowContextMenu(View* source, |
+ int x, |
+ int y, |
+ bool is_mouse_gesture) { |
+ // Only show context menu when an item has been selected. |
+ if (parent_->selected_index() != -1) { |
+ gfx::Point location (x, y); |
+ download_util::DownloadDestinationContextMenu menu( |
+ model_, GetWidget()->GetHWND(), location.ToPOINT()); |
+ } |
+} |
+ |
void DownloadItemTabView::LinkActivated(views::Link* source, int event_flags) { |
// There are several links in our view that could have been clicked: |
if (source == file_name_) { |
@@ -1176,6 +1216,13 @@ |
return false; |
} |
+void DownloadTabView::SelectItemAtIndex(int index) { |
+ if (selected_index() == -1) |
+ ItemBecameSelected(downloads_[total_downloads() - 1]); |
+ else if (index >= 0 && index < total_downloads()) |
+ ItemBecameSelected(downloads_[index]); |
+} |
+ |
void DownloadTabView::SchedulePaintForViewAtIndex(int index) { |
int y = GetYPositionForIndex(index); |
SchedulePaint(0, y, width(), big_icon_size_); |