blob: f8dede2f102a60b7bfc9a13de5d5069fcb3bd834 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
/**
* @fileoverview CategoryFilterButton extracts categories from the model
* and shows/hides them based on settings.
*/
base.require('filter');
base.require('overlay');
base.exportTo('tracing', function() {
var CategoryFilterDialog = tracing.ui.define('div');
CategoryFilterDialog.prototype = {
__proto__: tracing.ui.Overlay.prototype,
decorate: function() {
tracing.ui.Overlay.prototype.decorate.call(this);
this.className = 'view-category-filter-overlay';
this.autoClose = true;
var containerEl = document.createElement('div');
containerEl.className = 'category-filter-dialog';
containerEl.textContent = 'Select active categories:';
this.formEl_ = document.createElement('form');
this.formEl_.className = 'category-filter-dialog-form';
containerEl.appendChild(this.formEl_);
this.appendChild(containerEl);
this.categoriesEl_ = document.createElement('div');
this.categoriesEl_.className = 'categories';
this.formEl_.appendChild(this.categoriesEl_);
this.addEventListener('visibleChange', this.onVisibleChange_.bind(this));
this.onChangeCallback_ = undefined;
this.isCheckedCallback_ = undefined;
},
set categories(c) {
this.categories_ = c;
},
set settings_key(k) {
this.settings_key_ = k;
},
set settings(s) {
this.settings_ = s;
},
set settingUpdatedCallback(c) {
this.settingUpdatedCallback_ = c;
},
selectedCategories: function() {
// TODO(dsinclair): This can be made smarter by just storing an array
// of selected categories when they're clicked.
var inputs = this.categoriesEl_.querySelectorAll('input');
var inputs_length = inputs.length;
var categories = [];
for (var i = 0; i < inputs_length; ++i) {
var input = inputs[i];
if (input.checked)
categories.push(input.value);
}
return categories;
},
unselectedCategories: function() {
var inputs = this.categoriesEl_.querySelectorAll('input');
var inputs_length = inputs.length;
var categories = [];
for (var i = 0; i < inputs_length; ++i) {
var input = inputs[i];
if (input.checked)
continue;
categories.push(input.value);
}
return categories;
},
onVisibleChange_: function() {
if (this.visible) {
this.updateForm_();
}
},
updateForm_: function() {
this.categoriesEl_.innerHTML = ''; // Clear old categories
// Dedup the categories. We may have things in settings that are also
// returned when we query the category list.
var set = {};
var allCategories =
this.categories_.concat(this.settings_.keys(this.settings_key_));
var allCategoriesLength = allCategories.length;
for (var i = 0; i < allCategoriesLength; ++i) {
set[allCategories[i]] = true;
}
var categories = [];
for (var category in set) {
categories.push(category);
}
categories = categories.sort();
for (var i = 0; i < categories.length; i++) {
var category = categories[i];
var inputEl = document.createElement('input');
inputEl.type = 'checkbox';
inputEl.id = inputEl.value = category;
inputEl.checked =
this.settings_.get(category, 'true', this.settings_key_) === 'true';
inputEl.onchange = this.updateSetting_.bind(this);
var labelEl = document.createElement('label');
labelEl.textContent = category;
labelEl.setAttribute('for', category);
var divEl = document.createElement('div');
divEl.appendChild(inputEl);
divEl.appendChild(labelEl);
this.categoriesEl_.appendChild(divEl);
}
},
updateSetting_: function(e) {
var checkbox = e.target;
this.settings_.set(checkbox.value, checkbox.checked, this.settings_key_);
if (this.settingUpdatedCallback_ !== undefined)
this.settingUpdatedCallback_();
}
};
return {
CategoryFilterDialog: CategoryFilterDialog
};
});