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