Home | History | Annotate | Download | only in launcher
      1 // Copyright (c) 2012 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/launcher/launcher_navigator.h"
      6 
      7 #include "ash/launcher/launcher_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.
     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 
     24 int GetNextActivatedItemIndex(const LauncherModel& 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