📄 band.js
字号:
Timeline._Band.prototype.setMaxVisibleDate = function(date) {
if (!this._changing) {
this._moveEther(Math.round(this._viewLength - this._ether.dateToPixelOffset(date)));
}
};
Timeline._Band.prototype.setCenterVisibleDate = function(date) {
if (!this._changing) {
this._moveEther(Math.round(this._viewLength / 2 - this._ether.dateToPixelOffset(date)));
}
};
Timeline._Band.prototype.dateToPixelOffset = function(date) {
return this._ether.dateToPixelOffset(date) - this._viewOffset;
};
Timeline._Band.prototype.pixelOffsetToDate = function(pixels) {
return this._ether.pixelOffsetToDate(pixels + this._viewOffset);
};
Timeline._Band.prototype.createLayerDiv = function(zIndex, className) {
var div = this._timeline.getDocument().createElement("div");
div.className = "timeline-band-layer" + (typeof className == "string" ? (" " + className) : "");
div.style.zIndex = zIndex;
this._innerDiv.appendChild(div);
var innerDiv = this._timeline.getDocument().createElement("div");
innerDiv.className = "timeline-band-layer-inner";
if (SimileAjax.Platform.browser.isIE) {
innerDiv.style.cursor = "move";
} else {
innerDiv.style.cursor = "-moz-grab";
}
div.appendChild(innerDiv);
return innerDiv;
};
Timeline._Band.prototype.removeLayerDiv = function(div) {
this._innerDiv.removeChild(div.parentNode);
};
Timeline._Band.prototype.scrollToCenter = function(date, f) {
var pixelOffset = this._ether.dateToPixelOffset(date);
if (pixelOffset < -this._viewLength / 2) {
this.setCenterVisibleDate(this.pixelOffsetToDate(pixelOffset + this._viewLength));
} else if (pixelOffset > 3 * this._viewLength / 2) {
this.setCenterVisibleDate(this.pixelOffsetToDate(pixelOffset - this._viewLength));
}
this._autoScroll(Math.round(this._viewLength / 2 - this._ether.dateToPixelOffset(date)), f);
};
Timeline._Band.prototype.showBubbleForEvent = function(eventID) {
var evt = this.getEventSource().getEvent(eventID);
if (evt) {
var self = this;
this.scrollToCenter(evt.getStart(), function() {
self._eventPainter.showBubble(evt);
});
}
};
Timeline._Band.prototype.zoom = function(zoomIn, x, y, target) {
if (!this._zoomSteps) {
// zoom disabled
return;
}
// shift the x value by our offset
x += this._viewOffset;
var zoomDate = this._ether.pixelOffsetToDate(x);
var netIntervalChange = this._ether.zoom(zoomIn);
this._etherPainter.zoom(netIntervalChange);
// shift our zoom date to the far left
this._moveEther(Math.round(-this._ether.dateToPixelOffset(zoomDate)));
// then shift it back to where the mouse was
this._moveEther(x);
};
Timeline._Band.prototype._onMouseDown = function(innerFrame, evt, target) {
this.closeBubble();
this._dragging = true;
this._dragX = evt.clientX;
this._dragY = evt.clientY;
};
Timeline._Band.prototype._onMouseMove = function(innerFrame, evt, target) {
if (this._dragging) {
var diffX = evt.clientX - this._dragX;
var diffY = evt.clientY - this._dragY;
this._dragX = evt.clientX;
this._dragY = evt.clientY;
this._moveEther(this._timeline.isHorizontal() ? diffX : diffY);
this._positionHighlight();
}
};
Timeline._Band.prototype._onMouseUp = function(innerFrame, evt, target) {
this._dragging = false;
this._keyboardInput.focus();
};
Timeline._Band.prototype._onMouseOut = function(innerFrame, evt, target) {
var coords = SimileAjax.DOM.getEventRelativeCoordinates(evt, innerFrame);
coords.x += this._viewOffset;
if (coords.x < 0 || coords.x > innerFrame.offsetWidth ||
coords.y < 0 || coords.y > innerFrame.offsetHeight) {
this._dragging = false;
}
};
Timeline._Band.prototype._onMouseScroll = function(innerFrame, evt, target) {
var now = new Date();
now = now.getTime();
if (!this._lastScrollTime || ((now - this._lastScrollTime) > 50)) {
// limit 1 scroll per 200ms due to FF3 sending multiple events back to back
this._lastScrollTime = now;
var delta = 0;
if (evt.wheelDelta) {
delta = evt.wheelDelta/120;
} else if (evt.detail) {
delta = -evt.detail/3;
}
// either scroll or zoom
var mouseWheel = this._theme.mouseWheel;
if (this._zoomSteps || mouseWheel === 'zoom') {
var loc = SimileAjax.DOM.getEventRelativeCoordinates(evt, innerFrame);
if (delta != 0) {
var zoomIn;
if (delta > 0)
zoomIn = true;
if (delta < 0)
zoomIn = false;
// call zoom on the timeline so we could zoom multiple bands if desired
this._timeline.zoom(zoomIn, loc.x, loc.y, innerFrame);
}
}
else if (mouseWheel === 'scroll') {
var move_amt = 50 * (delta < 0 ? -1 : 1);
this._moveEther(move_amt);
}
}
// prevent bubble
if (evt.stopPropagation) {
evt.stopPropagation();
}
evt.cancelBubble = true;
// prevent the default action
if (evt.preventDefault) {
evt.preventDefault();
}
evt.returnValue = false;
};
Timeline._Band.prototype._onDblClick = function(innerFrame, evt, target) {
var coords = SimileAjax.DOM.getEventRelativeCoordinates(evt, innerFrame);
var distance = coords.x - (this._viewLength / 2 - this._viewOffset);
this._autoScroll(-distance);
};
Timeline._Band.prototype._onKeyDown = function(keyboardInput, evt, target) {
if (!this._dragging) {
switch (evt.keyCode) {
case 27: // ESC
break;
case 37: // left arrow
case 38: // up arrow
this._scrollSpeed = Math.min(50, Math.abs(this._scrollSpeed * 1.05));
this._moveEther(this._scrollSpeed);
break;
case 39: // right arrow
case 40: // down arrow
this._scrollSpeed = -Math.min(50, Math.abs(this._scrollSpeed * 1.05));
this._moveEther(this._scrollSpeed);
break;
default:
return true;
}
this.closeBubble();
SimileAjax.DOM.cancelEvent(evt);
return false;
}
return true;
};
Timeline._Band.prototype._onKeyUp = function(keyboardInput, evt, target) {
if (!this._dragging) {
this._scrollSpeed = this._originalScrollSpeed;
switch (evt.keyCode) {
case 35: // end
this.setCenterVisibleDate(this._eventSource.getLatestDate());
break;
case 36: // home
this.setCenterVisibleDate(this._eventSource.getEarliestDate());
break;
case 33: // page up
this._autoScroll(this._timeline.getPixelLength());
break;
case 34: // page down
this._autoScroll(-this._timeline.getPixelLength());
break;
default:
return true;
}
this.closeBubble();
SimileAjax.DOM.cancelEvent(evt);
return false;
}
return true;
};
Timeline._Band.prototype._autoScroll = function(distance, f) {
var b = this;
var a = SimileAjax.Graphics.createAnimation(
function(abs, diff) {
b._moveEther(diff);
},
0,
distance,
1000,
f
);
a.run();
};
Timeline._Band.prototype._moveEther = function(shift) {
this.closeBubble();
// A positive shift means back in time
// Check that we're not moving beyond Timeline's limits
if (!this._timeline.shiftOK(this._index, shift)) {
return; // early return
}
this._viewOffset += shift;
this._ether.shiftPixels(-shift);
if (this._timeline.isHorizontal()) {
this._div.style.left = this._viewOffset + "px";
} else {
this._div.style.top = this._viewOffset + "px";
}
if (this._viewOffset > -this._viewLength * 0.5 ||
this._viewOffset < -this._viewLength * (Timeline._Band.SCROLL_MULTIPLES - 1.5)) {
this._recenterDiv();
} else {
this.softLayout();
}
this._onChanging();
}
Timeline._Band.prototype._onChanging = function() {
this._changing = true;
this._fireOnScroll();
this._setSyncWithBandDate();
this._changing = false;
};
Timeline._Band.prototype.busy = function() {
// Is this band busy changing other bands?
return(this._changing);
};
Timeline._Band.prototype._fireOnScroll = function() {
for (var i = 0; i < this._onScrollListeners.length; i++) {
this._onScrollListeners[i](this);
}
};
Timeline._Band.prototype._setSyncWithBandDate = function() {
if (this._syncWithBand) {
var centerDate = this._ether.pixelOffsetToDate(this.getViewLength() / 2);
this._syncWithBand.setCenterVisibleDate(centerDate);
}
};
Timeline._Band.prototype._onHighlightBandScroll = function() {
if (this._syncWithBand) {
var centerDate = this._syncWithBand.getCenterVisibleDate();
var centerPixelOffset = this._ether.dateToPixelOffset(centerDate);
this._moveEther(Math.round(this._viewLength / 2 - centerPixelOffset));
if (this._highlight) {
this._etherPainter.setHighlight(
this._syncWithBand.getMinVisibleDate(),
this._syncWithBand.getMaxVisibleDate());
}
}
};
Timeline._Band.prototype._onAddMany = function() {
this._paintEvents();
};
Timeline._Band.prototype._onClear = function() {
this._paintEvents();
};
Timeline._Band.prototype._positionHighlight = function() {
if (this._syncWithBand) {
var startDate = this._syncWithBand.getMinVisibleDate();
var endDate = this._syncWithBand.getMaxVisibleDate();
if (this._highlight) {
this._etherPainter.setHighlight(startDate, endDate);
}
}
};
Timeline._Band.prototype._recenterDiv = function() {
this._viewOffset = -this._viewLength * (Timeline._Band.SCROLL_MULTIPLES - 1) / 2;
if (this._timeline.isHorizontal()) {
this._div.style.left = this._viewOffset + "px";
this._div.style.width = (Timeline._Band.SCROLL_MULTIPLES * this._viewLength) + "px";
} else {
this._div.style.top = this._viewOffset + "px";
this._div.style.height = (Timeline._Band.SCROLL_MULTIPLES * this._viewLength) + "px";
}
this.layout();
};
Timeline._Band.prototype._paintEvents = function() {
this._eventPainter.paint();
};
Timeline._Band.prototype._softPaintEvents = function() {
this._eventPainter.softPaint();
};
Timeline._Band.prototype._paintDecorators = function() {
for (var i = 0; i < this._decorators.length; i++) {
this._decorators[i].paint();
}
};
Timeline._Band.prototype._softPaintDecorators = function() {
for (var i = 0; i < this._decorators.length; i++) {
this._decorators[i].softPaint();
}
};
Timeline._Band.prototype.closeBubble = function() {
SimileAjax.WindowManager.cancelPopups();
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -