15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_ITEM_CONTROLLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_ITEM_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shelf/shelf_item_delegate.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/shelf/shelf_item_types.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/ash/launcher/chrome_launcher_types.h"
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/event.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeLauncherController;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ChromeLauncherAppMenuItem;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef ScopedVector<ChromeLauncherAppMenuItem> ChromeLauncherAppMenuItems;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Window;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LauncherItemController is used by ChromeLauncherController to track one
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// or more windows associated with a shelf item.
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LauncherItemController : public ash::ShelfItemDelegate {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Type {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TYPE_APP,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TYPE_APP_PANEL,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TYPE_SHORTCUT,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TYPE_WINDOWED_APP
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LauncherItemController(Type type,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::string& app_id,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ChromeLauncherController* launcher_controller);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~LauncherItemController();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Type type() const { return type_; }
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ash::ShelfID shelf_id() const { return shelf_id_; }
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_shelf_id(ash::ShelfID id) { shelf_id_ = id; }
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const std::string& app_id() const;
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ChromeLauncherController* launcher_controller() const {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return launcher_controller_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Lock this item to the launcher without being pinned (windowed v1 apps).
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void lock() { locked_++; }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void unlock() {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(locked_);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    locked_--;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool locked() { return locked_ > 0; }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool image_set_by_controller() const { return image_set_by_controller_; }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_image_set_by_controller(bool image_set_by_controller) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_set_by_controller_ = image_set_by_controller;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if this item is open.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsOpen() const = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if this item is visible (e.g. not minimized).
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsVisible() const = 0;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launches a new instance of the app associated with this item.
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void Launch(ash::LaunchSource source, int event_flags) = 0;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows and activates the most-recently-active window associated with the
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // item, or launches the item if it is not currently open.
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns true when a new item got created.
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool Activate(ash::LaunchSource source) = 0;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called to retrieve the list of running applications.
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ChromeLauncherAppMenuItems GetApplicationList(int event_flags) = 0;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Helper function to get the ash::ShelfItemType for the item type.
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ash::ShelfItemType GetShelfItemType() const;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function to return the title associated with |app_id_|.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns an empty title if no matching extension can be found.
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 GetAppTitle() const;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Type type_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App id will be empty if there is no app associated with the window.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string app_id_;
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ash::ShelfID shelf_id_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeLauncherController* launcher_controller_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The lock counter which tells the launcher if the item can be removed from
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the launcher (0) or not (>0). It is being used for windowed V1
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // applications.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int locked_;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set to true if the launcher item image has been set by the controller.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool image_set_by_controller_;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LauncherItemController);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_ITEM_CONTROLLER_H_
111