168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/shelf/shelf_navigator.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/shelf_model.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns true if accelerator processing should skip the shelf item with the
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// specified type.
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ShouldSkip(ShelfItemType type) {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return type == TYPE_APP_LIST ||
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         type == TYPE_BROWSER_SHORTCUT ||
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         type == TYPE_APP_SHORTCUT ||
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         type == TYPE_WINDOWED_APP;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int GetNextActivatedItemIndex(const ShelfModel& model,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CycleDirection direction) {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ShelfItems& items = model.items();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int item_count = model.item_count();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int current_index = -1;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int first_running = -1;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < item_count; ++i) {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ShelfItem& item = items[i];
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ShouldSkip(item.type))
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (item.status == STATUS_RUNNING && first_running < 0)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_running = i;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (item.status == STATUS_ACTIVE) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_index = i;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If nothing is active, try to active the first running item.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_index < 0) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (first_running >= 0)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return first_running;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int step = (direction == CYCLE_FORWARD) ? 1 : -1;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the next item and activate it.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = (current_index + step + item_count) % item_count;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != current_index; i = (i + step + item_count) % item_count) {
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ShelfItem& item = items[i];
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ShouldSkip(item.type))
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Skip already active item.
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (item.status == STATUS_ACTIVE)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return i;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return -1;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
73