Source: control/List.js

/**
 * Created by seeker910 on 2014/8/22.
 */
Rsd.define('Rsd.control.List', {
    extend: 'Rsd.control.Component',
    requires: ['Rsd.form.Label'],
    xtype: 'list',
    ctrlTagName: 'ol',
    cls: 'x-list',
    readOnly: false,
    dataSource: [],
    /**
    * @description 键值字段名
     * */
    itemKeyMember: 'id',
    /**
     * 元素 默认类型
     */
    itemXtype: null,
    itemClick: null,
    itemDblClick: null,
    /**
     *  单击时选中
     */
    selectedOnClick: true,
    /**
     *  双击击时选中
     */
    selectedOnDblClick: true,
    /*
    * */
    itemSelectedCls: '',
    /**
    * @description  item  默认样式 ,即dom li 样式
    * */
    //itemStyle: {height: '30px', lineHeight: '30px',float:'left'},
    /**
     * dom li class
     */
    itemCls: null,
    /*
    * 启用hover样式
    * */
    itemHover: false,
    /**
     *
     * @description items 布局方式
     * */
    //layout:'hbox',
    //items:[],
    /*
     none:不使用项目符号
     disc:实心圆,默认值
     circle:空心圆
     square:实心方块
     decimal:阿拉伯数字
     lower-roman:小写罗马数字
     upper-roman:大写罗马数字
     lower-alpha:小写英文字母
     upper-alpha:大写英文字母
     */
    listType: 'none',
    /*
    * */
    label: { position: 'top', align: 'center', height: 40 },

    /*
    *
    * */
    constructor: function ListView(config) {
        config = config || {};

        this.apply(config);
    },
    /**
     * 
     */
    initComponentEx: function initComponentEx() {
        this.callParent();
        this.ctrl.element.style.listStyleType = this.listType;
        this.ctrl.element.style.margin = '0px';
        this.setElAttribute('dom', 'layout', this.layout);

    },
    /**
     *@description control控件加载数据 无回调
      @param {Array} data 数据源 
      @param {Array} callback  回调函数 
     * */
    loadData: function loadData(data, callback) {

        //this.log('loadData');
        if (this.dataSource == data) {
            //return;
        }
        this.dataSource = data || this.dataSource;

        //this.log(this.dataSource);

        if (Rsd.isArray(this.dataSource)) {
            //console.log(this.dataSource);
            this.removeAll();
            for (var i in this.dataSource) {
                var _item = this.newItem(this.dataSource[i]);
                //
                this.ctrl.element.appendChild(_item.element);
                this.items.push(_item);
            }

            Rsd.callFunction(this, callback, [this.dataSource]);

        }
        else {
            console.error('Rsd.control.List.loadData()方法的data参数必须是数组', this.dataSource);
        }

        return this;
    },
    /**
     * @description  清空列表
     *  */
    removeAll: function removeAll() {

        if (this.ctrl.element) {
            this.ctrl.element.innerHTML = "";
        }
        this.items = [];

    },
    /**
    * @param key {int|string} int type is index value,string type is key value.
    * */
    select: function select(key, scroll) {

        if (!this.ctrl.element) {
            return;
        }
        if (Rsd.isString(key)) {
            var list = Rsd.select(this.ctrl.element, '[id=' + key + ']');
            if (list.length > 0) {
                list[0].click();
            }
            return this;
        }
        if (Rsd.isNumber(key) && key < 0) {
            var list = this.ctrl.element.querySelectorAll('.' + this.itemSelectedCls);
            for (var i in list) {
                this.removeCls(list[i], this.itemSelectedCls);
            }
            return this;
        }

        if (Rsd.isNumber(key) && key < this.items.length) {
            var _index = key % this.items.length;
            this.items[_index].element.click();
            return this;
        }

        return this;
    },
    /**
     * 
     * @description 选中节点滚动到可视区
     * */
    scrollCurrentIntoView: function (key, top) {
        var dom = document.getElementById(key);
        if (dom) {
            dom.scrollIntoView(top);
        }
    },


    /**
    * @private 创建一个新的列表项 li
    * */
    newItem: function newItem(item) {

        var me = this;
        var _item = item || {};//item 是 li节点,item.content 是li内部子节点
       
        if (Rsd.isString(item)) {

            _item = {
                innerCtrl:_item
            };
        }
    
        if(!_item.innerCtrl)
        {
            _item.innerCtrl = me.createInnerControl(_item);
        } 
        
        if (Rsd.isObject(item)) {
            _item.key =  _item[me.itemKeyMember];
        }

        //li 节点
        if (!_item.element) {

            _item.element = document.createElement('li');
        }
        
        if (_item.key) {
            _item.element.setAttribute('id', _item.key);
        }
        if (me.itemStyle) {
            var sizeUnit = me.sizeUnit || 'px';
            Rsd.setElStyle(_item.element, me.itemStyle, sizeUnit);
        } 
        if (me.itemHover) {
            _item.element.classList.add('x-li-hover');
        }
        //
        
        var innerCtrl  = _item.innerCtrl;
        //me.log('innerCtrl',Rsd.getType(_item.innerCtrl));
        if(Rsd.isString(innerCtrl))
        { 
            _item.element.appendChild( document.createTextNode(innerCtrl)); 
            _item.element.style.alignSelf = 'center';
        }
        if(innerCtrl instanceof HTMLElement)
        {
            //me.log('HTMLElement');
            _item.element.appendChild(innerCtrl); 
            //_item.element.style.display = 'flex';
            _item.element.style.alignSelf = 'center';
        }
        if(innerCtrl instanceof Rsd.common.ComponentX)
        {
             //me.log('Rsd.common.ComponentX');
            _item.element.style.flex = _item.flex;
            _item.element.style.display = 'flex';

            innerCtrl.parent = me;
            innerCtrl.style.alignSelf = 'center';
            innerCtrl.renderTo(_item.element).doLayout();
            //_item.content = innerCtrl;

        }
        //
        var el = _item.element;

        el.onclick = function (e) {
            if (me.selectedOnClick) {
                if (!Rsd.isEmpty(me.itemSelectedCls)) {

                    var list = me.ctrl.element.querySelectorAll('.' + me.itemSelectedCls);
                    for (var i in list) {
                        me.removeCls(list[i], me.itemSelectedCls);
                    }

                    me.addCls(this, me.itemSelectedCls);
                }
            }

            var _click = item.click || me.itemClick;
            if (_click) {
                me.funApplyByIOC(_click, [_item, e]);
            }


        };

        el.ondblclick = function (e) {

            if (me.selectedOnDblClick) {
                if (!Rsd.isEmpty(me.itemSelectedCls)) {
                    var list = me.ctrl.element.querySelectorAll('.' + me.itemSelectedCls);
                    for (var i in list) {
                        me.removeCls(list[i], me.itemSelectedCls);
                    }

                    me.addCls(this, me.itemSelectedCls);
                }
            }

            var _dblClick = item.dblClick || me.itemDblClick;
            if (_dblClick) {
                me.funApplyByIOC(_dblClick, [_item, e]);
            }

        };

        return _item;
    },
    /**
     * 
     */
    createInnerControl:function createInnerControl(config)
    {
        //console.log(content)
        var me = this;
        //li 内部 控件
        var _config = config || 'no content';

        if (Rsd.isString(_config)) {

            var _txt = document.createTextNode(_config);
            return _txt;
        }

        if (_config instanceof HTMLElement) {

            return _config;
        }
 
        //debugger;
        if (Rsd.isObject(_config)) {

            var _xtype = _config.xtype || me.itemXtype || 'label';

            if (_config.flex) {
             
                delete _config[flex];
            }
            var ctrl = Rsd.widget(_xtype, _config);
           
            return ctrl;
        }
    }



}, function (type) {

    var _layoutGetter = function () {
        return this.__layout || 'hbox';
    };

    var _layoutSetter = function (value) {
        this.__layout = value;
    };
    this.defineProperty(type, "layout", _layoutGetter, _layoutSetter, false);


    var _itemsGetter = function () {

        this.__items = this.__items || [];
        return this.__items;
    };

    var _itemsSetter = function (value) {

        this.__items = value || [];
    };
    this.defineProperty(type, "items", _itemsGetter, _itemsSetter, true);

    var _itemStyleGetter = function () {

        if (!this.hasOwnProperty('__itemStyle')) {
            switch (this.layout) {
                case 'hbox':
                    this.__itemStyle = { "height": '30px', "lineHeight": '30px', "float": 'left' };
                    break;
                case 'vhox':
                    this.__itemStyle = { "height": '30px', "lineHeight": '30px' };
                    break;
            }

        }
        return this.__itemStyle;
    };

    var _itemStyleSetter = function (value) {

        this.__itemStyle = Rsd.apply(this.itemStyle, value || {});
    };
    this.defineProperty(type, "itemStyle", _itemStyleGetter, _itemStyleSetter, true);

});