@qooxdoo/framework
Version:
The JS Framework for Coders
190 lines (146 loc) • 4.94 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2010 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Tristan Koch (tristankoch)
************************************************************************ */
qx.Class.define("qxl.demobrowser.demo.virtual.SettingsList",
{
extend : qx.application.Standalone,
members :
{
__data: null,
/*
*****************************************************************************
MAIN
*****************************************************************************
*/
main: function()
{
this.base(arguments);
//
// Data
//
// Items
var data = [];
var names = ["Apple", "Orange", "Potato", "Carrot"];
for (var i = 0; i < names.length; i++) {
data[i] = {
name : names[i],
checked : i < 2,
group: null
};
}
this.__data = qx.data.marshal.Json.createModel(data, true);
// Groups
var groups = []
for (var i = 0; i < 2; i++) {
groups[i] = {
name: null,
checked: false
};
}
groups = qx.data.marshal.Json.createModel(groups, true);
groups.getItem(0).setName("Fruits");
groups.getItem(1).setName("Vegetables");
// Assign group
this.__data.toArray().forEach(function(item, index) {
index = index < 2 ? 0 : 1;
item.setGroup(groups.getItem(index));
});
// Widgets
var list = new qx.ui.list.List();
list.setWidth(150);
this.getRoot().add(list, {left: 20, top: 20});
// Let the magic happen
list.setDelegate(this);
list.setModel(this.__data);
},
/*
*****************************************************************************
DELEGATE
*****************************************************************************
*/
//
// This section implements qx.ui.list.core.IListDelegate.
// Therefore, "this" is a valid delegate for qx.ui.list.List.
//
createItem : function() {
return new qx.ui.form.CheckBox();
},
configureItem : function(item) {
item.setPadding(3);
},
createGroupItem : function() {
return new qx.ui.form.CheckBox();
},
configureGroupItem : function(group) {
// Background
group.setBackgroundColor("#ddd");
// Setting value to null shows triState
group.setTriState(true);
// Sync value of items with value of group
group.addListener("changeValue", function(e) {
// Ignore change when triState was set. Avoids infinite loop.
if (group.getValue() === null) {
return;
}
var value = e.getData();
// Find model entries where group matches label,
// i.e. all entries that belong to group
this.__data.forEach(function(entry) {
if (group.getLabel() == entry.getGroup().getName()) {
entry.setChecked(value);
}
});
}, this);
},
bindItem : function(controller, item, id) {
// Bind name -> label
controller.bindProperty("name", "label", null, item, id);
// Bind checked <-> value
controller.bindProperty("checked", "value", null, item, id);
controller.bindPropertyReverse("checked", "value", null, item, id);
// Bind group.checked -> value
//
// Check group when all items that belong to group are checked
var data = this.__data;
controller.bindPropertyReverse("group.checked", "value", {
converter: function(value, model) {
var item = model.getItem(id);
var group = item.getGroup();
var itemsOfGroup = data.toArray().filter(function(item) {
return item.getGroup() == group;
});
var isAllChecked = itemsOfGroup.every(function(item) {
return item.getChecked();
});
var isOneChecked = itemsOfGroup.some(function(item) {
return item.getChecked();
});
// Set triState when one item in group is checked
if (isOneChecked) {
return isAllChecked ? true : null;
} else {
return false;
}
}
}, item, id);
},
bindGroupItem : function(controller, group, id) {
// Bind name -> label
controller.bindProperty("name", "label", null, group, id);
// Bind checked <-> value
controller.bindProperty("checked", "value", null, group, id);
controller.bindPropertyReverse("checked", "value", null, group, id);
},
group : function(model) {
return model.getGroup();
}
}
});