248 lines
6.3 KiB
JavaScript
248 lines
6.3 KiB
JavaScript
/**
|
|
*
|
|
*/
|
|
Ext.define('Ext.util.Droppable', {
|
|
mixins: {
|
|
observable: 'Ext.mixin.Observable'
|
|
},
|
|
|
|
config: {
|
|
/**
|
|
* The base CSS class to apply to this component's element.
|
|
* This will also be prepended to other elements within this component.
|
|
*/
|
|
baseCls: Ext.baseCSSPrefix + 'droppable'
|
|
},
|
|
|
|
/**
|
|
* @cfg {String} activeCls
|
|
* The CSS added to a Droppable when a Draggable in the same group is being
|
|
* dragged.
|
|
*/
|
|
activeCls: Ext.baseCSSPrefix + 'drop-active',
|
|
|
|
/**
|
|
* @cfg {String} invalidCls
|
|
* The CSS class to add to the droppable when dragging a draggable that is
|
|
* not in the same group.
|
|
*/
|
|
invalidCls: Ext.baseCSSPrefix + 'drop-invalid',
|
|
|
|
/**
|
|
* @cfg {String} hoverCls
|
|
* The CSS class to add to the droppable when hovering over a valid drop.
|
|
*/
|
|
hoverCls: Ext.baseCSSPrefix + 'drop-hover',
|
|
|
|
/**
|
|
* @cfg {String} validDropMode
|
|
* Determines when a drop is considered 'valid' whether it simply need to
|
|
* intersect the region or if it needs to be contained within the region.
|
|
* Valid values are: 'intersects' or 'contains'
|
|
*/
|
|
validDropMode: 'intersect',
|
|
|
|
/**
|
|
* @cfg {Boolean} disabled
|
|
*/
|
|
disabled: false,
|
|
|
|
/**
|
|
* @cfg {String} group
|
|
* Draggable and Droppable objects can participate in a group which are
|
|
* capable of interacting.
|
|
*/
|
|
group: 'base',
|
|
|
|
// not yet implemented
|
|
tolerance: null,
|
|
|
|
// @private
|
|
monitoring: false,
|
|
|
|
/**
|
|
* Creates new Droppable.
|
|
* @param {Mixed} el String, HtmlElement or Ext.Element representing an
|
|
* element on the page.
|
|
* @param {Object} config Configuration options for this class.
|
|
*/
|
|
constructor: function(el, config) {
|
|
var me = this;
|
|
|
|
config = config || {};
|
|
Ext.apply(me, config);
|
|
|
|
/**
|
|
* @event dropactivate
|
|
* @param {Ext.util.Droppable} this
|
|
* @param {Ext.util.Draggable} draggable
|
|
* @param {Ext.event.Event} e
|
|
*/
|
|
|
|
/**
|
|
* @event dropdeactivate
|
|
* @param {Ext.util.Droppable} this
|
|
* @param {Ext.util.Draggable} draggable
|
|
* @param {Ext.event.Event} e
|
|
*/
|
|
|
|
/**
|
|
* @event dropenter
|
|
* @param {Ext.util.Droppable} this
|
|
* @param {Ext.util.Draggable} draggable
|
|
* @param {Ext.event.Event} e
|
|
*/
|
|
|
|
/**
|
|
* @event dropleave
|
|
* @param {Ext.util.Droppable} this
|
|
* @param {Ext.util.Draggable} draggable
|
|
* @param {Ext.event.Event} e
|
|
*/
|
|
|
|
/**
|
|
* @event drop
|
|
* @param {Ext.util.Droppable} this
|
|
* @param {Ext.util.Draggable} draggable
|
|
* @param {Ext.event.Event} e
|
|
*/
|
|
|
|
me.el = Ext.get(el);
|
|
me.callParent();
|
|
|
|
me.mixins.observable.constructor.call(me);
|
|
|
|
if (!me.disabled) {
|
|
me.enable();
|
|
}
|
|
|
|
me.el.addCls(me.baseCls);
|
|
},
|
|
|
|
// @private
|
|
onDragStart: function(draggable, e) {
|
|
if (draggable.group === this.group) {
|
|
this.monitoring = true;
|
|
this.el.addCls(this.activeCls);
|
|
this.region = this.el.getPageBox(true);
|
|
|
|
draggable.on({
|
|
drag: this.onDrag,
|
|
beforedragend: this.onBeforeDragEnd,
|
|
dragend: this.onDragEnd,
|
|
scope: this
|
|
});
|
|
|
|
if (this.isDragOver(draggable)) {
|
|
this.setCanDrop(true, draggable, e);
|
|
}
|
|
|
|
this.fireEvent('dropactivate', this, draggable, e);
|
|
}
|
|
else {
|
|
draggable.on({
|
|
dragend: function() {
|
|
this.el.removeCls(this.invalidCls);
|
|
},
|
|
scope: this,
|
|
single: true
|
|
});
|
|
this.el.addCls(this.invalidCls);
|
|
}
|
|
},
|
|
|
|
// @private
|
|
isDragOver: function(draggable, region) {
|
|
return this.region[this.validDropMode](draggable.region);
|
|
},
|
|
|
|
// @private
|
|
onDrag: function(draggable, e) {
|
|
this.setCanDrop(this.isDragOver(draggable), draggable, e);
|
|
},
|
|
|
|
// @private
|
|
setCanDrop: function(canDrop, draggable, e) {
|
|
if (canDrop && !this.canDrop) {
|
|
this.canDrop = true;
|
|
this.el.addCls(this.hoverCls);
|
|
this.fireEvent('dropenter', this, draggable, e);
|
|
}
|
|
else if (!canDrop && this.canDrop) {
|
|
this.canDrop = false;
|
|
this.el.removeCls(this.hoverCls);
|
|
this.fireEvent('dropleave', this, draggable, e);
|
|
}
|
|
},
|
|
|
|
// @private
|
|
onBeforeDragEnd: function(draggable, e) {
|
|
draggable.cancelRevert = this.canDrop;
|
|
},
|
|
|
|
// @private
|
|
onDragEnd: function(draggable, e) {
|
|
this.monitoring = false;
|
|
this.el.removeCls(this.activeCls);
|
|
|
|
draggable.un({
|
|
drag: this.onDrag,
|
|
beforedragend: this.onBeforeDragEnd,
|
|
dragend: this.onDragEnd,
|
|
scope: this
|
|
});
|
|
|
|
|
|
if (this.canDrop) {
|
|
this.canDrop = false;
|
|
this.el.removeCls(this.hoverCls);
|
|
this.fireEvent('drop', this, draggable, e);
|
|
}
|
|
|
|
this.fireEvent('dropdeactivate', this, draggable, e);
|
|
},
|
|
|
|
/**
|
|
* Enable the Droppable target.
|
|
* This is invoked immediately after constructing a Droppable if the
|
|
* disabled parameter is NOT set to true.
|
|
*/
|
|
enable: function() {
|
|
if (!this.mgr) {
|
|
this.mgr = Ext.util.Observable.observe(Ext.util.Draggable);
|
|
}
|
|
this.mgr.on({
|
|
dragstart: this.onDragStart,
|
|
scope: this
|
|
});
|
|
this.disabled = false;
|
|
},
|
|
|
|
/**
|
|
* Disable the Droppable target.
|
|
*/
|
|
disable: function() {
|
|
this.mgr.un({
|
|
dragstart: this.onDragStart,
|
|
scope: this
|
|
});
|
|
this.disabled = true;
|
|
},
|
|
|
|
/**
|
|
* Method to determine whether this Component is currently disabled.
|
|
* @return {Boolean} the disabled state of this Component.
|
|
*/
|
|
isDisabled: function() {
|
|
return this.disabled;
|
|
},
|
|
|
|
/**
|
|
* Method to determine whether this Droppable is currently monitoring drag operations of Draggables.
|
|
* @return {Boolean} the monitoring state of this Droppable
|
|
*/
|
|
isMonitoring: function() {
|
|
return this.monitoring;
|
|
}
|
|
});
|