166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2012 The Chromium Authors. All rights reserved. 266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be 366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file. 466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict'; 666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/** 866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @fileoverview A list of things, and a viewer for the currently selected 966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * thing. 1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('ui'); 1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('ui.list_view'); 1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.requireStylesheet('ui.list_and_associated_view'); 1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('ui', function() { 1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis /** 1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @constructor 1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var ListAndAssociatedView = ui.define('x-list-and-associated-view'); 2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ListAndAssociatedView.prototype = { 2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis __proto__: HTMLUnknownElement.prototype, 2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis decorate: function() { 2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.list_ = undefined; 2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.listProperty_ = undefined; 2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.view_ = undefined; 2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.viewProperty_ = undefined; 2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.listView_ = new ui.ListView(); 2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.listView_.addEventListener('selection-changed', 3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.onSelectionChanged_.bind(this)); 3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.placeholder_ = document.createElement('div'); 3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendChild(this.listView_); 3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendChild(this.placeholder_); 3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis get listView() { 3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return this.listView_; 3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis get list() { 4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return this.list_; 4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis set list(list) { 4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.list_ = list; 4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.updateChildren_(); 4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis get listProperty() { 5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return this.listProperty_; 5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis set listProperty(listProperty) { 5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.listProperty_ = listProperty; 5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.updateChildren_(); 5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis get view() { 5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return this.view_; 6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis set view(view) { 6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.view_ = view; 6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.updateChildren_(); 6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis get viewProperty() { 6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return this.viewProperty_; 6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis set viewProperty(viewProperty) { 7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.viewProperty_ = viewProperty; 7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.updateChildren_(); 7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis updateChildren_: function() { 7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var complete = this.list_ && 7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.listProperty_ && 7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.view_ && 8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.viewProperty_; 8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (!complete) { 8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.replaceChild(this.placeholder_, 8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.children[1]); 8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return; 8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis for (var i = 0; i < this.list_.length; i++) { 8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var itemEl; 8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (i >= this.listView_.children.length) { 9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis itemEl = document.createElement('div'); 9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.listView_.appendChild(itemEl); 9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else { 9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis itemEl = this.listView_.children[i]; 9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis itemEl.item = this.list_[i]; 9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var getter = this.list_[i].__lookupGetter__(this.listProperty_); 9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (getter) 9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis itemEl.textContent = getter.call(this.list_[i]); 9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis else 10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis itemEl.textContent = this.list_[i][this.listProperty_]; 10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (this.children[1] == this.placeholder_) { 10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.replaceChild(this.view_, 10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.children[1]); 10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (this.listView_.children.length && 10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis !this.listView_.selectedElement) 10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.listView_.selectedElement = this.listView_.children[0]; 11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis onSelectionChanged_: function(e) { 11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var setter = this.view_.__lookupSetter__(this.viewProperty_); 11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (!setter) { 11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var prop = this.viewProperty_; 11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis setter = function(value) { this[prop] = value; } 11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (this.listView_.selectedElement) { 11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis setter.call(this.view_, 12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.listView_.selectedElement.item); 12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else { 12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis setter.call(this.view_, 12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis undefined); 12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return { 12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ListAndAssociatedView: ListAndAssociatedView 13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis}); 132