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