| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/shelf/shelf_navigator.h" |
| |
| #include "ash/shelf/shelf_model.h" |
| |
| namespace ash { |
| |
| namespace { |
| |
| // Returns true if accelerator processing should skip the shelf item with the |
| // specified type. |
| bool ShouldSkip(ShelfItemType type) { |
| return type == TYPE_APP_LIST || |
| type == TYPE_BROWSER_SHORTCUT || |
| type == TYPE_APP_SHORTCUT || |
| type == TYPE_WINDOWED_APP; |
| } |
| |
| } // namespace |
| |
| int GetNextActivatedItemIndex(const ShelfModel& model, |
| CycleDirection direction) { |
| const ShelfItems& items = model.items(); |
| int item_count = model.item_count(); |
| int current_index = -1; |
| int first_running = -1; |
| |
| for (int i = 0; i < item_count; ++i) { |
| const ShelfItem& item = items[i]; |
| if (ShouldSkip(item.type)) |
| continue; |
| |
| if (item.status == STATUS_RUNNING && first_running < 0) |
| first_running = i; |
| |
| if (item.status == STATUS_ACTIVE) { |
| current_index = i; |
| break; |
| } |
| } |
| |
| // If nothing is active, try to active the first running item. |
| if (current_index < 0) { |
| if (first_running >= 0) |
| return first_running; |
| else |
| return -1; |
| } |
| |
| int step = (direction == CYCLE_FORWARD) ? 1 : -1; |
| |
| // Find the next item and activate it. |
| for (int i = (current_index + step + item_count) % item_count; |
| i != current_index; i = (i + step + item_count) % item_count) { |
| const ShelfItem& item = items[i]; |
| if (ShouldSkip(item.type)) |
| continue; |
| |
| // Skip already active item. |
| if (item.status == STATUS_ACTIVE) |
| continue; |
| |
| return i; |
| } |
| |
| return -1; |
| } |
| |
| } // namespace ash |