    /*!
     * Ext JS Library 3.3.0
     * Copyright(c) 2006-2010 Ext JS, Inc.
     * licensing@extjs.com
     * http://www.extjs.com/license
     */
    /**
     * @class Ext.DataView.LabelEditor
     * @extends Ext.Editor
     *
     */
    Ext.DataView.LabelEditor = Ext.extend(Ext.Editor, {
        alignment: "tl-tl",
        hideEl : false,
        cls: "x-small-editor",
        shim: false,
        completeOnEnter: true,
        cancelOnEsc: true,
        labelSelector: 'span.x-editable',

        constructor: function(cfg, field){
            Ext.DataView.LabelEditor.superclass.constructor.call(this,
                field || new Ext.form.TextField({
                    allowBlank: false,
                    growMin:90,
                    growMax:240,
                    grow:true,
                    selectOnFocus:true
                }), cfg
            );
        },

        init : function(view){
            this.view = view;
            view.on('render', this.initEditor, this);
            this.on('complete', this.onSave, this);
        },

        initEditor : function(){
            this.view.on({
                scope: this,
                containerclick: this.doBlur,
                click: this.doBlur
            });
            this.view.getEl().on('mousedown', this.onMouseDown, this, {delegate: this.labelSelector});
        },

        doBlur: function(){
            if(this.editing){
                this.field.blur();
            }
        },

        onMouseDown : function(e, target){
            if(!e.ctrlKey && !e.shiftKey){
                var item = this.view.findItemFromChild(target);
                e.stopEvent();
                var record = this.view.store.getAt(this.view.indexOf(item));
                this.startEdit(target, record.data[this.dataIndex]);
                this.activeRecord = record;
            }else{
                e.preventDefault();
            }
        },

        onSave : function(ed, value){
            this.activeRecord.set(this.dataIndex, value);
        }
    });

    Ext.DataView.DragSelector = function(cfg){
        cfg = cfg || {};
        var view, proxy, tracker;
        var rs, bodyRegion, dragRegion = new Ext.lib.Region(0,0,0,0);
        var dragSafe = cfg.dragSafe === true;

        this.init = function(dataView){
            view = dataView;
            view.on('render', onRender);
        };

        function fillRegions(){
            rs = [];
            view.all.each(function(el){
                rs[rs.length] = el.getRegion();
            });
            bodyRegion = view.el.getRegion();
        }

        function cancelClick(){
            return false;
        }

        function onBeforeStart(e){
            return !dragSafe || e.target == view.el.dom;
        }

        function onStart(e){
            view.on('containerclick', cancelClick, view, {single:true});
            if(!proxy){
                proxy = view.el.createChild({cls:'x-view-selector'});
            }else{
                if(proxy.dom.parentNode !== view.el.dom){
                    view.el.dom.appendChild(proxy.dom);
                }
                proxy.setDisplayed('block');
            }
            fillRegions();
            view.clearSelections();
        }

        function onDrag(e){
            var startXY = tracker.startXY;
            var xy = tracker.getXY();

            var x = Math.min(startXY[0], xy[0]);
            var y = Math.min(startXY[1], xy[1]);
            var w = Math.abs(startXY[0] - xy[0]);
            var h = Math.abs(startXY[1] - xy[1]);

            dragRegion.left = x;
            dragRegion.top = y;
            dragRegion.right = x+w;
            dragRegion.bottom = y+h;

            dragRegion.constrainTo(bodyRegion);
            proxy.setRegion(dragRegion);

            for(var i = 0, len = rs.length; i < len; i++){
                var r = rs[i], sel = dragRegion.intersect(r);
                if(sel && !r.selected){
                    r.selected = true;
                    view.select(i, true);
                }else if(!sel && r.selected){
                    r.selected = false;
                    view.deselect(i);
                }
            }
        }

        function onEnd(e){
            if (!Ext.isIE) {
                view.un('containerclick', cancelClick, view);
            }
            if(proxy){
                proxy.setDisplayed(false);
            }
        }

        function onRender(view){
            tracker = new Ext.dd.DragTracker({
                onBeforeStart: onBeforeStart,
                onStart: onStart,
                onDrag: onDrag,
                onEnd: onEnd
            });
            tracker.initEl(view.el);
        }
    };