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)/** @constructor */
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function TaskManager() { }
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.addSingletonGetter(TaskManager);
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TaskManager.prototype = {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Handle window close.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onClose: function() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!this.disabled_) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.disabled_ = true;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      commands.disableTaskManager();
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Handles selection changes.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * This is also called when data of tasks are refreshed, even if selection
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * has not been changed.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onSelectionChange: function() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var sm = this.selectionModel_;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var dm = this.dataModel_;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var selectedIndexes = sm.selectedIndexes;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var isEndProcessEnabled = true;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (selectedIndexes.length == 0)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      isEndProcessEnabled = false;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < selectedIndexes.length; i++) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var index = selectedIndexes[i];
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var task = dm.item(index);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (task['type'] == 'BROWSER')
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        isEndProcessEnabled = false;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (this.isEndProcessEnabled_ != isEndProcessEnabled) {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (isEndProcessEnabled)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        $('kill-process').removeAttribute('disabled');
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        $('kill-process').setAttribute('disabled', 'true');
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.isEndProcessEnabled_ = isEndProcessEnabled;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Closes taskmanager dialog.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * After this function is called, onClose() will be called.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close: function() {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window.close();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Sends commands to kill selected processes.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  killSelectedProcesses: function() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var selectedIndexes = this.selectionModel_.selectedIndexes;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var dm = this.dataModel_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var uniqueIds = [];
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < selectedIndexes.length; i++) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var index = selectedIndexes[i];
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var task = dm.item(index);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniqueIds.push(task['uniqueId'][0]);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    commands.killSelectedProcesses(uniqueIds);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Initializes taskmanager.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initialize: function(dialogDom, opt) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!dialogDom) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      console.log('ERROR: dialogDom is not defined.');
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    measureTime.startInterval('Load.DOM');
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.opt_ = opt;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.initialized_ = true;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.elementsCache_ = {};
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.dialogDom_ = dialogDom;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.document_ = dialogDom.ownerDocument;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.localized_column_ = [];
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < DEFAULT_COLUMNS.length; i++) {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var columnLabelId = DEFAULT_COLUMNS[i][1];
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.localized_column_[i] = loadTimeData.getString(columnLabelId);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.initElements_();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.initColumnModel_();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.selectionModel_ = new cr.ui.ListSelectionModel();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.dataModel_ = new cr.ui.ArrayDataModel([]);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.selectionModel_.addEventListener('change',
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          this.onSelectionChange.bind(this));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initializes compare functions for column sort.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var dm = this.dataModel_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // List of columns to sort by its numerical value as opposed to the
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // formatted value, e.g., 20480 vs. 20KB.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var COLUMNS_SORTED_BY_VALUE = [
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'cpuUsage', 'physicalMemory', 'sharedMemory', 'privateMemory',
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'networkUsage', 'webCoreImageCacheSize', 'webCoreScriptsCacheSize',
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'webCoreCSSCacheSize', 'fps', 'videoMemory', 'sqliteMemoryUsed',
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'goatsTeleported', 'v8MemoryAllocatedSize'];
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < DEFAULT_COLUMNS.length; i++) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var columnId = DEFAULT_COLUMNS[i][0];
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var compareFunc = (function() {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var columnIdToSort = columnId;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (COLUMNS_SORTED_BY_VALUE.indexOf(columnId) != -1)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            columnIdToSort += 'Value';
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return function(a, b) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var aValues = a[columnIdToSort];
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var bValues = b[columnIdToSort];
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var aValue = aValues && aValues[0] || 0;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var bvalue = bValues && bValues[0] || 0;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              return dm.defaultValuesCompareFunction(aValue, bvalue);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          };
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      })();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dm.setCompareFunction(columnId, compareFunc);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (isColumnEnabled(DEFAULT_SORT_COLUMN))
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dm.sort(DEFAULT_SORT_COLUMN, DEFAULT_SORT_DIRECTION);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.initTable_();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    commands.enableTaskManager();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Populate the static localized strings.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i18nTemplate.process(this.document_, loadTimeData);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    measureTime.recordInterval('Load.DOM');
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    measureTime.recordInterval('Load.Total');
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadDelayedIncludes(this);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Initializes the visibilities and handlers of the elements.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * This method is called by initialize().
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initElements_: function() {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // <if expr="pp_ifdef('chromeos')">
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The 'close-window' element exists only on ChromeOS.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This <if ... /if> section is removed while flattening HTML if chrome is
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // built as Desktop Chrome.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!this.opt_['isShowCloseButton'])
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('close-window').style.display = 'none';
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('close-window').addEventListener('click', this.close.bind(this));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // </if>
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('kill-process').addEventListener('click',
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       this.killSelectedProcesses.bind(this));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('about-memory-link').addEventListener('click', commands.openAboutMemory);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Additional initialization of taskmanager. This function is called when
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * the loading of delayed scripts finished.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delayedInitialize: function() {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.initColumnMenu_();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.initTableMenu_();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var dm = this.dataModel_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < dm.length; i++) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var processId = dm.item(i)['processId'][0];
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var j = 0; j < DEFAULT_COLUMNS.length; j++) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var columnId = DEFAULT_COLUMNS[j][0];
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var row = dm.item(i)[columnId];
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!row)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          continue;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (var k = 0; k < row.length; k++) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var labelId = 'detail-' + columnId + '-pid' + processId + '-' + k;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var label = $(labelId);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Initialize a context-menu, if the label exists and its context-
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // menu is not initialized yet.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (label && !label.contextMenu)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cr.ui.contextMenuHandler.setContextMenu(label,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    this.tableContextMenu_);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.isFinishedInitDelayed_ = true;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var t = this.table_;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    t.redraw();
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    addEventListener('resize', t.redraw.bind(t));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initColumnModel_: function() {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var tableColumns = new Array();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < DEFAULT_COLUMNS.length; i++) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var column = DEFAULT_COLUMNS[i];
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var columnId = column[0];
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!isColumnEnabled(columnId))
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tableColumns.push(new cr.ui.table.TableColumn(columnId,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     this.localized_column_[i],
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     column[2]));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (var i = 0; i < tableColumns.length; i++) {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tableColumns[i].renderFunction = this.renderColumn_.bind(this);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.columnModel_ = new cr.ui.table.TableColumnModel(tableColumns);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initColumnMenu_: function() {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.column_menu_commands_ = [];
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.commandsElement_ = this.document_.createElement('commands');
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.document_.body.appendChild(this.commandsElement_);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.columnSelectContextMenu_ = this.document_.createElement('menu');
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < DEFAULT_COLUMNS.length; i++) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var column = DEFAULT_COLUMNS[i];
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Creates command element to receive event.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var command = this.document_.createElement('command');
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command.id = COMMAND_CONTEXTMENU_COLUMN_PREFIX + '-' + column[0];
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cr.ui.Command.decorate(command);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.column_menu_commands_[command.id] = command;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.commandsElement_.appendChild(command);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Creates menuitem element.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var item = this.document_.createElement('menuitem');
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item.command = command;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command.menuitem = item;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item.textContent = this.localized_column_[i];
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isColumnEnabled(column[0]))
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        item.setAttributeNode(this.document_.createAttribute('checked'));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.columnSelectContextMenu_.appendChild(item);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.document_.body.appendChild(this.columnSelectContextMenu_);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cr.ui.Menu.decorate(this.columnSelectContextMenu_);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cr.ui.contextMenuHandler.setContextMenu(this.table_.header,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            this.columnSelectContextMenu_);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cr.ui.contextMenuHandler.setContextMenu(this.table_.list,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            this.columnSelectContextMenu_);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.document_.addEventListener('command', this.onCommand_.bind(this));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.document_.addEventListener('canExecute',
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    this.onCommandCanExecute_.bind(this));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initTableMenu_: function() {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_menu_commands_ = [];
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.tableContextMenu_ = this.document_.createElement('menu');
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var addMenuItem = function(tm, commandId, string_id) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Creates command element to receive event.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var command = tm.document_.createElement('command');
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command.id = COMMAND_CONTEXTMENU_TABLE_PREFIX + '-' + commandId;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cr.ui.Command.decorate(command);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tm.table_menu_commands_[command.id] = command;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tm.commandsElement_.appendChild(command);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Creates menuitem element.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var item = tm.document_.createElement('menuitem');
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item.command = command;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command.menuitem = item;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item.textContent = loadTimeData.getString(string_id);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tm.tableContextMenu_.appendChild(item);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addMenuItem(this, 'inspect', 'inspect');
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addMenuItem(this, 'activate', 'activate');
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.document_.body.appendChild(this.tableContextMenu_);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cr.ui.Menu.decorate(this.tableContextMenu_);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initTable_: function() {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!this.dataModel_ || !this.selectionModel_ || !this.columnModel_) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      console.log('ERROR: some models are not defined.');
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_ = this.dialogDom_.querySelector('.detail-table');
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cr.ui.Table.decorate(this.table_);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.dataModel = this.dataModel_;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.selectionModel = this.selectionModel_;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.columnModel = this.columnModel_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expands height of row when a process has some tasks.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.fixedHeight = false;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.list.addEventListener('contextmenu',
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      this.onTableContextMenuOpened_.bind(this),
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      true);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Sets custom row render function.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.setRenderFunction(this.getRow_.bind(this));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Returns a list item element of the list. This method trys to reuse the
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * cached element, or creates a new element.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {cr.ui.ListItem}  list item element which contains the given data.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  getRow_: function(data, table) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Trys to reuse the cached row;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var listItemElement = this.renderRowFromCache_(data, table);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (listItemElement)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return listItemElement;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initializes the cache.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var pid = data['processId'][0];
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.elementsCache_[pid] = {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      listItem: null,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cell: [],
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      icon: [],
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      columns: {}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create new row.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return this.renderRow_(data, table);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Returns a list item element with re-using the previous cached element, or
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * returns null if failed.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {cr.ui.ListItem} cached un-used element to be reused.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderRowFromCache_: function(data, table) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var pid = data['processId'][0];
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Checks whether the cache exists or not.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cache = this.elementsCache_[pid];
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!cache)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var listItemElement = cache.listItem;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cm = table.columnModel;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Checks whether the number of columns has been changed or not.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cache.cachedColumnSize != cm.size)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Checks whether the number of childlen tasks has been changed or not.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cache.cachedChildSize != data['uniqueId'].length)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return null;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Updates informations of the task if necessary.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < cm.size; i++) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var columnId = cm.getId(i);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var columnData = data[columnId];
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var oldColumnData = listItemElement.data[columnId];
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var columnElements = cache.columns[columnId];
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!columnData || !oldColumnData || !columnElements)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return null;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Sets new width of the cell.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var cellElement = cache.cell[i];
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cellElement.style.width = cm.getWidth(i) + '%';
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var j = 0; j < columnData.length; j++) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Sets the new text, if the text has been changed.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (oldColumnData[j] != columnData[j]) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var textElement = columnElements[j];
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          textElement.textContent = columnData[j];
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Updates icon of the task if necessary.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var oldIcons = listItemElement.data['icon'];
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var newIcons = data['icon'];
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (oldIcons && newIcons) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var j = 0; j < columnData.length; j++) {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var oldIcon = oldIcons[j];
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var newIcon = newIcons[j];
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (oldIcon != newIcon) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var iconElement = cache.icon[j];
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          iconElement.src = newIcon;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listItemElement.data = data;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Removes 'selected' and 'lead' attributes.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listItemElement.removeAttribute('selected');
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listItemElement.removeAttribute('lead');
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return listItemElement;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Create a new list item element.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {cr.ui.ListItem} created new list item element.
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderRow_: function(data, table) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var pid = data['processId'][0];
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cm = table.columnModel;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var listItem = new cr.ui.ListItem({label: ''});
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listItem.className = 'table-row';
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < cm.size; i++) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var cell = document.createElement('div');
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cell.style.width = cm.getWidth(i) + '%';
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cell.className = 'table-row-cell';
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cell.id = 'column-' + pid + '-' + cm.getId(i);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cell.appendChild(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cm.getRenderFunction(i).call(null, data, cm.getId(i), table));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      listItem.appendChild(cell);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Stores the cell element to the dictionary.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.elementsCache_[pid].cell[i] = cell;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Specifies the height of the row. The height of each row is
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 'num_of_tasks * HEIGHT_OF_TASK' px.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listItem.style.height = (data['uniqueId'].length * HEIGHT_OF_TASK) + 'px';
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listItem.data = data;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Stores the list item element, the number of columns and the number of
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // childlen.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.elementsCache_[pid].listItem = listItem;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.elementsCache_[pid].cachedColumnSize = cm.size;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.elementsCache_[pid].cachedChildSize = data['uniqueId'].length;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return listItem;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Create a new element of the cell.
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {HTMLDIVElement} created cell
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderColumn_: function(entry, columnId, table) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var container = this.document_.createElement('div');
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    container.className = 'detail-container-' + columnId;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var pid = entry['processId'][0];
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cache = [];
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cacheIcon = [];
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry && entry[columnId]) {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      container.id = 'detail-container-' + columnId + '-pid' + entry.processId;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < entry[columnId].length; i++) {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var label = document.createElement('div');
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (columnId == 'title') {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Creates a page title element with icon.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var image = this.document_.createElement('img');
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          image.className = 'detail-title-image';
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          image.src = entry['icon'][i];
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          image.id = 'detail-title-icon-pid' + pid + '-' + i;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          label.appendChild(image);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var text = this.document_.createElement('div');
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          text.className = 'detail-title-text';
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          text.id = 'detail-title-text-pid' + pid + '-' + i;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          text.textContent = entry['title'][i];
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          label.appendChild(text);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Chech if the delayed scripts (included in includes.js) have been
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // loaded or not. If the delayed scripts ware not loaded yet, a
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // context menu could not be initialized. In such case, it will be
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // initialized at delayedInitialize() just after loading of delayed
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // scripts instead of here.
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (this.isFinishedInitDelayed_)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cr.ui.contextMenuHandler.setContextMenu(label,
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    this.tableContextMenu_);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          label.addEventListener('dblclick', (function(uniqueId) {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              commands.activatePage(uniqueId);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }).bind(this, entry['uniqueId'][i]));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          label.data = entry;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          label.index_in_group = i;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cache[i] = text;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cacheIcon[i] = image;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          label.textContent = entry[columnId][i];
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cache[i] = label;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label.id = 'detail-' + columnId + '-pid' + pid + '-' + i;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label.className = 'detail-' + columnId + ' pid' + pid;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        container.appendChild(label);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.elementsCache_[pid].columns[columnId] = cache;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (columnId == 'title')
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.elementsCache_[pid].icon = cacheIcon;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return container;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Updates the task list with the supplied task.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @private
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  processTaskChange: function(task) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var dm = this.dataModel_;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var sm = this.selectionModel_;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!dm || !sm) return;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.list.startBatchUpdates();
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sm.beginChange();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var type = task.type;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var start = task.start;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var length = task.length;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var tasks = task.tasks;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We have to store the selected pids and restore them after
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // splice(), because it might replace some items but the replaced
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // items would lose the selection.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var oldSelectedIndexes = sm.selectedIndexes;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create map of selected PIDs.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var selectedPids = {};
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < oldSelectedIndexes.length; i++) {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var item = dm.item(oldSelectedIndexes[i]);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (item) selectedPids[item['processId'][0]] = true;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var args = tasks.slice();
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args.unshift(start, dm.length);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dm.splice.apply(dm, args);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create new array of selected indexes from map of old PIDs.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var newSelectedIndexes = [];
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < dm.length; i++) {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (selectedPids[dm.item(i)['processId'][0]])
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        newSelectedIndexes.push(i);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sm.selectedIndexes = newSelectedIndexes;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var pids = [];
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < dm.length; i++) {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pids.push(dm.item(i)['processId'][0]);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Sweeps unused caches, which elements no longer exist on the list.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var pid in this.elementsCache_) {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (pids.indexOf(pid) == -1)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete this.elementsCache_[pid];
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sm.endChange();
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.list.endBatchUpdates();
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Respond to a command being executed.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onCommand_: function(event) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var command = event.command;
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var commandId = command.id.split('-', 2);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var mainCommand = commandId[0];
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var subCommand = commandId[1];
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (mainCommand == COMMAND_CONTEXTMENU_COLUMN_PREFIX) {
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.onColumnContextMenu_(subCommand, command);
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (mainCommand == COMMAND_CONTEXTMENU_TABLE_PREFIX) {
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      var targetUniqueId = this.currentContextMenuTarget_;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!targetUniqueId)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (subCommand == 'inspect')
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        commands.inspect(targetUniqueId);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else if (subCommand == 'activate')
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        commands.activatePage(targetUniqueId);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.currentContextMenuTarget_ = undefined;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onCommandCanExecute_: function(event) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    event.canExecute = true;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Store resourceIndex of target resource of context menu, because resource
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * will be replaced when it is refreshed.
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @this
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onTableContextMenuOpened_: function(e) {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!this.isFinishedInitDelayed_)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var mc = this.table_menu_commands_;
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var inspectMenuitem =
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mc[COMMAND_CONTEXTMENU_TABLE_PREFIX + '-inspect'].menuitem;
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var activateMenuitem =
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mc[COMMAND_CONTEXTMENU_TABLE_PREFIX + '-activate'].menuitem;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Disabled by default.
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    inspectMenuitem.disabled = true;
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    activateMenuitem.disabled = true;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var target = e.target;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (;; target = target.parentNode) {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!target) return;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var classes = target.classList;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (classes &&
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Array.prototype.indexOf.call(classes, 'detail-title') != -1) break;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var indexInGroup = target.index_in_group;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Sets the uniqueId for current target page under the mouse corsor.
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    this.currentContextMenuTarget_ = target.data['uniqueId'][indexInGroup];
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Enables if the page can be inspected.
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (target.data['canInspect'][indexInGroup])
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      inspectMenuitem.disabled = false;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Enables if the page can be activated.
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (target.data['canActivate'][indexInGroup])
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      activateMenuitem.disabled = false;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onColumnContextMenu_: function(columnId, command) {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var menuitem = command.menuitem;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var checkedItemCount = 0;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var checked = isColumnEnabled(columnId);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Leaves a item visible when user tries making invisible but it is the
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // last one.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var enabledColumns = getEnabledColumns();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var id in enabledColumns) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (enabledColumns[id])
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        checkedItemCount++;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (checkedItemCount == 1 && checked)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Toggles the visibility of the column.
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var newChecked = !checked;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menuitem.checked = newChecked;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setColumnEnabled(columnId, newChecked);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.initColumnModel_();
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.columnModel = this.columnModel_;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.table_.redraw();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |taskmanager| has been declared in preload.js.
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)taskmanager = TaskManager.getInstance();
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function init() {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var params = parseQueryParams(window.location);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var opt = {};
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opt['isShowCloseButton'] = params.showclose;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  taskmanager.initialize(document.body, opt);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)document.addEventListener('DOMContentLoaded', init);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)document.addEventListener('Close', taskmanager.onClose.bind(taskmanager));
697