1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/**
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @fileoverview The recently closed menu: button, model data, and menu.
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsencr.define('ntp4', function() {
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  'use strict';
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  var localStrings = new LocalStrings();
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /**
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * Returns the text used for a recently closed window.
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @param {number} numTabs Number of tabs in the window.
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   * @return {string} The text to use.
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   */
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  function formatTabsText(numTabs) {
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (numTabs == 1)
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return localStrings.getString('closedwindowsingle');
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return localStrings.getStringF('closedwindowmultiple', numTabs);
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  var Menu = cr.ui.Menu;
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  var MenuItem = cr.ui.MenuItem;
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  var MenuButton = cr.ui.MenuButton;
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  var RecentMenuButton = cr.ui.define('button');
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  RecentMenuButton.prototype = {
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    __proto__: MenuButton.prototype,
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    decorate: function() {
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      MenuButton.prototype.decorate.call(this);
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.menu = new Menu;
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      cr.ui.decorate(this.menu, Menu);
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.menu.classList.add('recent-menu');
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      document.body.appendChild(this.menu);
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.needsRebuild_ = true;
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.hidden = true;
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    /**
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * Shows the menu, first rebuilding it if necessary.
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * TODO(estade): the right of the menu should align with the right of the
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * button.
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @override
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     */
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    showMenu: function() {
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (this.needsRebuild_) {
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this.menu.textContent = '';
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this.dataItems_.forEach(this.addItem_, this);
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        this.needsRebuild_ = false;
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      MenuButton.prototype.showMenu.call(this);
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    /**
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * Sets the menu model data.
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @param {Array} dataItems Array of objects that describe the apps.
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     */
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    set dataItems(dataItems) {
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.dataItems_ = dataItems;
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.needsRebuild_ = true;
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.hidden = dataItems.length == 0;
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    /**
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * Adds an app to the menu.
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @param {Object} data An object encapsulating all data about the app.
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @private
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     */
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    addItem_: function(data) {
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      var isWindow = data.type == 'window';
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      var a = this.ownerDocument.createElement('a');
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      a.className = 'recent-menu-item';
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (isWindow) {
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        a.href = '';
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        a.classList.add('recent-window');
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        a.textContent = formatTabsText(data.tabs.length);
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        a.href = data.url;
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        a.style.backgroundImage = 'url(chrome://favicon/' + data.url + ')';
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        a.textContent = data.title;
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // TODO(estade): add app ping url.
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      function onActivate(e) {
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // TODO(estade): don't convert to string.
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        chrome.send('reopenTab', [String(data.sessionId)]);
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        e.preventDefault();
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      a.addEventListener('activate', onActivate);
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this.menu.appendChild(a);
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      cr.ui.decorate(a, MenuItem);
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    },
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return {
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RecentMenuButton: RecentMenuButton,
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen});
106