You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cacert-testmgr/external/ZendFramework-1.9.5/externals/dojo/dijit/_tree/dndSelector.js

221 lines
5.7 KiB
JavaScript

dojo.provide("dijit._tree.dndSelector");
dojo.require("dojo.dnd.common");
dojo.require("dijit._tree.dndContainer");
dojo.declare("dijit._tree.dndSelector",
dijit._tree.dndContainer,
{
// summary:
// This is a base class for `dijit._tree.dndSource` , and isn't meant to be used directly.
// It's based on `dojo.dnd.Selector`.
// tags:
// protected
constructor: function(tree, params){
// summary:
// Initialization
// tags:
// private
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")
);
},
// singular: [readonly] Boolean
// Apparently this is indicates whether a single or multiple elements are
// selected, but AFAIK Tree doesn't support multiple selection, so it doesn't
// do anything. (There is, however, a bunch of dead code that would only run
// if singular == true)
singular: false, // is singular property
// methods
getSelectedItems: function(){
// summary:
// Returns selected items, for which there is only one for Tree?
// tags:
// private
// TODO: apparently no one is calling this; get rid of it?
var selectedItems = [];
for (var i in this.selection){
selectedItems.push(dijit.getEnclosingWidget(this.selection[i]).item);
}
return selectedItems;
},
getSelectedNodes: function(){
// summary:
// Returns the set of selected nodes.
// Used by dndSource on the start of a drag.
// tags:
// protected
return this.selection;
},
selectNone: function(){
// summary:
// Unselects all items
// tags:
// private
return this._removeSelection()._removeAnchor(); // self
},
insertItems: function(item, parent){
// summary:
// Inserts new data items (see Container's insertNodes method for details).
// Apparently an unused method.
// tags:
// private
// TODO: this isn't used anywhere, delete it
//we actually need to add things to the store here instead of adding nodes directly to the tree
},
destroy: function(){
// summary:
// Prepares the object to be garbage-collected
dijit._tree.dndSelector.superclass.destroy.call(this);
this.selection = this.anchor = null;
},
// mouse events
onMouseDown: function(e){
// summary:
// Event processor for onmousedown
// e: Event
// mouse event
// tags:
// protected
if(!this.current){ return; }
if(e.button == 2){ return; } // ignore right-click
var item = dijit.getEnclosingWidget(this.current).item;
var id = this.tree.model.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{
// TODO: item and id are already declared and set above, remove these lines?
var item = dijit.getEnclosingWidget(this.current).item;
var id = this.tree.model.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);
},
onMouseUp: function(e){
// summary:
// Event processor for onmouseup
// e: Event
// mouse event
// tags:
// protected
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
// tags:
// private
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(){
// summary:
// Removes the Anchor CSS class from a node.
// According to `dojo.dnd.Selector`, anchor means that
// "an item is selected, and is an anchor for a 'shift' selection".
// It's not relevant for Tree at this point, since we don't support multiple selection.
// tags:
// private
if(this.anchor){
this._removeItemClass(this.anchor, "Anchor");
this.anchor = null;
}
return this; // self
}
});