📄 original-painter.js
字号:
var startDate = evt.getStart();
var endDate = evt.getEnd();
var startPixel = Math.round(this._band.dateToPixelOffset(startDate));
var endPixel = Math.round(this._band.dateToPixelOffset(endDate));
var labelDivClassName = this._getLabelDivClassName(evt);
var labelSize = this._frc.computeSize(text, labelDivClassName);
var labelLeft = startPixel;
var labelRight = labelLeft + labelSize.width;
var rightEdge = Math.max(labelRight, endPixel);
var track = this._findFreeTrack(evt, rightEdge);
var labelTop = Math.round(
metrics.trackOffset + track * metrics.trackIncrement + theme.event.tape.height);
var color = evt.getColor();
color = color != null ? color : theme.event.duration.color;
var tapeElmtData = this._paintEventTape(evt, track, startPixel, endPixel, color, 100, metrics, theme, 0);
var labelElmtData = this._paintEventLabel(evt, text, labelLeft, labelTop, labelSize.width,
labelSize.height, theme, labelDivClassName, highlightIndex);
var els = [tapeElmtData.elmt, labelElmtData.elmt];
var self = this;
var clickHandler = function(elmt, domEvt, target) {
return self._onClickDurationEvent(tapeElmtData.elmt, domEvt, evt);
};
SimileAjax.DOM.registerEvent(tapeElmtData.elmt, "mousedown", clickHandler);
SimileAjax.DOM.registerEvent(labelElmtData.elmt, "mousedown", clickHandler);
var hDiv = this._createHighlightDiv(highlightIndex, tapeElmtData, theme, evt);
if (hDiv != null) {els.push(hDiv);}
this._fireEventPaintListeners('paintedEvent', evt, els);
this._eventIdToElmt[evt.getID()] = tapeElmtData.elmt;
this._tracks[track] = startPixel;
};
Timeline.OriginalEventPainter.prototype.paintImpreciseDurationEvent = function(evt, metrics, theme, highlightIndex) {
var doc = this._timeline.getDocument();
var text = evt.getText();
var startDate = evt.getStart();
var latestStartDate = evt.getLatestStart();
var endDate = evt.getEnd();
var earliestEndDate = evt.getEarliestEnd();
var startPixel = Math.round(this._band.dateToPixelOffset(startDate));
var latestStartPixel = Math.round(this._band.dateToPixelOffset(latestStartDate));
var endPixel = Math.round(this._band.dateToPixelOffset(endDate));
var earliestEndPixel = Math.round(this._band.dateToPixelOffset(earliestEndDate));
var labelDivClassName = this._getLabelDivClassName(evt);
var labelSize = this._frc.computeSize(text, labelDivClassName);
var labelLeft = latestStartPixel;
var labelRight = labelLeft + labelSize.width;
var rightEdge = Math.max(labelRight, endPixel);
var track = this._findFreeTrack(evt, rightEdge);
var labelTop = Math.round(
metrics.trackOffset + track * metrics.trackIncrement + theme.event.tape.height);
var color = evt.getColor();
color = color != null ? color : theme.event.duration.color;
// Imprecise events can have two event tapes
// The imprecise dates tape, uses opacity to be dimmer than precise dates
var impreciseTapeElmtData = this._paintEventTape(evt, track, startPixel, endPixel,
theme.event.duration.impreciseColor,
theme.event.duration.impreciseOpacity, metrics, theme, 0);
// The precise dates tape, regular (100%) opacity
var tapeElmtData = this._paintEventTape(evt, track, latestStartPixel,
earliestEndPixel, color, 100, metrics, theme, 1);
var labelElmtData = this._paintEventLabel(evt, text, labelLeft, labelTop,
labelSize.width, labelSize.height, theme, labelDivClassName, highlightIndex);
var els = [impreciseTapeElmtData.elmt, tapeElmtData.elmt, labelElmtData.elmt];
var self = this;
var clickHandler = function(elmt, domEvt, target) {
return self._onClickDurationEvent(tapeElmtData.elmt, domEvt, evt);
};
SimileAjax.DOM.registerEvent(tapeElmtData.elmt, "mousedown", clickHandler);
SimileAjax.DOM.registerEvent(labelElmtData.elmt, "mousedown", clickHandler);
var hDiv = this._createHighlightDiv(highlightIndex, tapeElmtData, theme, evt);
if (hDiv != null) {els.push(hDiv);}
this._fireEventPaintListeners('paintedEvent', evt, els);
this._eventIdToElmt[evt.getID()] = tapeElmtData.elmt;
this._tracks[track] = startPixel;
};
Timeline.OriginalEventPainter.prototype._encodeEventElID = function(elType, evt) {
return Timeline.EventUtils.encodeEventElID(this._timeline, this._band, elType, evt);
};
Timeline.OriginalEventPainter.prototype._findFreeTrack = function(event, rightEdge) {
var trackAttribute = event.getTrackNum();
if (trackAttribute != null) {
return trackAttribute; // early return since event includes track number
}
// normal case: find an open track
for (var i = 0; i < this._tracks.length; i++) {
var t = this._tracks[i];
if (t > rightEdge) {
break;
}
}
return i;
};
Timeline.OriginalEventPainter.prototype._paintEventIcon = function(evt, iconTrack, left, metrics, theme, tapeHeight) {
// If no tape, then paint the icon in the middle of the track.
// If there is a tape, paint the icon below the tape + impreciseIconMargin
var icon = evt.getIcon();
icon = icon != null ? icon : metrics.icon;
var top; // top of the icon
if (tapeHeight > 0) {
top = metrics.trackOffset + iconTrack * metrics.trackIncrement +
tapeHeight + metrics.impreciseIconMargin;
} else {
var middle = metrics.trackOffset + iconTrack * metrics.trackIncrement +
metrics.trackHeight / 2;
top = Math.round(middle - metrics.iconHeight / 2);
}
var img = SimileAjax.Graphics.createTranslucentImage(icon);
var iconDiv = this._timeline.getDocument().createElement("div");
iconDiv.className = this._getElClassName('timeline-event-icon', evt, 'icon');
iconDiv.id = this._encodeEventElID('icon', evt);
iconDiv.style.left = left + "px";
iconDiv.style.top = top + "px";
iconDiv.appendChild(img);
if(evt._title != null)
iconDiv.title = evt._title;
this._eventLayer.appendChild(iconDiv);
return {
left: left,
top: top,
width: metrics.iconWidth,
height: metrics.iconHeight,
elmt: iconDiv
};
};
Timeline.OriginalEventPainter.prototype._paintEventLabel = function(evt, text, left, top, width,
height, theme, labelDivClassName, highlightIndex) {
var doc = this._timeline.getDocument();
var labelDiv = doc.createElement("div");
labelDiv.className = labelDivClassName;
labelDiv.id = this._encodeEventElID('label', evt);
labelDiv.style.left = left + "px";
labelDiv.style.width = width + "px";
labelDiv.style.top = top + "px";
labelDiv.innerHTML = text;
if(evt._title != null)
labelDiv.title = evt._title;
var color = evt.getTextColor();
if (color == null) {
color = evt.getColor();
}
if (color != null) {
labelDiv.style.color = color;
}
if (theme.event.highlightLabelBackground && highlightIndex >= 0) {
labelDiv.style.background = this._getHighlightColor(highlightIndex, theme);
}
this._eventLayer.appendChild(labelDiv);
return {
left: left,
top: top,
width: width,
height: height,
elmt: labelDiv
};
};
Timeline.OriginalEventPainter.prototype._paintEventTape = function(
evt, iconTrack, startPixel, endPixel, color, opacity, metrics, theme, tape_index) {
var tapeWidth = endPixel - startPixel;
var tapeHeight = theme.event.tape.height;
var top = metrics.trackOffset + iconTrack * metrics.trackIncrement;
var tapeDiv = this._timeline.getDocument().createElement("div");
tapeDiv.className = this._getElClassName('timeline-event-tape', evt, 'tape');
tapeDiv.id = this._encodeEventElID('tape' + tape_index, evt);
tapeDiv.style.left = startPixel + "px";
tapeDiv.style.width = tapeWidth + "px";
tapeDiv.style.height = tapeHeight + "px";
tapeDiv.style.top = top + "px";
if(evt._title != null)
tapeDiv.title = evt._title;
if(color != null) {
tapeDiv.style.backgroundColor = color;
}
var backgroundImage = evt.getTapeImage();
var backgroundRepeat = evt.getTapeRepeat();
backgroundRepeat = backgroundRepeat != null ? backgroundRepeat : 'repeat';
if(backgroundImage != null) {
tapeDiv.style.backgroundImage = "url(" + backgroundImage + ")";
tapeDiv.style.backgroundRepeat = backgroundRepeat;
}
SimileAjax.Graphics.setOpacity(tapeDiv, opacity);
this._eventLayer.appendChild(tapeDiv);
return {
left: startPixel,
top: top,
width: tapeWidth,
height: tapeHeight,
elmt: tapeDiv
};
}
Timeline.OriginalEventPainter.prototype._getLabelDivClassName = function(evt) {
return this._getElClassName('timeline-event-label', evt, 'label');
};
Timeline.OriginalEventPainter.prototype._getElClassName = function(elClassName, evt, prefix) {
// Prefix and '_' is added to the event's classname. Set to null for no prefix
var evt_classname = evt.getClassName(),
pieces = [];
if (evt_classname) {
if (prefix) {pieces.push(prefix + '-' + evt_classname + ' ');}
pieces.push(evt_classname + ' ');
}
pieces.push(elClassName);
return(pieces.join(''));
};
Timeline.OriginalEventPainter.prototype._getHighlightColor = function(highlightIndex, theme) {
var highlightColors = theme.event.highlightColors;
return highlightColors[Math.min(highlightIndex, highlightColors.length - 1)];
};
Timeline.OriginalEventPainter.prototype._createHighlightDiv = function(highlightIndex, dimensions, theme, evt) {
var div = null;
if (highlightIndex >= 0) {
var doc = this._timeline.getDocument();
var color = this._getHighlightColor(highlightIndex, theme);
div = doc.createElement("div");
div.className = this._getElClassName('timeline-event-highlight', evt, 'highlight');
div.id = this._encodeEventElID('highlight0', evt); // in future will have other
// highlight divs for tapes + icons
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);
}
return div;
};
Timeline.OriginalEventPainter.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.OriginalEventPainter.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.OriginalEventPainter.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.OriginalEventPainter.prototype._showBubble = function(x, y, evt) {
var div = document.createElement("div");
var themeBubble = this._params.theme.event.bubble;
evt.fillInfoBubble(div, this._params.theme, this._band.getLabeller());
SimileAjax.WindowManager.cancelPopups();
SimileAjax.Graphics.createBubbleForContentAndPoint(div, x, y,
themeBubble.width, null, themeBubble.maxHeight);
};
Timeline.OriginalEventPainter.prototype._fireOnSelect = function(eventID) {
for (var i = 0; i < this._onSelectListeners.length; i++) {
this._onSelectListeners[i](eventID);
}
};
Timeline.OriginalEventPainter.prototype._fireEventPaintListeners = function(op, evt, els) {
for (var i = 0; i < this._eventPaintListeners.length; i++) {
this._eventPaintListeners[i](this._band, op, evt, els);
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -