fin-hypergrid
Version:
Canvas-based high-performance grid
781 lines (698 loc) • 31.4 kB
JavaScript
/* eslint-env browser */
'use strict';
var dispatchGridEvent = require('../lib/dispatchGridEvent');
var Button = require('../cellRenderers/Button');
/**
* @summary Grid event support.
* @desc Additions to `Hypergrid.prototype` for handling and firing events.
*
* All members are documented on the {@link Hypergrid} page.
* @mixin events.mixin
*/
exports.mixin = {
/**
* @summary Add an event listener to me.
* @desc Listeners added by this method should only be removed by {@link Hypergrid#removeEventListener|grid.removeEventListener} (or {@link Hypergrid#removeAllEventListeners|grid.removeAllEventListeners}).
* @param {string} eventName - The type of event we are interested in.
* @param {function} listener - The event handler.
* @param {boolean} [internal=false] - Used by {@link Hypergrid#addInternalEventListener|grid.addInternalEventListener} (see).
* @memberOf Hypergrid#
*/
addEventListener: function(eventName, listener, internal) {
var self = this,
listeners = this.listeners[eventName] = this.listeners[eventName] || [],
alreadyAttached = listeners.find(function(info) { return info.listener === listener; });
if (!alreadyAttached) {
var info = {
internal: internal,
listener: listener,
decorator: function(e) {
if (self.allowEventHandlers) {
listener(e);
}
}
};
listeners.push(info);
this.canvas.addEventListener(eventName, info.decorator);
}
},
/**
* @summary Add an internal event listener to me.
* @desc The new listener is flagged as "internal." Internal listeners are removed as usual by {@link Hypergrid#removeEventListener|grid.removeEventListener}. However, they are ignored by {@link Hypergrid#removeAllEventListeners|grid.removeAllEventListeners()} (as called by {@link Hypergrid#reset|reset}). (But see {@link Hypergrid#removeAllEventListeners|grid.removeAllEventListeners(true)}.)
*
* Listeners added by this method should only be removed by {@link Hypergrid#removeEventListener|grid.removeEventListener} (or {@link Hypergrid#removeAllEventListeners|grid.removeAllEventListeners(true)}).
* @param {string} eventName - The type of event we are interested in.
* @param {function} listener - The event handler.
* @memberOf Hypergrid#
*/
addInternalEventListener: function(eventName, listener) {
this.addEventListener(eventName, listener, true);
},
/**
* @summary Remove an event listeners.
* @desc Removes the event listener with matching name and function that was added by {@link Hypergrid#addEventListener|grid.addEventListener}.
*
* NOTE: This method cannot remove event listeners added by other means.
* @memberOf Hypergrid#
*/
removeEventListener: function(eventName, listener) {
var listenerList = this.listeners[eventName];
if (listenerList) {
listenerList.find(function(info, index) {
if (info.listener === listener) {
if (listenerList.length === 1) {
delete this.listeners[eventName];
} else {
listenerList.splice(index, 1); // remove it from the list
}
this.canvas.removeEventListener(eventName, info.decorator);
return true;
}
}, this);
}
},
/**
* @summary Remove all event listeners.
* @desc Removes all event listeners added with {@link Hypergrid#addEventListener|grid.addEventListener} except those added as "internal."
* @param {boolean} [internal=false] - Include internal listeners.
* @memberOf Hypergrid#
*/
removeAllEventListeners: function(internal) {
Object.keys(this.listeners).forEach(function(key) {
this.listeners[key].slice().forEach(function(info) {
if (internal || !info.internal) {
this.removeEventListener(key, info.listener);
}
}, this);
}, this);
},
allowEvents: function(allow){
this.allowEventHandlers = !!allow;
if (this.behavior.featureChain) {
if (allow){
this.behavior.featureChain.attachChain();
} else {
this.behavior.featureChain.detachChain();
}
}
this.behavior.changed();
},
/**
* @memberOf Hypergrid#
* @param {number} c - grid column index.
* @param {string[]} keys
* @desc Synthesize and fire a `fin-column-sort` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticColumnSortEvent: function(c, keys) {
return dispatchGridEvent.call(this, 'fin-column-sort', {
column: c,
keys: keys
});
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-editor-keyup` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticEditorKeyUpEvent: function(inputControl, keyEvent) {
return dispatchGridEvent.call(this, 'fin-editor-keyup', {
input: inputControl,
keyEvent: keyEvent,
char: this.canvas.getKeyChar(keyEvent),
legacyChar: keyEvent.legacyKey // decorated by getKeyChar
});
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-editor-keydown` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticEditorKeyDownEvent: function(inputControl, keyEvent) {
return dispatchGridEvent.call(this, 'fin-editor-keydown', {
input: inputControl,
keyEvent: keyEvent,
char: this.canvas.getKeyChar(keyEvent),
legacyChar: keyEvent.legacyKey // decorated by getKeyChar
});
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-editor-keypress` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticEditorKeyPressEvent: function(inputControl, keyEvent) {
return dispatchGridEvent.call(this, 'fin-editor-keypress', {
input: inputControl,
keyEvent: keyEvent,
char: this.canvas.getKeyChar(keyEvent),
legacyChar: keyEvent.legacyKey // decorated by getKeyChar
});
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-editor-data-change` event.
*
* This event is cancelable.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticEditorDataChangeEvent: function(inputControl, oldValue, newValue) {
return dispatchGridEvent.call(this, 'fin-editor-data-change', true, {
input: inputControl,
oldValue: oldValue,
newValue: newValue
});
},
fireSyntheticRowHeaderClickedEvent: function(event) {
return dispatchGridEvent.call(this, 'fin-row-header-clicked', true, {}, event);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-row-selection-changed` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticRowSelectionChangedEvent: function() {
return dispatchGridEvent.call(this, 'fin-row-selection-changed', this.selectionDetailGetters);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-column-selection-changed` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticColumnSelectionChangedEvent: function() {
return dispatchGridEvent.call(this, 'fin-column-selection-changed', this.selectionDetailGetters);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-context-menu` event
* @param {keyEvent} event - The canvas event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticContextMenuEvent: function(event) {
Object.defineProperties(event, this.selectionDetailGetterDescriptors);
return dispatchGridEvent.call(this, 'fin-context-menu', {}, event);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-mouseup` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticMouseUpEvent: function(event) {
Object.defineProperties(event, this.selectionDetailGetterDescriptors);
return dispatchGridEvent.call(this, 'fin-mouseup', {}, event);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-mousedown` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticMouseDownEvent: function(event) {
Object.defineProperties(event, this.selectionDetailGetterDescriptors);
return dispatchGridEvent.call(this, 'fin-mousedown', {}, event);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-mousemove` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticMouseMoveEvent: function(event) {
return dispatchGridEvent.call(this, 'fin-mousemove', {}, event);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-button-pressed` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticButtonPressedEvent: function(event) {
if (event.cellRenderer instanceof Button) { // Button or subclass thereof?
if (event.value && event.value.subrows) {
var y = event.primitiveEvent.detail.mouse.y - event.bounds.y,
subheight = event.bounds.height / event.value.subrows;
event.subrow = Math.floor(y / subheight);
}
return dispatchGridEvent.call(this, 'fin-button-pressed', {}, event);
}
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-column-drag-start` event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticOnColumnsChangedEvent: function() {
return dispatchGridEvent.call(this, 'fin-column-changed-event', {});
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-keydown` event.
* @param {keyEvent} event - The canvas event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticKeydownEvent: function(keyEvent) {
return dispatchGridEvent.call(this, 'fin-keydown', keyEvent.detail);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-keyup` event.
* @param {keyEvent} event - The canvas event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticKeyupEvent: function(keyEvent) {
return dispatchGridEvent.call(this, 'fin-keyup', keyEvent.detail);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a fin-filter-applied event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticFilterAppliedEvent: function() {
return dispatchGridEvent.call(this, 'fin-filter-applied', {});
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-cell-enter` event
* @param {Point} cell - The pixel location of the cell in which the click event occurred.
* @param {MouseEvent} event - The system mouse event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticOnCellEnterEvent: function(cellEvent) {
return dispatchGridEvent.call(this, 'fin-cell-enter', cellEvent);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-cell-exit` event.
* @param {Point} cell - The pixel location of the cell in which the click event occured.
* @param {MouseEvent} event - The system mouse event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticOnCellExitEvent: function(cellEvent) {
return dispatchGridEvent.call(this, 'fin-cell-exit', cellEvent);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-cell-click` event.
* @param {Point} cell - The pixel location of the cell in which the click event occured.
* @param {MouseEvent} event - The system mouse event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticClickEvent: function(cellEvent) {
return dispatchGridEvent.call(this, 'fin-click', {}, cellEvent);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-double-click` event.
* @param {MouseEvent} event - The system mouse event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticDoubleClickEvent: function(cellEvent) {
if (!this.abortEditing()) { return; }
return dispatchGridEvent.call(this, 'fin-double-click', {}, cellEvent);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a fin-grid-rendered event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticGridRenderedEvent: function() {
return dispatchGridEvent.call(this, 'fin-grid-rendered', { source: this });
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a fin-tick event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticTickEvent: function() {
return dispatchGridEvent.call(this, 'fin-tick', { source: this });
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a fin-grid-resized event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticGridResizedEvent: function(e) {
return dispatchGridEvent.call(this, 'fin-grid-resized', e);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-touchstart` event.
* @param {CustomEvent} e - The canvas event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticTouchStartEvent: function(e) {
return dispatchGridEvent.call(this, 'fin-touchstart', e);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-touchmove` event.
* @param {CustomEvent} e - The canvas event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticTouchMoveEvent: function(e) {
return dispatchGridEvent.call(this, 'fin-touchmove', e);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a `fin-touchend` event.
* @param {CustomEvent} e - The canvas event.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireSyntheticTouchEndEvent: function(e) {
return dispatchGridEvent.call(this, 'fin-touchend', e);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a scroll event.
* @param {string} type - Should be either `fin-scroll-x` or `fin-scroll-y`.
* @param {number} oldValue - The old scroll value.
* @param {number} newValue - The new scroll value.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireScrollEvent: function(eventName, oldValue, newValue) {
return dispatchGridEvent.call(this, eventName, {
oldValue: oldValue,
value: newValue
});
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a fin-request-cell-edit event.
*
* This event is cancelable.
* @param {CellEvent} cellEvent
* @param {*} value
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireRequestCellEdit: function(cellEvent, value) {
return dispatchGridEvent.call(this, 'fin-request-cell-edit', true, { value: value }, cellEvent);
},
/**
* @memberOf Hypergrid#
* @desc Synthesize and fire a fin-before-cell-edit event.
*
* This event is cancelable.
* @param {Point} cell - The x,y coordinates.
* @param {Object} value - The current value.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireBeforeCellEdit: function(cellEvent, oldValue, newValue, control) {
return dispatchGridEvent.call(this, 'fin-before-cell-edit', true, {
oldValue: oldValue,
newValue: newValue,
input: control
}, cellEvent);
},
/**
* @memberOf Hypergrid#
* @returns {Renderer} sub-component
* @param {Point} cell - The x,y coordinates.
* @param {Object} oldValue - The old value.
* @param {Object} newValue - The new value.
* @returns {boolean} Proceed; event was not [canceled](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent#Return_Value `EventTarget.dispatchEvent`).
*/
fireAfterCellEdit: function(cellEvent, oldValue, newValue, control) {
return dispatchGridEvent.call(this, 'fin-after-cell-edit', {
newValue: newValue,
oldValue: oldValue,
input: control
}, cellEvent);
},
delegateCanvasEvents: function() {
var grid = this;
function handleMouseEvent(e, cb) {
if (grid.getLogicalRowCount() === 0) {
return;
}
var c = grid.getGridCellFromMousePoint(e.detail.mouse),
primitiveEvent,
decoratedEvent;
// No events on the whitespace of the grid unless they're drag events
if (!c.fake || e.detail.dragstart) {
primitiveEvent = c.cellEvent;
}
if (primitiveEvent) {
decoratedEvent = Object.defineProperty(
primitiveEvent,
'primitiveEvent',
{
value: e,
enumerable: false,
configurable: true,
writable: true
}
);
// add some interesting mouse offsets
var drilldown;
if ((drilldown = primitiveEvent.primitiveEvent && primitiveEvent.primitiveEvent.detail)) {
decoratedEvent.gridPoint = drilldown.mouse;
if ((drilldown = drilldown.primitiveEvent)) {
decoratedEvent.clientPoint = {
x: drilldown.clientX,
y: drilldown.clientY
};
decoratedEvent.pagePoint = {
x: drilldown.clientX + window.scrollX,
y: drilldown.clientY + window.scrollY
};
}
}
cb.call(grid, decoratedEvent);
}
}
this.addInternalEventListener('fin-canvas-resized', function(e) {
grid.resized();
grid.fireSyntheticGridResizedEvent(e);
});
this.addInternalEventListener('fin-canvas-mousemove', function(e) {
if (grid.properties.readOnly) {
return;
}
handleMouseEvent(e, function(mouseEvent) {
this.delegateMouseMove(mouseEvent);
this.fireSyntheticMouseMoveEvent(mouseEvent);
});
});
this.addInternalEventListener('fin-canvas-mousedown', function(e) {
if (grid.properties.readOnly) {
return;
}
if (!grid.abortEditing()) {
e.stopPropagation();
return;
}
handleMouseEvent(e, function(mouseEvent) {
mouseEvent.keys = e.detail.keys;
this.mouseDownState = mouseEvent;
this.delegateMouseDown(mouseEvent);
this.fireSyntheticMouseDownEvent(mouseEvent);
this.repaint();
});
});
this.addInternalEventListener('fin-canvas-click', function(e) {
if (grid.properties.readOnly) {
return;
}
handleMouseEvent(e, function(mouseEvent) {
var isMouseDownCell = this.mouseDownState && this.mouseDownState.gridCell.equals(mouseEvent.gridCell);
if (isMouseDownCell && mouseEvent.mousePointInClickRect) {
mouseEvent.keys = e.detail.keys; // todo: this was in fin-tap but wasn't here
if (this.mouseDownState) {
this.fireSyntheticButtonPressedEvent(this.mouseDownState);
}
this.fireSyntheticClickEvent(mouseEvent);
this.delegateClick(mouseEvent);
}
this.mouseDownState = null;
});
});
this.addInternalEventListener('fin-canvas-mouseup', function(e) {
if (grid.properties.readOnly) {
return;
}
grid.dragging = false;
if (grid.isScrollingNow()) {
grid.setScrollingNow(false);
}
if (grid.columnDragAutoScrolling) {
grid.columnDragAutoScrolling = false;
}
handleMouseEvent(e, function(mouseEvent) {
this.delegateMouseUp(mouseEvent);
this.fireSyntheticMouseUpEvent(mouseEvent);
});
});
this.addInternalEventListener('fin-canvas-dblclick', function(e) {
if (grid.properties.readOnly) {
return;
}
handleMouseEvent(e, function(mouseEvent) {
this.fireSyntheticDoubleClickEvent(mouseEvent, e);
this.delegateDoubleClick(mouseEvent);
});
});
this.addInternalEventListener('fin-canvas-drag', function(e) {
if (grid.properties.readOnly) {
return;
}
grid.dragging = true;
handleMouseEvent(e, grid.delegateMouseDrag);
});
this.addInternalEventListener('fin-canvas-keydown', function(e) {
if (grid.properties.readOnly) {
return;
}
grid.fireSyntheticKeydownEvent(e);
grid.delegateKeyDown(e);
});
this.addInternalEventListener('fin-canvas-keyup', function(e) {
if (grid.properties.readOnly) {
return;
}
grid.fireSyntheticKeyupEvent(e);
grid.delegateKeyUp(e);
});
this.addInternalEventListener('fin-canvas-wheelmoved', function(e) {
handleMouseEvent(e, grid.delegateWheelMoved);
});
this.addInternalEventListener('fin-canvas-mouseout', function(e) {
if (grid.properties.readOnly) {
return;
}
handleMouseEvent(e, grid.delegateMouseExit);
});
this.addInternalEventListener('fin-canvas-context-menu', function(e) {
handleMouseEvent(e, function(mouseEvent) {
grid.delegateContextMenu(mouseEvent);
grid.fireSyntheticContextMenuEvent(mouseEvent);
});
});
this.addInternalEventListener('fin-canvas-touchstart', function(e) {
grid.delegateTouchStart(e);
grid.fireSyntheticTouchStartEvent(e);
});
this.addInternalEventListener('fin-canvas-touchmove', function(e) {
grid.delegateTouchMove(e);
grid.fireSyntheticTouchMoveEvent(e);
});
this.addInternalEventListener('fin-canvas-touchend', function(e) {
grid.delegateTouchEnd(e);
grid.fireSyntheticTouchEndEvent(e);
});
//Register a listener for the copy event so we can copy our selected region to the pastebuffer if conditions are right.
document.body.addEventListener('copy', function(evt) {
grid.checkClipboardCopy(evt);
});
},
/**
* @memberOf Hypergrid#
* @desc Delegate the wheel moved event to the behavior.
* @param {Event} event - The pertinent event.
*/
delegateWheelMoved: function(event) {
this.behavior.onWheelMoved(this, event);
},
/**
* @memberOf Hypergrid#
* @desc Delegate MouseExit to the behavior (model).
* @param {Event} event - The pertinent event.
*/
delegateMouseExit: function(event) {
this.behavior.handleMouseExit(this, event);
},
/**
* @memberOf Hypergrid#
* @desc Delegate MouseExit to the behavior (model).
* @param {Event} event - The pertinent event.
*/
delegateContextMenu: function(event) {
this.behavior.onContextMenu(this, event);
},
/**
* @memberOf Hypergrid#
* @desc Delegate MouseMove to the behavior (model).
* @param {mouseDetails} mouseDetails - An enriched mouse event from fin-canvas.
*/
delegateMouseMove: function(mouseDetails) {
this.behavior.onMouseMove(this, mouseDetails);
},
/**
* @memberOf Hypergrid#
* @desc Delegate mousedown to the behavior (model).
* @param {mouseDetails} mouseDetails - An enriched mouse event from fin-canvas.
*/
delegateMouseDown: function(mouseDetails) {
this.behavior.handleMouseDown(this, mouseDetails);
},
/**
* @memberOf Hypergrid#
* @desc Delegate mouseup to the behavior (model).
* @param {mouseDetails} mouseDetails - An enriched mouse event from fin-canvas.
*/
delegateMouseUp: function(mouseDetails) {
this.behavior.onMouseUp(this, mouseDetails);
},
/**
* @memberOf Hypergrid#
* @desc Delegate click to the behavior (model).
* @param {mouseDetails} mouseDetails - An enriched mouse event from fin-canvas.
*/
delegateClick: function(mouseDetails) {
this.behavior.onClick(this, mouseDetails);
},
/**
* @memberOf Hypergrid#
* @desc Delegate mouseDrag to the behavior (model).
* @param {mouseDetails} mouseDetails - An enriched mouse event from fin-canvas.
*/
delegateMouseDrag: function(mouseDetails) {
this.behavior.onMouseDrag(this, mouseDetails);
},
/**
* @memberOf Hypergrid#
* @desc We've been doubleclicked on. Delegate through the behavior (model).
* @param {mouseDetails} mouseDetails - An enriched mouse event from fin-canvas.
*/
delegateDoubleClick: function(mouseDetails) {
this.behavior.onDoubleClick(this, mouseDetails);
},
/**
* @memberOf Hypergrid#
* @summary Generate a function name and call it on self.
* @desc This should also be delegated through Behavior keeping the default implementation here though.
* @param {event} event - The pertinent event.
*/
delegateKeyDown: function(event) {
this.behavior.onKeyDown(this, event);
},
/**
* @memberOf Hypergrid#
* @summary Generate a function name and call it on self.
* @desc This should also be delegated through Behavior keeping the default implementation here though.
* @param {event} event - The pertinent event.
*/
delegateKeyUp: function(event) {
this.behavior.onKeyUp(this, event);
},
/**
* @memberOf Hypergrid#
* @desc Delegate touchstart to the Behavior model.
* @param {CustomEvent} event - The pertinent event.
*/
delegateTouchStart: function(event) {
this.behavior.onTouchStart(this, event);
},
/**
* @memberOf Hypergrid#
* @desc Delegate touchmove to the Behavior model.
* @param {CustomEvent} event - The pertinent event.
*/
delegateTouchMove: function(event) {
this.behavior.onTouchMove(this, event);
},
/**
* @memberOf Hypergrid#
* @desc Delegate touchend to the Behavior model.
* @param {CustomEvent} event - The pertinent event.
*/
delegateTouchEnd: function(event) {
this.behavior.onTouchEnd(this, event);
}
};