Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

if(!dojo._hasResource["dijit._tree.dndSelector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dijit._tree.dndSelector"] = true;
dojo.provide("dijit._tree.dndSelector");
dojo.require("dojo.dnd.common");
dojo.require("dijit._tree.dndContainer");

dojo.declare("dijit._tree.dndSelector",
        dijit._tree.dndContainer,
        {
                constructor: function(tree, params){
                        this.selection={};
                        this.anchor = null;
                        this.simpleSelection=false;
                
                        this.events.push(
                                dojo.connect(this.tree.domNode, "onmousedown", this,"onMouseDown"),
                                dojo.connect(this.tree.domNode, "onmouseup", this,"onMouseUp")
                        );
                },
        
                // object attributes (for markup)
                singular: false,        // is singular property
        
                // methods
                getSelectedItems: function(){
                        var selectedItems = []
                        for (var i in this.selection){
                                selectedItems.push(dijit.getEnclosingWidget(this.selection[i]).item);
                        }
                        return selectedItems;
                },

                getSelectedNodes: function(){
                        return this.selection;
                },

                selectNone: function(){
                        // summary: unselects all items
                        return this._removeSelection()._removeAnchor(); // self
                },

                insertItems: function(item, parent){
                        // summary: inserts new data items (see Container's insertNodes method for details)
                        
                        //we actually need to add things to the store here instead of adding noes to the tree directly          
                },

                destroy: function(){
                        // summary: prepares the object to be garbage-collected
                        dojo.dnd.Selector.superclass.destroy.call(this);
                        this.selection = this.anchor = null;
                },

                // mouse events
                onMouseDown: function(e){
                        // summary: event processor for onmousedown
                        // e: Event: mouse event
                        if(!this.current){ return; }

                        var item = dijit.getEnclosingWidget(this.current).item
                        var id = this.tree.store.getIdentity(item);

                        if (!this.current.id) {
                                this.current.id=id;
                        }

                        if (!this.current.type) {
                                this.current.type="data";
                        }

                        if(!this.singular && !dojo.dnd.getCopyKeyState(e) && !e.shiftKey && (this.current.id in this.selection)){
                                this.simpleSelection = true;
                                dojo.stopEvent(e);
                                return;
                        }

                        if(this.singular){
                                if(this.anchor == this.current){
                                        if(dojo.dnd.getCopyKeyState(e)){
                                                this.selectNone();
                                        }
                                }else{
                                        this.selectNone();
                                        this.anchor = this.current;
                                        this._addItemClass(this.anchor, "Anchor");

                                        this.selection[this.current.id] = this.current;
                                }
                        }else{
                                if(!this.singular && e.shiftKey){       
                                        if (dojo.dnd.getCopyKeyState(e)){
                                                //TODO add range to selection
                                        }else{
                                                //TODO select new range from anchor 
                                        }
                                }else{
                                        if(dojo.dnd.getCopyKeyState(e)){
                                                if(this.anchor == this.current){
                                                        delete this.selection[this.anchor.id];
                                                        this._removeAnchor();
                                                }else{
                                                        if(this.current.id in this.selection){
                                                                this._removeItemClass(this.current, "Selected");
                                                                delete this.selection[this.current.id];
                                                        }else{
                                                                if(this.anchor){
                                                                        this._removeItemClass(this.anchor, "Anchor");
                                                                        this._addItemClass(this.anchor, "Selected");
                                                                }
                                                                this.anchor = this.current;
                                                                this._addItemClass(this.current, "Anchor");
                                                                this.selection[this.current.id] = this.current;
                                                        }
                                                }
                                        }else{
                                                var item = dijit.getEnclosingWidget(this.current).item
                                                var id = this.tree.store.getIdentity(item);
                                                if(!(id in this.selection)){
                                                        this.selectNone();
                                                        this.anchor = this.current;
                                                        this._addItemClass(this.current, "Anchor");
                                                        this.selection[id] = this.current;
                                                }
                                        }
                                }
                        }

                        dojo.stopEvent(e);
                },

                onMouseMove: function() {

                },

                onOverEvent: function() {
                        this.onmousemoveEvent = dojo.connect(this.node, "onmousemove", this, "onMouseMove");
                },

                onMouseUp: function(e){
                        // summary: event processor for onmouseup
                        // e: Event: mouse event
                        if(!this.simpleSelection){ return; }
                        this.simpleSelection = false;
                        this.selectNone();
                        if(this.current){
                                this.anchor = this.current;
                                this._addItemClass(this.anchor, "Anchor");
                                this.selection[this.current.id] = this.current;
                        }
                },
                _removeSelection: function(){
                        // summary: unselects all items
                        var e = dojo.dnd._empty;
                        for(var i in this.selection){
                                if(i in e){ continue; }
                                var node = dojo.byId(i);
                                if(node){ this._removeItemClass(node, "Selected"); }
                        }
                        this.selection = {};
                        return this;    // self
                },
                _removeAnchor: function(){
                        if(this.anchor){
                                this._removeItemClass(this.anchor, "Anchor");
                                this.anchor = null;
                        }
                        return this;    // self
                }
});

}