12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js">/*
- * This is a derivative of the similarly named class in the YUI Library.
- * The original license:
- * Copyright (c) 2006, Yahoo! Inc. All rights reserved.
- * Code licensed under the BSD License:
- * http://developer.yahoo.net/yui/license.txt
- */
- <span id='Ext-dd-DragDrop'>/**
- </span> * Defines the interface and base operation of items that that can be
- * dragged or can be drop targets. It was designed to be extended, overriding
- * the event handlers for startDrag, onDrag, onDragOver and onDragOut.
- * Up to three html elements can be associated with a DragDrop instance:
- *
- * - linked element: the element that is passed into the constructor.
- * This is the element which defines the boundaries for interaction with
- * other DragDrop objects.
- *
- * - handle element(s): The drag operation only occurs if the element that
- * was clicked matches a handle element. By default this is the linked
- * element, but there are times that you will want only a portion of the
- * linked element to initiate the drag operation, and the setHandleElId()
- * method provides a way to define this.
- *
- * - drag element: this represents the element that would be moved along
- * with the cursor during a drag operation. By default, this is the linked
- * element itself as in {@link Ext.dd.DD}. setDragElId() lets you define
- * a separate element that would be moved, as in {@link Ext.dd.DDProxy}.
- *
- * This class should not be instantiated until the onload event to ensure that
- * the associated elements are available.
- * The following would define a DragDrop obj that would interact with any
- * other DragDrop obj in the "group1" group:
- *
- * dd = new Ext.dd.DragDrop("div1", "group1");
- *
- * Since none of the event handlers have been implemented, nothing would
- * actually happen if you were to run the code above. Normally you would
- * override this class or one of the default implementations, but you can
- * also override the methods you want on an instance of the class...
- *
- * dd.onDragDrop = function(e, id) {
- * alert("dd was dropped on " + id);
- * }
- *
- */
- Ext.define('Ext.dd.DragDrop', {
- requires: ['Ext.dd.DragDropManager'],
- <span id='Ext-dd-DragDrop-method-constructor'> /**
- </span> * Creates new DragDrop.
- * @param {String} id of the element that is linked to this instance
- * @param {String} sGroup the group of related DragDrop objects
- * @param {Object} config an object containing configurable attributes.
- * Valid properties for DragDrop:
- *
- * - padding
- * - isTarget
- * - maintainOffset
- * - primaryButtonOnly
- */
- constructor: function(id, sGroup, config) {
- if(id) {
- this.init(id, sGroup, config);
- }
- },
- <span id='Ext-dd-DragDrop-property-ignoreSelf'> /**
- </span> * @property {Boolean} ignoreSelf
- * Set to false to enable a DragDrop object to fire drag events while dragging
- * over its own Element. Defaults to true - DragDrop objects do not by default
- * fire drag events to themselves.
- */
- <span id='Ext-dd-DragDrop-property-id'> /**
- </span> * @property {String} id
- * The id of the element associated with this object. This is what we
- * refer to as the "linked element" because the size and position of
- * this element is used to determine when the drag and drop objects have
- * interacted.
- */
- id: null,
- <span id='Ext-dd-DragDrop-property-config'> /**
- </span> * @property {Object} config
- * Configuration attributes passed into the constructor
- */
- config: null,
- <span id='Ext-dd-DragDrop-property-dragElId'> /**
- </span> * @property {String} dragElId
- * The id of the element that will be dragged. By default this is same
- * as the linked element, but could be changed to another element. Ex:
- * Ext.dd.DDProxy
- * @private
- */
- dragElId: null,
- <span id='Ext-dd-DragDrop-property-handleElId'> /**
- </span> * @property {String} handleElId
- * The ID of the element that initiates the drag operation. By default
- * this is the linked element, but could be changed to be a child of this
- * element. This lets us do things like only starting the drag when the
- * header element within the linked html element is clicked.
- * @private
- */
- handleElId: null,
- <span id='Ext-dd-DragDrop-property-invalidHandleTypes'> /**
- </span> * @property {Object} invalidHandleTypes
- * An object who's property names identify HTML tags to be considered invalid as drag handles.
- * A non-null property value identifies the tag as invalid. Defaults to the
- * following value which prevents drag operations from being initiated by `<a>` elements:
- *
- * {
- * A: "A"
- * }
- */
- invalidHandleTypes: null,
- <span id='Ext-dd-DragDrop-property-invalidHandleIds'> /**
- </span> * @property {Object} invalidHandleIds
- * An object who's property names identify the IDs of elements to be considered invalid as drag handles.
- * A non-null property value identifies the ID as invalid. For example, to prevent
- * dragging from being initiated on element ID "foo", use:
- *
- * {
- * foo: true
- * }
- */
- invalidHandleIds: null,
- <span id='Ext-dd-DragDrop-property-invalidHandleClasses'> /**
- </span> * @property {String[]} invalidHandleClasses
- * An Array of CSS class names for elements to be considered in valid as drag handles.
- */
- invalidHandleClasses: null,
- <span id='Ext-dd-DragDrop-property-startPageX'> /**
- </span> * @property {Number} startPageX
- * The linked element's absolute X position at the time the drag was
- * started
- * @private
- */
- startPageX: 0,
- <span id='Ext-dd-DragDrop-property-startPageY'> /**
- </span> * @property {Number} startPageY
- * The linked element's absolute X position at the time the drag was
- * started
- * @private
- */
- startPageY: 0,
- <span id='Ext-dd-DragDrop-property-groups'> /**
- </span> * @property {Object} groups
- * The group defines a logical collection of DragDrop objects that are
- * related. Instances only get events when interacting with other
- * DragDrop object in the same group. This lets us define multiple
- * groups using a single DragDrop subclass if we want.
- *
- * An object in the format {'group1':true, 'group2':true}
- */
- groups: null,
- <span id='Ext-dd-DragDrop-property-locked'> /**
- </span> * @property {Boolean} locked
- * Individual drag/drop instances can be locked. This will prevent
- * onmousedown start drag.
- * @private
- */
- locked: false,
- <span id='Ext-dd-DragDrop-method-lock'> /**
- </span> * Locks this instance
- */
- lock: function() {
- this.locked = true;
- },
- <span id='Ext-dd-DragDrop-property-moveOnly'> /**
- </span> * @property {Boolean} moveOnly
- * When set to true, other DD objects in cooperating DDGroups do not receive
- * notification events when this DD object is dragged over them.
- */
- moveOnly: false,
- <span id='Ext-dd-DragDrop-method-unlock'> /**
- </span> * Unlocks this instace
- */
- unlock: function() {
- this.locked = false;
- },
- <span id='Ext-dd-DragDrop-property-isTarget'> /**
- </span> * @property {Boolean} isTarget
- * By default, all instances can be a drop target. This can be disabled by
- * setting isTarget to false.
- */
- isTarget: true,
- <span id='Ext-dd-DragDrop-property-padding'> /**
- </span> * @property {Number[]} padding
- * The padding configured for this drag and drop object for calculating
- * the drop zone intersection with this object.
- * An array containing the 4 padding values: [top, right, bottom, left]
- */
- padding: null,
- <span id='Ext-dd-DragDrop-property-_domRef'> /**
- </span> * @property _domRef
- * Cached reference to the linked element
- * @private
- */
- _domRef: null,
- <span id='Ext-dd-DragDrop-property-__ygDragDrop'> /**
- </span> * @property __ygDragDrop
- * Internal typeof flag
- * @private
- */
- __ygDragDrop: true,
- <span id='Ext-dd-DragDrop-property-constrainX'> /**
- </span> * @property {Boolean} constrainX
- * Set to true when horizontal contraints are applied
- * @private
- */
- constrainX: false,
- <span id='Ext-dd-DragDrop-property-constrainY'> /**
- </span> * @property {Boolean} constrainY
- * Set to true when vertical contraints are applied
- * @private
- */
- constrainY: false,
- <span id='Ext-dd-DragDrop-property-minX'> /**
- </span> * @property {Number} minX
- * The left constraint
- * @private
- */
- minX: 0,
- <span id='Ext-dd-DragDrop-property-maxX'> /**
- </span> * @property {Number} maxX
- * The right constraint
- * @private
- */
- maxX: 0,
- <span id='Ext-dd-DragDrop-property-minY'> /**
- </span> * @property {Number} minY
- * The up constraint
- * @private
- */
- minY: 0,
- <span id='Ext-dd-DragDrop-property-maxY'> /**
- </span> * @property {Number} maxY
- * The down constraint
- * @private
- */
- maxY: 0,
- <span id='Ext-dd-DragDrop-property-maintainOffset'> /**
- </span> * @property {Boolean} maintainOffset
- * Maintain offsets when we resetconstraints. Set to true when you want
- * the position of the element relative to its parent to stay the same
- * when the page changes
- */
- maintainOffset: false,
- <span id='Ext-dd-DragDrop-property-xTicks'> /**
- </span> * @property {Number[]} xTicks
- * Array of pixel locations the element will snap to if we specified a
- * horizontal graduation/interval. This array is generated automatically
- * when you define a tick interval.
- */
- xTicks: null,
- <span id='Ext-dd-DragDrop-property-yTicks'> /**
- </span> * @property {Number[]} yTicks
- * Array of pixel locations the element will snap to if we specified a
- * vertical graduation/interval. This array is generated automatically
- * when you define a tick interval.
- */
- yTicks: null,
- <span id='Ext-dd-DragDrop-property-primaryButtonOnly'> /**
- </span> * @property {Boolean} primaryButtonOnly
- * By default the drag and drop instance will only respond to the primary
- * button click (left button for a right-handed mouse). Set to true to
- * allow drag and drop to start with any mouse click that is propogated
- * by the browser
- */
- primaryButtonOnly: true,
- <span id='Ext-dd-DragDrop-property-available'> /**
- </span> * @property {Boolean} available
- * The available property is false until the linked dom element is accessible.
- */
- available: false,
- <span id='Ext-dd-DragDrop-property-hasOuterHandles'> /**
- </span> * @property {Boolean} hasOuterHandles
- * By default, drags can only be initiated if the mousedown occurs in the
- * region the linked element is. This is done in part to work around a
- * bug in some browsers that mis-report the mousedown if the previous
- * mouseup happened outside of the window. This property is set to true
- * if outer handles are defined. Defaults to false.
- */
- hasOuterHandles: false,
- <span id='Ext-dd-DragDrop-method-b4StartDrag'> /**
- </span> * Code that executes immediately before the startDrag event
- * @private
- */
- b4StartDrag: function(x, y) { },
- <span id='Ext-dd-DragDrop-method-startDrag'> /**
- </span> * Abstract method called after a drag/drop object is clicked
- * and the drag or mousedown time thresholds have beeen met.
- * @param {Number} X click location
- * @param {Number} Y click location
- */
- startDrag: function(x, y) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-b4Drag'> /**
- </span> * Code that executes immediately before the onDrag event
- * @private
- */
- b4Drag: function(e) { },
- <span id='Ext-dd-DragDrop-method-onDrag'> /**
- </span> * Abstract method called during the onMouseMove event while dragging an
- * object.
- * @param {Event} e the mousemove event
- */
- onDrag: function(e) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-onDragEnter'> /**
- </span> * Abstract method called when this element fist begins hovering over
- * another DragDrop obj
- * @param {Event} e the mousemove event
- * @param {String/Ext.dd.DragDrop[]} id In POINT mode, the element
- * id this is hovering over. In INTERSECT mode, an array of one or more
- * dragdrop items being hovered over.
- */
- onDragEnter: function(e, id) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-b4DragOver'> /**
- </span> * Code that executes immediately before the onDragOver event
- * @private
- */
- b4DragOver: function(e) { },
- <span id='Ext-dd-DragDrop-method-onDragOver'> /**
- </span> * Abstract method called when this element is hovering over another
- * DragDrop obj
- * @param {Event} e the mousemove event
- * @param {String/Ext.dd.DragDrop[]} id In POINT mode, the element
- * id this is hovering over. In INTERSECT mode, an array of dd items
- * being hovered over.
- */
- onDragOver: function(e, id) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-b4DragOut'> /**
- </span> * Code that executes immediately before the onDragOut event
- * @private
- */
- b4DragOut: function(e) { },
- <span id='Ext-dd-DragDrop-method-onDragOut'> /**
- </span> * Abstract method called when we are no longer hovering over an element
- * @param {Event} e the mousemove event
- * @param {String/Ext.dd.DragDrop[]} id In POINT mode, the element
- * id this was hovering over. In INTERSECT mode, an array of dd items
- * that the mouse is no longer over.
- */
- onDragOut: function(e, id) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-b4DragDrop'> /**
- </span> * Code that executes immediately before the onDragDrop event
- * @private
- */
- b4DragDrop: function(e) { },
- <span id='Ext-dd-DragDrop-method-onDragDrop'> /**
- </span> * Abstract method called when this item is dropped on another DragDrop
- * obj
- * @param {Event} e the mouseup event
- * @param {String/Ext.dd.DragDrop[]} id In POINT mode, the element
- * id this was dropped on. In INTERSECT mode, an array of dd items this
- * was dropped on.
- */
- onDragDrop: function(e, id) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-onInvalidDrop'> /**
- </span> * Abstract method called when this item is dropped on an area with no
- * drop target
- * @param {Event} e the mouseup event
- */
- onInvalidDrop: function(e) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-b4EndDrag'> /**
- </span> * Code that executes immediately before the endDrag event
- * @private
- */
- b4EndDrag: function(e) { },
- <span id='Ext-dd-DragDrop-method-endDrag'> /**
- </span> * Called when we are done dragging the object
- * @param {Event} e the mouseup event
- */
- endDrag: function(e) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-b4MouseDown'> /**
- </span> * Code executed immediately before the onMouseDown event
- * @param {Event} e the mousedown event
- * @private
- */
- b4MouseDown: function(e) { },
- <span id='Ext-dd-DragDrop-method-onMouseDown'> /**
- </span> * Called when a drag/drop obj gets a mousedown
- * @param {Event} e the mousedown event
- */
- onMouseDown: function(e) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-onMouseUp'> /**
- </span> * Called when a drag/drop obj gets a mouseup
- * @param {Event} e the mouseup event
- */
- onMouseUp: function(e) { /* override this */ },
- <span id='Ext-dd-DragDrop-method-onAvailable'> /**
- </span> * Override the onAvailable method to do what is needed after the initial
- * position was determined.
- */
- onAvailable: function () {
- },
- <span id='Ext-dd-DragDrop-property-defaultPadding'> /**
- </span> * @property {Object} defaultPadding
- * Provides default constraint padding to "constrainTo" elements.
- */
- defaultPadding: {
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- },
- <span id='Ext-dd-DragDrop-method-constrainTo'> /**
- </span> * Initializes the drag drop object's constraints to restrict movement to a certain element.
- *
- * Usage:
- *
- * var dd = new Ext.dd.DDProxy("dragDiv1", "proxytest",
- * { dragElId: "existingProxyDiv" });
- * dd.startDrag = function(){
- * this.constrainTo("parent-id");
- * };
- *
- * Or you can initalize it using the {@link Ext.Element} object:
- *
- * Ext.get("dragDiv1").initDDProxy("proxytest", {dragElId: "existingProxyDiv"}, {
- * startDrag : function(){
- * this.constrainTo("parent-id");
- * }
- * });
- *
- * @param {String/HTMLElement/Ext.Element} constrainTo The element or element ID to constrain to.
- * @param {Object/Number} pad (optional) Pad provides a way to specify "padding" of the constraints,
- * and can be either a number for symmetrical padding (4 would be equal to `{left:4, right:4, top:4, bottom:4}`) or
- * an object containing the sides to pad. For example: `{right:10, bottom:10}`
- * @param {Boolean} inContent (optional) Constrain the draggable in the content box of the element (inside padding and borders)
- */
- constrainTo : function(constrainTo, pad, inContent){
- if(Ext.isNumber(pad)){
- pad = {left: pad, right:pad, top:pad, bottom:pad};
- }
- pad = pad || this.defaultPadding;
- var b = Ext.get(this.getEl()).getBox(),
- ce = Ext.get(constrainTo),
- s = ce.getScroll(),
- c,
- cd = ce.dom,
- xy,
- topSpace,
- leftSpace;
- if(cd == document.body){
- c = { x: s.left, y: s.top, width: Ext.Element.getViewWidth(), height: Ext.Element.getViewHeight()};
- }else{
- xy = ce.getXY();
- c = {x : xy[0], y: xy[1], width: cd.clientWidth, height: cd.clientHeight};
- }
- topSpace = b.y - c.y;
- leftSpace = b.x - c.x;
- this.resetConstraints();
- this.setXConstraint(leftSpace - (pad.left||0), // left
- c.width - leftSpace - b.width - (pad.right||0), //right
- this.xTickSize
- );
- this.setYConstraint(topSpace - (pad.top||0), //top
- c.height - topSpace - b.height - (pad.bottom||0), //bottom
- this.yTickSize
- );
- },
- <span id='Ext-dd-DragDrop-method-getEl'> /**
- </span> * Returns a reference to the linked element
- * @return {HTMLElement} the html element
- */
- getEl: function() {
- if (!this._domRef) {
- this._domRef = Ext.getDom(this.id);
- }
- return this._domRef;
- },
- <span id='Ext-dd-DragDrop-method-getDragEl'> /**
- </span> * Returns a reference to the actual element to drag. By default this is
- * the same as the html element, but it can be assigned to another
- * element. An example of this can be found in Ext.dd.DDProxy
- * @return {HTMLElement} the html element
- */
- getDragEl: function() {
- return Ext.getDom(this.dragElId);
- },
- <span id='Ext-dd-DragDrop-method-init'> /**
- </span> * Sets up the DragDrop object. Must be called in the constructor of any
- * Ext.dd.DragDrop subclass
- * @param {String} id the id of the linked element
- * @param {String} sGroup the group of related items
- * @param {Object} config configuration attributes
- */
- init: function(id, sGroup, config) {
- this.initTarget(id, sGroup, config);
- Ext.EventManager.on(this.id, "mousedown", this.handleMouseDown, this);
- // Ext.EventManager.on(this.id, "selectstart", Event.preventDefault);
- },
- <span id='Ext-dd-DragDrop-method-initTarget'> /**
- </span> * Initializes Targeting functionality only... the object does not
- * get a mousedown handler.
- * @param {String} id the id of the linked element
- * @param {String} sGroup the group of related items
- * @param {Object} config configuration attributes
- */
- initTarget: function(id, sGroup, config) {
- // configuration attributes
- this.config = config || {};
- // create a local reference to the drag and drop manager
- this.DDMInstance = Ext.dd.DragDropManager;
- // initialize the groups array
- this.groups = {};
- // assume that we have an element reference instead of an id if the
- // parameter is not a string
- if (typeof id !== "string") {
- id = Ext.id(id);
- }
- // set the id
- this.id = id;
- // add to an interaction group
- this.addToGroup((sGroup) ? sGroup : "default");
- // We don't want to register this as the handle with the manager
- // so we just set the id rather than calling the setter.
- this.handleElId = id;
- // the linked element is the element that gets dragged by default
- this.setDragElId(id);
- // by default, clicked anchors will not start drag operations.
- this.invalidHandleTypes = { A: "A" };
- this.invalidHandleIds = {};
- this.invalidHandleClasses = [];
- this.applyConfig();
- this.handleOnAvailable();
- },
- <span id='Ext-dd-DragDrop-method-applyConfig'> /**
- </span> * Applies the configuration parameters that were passed into the constructor.
- * This is supposed to happen at each level through the inheritance chain. So
- * a DDProxy implentation will execute apply config on DDProxy, DD, and
- * DragDrop in order to get all of the parameters that are available in
- * each object.
- */
- applyConfig: function() {
- // configurable properties:
- // padding, isTarget, maintainOffset, primaryButtonOnly
- this.padding = this.config.padding || [0, 0, 0, 0];
- this.isTarget = (this.config.isTarget !== false);
- this.maintainOffset = (this.config.maintainOffset);
- this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);
- },
- <span id='Ext-dd-DragDrop-method-handleOnAvailable'> /**
- </span> * Executed when the linked element is available
- * @private
- */
- handleOnAvailable: function() {
- this.available = true;
- this.resetConstraints();
- this.onAvailable();
- },
- <span id='Ext-dd-DragDrop-method-setPadding'> /**
- </span> * Configures the padding for the target zone in px. Effectively expands
- * (or reduces) the virtual object size for targeting calculations.
- * Supports css-style shorthand; if only one parameter is passed, all sides
- * will have that padding, and if only two are passed, the top and bottom
- * will have the first param, the left and right the second.
- * @param {Number} iTop Top pad
- * @param {Number} iRight Right pad
- * @param {Number} iBot Bot pad
- * @param {Number} iLeft Left pad
- */
- setPadding: function(iTop, iRight, iBot, iLeft) {
- // this.padding = [iLeft, iRight, iTop, iBot];
- if (!iRight && 0 !== iRight) {
- this.padding = [iTop, iTop, iTop, iTop];
- } else if (!iBot && 0 !== iBot) {
- this.padding = [iTop, iRight, iTop, iRight];
- } else {
- this.padding = [iTop, iRight, iBot, iLeft];
- }
- },
- <span id='Ext-dd-DragDrop-method-setInitPosition'> /**
- </span> * Stores the initial placement of the linked element.
- * @param {Number} diffX the X offset, default 0
- * @param {Number} diffY the Y offset, default 0
- */
- setInitPosition: function(diffX, diffY) {
- var el = this.getEl(),
- dx, dy, p;
- if (!this.DDMInstance.verifyEl(el)) {
- return;
- }
- dx = diffX || 0;
- dy = diffY || 0;
- p = Ext.Element.getXY( el );
- this.initPageX = p[0] - dx;
- this.initPageY = p[1] - dy;
- this.lastPageX = p[0];
- this.lastPageY = p[1];
- this.setStartPosition(p);
- },
- <span id='Ext-dd-DragDrop-method-setStartPosition'> /**
- </span> * Sets the start position of the element. This is set when the obj
- * is initialized, the reset when a drag is started.
- * @param pos current position (from previous lookup)
- * @private
- */
- setStartPosition: function(pos) {
- var p = pos || Ext.Element.getXY( this.getEl() );
- this.deltaSetXY = null;
- this.startPageX = p[0];
- this.startPageY = p[1];
- },
- <span id='Ext-dd-DragDrop-method-addToGroup'> /**
- </span> * Adds this instance to a group of related drag/drop objects. All
- * instances belong to at least one group, and can belong to as many
- * groups as needed.
- * @param {String} sGroup the name of the group
- */
- addToGroup: function(sGroup) {
- this.groups[sGroup] = true;
- this.DDMInstance.regDragDrop(this, sGroup);
- },
- <span id='Ext-dd-DragDrop-method-removeFromGroup'> /**
- </span> * Removes this instance from the supplied interaction group
- * @param {String} sGroup The group to drop
- */
- removeFromGroup: function(sGroup) {
- if (this.groups[sGroup]) {
- delete this.groups[sGroup];
- }
- this.DDMInstance.removeDDFromGroup(this, sGroup);
- },
- <span id='Ext-dd-DragDrop-method-setDragElId'> /**
- </span> * Allows you to specify that an element other than the linked element
- * will be moved with the cursor during a drag
- * @param {String} id the id of the element that will be used to initiate the drag
- */
- setDragElId: function(id) {
- this.dragElId = id;
- },
- <span id='Ext-dd-DragDrop-method-setHandleElId'> /**
- </span> * Allows you to specify a child of the linked element that should be
- * used to initiate the drag operation. An example of this would be if
- * you have a content div with text and links. Clicking anywhere in the
- * content area would normally start the drag operation. Use this method
- * to specify that an element inside of the content div is the element
- * that starts the drag operation.
- * @param {String} id the id of the element that will be used to
- * initiate the drag.
- */
- setHandleElId: function(id) {
- if (typeof id !== "string") {
- id = Ext.id(id);
- }
- this.handleElId = id;
- this.DDMInstance.regHandle(this.id, id);
- },
- <span id='Ext-dd-DragDrop-method-setOuterHandleElId'> /**
- </span> * Allows you to set an element outside of the linked element as a drag
- * handle
- * @param {String} id the id of the element that will be used to initiate the drag
- */
- setOuterHandleElId: function(id) {
- if (typeof id !== "string") {
- id = Ext.id(id);
- }
- Ext.EventManager.on(id, "mousedown", this.handleMouseDown, this);
- this.setHandleElId(id);
- this.hasOuterHandles = true;
- },
- <span id='Ext-dd-DragDrop-method-unreg'> /**
- </span> * Removes all drag and drop hooks for this element
- */
- unreg: function() {
- Ext.EventManager.un(this.id, "mousedown", this.handleMouseDown, this);
- this._domRef = null;
- this.DDMInstance._remove(this);
- },
- destroy : function(){
- this.unreg();
- },
- <span id='Ext-dd-DragDrop-method-isLocked'> /**
- </span> * Returns true if this instance is locked, or the drag drop mgr is locked
- * (meaning that all drag/drop is disabled on the page.)
- * @return {Boolean} true if this obj or all drag/drop is locked, else
- * false
- */
- isLocked: function() {
- return (this.DDMInstance.isLocked() || this.locked);
- },
- <span id='Ext-dd-DragDrop-method-handleMouseDown'> /**
- </span> * Called when this object is clicked
- * @param {Event} e
- * @param {Ext.dd.DragDrop} oDD the clicked dd object (this dd obj)
- * @private
- */
- handleMouseDown: function(e, oDD){
- if (this.primaryButtonOnly && e.button != 0) {
- return;
- }
- if (this.isLocked()) {
- return;
- }
- this.DDMInstance.refreshCache(this.groups);
- if (this.hasOuterHandles || this.DDMInstance.isOverTarget(e.getPoint(), this) ) {
- if (this.clickValidator(e)) {
- // set the initial element position
- this.setStartPosition();
- this.b4MouseDown(e);
- this.onMouseDown(e);
- this.DDMInstance.handleMouseDown(e, this);
- this.DDMInstance.stopEvent(e);
- }
- }
- },
- clickValidator: function(e) {
- var target = e.getTarget();
- return ( this.isValidHandleChild(target) &&
- (this.id == this.handleElId ||
- this.DDMInstance.handleWasClicked(target, this.id)) );
- },
- <span id='Ext-dd-DragDrop-method-addInvalidHandleType'> /**
- </span> * Allows you to specify a tag name that should not start a drag operation
- * when clicked. This is designed to facilitate embedding links within a
- * drag handle that do something other than start the drag.
- * @method addInvalidHandleType
- * @param {String} tagName the type of element to exclude
- */
- addInvalidHandleType: function(tagName) {
- var type = tagName.toUpperCase();
- this.invalidHandleTypes[type] = type;
- },
- <span id='Ext-dd-DragDrop-method-addInvalidHandleId'> /**
- </span> * Lets you to specify an element id for a child of a drag handle
- * that should not initiate a drag
- * @method addInvalidHandleId
- * @param {String} id the element id of the element you wish to ignore
- */
- addInvalidHandleId: function(id) {
- if (typeof id !== "string") {
- id = Ext.id(id);
- }
- this.invalidHandleIds[id] = id;
- },
- <span id='Ext-dd-DragDrop-method-addInvalidHandleClass'> /**
- </span> * Lets you specify a css class of elements that will not initiate a drag
- * @param {String} cssClass the class of the elements you wish to ignore
- */
- addInvalidHandleClass: function(cssClass) {
- this.invalidHandleClasses.push(cssClass);
- },
- <span id='Ext-dd-DragDrop-method-removeInvalidHandleType'> /**
- </span> * Unsets an excluded tag name set by addInvalidHandleType
- * @param {String} tagName the type of element to unexclude
- */
- removeInvalidHandleType: function(tagName) {
- var type = tagName.toUpperCase();
- // this.invalidHandleTypes[type] = null;
- delete this.invalidHandleTypes[type];
- },
- <span id='Ext-dd-DragDrop-method-removeInvalidHandleId'> /**
- </span> * Unsets an invalid handle id
- * @param {String} id the id of the element to re-enable
- */
- removeInvalidHandleId: function(id) {
- if (typeof id !== "string") {
- id = Ext.id(id);
- }
- delete this.invalidHandleIds[id];
- },
- <span id='Ext-dd-DragDrop-method-removeInvalidHandleClass'> /**
- </span> * Unsets an invalid css class
- * @param {String} cssClass the class of the element(s) you wish to
- * re-enable
- */
- removeInvalidHandleClass: function(cssClass) {
- for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
- if (this.invalidHandleClasses[i] == cssClass) {
- delete this.invalidHandleClasses[i];
- }
- }
- },
- <span id='Ext-dd-DragDrop-method-isValidHandleChild'> /**
- </span> * Checks the tag exclusion list to see if this click should be ignored
- * @param {HTMLElement} node the HTMLElement to evaluate
- * @return {Boolean} true if this is a valid tag type, false if not
- */
- isValidHandleChild: function(node) {
- var valid = true,
- nodeName,
- i, len;
- // var n = (node.nodeName == "#text") ? node.parentNode : node;
- try {
- nodeName = node.nodeName.toUpperCase();
- } catch(e) {
- nodeName = node.nodeName;
- }
- valid = valid && !this.invalidHandleTypes[nodeName];
- valid = valid && !this.invalidHandleIds[node.id];
- for (i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
- valid = !Ext.fly(node).hasCls(this.invalidHandleClasses[i]);
- }
- return valid;
- },
- <span id='Ext-dd-DragDrop-method-setXTicks'> /**
- </span> * Creates the array of horizontal tick marks if an interval was specified
- * in setXConstraint().
- * @private
- */
- setXTicks: function(iStartX, iTickSize) {
- this.xTicks = [];
- this.xTickSize = iTickSize;
- var tickMap = {},
- i;
- for (i = this.initPageX; i >= this.minX; i = i - iTickSize) {
- if (!tickMap[i]) {
- this.xTicks[this.xTicks.length] = i;
- tickMap[i] = true;
- }
- }
- for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
- if (!tickMap[i]) {
- this.xTicks[this.xTicks.length] = i;
- tickMap[i] = true;
- }
- }
- Ext.Array.sort(this.xTicks, this.DDMInstance.numericSort);
- },
- <span id='Ext-dd-DragDrop-method-setYTicks'> /**
- </span> * Creates the array of vertical tick marks if an interval was specified in
- * setYConstraint().
- * @private
- */
- setYTicks: function(iStartY, iTickSize) {
- this.yTicks = [];
- this.yTickSize = iTickSize;
- var tickMap = {},
- i;
- for (i = this.initPageY; i >= this.minY; i = i - iTickSize) {
- if (!tickMap[i]) {
- this.yTicks[this.yTicks.length] = i;
- tickMap[i] = true;
- }
- }
- for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
- if (!tickMap[i]) {
- this.yTicks[this.yTicks.length] = i;
- tickMap[i] = true;
- }
- }
- Ext.Array.sort(this.yTicks, this.DDMInstance.numericSort);
- },
- <span id='Ext-dd-DragDrop-method-setXConstraint'> /**
- </span> * By default, the element can be dragged any place on the screen. Use
- * this method to limit the horizontal travel of the element. Pass in
- * 0,0 for the parameters if you want to lock the drag to the y axis.
- * @param {Number} iLeft the number of pixels the element can move to the left
- * @param {Number} iRight the number of pixels the element can move to the
- * right
- * @param {Number} iTickSize (optional) parameter for specifying that the
- * element should move iTickSize pixels at a time.
- */
- setXConstraint: function(iLeft, iRight, iTickSize) {
- this.leftConstraint = iLeft;
- this.rightConstraint = iRight;
- this.minX = this.initPageX - iLeft;
- this.maxX = this.initPageX + iRight;
- if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
- this.constrainX = true;
- },
- <span id='Ext-dd-DragDrop-method-clearConstraints'> /**
- </span> * Clears any constraints applied to this instance. Also clears ticks
- * since they can't exist independent of a constraint at this time.
- */
- clearConstraints: function() {
- this.constrainX = false;
- this.constrainY = false;
- this.clearTicks();
- },
- <span id='Ext-dd-DragDrop-method-clearTicks'> /**
- </span> * Clears any tick interval defined for this instance
- */
- clearTicks: function() {
- this.xTicks = null;
- this.yTicks = null;
- this.xTickSize = 0;
- this.yTickSize = 0;
- },
- <span id='Ext-dd-DragDrop-method-setYConstraint'> /**
- </span> * By default, the element can be dragged any place on the screen. Set
- * this to limit the vertical travel of the element. Pass in 0,0 for the
- * parameters if you want to lock the drag to the x axis.
- * @param {Number} iUp the number of pixels the element can move up
- * @param {Number} iDown the number of pixels the element can move down
- * @param {Number} iTickSize (optional) parameter for specifying that the
- * element should move iTickSize pixels at a time.
- */
- setYConstraint: function(iUp, iDown, iTickSize) {
- this.topConstraint = iUp;
- this.bottomConstraint = iDown;
- this.minY = this.initPageY - iUp;
- this.maxY = this.initPageY + iDown;
- if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
- this.constrainY = true;
- },
- <span id='Ext-dd-DragDrop-method-resetConstraints'> /**
- </span> * Must be called if you manually reposition a dd element.
- * @param {Boolean} maintainOffset
- */
- resetConstraints: function() {
- // Maintain offsets if necessary
- if (this.initPageX || this.initPageX === 0) {
- // figure out how much this thing has moved
- var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0,
- dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
- this.setInitPosition(dx, dy);
- // This is the first time we have detected the element's position
- } else {
- this.setInitPosition();
- }
- if (this.constrainX) {
- this.setXConstraint( this.leftConstraint,
- this.rightConstraint,
- this.xTickSize );
- }
- if (this.constrainY) {
- this.setYConstraint( this.topConstraint,
- this.bottomConstraint,
- this.yTickSize );
- }
- },
- <span id='Ext-dd-DragDrop-method-getTick'> /**
- </span> * Normally the drag element is moved pixel by pixel, but we can specify
- * that it move a number of pixels at a time. This method resolves the
- * location when we have it set up like this.
- * @param {Number} val where we want to place the object
- * @param {Number[]} tickArray sorted array of valid points
- * @return {Number} the closest tick
- * @private
- */
- getTick: function(val, tickArray) {
- if (!tickArray) {
- // If tick interval is not defined, it is effectively 1 pixel,
- // so we return the value passed to us.
- return val;
- } else if (tickArray[0] >= val) {
- // The value is lower than the first tick, so we return the first
- // tick.
- return tickArray[0];
- } else {
- var i, len, next, diff1, diff2;
- for (i=0, len=tickArray.length; i<len; ++i) {
- next = i + 1;
- if (tickArray[next] && tickArray[next] >= val) {
- diff1 = val - tickArray[i];
- diff2 = tickArray[next] - val;
- return (diff2 > diff1) ? tickArray[i] : tickArray[next];
- }
- }
- // The value is larger than the last tick, so we return the last
- // tick.
- return tickArray[tickArray.length - 1];
- }
- },
- <span id='Ext-dd-DragDrop-method-toString'> /**
- </span> * toString method
- * @return {String} string representation of the dd obj
- */
- toString: function() {
- return ("DragDrop " + this.id);
- }
- });
- </pre>
- </body>
- </html>
|