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