1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ash/shelf/shelf_navigator.h"
6
7#include "ash/shelf/shelf_model.h"
8
9namespace ash {
10
11namespace {
12
13// Returns true if accelerator processing should skip the shelf item with the
14// specified type.
15bool ShouldSkip(ShelfItemType type) {
16  return type == TYPE_APP_LIST ||
17         type == TYPE_BROWSER_SHORTCUT ||
18         type == TYPE_APP_SHORTCUT ||
19         type == TYPE_WINDOWED_APP;
20}
21
22}  // namespace
23
24int GetNextActivatedItemIndex(const ShelfModel& model,
25                              CycleDirection direction) {
26  const ShelfItems& items = model.items();
27  int item_count = model.item_count();
28  int current_index = -1;
29  int first_running = -1;
30
31  for (int i = 0; i < item_count; ++i) {
32    const ShelfItem& item = items[i];
33    if (ShouldSkip(item.type))
34      continue;
35
36    if (item.status == STATUS_RUNNING && first_running < 0)
37      first_running = i;
38
39    if (item.status == STATUS_ACTIVE) {
40      current_index = i;
41      break;
42    }
43  }
44
45  // If nothing is active, try to active the first running item.
46  if (current_index < 0) {
47    if (first_running >= 0)
48      return first_running;
49    else
50      return -1;
51  }
52
53  int step = (direction == CYCLE_FORWARD) ? 1 : -1;
54
55  // Find the next item and activate it.
56  for (int i = (current_index + step + item_count) % item_count;
57       i != current_index; i = (i + step + item_count) % item_count) {
58    const ShelfItem& item = items[i];
59    if (ShouldSkip(item.type))
60      continue;
61
62    // Skip already active item.
63    if (item.status == STATUS_ACTIVE)
64      continue;
65
66    return i;
67  }
68
69  return -1;
70}
71
72}  // namespace ash
73