📄 compact-painter.js
字号:
var anchorPixel = getPixelOffset(anchorDate);
var newTracks = [];
var tapeHeightOccupied = 0; // how many pixels (vertically) the tape occupies, including bottom margin
var tapeTrackCount = 0; // how many tracks the tape takes up, usually just 1
var tapeLastTrackExtraSpace = 0; // on the last track that the tape occupies, how many pixels are left (for icon and label to occupy as well)
if (tapeData != null) {
tapeHeightOccupied = metrics.tapeHeight + metrics.tapeBottomMargin;
tapeTrackCount = Math.ceil(metrics.tapeHeight / metrics.trackHeight);
var tapeEndPixelOffset = getPixelOffset(tapeData.end) - anchorPixel;
var tapeStartPixelOffset = getPixelOffset(tapeData.start) - anchorPixel;
for (var t = 0; t < tapeTrackCount; t++) {
newTracks.push({ start: tapeStartPixelOffset, end: tapeEndPixelOffset });
}
tapeLastTrackExtraSpace = metrics.trackHeight - (tapeHeightOccupied % metrics.tapeHeight);
}
var iconStartPixelOffset = 0; // where the icon starts compared to the anchor pixel;
// this can be negative if the icon is center-aligned around the anchor
var iconHorizontalSpaceOccupied = 0; // how many pixels the icon take up from the anchor pixel,
// including the gap between the icon and the label
if (iconData != null) {
if ("iconAlign" in iconData && iconData.iconAlign == "center") {
iconStartPixelOffset = -Math.floor(iconData.width / 2);
}
iconHorizontalSpaceOccupied = iconStartPixelOffset + iconData.width + metrics.iconLabelGap;
if (tapeTrackCount > 0) {
newTracks[tapeTrackCount - 1].end = Math.max(newTracks[tapeTrackCount - 1].end, iconHorizontalSpaceOccupied);
}
var iconHeight = iconData.height + metrics.iconBottomMargin + tapeLastTrackExtraSpace;
while (iconHeight > 0) {
newTracks.push({ start: iconStartPixelOffset, end: iconHorizontalSpaceOccupied });
iconHeight -= metrics.trackHeight;
}
}
var text = labelData.text;
var labelSize = this._frc.computeSize(text);
var labelHeight = labelSize.height + metrics.labelBottomMargin + tapeLastTrackExtraSpace;
var labelEndPixelOffset = iconHorizontalSpaceOccupied + labelSize.width + metrics.labelRightMargin;
if (tapeTrackCount > 0) {
newTracks[tapeTrackCount - 1].end = Math.max(newTracks[tapeTrackCount - 1].end, labelEndPixelOffset);
}
for (var i = 0; labelHeight > 0; i++) {
if (tapeTrackCount + i < newTracks.length) {
var track = newTracks[tapeTrackCount + i];
track.end = labelEndPixelOffset;
} else {
newTracks.push({ start: 0, end: labelEndPixelOffset });
}
labelHeight -= metrics.trackHeight;
}
/*
* Try to fit the new track on top of the existing tracks, then
* render the various elements.
*/
var firstTrack = this._fitTracks(anchorPixel, newTracks);
var verticalPixelOffset = firstTrack * metrics.trackHeight + metrics.trackOffset;
var result = {};
result.labelElmtData = this._paintEventLabel(
commonData,
labelData,
anchorPixel + iconHorizontalSpaceOccupied,
verticalPixelOffset + tapeHeightOccupied,
labelSize.width,
labelSize.height,
theme
);
if (tapeData != null) {
if ("latestStart" in tapeData || "earliestEnd" in tapeData) {
result.impreciseTapeElmtData = this._paintEventTape(
commonData,
tapeData,
metrics.tapeHeight,
verticalPixelOffset,
getPixelOffset(tapeData.start),
getPixelOffset(tapeData.end),
theme.event.duration.impreciseColor,
theme.event.duration.impreciseOpacity,
metrics,
theme
);
}
if (!tapeData.isInstant && "start" in tapeData && "end" in tapeData) {
result.tapeElmtData = this._paintEventTape(
commonData,
tapeData,
metrics.tapeHeight,
verticalPixelOffset,
anchorPixel,
getPixelOffset("earliestEnd" in tapeData ? tapeData.earliestEnd : tapeData.end),
tapeData.color,
100,
metrics,
theme
);
}
}
if (iconData != null) {
result.iconElmtData = this._paintEventIcon(
commonData,
iconData,
verticalPixelOffset + tapeHeightOccupied,
anchorPixel + iconStartPixelOffset,
metrics,
theme
);
}
//this._createHighlightDiv(highlightIndex, iconElmtData, theme);
return result;
};
Timeline.CompactEventPainter.prototype._fitTracks = function(anchorPixel, newTracks) {
var firstTrack;
for (firstTrack = 0; firstTrack < this._tracks.length; firstTrack++) {
var fit = true;
for (var j = 0; j < newTracks.length && (firstTrack + j) < this._tracks.length; j++) {
var existingTrack = this._tracks[firstTrack + j];
var newTrack = newTracks[j];
if (anchorPixel + newTrack.start < existingTrack) {
fit = false;
break;
}
}
if (fit) {
break;
}
}
for (var i = 0; i < newTracks.length; i++) {
this._tracks[firstTrack + i] = anchorPixel + newTracks[i].end;
}
return firstTrack;
};
Timeline.CompactEventPainter.prototype._paintEventIcon = function(commonData, iconData, top, left, metrics, theme) {
var img = SimileAjax.Graphics.createTranslucentImage(iconData.url);
var iconDiv = this._timeline.getDocument().createElement("div");
iconDiv.className = 'timeline-event-icon' + ("className" in iconData ? (" " + iconData.className) : "");
iconDiv.style.left = left + "px";
iconDiv.style.top = top + "px";
iconDiv.appendChild(img);
if ("tooltip" in commonData && typeof commonData.tooltip == "string") {
iconDiv.title = commonData.tooltip;
}
this._eventLayer.appendChild(iconDiv);
return {
left: left,
top: top,
width: metrics.iconWidth,
height: metrics.iconHeight,
elmt: iconDiv
};
};
Timeline.CompactEventPainter.prototype._paintEventLabel = function(commonData, labelData, left, top, width, height, theme) {
var doc = this._timeline.getDocument();
var labelDiv = doc.createElement("div");
labelDiv.className = 'timeline-event-label';
labelDiv.style.left = left + "px";
labelDiv.style.width = (width + 1) + "px";
labelDiv.style.top = top + "px";
labelDiv.innerHTML = labelData.text;
if ("tooltip" in commonData && typeof commonData.tooltip == "string") {
labelDiv.title = commonData.tooltip;
}
if ("color" in labelData && typeof labelData.color == "string") {
labelDiv.style.color = labelData.color;
}
if ("className" in labelData && typeof labelData.className == "string") {
labelDiv.className += ' ' + labelData.className;
}
this._eventLayer.appendChild(labelDiv);
return {
left: left,
top: top,
width: width,
height: height,
elmt: labelDiv
};
};
Timeline.CompactEventPainter.prototype._paintEventTape = function(
commonData, tapeData, height, top, startPixel, endPixel, color, opacity, metrics, theme) {
var width = endPixel - startPixel;
var tapeDiv = this._timeline.getDocument().createElement("div");
tapeDiv.className = "timeline-event-tape"
tapeDiv.style.left = startPixel + "px";
tapeDiv.style.top = top + "px";
tapeDiv.style.width = width + "px";
tapeDiv.style.height = height + "px";
if ("tooltip" in commonData && typeof commonData.tooltip == "string") {
tapeDiv.title = commonData.tooltip;
}
if (color != null && typeof tapeData.color == "string") {
tapeDiv.style.backgroundColor = color;
}
if ("backgroundImage" in tapeData && typeof tapeData.backgroundImage == "string") {
tapeDiv.style.backgroundImage = "url(" + backgroundImage + ")";
tapeDiv.style.backgroundRepeat =
("backgroundRepeat" in tapeData && typeof tapeData.backgroundRepeat == "string")
? tapeData.backgroundRepeat : 'repeat';
}
SimileAjax.Graphics.setOpacity(tapeDiv, opacity);
if ("className" in tapeData && typeof tapeData.className == "string") {
tapeDiv.className += ' ' + tapeData.className;
}
this._eventLayer.appendChild(tapeDiv);
return {
left: startPixel,
top: top,
width: width,
height: height,
elmt: tapeDiv
};
}
Timeline.CompactEventPainter.prototype._createHighlightDiv = function(highlightIndex, dimensions, theme) {
if (highlightIndex >= 0) {
var doc = this._timeline.getDocument();
var eventTheme = theme.event;
var color = eventTheme.highlightColors[Math.min(highlightIndex, eventTheme.highlightColors.length - 1)];
var div = doc.createElement("div");
div.style.position = "absolute";
div.style.overflow = "hidden";
div.style.left = (dimensions.left - 2) + "px";
div.style.width = (dimensions.width + 4) + "px";
div.style.top = (dimensions.top - 2) + "px";
div.style.height = (dimensions.height + 4) + "px";
// div.style.background = color;
this._highlightLayer.appendChild(div);
}
};
Timeline.CompactEventPainter.prototype._onClickMultiplePreciseInstantEvent = function(icon, domEvt, events) {
var c = SimileAjax.DOM.getPageCoordinates(icon);
this._showBubble(
c.left + Math.ceil(icon.offsetWidth / 2),
c.top + Math.ceil(icon.offsetHeight / 2),
events
);
var ids = [];
for (var i = 0; i < events.length; i++) {
ids.push(events[i].getID());
}
this._fireOnSelect(ids);
domEvt.cancelBubble = true;
SimileAjax.DOM.cancelEvent(domEvt);
return false;
};
Timeline.CompactEventPainter.prototype._onClickInstantEvent = function(icon, domEvt, evt) {
var c = SimileAjax.DOM.getPageCoordinates(icon);
this._showBubble(
c.left + Math.ceil(icon.offsetWidth / 2),
c.top + Math.ceil(icon.offsetHeight / 2),
[evt]
);
this._fireOnSelect([evt.getID()]);
domEvt.cancelBubble = true;
SimileAjax.DOM.cancelEvent(domEvt);
return false;
};
Timeline.CompactEventPainter.prototype._onClickDurationEvent = function(target, domEvt, evt) {
if ("pageX" in domEvt) {
var x = domEvt.pageX;
var y = domEvt.pageY;
} else {
var c = SimileAjax.DOM.getPageCoordinates(target);
var x = domEvt.offsetX + c.left;
var y = domEvt.offsetY + c.top;
}
this._showBubble(x, y, [evt]);
this._fireOnSelect([evt.getID()]);
domEvt.cancelBubble = true;
SimileAjax.DOM.cancelEvent(domEvt);
return false;
};
Timeline.CompactEventPainter.prototype.showBubble = function(evt) {
var elmt = this._eventIdToElmt[evt.getID()];
if (elmt) {
var c = SimileAjax.DOM.getPageCoordinates(elmt);
this._showBubble(c.left + elmt.offsetWidth / 2, c.top + elmt.offsetHeight / 2, [evt]);
}
};
Timeline.CompactEventPainter.prototype._showBubble = function(x, y, evts) {
var div = document.createElement("div");
evts = ("fillInfoBubble" in evts) ? [evts] : evts;
for (var i = 0; i < evts.length; i++) {
var div2 = document.createElement("div");
div.appendChild(div2);
evts[i].fillInfoBubble(div2, this._params.theme, this._band.getLabeller());
}
SimileAjax.WindowManager.cancelPopups();
SimileAjax.Graphics.createBubbleForContentAndPoint(div, x, y, this._params.theme.event.bubble.width);
};
Timeline.CompactEventPainter.prototype._fireOnSelect = function(eventIDs) {
for (var i = 0; i < this._onSelectListeners.length; i++) {
this._onSelectListeners[i](eventIDs);
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -