• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
9 namespace ash {
10 
11 namespace {
12 
13 // Returns true if accelerator processing should skip the launcher item with
14 // the specified type.
ShouldSkip(ash::LauncherItemType type)15 bool ShouldSkip(ash::LauncherItemType type) {
16   return type == ash::TYPE_APP_LIST ||
17          type == ash::TYPE_BROWSER_SHORTCUT ||
18          type == ash::TYPE_APP_SHORTCUT ||
19          type == ash::TYPE_WINDOWED_APP;
20 }
21 
22 }  // namespace
23 
GetNextActivatedItemIndex(const ShelfModel & model,CycleDirection direction)24 int GetNextActivatedItemIndex(const ShelfModel& model,
25                               CycleDirection direction) {
26   const ash::LauncherItems& 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 ash::LauncherItem& item = items[i];
33     if (ShouldSkip(item.type))
34       continue;
35 
36     if (item.status == ash::STATUS_RUNNING && first_running < 0)
37       first_running = i;
38 
39     if (item.status == ash::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 ash::LauncherItem& item = items[i];
59     if (ShouldSkip(item.type))
60       continue;
61 
62     // Skip already active item.
63     if (item.status == ash::STATUS_ACTIVE)
64       continue;
65 
66     return i;
67   }
68 
69   return -1;
70 }
71 
72 }  // namespace ash
73