The source code

    tx.data.ListStore = Ext.extend(Ext.data.Store, {
    	constructor: function(){
    		tx.data.ListStore.superclass.constructor.call(this, {
    	        sortInfo:{field: 'listName', direction: "ASC"},
    	        reader: new Ext.data.JsonReader({
    	            id: 'listId',
    				fields: tx.data.List
    	        })
    	    });
    		this.boundTrees = {};
    	    this.conn = tx.data.conn;
    	    this.proxy = new Ext.sql.Proxy(tx.data.conn, 'list', 'listId', this);
    	},

        getName : function(id){
    		var l = this.data.map[id];
    		return l ? l.data.listName : '';
    	},

    	addList : function(name, id, isFolder, parentId){
    		var l = this.findList(name);
    		if(!l){
    			var id = id || Ext.uniqueId();
    			l = new tx.data.List({listId: id, listName: name, isFolder: isFolder === true, parentId: parentId || 'root'}, id);
    			this.add(l);
    		}
    		return l;
    	},

    	newList : function(isFolder, parentId){
    		var i = 1;
    		var text = isFolder ? 'New Folder ' : 'New List ';
    		while(this.findList(text + i)){
    			i++;
    		}
    		return this.addList(text + i, undefined, isFolder, parentId);
    	},

    	findList : function(name){
    		var d = this.data;
    		for(var i = 0, len = d.length; i < len; i++){
    			if(d.items[i].data.listName === name){
    				return d.items[i];
    			}
    		}
    		return null;
    	},

    	loadDemoLists: function(){
    		this.addList('Personal', 'personal', true, 'root');
    		this.addList('Family', 'family', false, 'personal');
    		this.addList('Bills', 'bills', false, 'personal');
    		this.addList('Fun', 'fun', false, 'personal');
    		this.addList('Other Stuff', 'personal-misc', false, 'personal');
    		this.addList('Work', 'work', true, 'root');
    		this.addList('Ext 2.x', 'ext2', false, 'work');
    		this.addList('Ext 1.x', 'ext1', false, 'work');
    		this.addList('Meetings', 'meetings', false, 'work');
    		this.addList('Miscellaneous', 'work-misc', false, 'work');
    	},

    	bindTree : function(tree){
    		this.boundTrees[tree.id] = {
    			add: function(ls, records){
    				var pnode = tree.getNodeById(records[0].data.parentId);
    				if(pnode){
    					pnode.reload();
    				}
    			},

    			remove: function(ls, record){
    				var node = tree.getNodeById(record.id);
    				if(node && node.parentNode){
    					node.parentNode.removeChild(node);
    				}
    			},

    			update: function(ls, record){
    				var node = tree.getNodeById(record.id);
    				if(node){
    					node.setText(record.data.listName);
    				}
    			}
    		};

    		this.on(this.boundTrees[tree.id]);
    	},

    	unbindTree : function(tree){
    		var h = this.boundTrees[tree.id];
    		if (h) {
    			this.un('add', h.add);
    			this.un('remove', h.remove);
    			this.un('update', h.update);
    		}
    	},

    	prepareTable : function(){
            try{
            this.createTable({
                name: 'list',
                key: 'listId',
                fields: tx.data.List.prototype.fields
            });
            }catch(e){console.log(e);}
        }
    });