Thanks for getting back to me, do you have a link to your site?
On 9/8/08, mohsin beg <[EMAIL PROTECTED]> wrote:
>
> Hi,
>
> Here you go. A quick hack.
> Using an event like this..
>
> <event start="Nov 01 2007" end="Nov 15 2007" isDuration="true"
> title="Test Task with pctComplete"
> pctComplete="33">
> Test Task with pctComplete
> </event>
>
>
> Use the below my-painter.js file (see_createPctCompleteDiv() function)
> You can diff it with original-painter.js to see the differences
>
> -------------------------------------
> cut------------------------------------------
> /*==================================================
> * Original Event Painter
> *==================================================
> */
>
> Timeline.OriginalEventPainter = function(params) {
> this._params = params;
> this._onSelectListeners = [];
>
> this._filterMatcher = null;
> this._highlightMatcher = null;
> this._frc = null;
>
> this._eventIdToElmt = {};
> };
>
> Timeline.OriginalEventPainter.prototype.initialize = function(band,
> timeline) {
> this._band = band;
> this._timeline = timeline;
>
> this._backLayer = null;
> this._eventLayer = null;
> this._lineLayer = null;
> this._highlightLayer = null;
>
> this._eventIdToElmt = null;
> };
>
> Timeline.OriginalEventPainter.prototype.addOnSelectListener =
> function(listener) {
> this._onSelectListeners.push(listener);
> };
>
> Timeline.OriginalEventPainter.prototype.removeOnSelectListener =
> function(listener) {
> for (var i = 0; i < this._onSelectListeners.length; i++) {
> if (this._onSelectListeners[i] == listener) {
> this._onSelectListeners.splice(i, 1);
> break;
> }
> }
> };
>
> Timeline.OriginalEventPainter.prototype.getFilterMatcher = function()
> {
> return this._filterMatcher;
> };
>
> Timeline.OriginalEventPainter.prototype.setFilterMatcher =
> function(filterMatcher) {
> this._filterMatcher = filterMatcher;
> };
>
> Timeline.OriginalEventPainter.prototype.getHighlightMatcher =
> function() {
> return this._highlightMatcher;
> };
>
> Timeline.OriginalEventPainter.prototype.setHighlightMatcher =
> function(highlightMatcher) {
> this._highlightMatcher = highlightMatcher;
> };
>
> Timeline.OriginalEventPainter.prototype.paint = function() {
> var eventSource = this._band.getEventSource();
> if (eventSource == null) {
> return;
> }
>
> this._eventIdToElmt = {};
> this._prepareForPainting();
>
> var eventTheme = this._params.theme.event;
> var trackHeight = Math.max(eventTheme.track.height,
> eventTheme.tape.height + this._frc.getLineHeight());
> var metrics = {
> trackOffset: eventTheme.track.gap,
> trackHeight: trackHeight,
> trackGap: eventTheme.track.gap,
> trackIncrement: trackHeight + eventTheme.track.gap,
> icon: eventTheme.instant.icon,
> iconWidth: eventTheme.instant.iconWidth,
> iconHeight: eventTheme.instant.iconHeight,
> labelWidth: eventTheme.label.width
> }
>
> var minDate = this._band.getMinDate();
> var maxDate = this._band.getMaxDate();
>
> var filterMatcher = (this._filterMatcher != null) ?
> this._filterMatcher :
> function(evt) { return true; };
> var highlightMatcher = (this._highlightMatcher != null) ?
> this._highlightMatcher :
> function(evt) { return -1; };
>
> var iterator = eventSource.getEventReverseIterator(minDate,
> maxDate);
> while (iterator.hasNext()) {
> var evt = iterator.next();
> if (filterMatcher(evt)) {
> this.paintEvent(evt, metrics, this._params.theme,
> highlightMatcher(evt));
> }
> }
>
> this._highlightLayer.style.display = "block";
> this._lineLayer.style.display = "block";
> this._eventLayer.style.display = "block";
> };
>
> Timeline.OriginalEventPainter.prototype.softPaint = function() {
> };
>
> Timeline.OriginalEventPainter.prototype._prepareForPainting =
> function() {
> var band = this._band;
>
> if (this._backLayer == null) {
> this._backLayer = this._band.createLayerDiv(0, "timeline-band-
> events");
> this._backLayer.style.visibility = "hidden";
>
> var eventLabelPrototype = document.createElement("span");
> eventLabelPrototype.className = "timeline-event-label";
> this._backLayer.appendChild(eventLabelPrototype);
> this._frc =
> SimileAjax.Graphics.getFontRenderingContext(eventLabelPrototype);
> }
> this._frc.update();
> this._tracks = [];
>
> if (this._highlightLayer != null) {
> band.removeLayerDiv(this._highlightLayer);
> }
> this._highlightLayer = band.createLayerDiv(105, "timeline-band-
> highlights");
> this._highlightLayer.style.display = "none";
>
> if (this._lineLayer != null) {
> band.removeLayerDiv(this._lineLayer);
> }
> this._lineLayer = band.createLayerDiv(110, "timeline-band-lines");
> this._lineLayer.style.display = "none";
>
> if (this._eventLayer != null) {
> band.removeLayerDiv(this._eventLayer);
> }
> this._eventLayer = band.createLayerDiv(115, "timeline-band-
> events");
> this._eventLayer.style.display = "none";
> };
>
> Timeline.OriginalEventPainter.prototype.paintEvent = function(evt,
> metrics, theme, highlightIndex) {
> if (evt.isInstant()) {
> this.paintInstantEvent(evt, metrics, theme, highlightIndex);
> } else {
> this.paintDurationEvent(evt, metrics, theme, highlightIndex);
> }
> };
>
> Timeline.OriginalEventPainter.prototype.paintInstantEvent =
> function(evt, metrics, theme, highlightIndex) {
> if (evt.isImprecise()) {
> this.paintImpreciseInstantEvent(evt, metrics, theme,
> highlightIndex);
> } else {
> this.paintPreciseInstantEvent(evt, metrics, theme,
> highlightIndex);
> }
> }
>
> Timeline.OriginalEventPainter.prototype.paintDurationEvent =
> function(evt, metrics, theme, highlightIndex) {
> if (evt.isImprecise()) {
> this.paintImpreciseDurationEvent(evt, metrics, theme,
> highlightIndex);
> } else {
> this.paintPreciseDurationEvent(evt, metrics, theme,
> highlightIndex);
> }
> }
>
> Timeline.OriginalEventPainter.prototype.paintPreciseInstantEvent =
> function(evt, metrics, theme, highlightIndex) {
> var doc = this._timeline.getDocument();
> var text = evt.getText();
>
> var startDate = evt.getStart();
> var startPixel =
> Math.round(this._band.dateToPixelOffset(startDate));
> var iconRightEdge = Math.round(startPixel + metrics.iconWidth /
> 2);
> var iconLeftEdge = Math.round(startPixel - metrics.iconWidth / 2);
>
> var labelSize = this._frc.computeSize(text);
> var labelLeft = iconRightEdge + theme.event.label.offsetFromLine;
> var labelRight = labelLeft + labelSize.width;
>
> var rightEdge = labelRight;
> var track = this._findFreeTrack(rightEdge);
>
> var labelTop = Math.round(
> metrics.trackOffset + track * metrics.trackIncrement +
> metrics.trackHeight / 2 - labelSize.height / 2);
>
> var iconElmtData = this._paintEventIcon(evt, track, iconLeftEdge,
> metrics, theme);
> var labelElmtData = this._paintEventLabel(evt, text, labelLeft,
> labelTop, labelSize.width, labelSize.height, theme);
>
> var self = this;
> var clickHandler = function(elmt, domEvt, target) {
> return self._onClickInstantEvent(iconElmtData.elmt, domEvt,
> evt);
> };
> SimileAjax.DOM.registerEvent(iconElmtData.elmt, "mousedown",
> clickHandler);
> SimileAjax.DOM.registerEvent(labelElmtData.elmt, "mousedown",
> clickHandler);
>
> this._createHighlightDiv(highlightIndex, iconElmtData, theme);
>
> this._eventIdToElmt[evt.getID()] = iconElmtData.elmt;
> this._tracks[track] = iconLeftEdge;
> };
>
> Timeline.OriginalEventPainter.prototype.paintImpreciseInstantEvent =
> function(evt, metrics, theme, highlightIndex) {
> var doc = this._timeline.getDocument();
> var text = evt.getText();
>
> 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 iconRightEdge = Math.round(startPixel + metrics.iconWidth /
> 2);
> var iconLeftEdge = Math.round(startPixel - metrics.iconWidth / 2);
>
> var labelSize = this._frc.computeSize(text);
> var labelLeft = iconRightEdge + theme.event.label.offsetFromLine;
> var labelRight = labelLeft + labelSize.width;
>
> var rightEdge = Math.max(labelRight, endPixel);
> var track = this._findFreeTrack(rightEdge);
> var labelTop = Math.round(
> metrics.trackOffset + track * metrics.trackIncrement +
> metrics.trackHeight / 2 - labelSize.height / 2);
>
> var iconElmtData = this._paintEventIcon(evt, track, iconLeftEdge,
> metrics, theme);
> var labelElmtData = this._paintEventLabel(evt, text, labelLeft,
> labelTop, labelSize.width, labelSize.height, theme);
> var tapeElmtData = this._paintEventTape(evt, track, startPixel,
> endPixel,
> theme.event.instant.impreciseColor,
> theme.event.instant.impreciseOpacity, metrics, theme);
>
> var self = this;
> var clickHandler = function(elmt, domEvt, target) {
> return self._onClickInstantEvent(iconElmtData.elmt, domEvt,
> evt);
> };
> SimileAjax.DOM.registerEvent(iconElmtData.elmt, "mousedown",
> clickHandler);
> SimileAjax.DOM.registerEvent(tapeElmtData.elmt, "mousedown",
> clickHandler);
> SimileAjax.DOM.registerEvent(labelElmtData.elmt, "mousedown",
> clickHandler);
>
> this._createHighlightDiv(highlightIndex, iconElmtData, theme);
>
> this._eventIdToElmt[evt.getID()] = iconElmtData.elmt;
> this._tracks[track] = iconLeftEdge;
> };
>
> Timeline.OriginalEventPainter.prototype.paintPreciseDurationEvent =
> function(evt, metrics, theme, highlightIndex) {
> var doc = this._timeline.getDocument();
> var text = evt.getText();
>
> 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 pctComplete = evt.getProperty("pctComplete");
> if (pctComplete == null || pctComplete.length == 0) {
> pctComplete = 0;
> }
> text = text + " [" + pctComplete + "%]";
>
> var labelSize = this._frc.computeSize(text);
> var labelLeft = startPixel;
> var labelRight = labelLeft + labelSize.width;
>
> var rightEdge = Math.max(labelRight, endPixel);
> var track = this._findFreeTrack(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);
> var labelElmtData = this._paintEventLabel(evt, text, labelLeft,
> labelTop, labelSize.width, labelSize.height, theme);
> var pctCompleteElmtData =
> this._createPctCompleteDiv(highlightIndex, tapeElmtData, theme, evt);
>
> 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);
> SimileAjax.DOM.registerEvent(pctCompleteElmtData.elmt,
> "mousedown", clickHandler);
>
> this._createHighlightDiv(highlightIndex, tapeElmtData, theme);
>
> 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 labelSize = this._frc.computeSize(text);
> var labelLeft = latestStartPixel;
> var labelRight = labelLeft + labelSize.width;
>
> var rightEdge = Math.max(labelRight, endPixel);
> var track = this._findFreeTrack(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 impreciseTapeElmtData = this._paintEventTape(evt, track,
> startPixel, endPixel,
> theme.event.duration.impreciseColor,
> theme.event.duration.impreciseOpacity, metrics, theme);
> var tapeElmtData = this._paintEventTape(evt, track,
> latestStartPixel, earliestEndPixel, color, 100, metrics, theme);
>
> var labelElmtData = this._paintEventLabel(evt, text, labelLeft,
> labelTop, labelSize.width, labelSize.height, theme);
>
> 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);
>
> this._createHighlightDiv(highlightIndex, tapeElmtData, theme);
>
> this._eventIdToElmt[evt.getID()] = tapeElmtData.elmt;
> this._tracks[track] = startPixel;
> };
>
> Timeline.OriginalEventPainter.prototype._findFreeTrack =
> function(rightEdge) {
> 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) {
> var icon = evt.getIcon();
> icon = icon != null ? icon : metrics.icon;
>
> var middle = metrics.trackOffset + iconTrack *
> metrics.trackIncrement + metrics.trackHeight / 2;
> var top = Math.round(middle - metrics.iconHeight / 2);
>
> var img = SimileAjax.Graphics.createTranslucentImage(icon);
> var iconDiv = this._timeline.getDocument().createElement("div");
> iconDiv.style.position = "absolute";
> iconDiv.style.left = left + "px";
> iconDiv.style.top = top + "px";
> iconDiv.appendChild(img);
> iconDiv.style.cursor = "pointer";
> 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) {
> var doc = this._timeline.getDocument();
>
> var labelDiv = doc.createElement("div");
> labelDiv.style.position = "absolute";
> labelDiv.style.left = left + "px";
> labelDiv.style.width = width + "px";
> labelDiv.style.top = top + "px";
> labelDiv.innerHTML = text;
> labelDiv.style.cursor = "pointer";
>
> var color = evt.getTextColor();
> if (color == null) {
> color = evt.getColor();
> }
> if (color != null) {
> labelDiv.style.color = color;
> }
>
> 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) {
>
> 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.style.position = "absolute";
> tapeDiv.style.left = startPixel + "px";
> tapeDiv.style.width = tapeWidth + "px";
> tapeDiv.style.top = top + "px";
> tapeDiv.style.height = tapeHeight + "px";
> tapeDiv.style.backgroundColor = color;
> tapeDiv.style.overflow = "hidden";
> tapeDiv.style.cursor = "pointer";
> SimileAjax.Graphics.setOpacity(tapeDiv, opacity);
>
> this._eventLayer.appendChild(tapeDiv);
>
> return {
> left: startPixel,
> top: top,
> width: tapeWidth,
> height: tapeHeight,
> elmt: tapeDiv
> };
> }
>
> Timeline.OriginalEventPainter.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.OriginalEventPainter.prototype._createPctCompleteDiv =
> function(highlightIndex, dimensions, theme, evt) {
>
> var doc = this._timeline.getDocument();
> var eventTheme = theme.event;
>
> var color =
> eventTheme.highlightColors[Math.min(highlightIndex>=0?
> highlightIndex:0
> ,eventTheme.highlightColors.length
> - 1)];
>
> var pctComplete = evt.getProperty("pctComplete");
> var widthReduction = dimensions.width - 2;
> if (pctComplete != null && pctComplete.length > 0) {
> widthReduction = Math.round(dimensions.width * (100 - pctComplete)/
> 100 );
> widthReduction = (widthReduction <= 0) ? 2 : widthReduction;
> }
>
> var div = doc.createElement("div");
> div.style.position = "absolute";
> div.style.overflow = "hidden";
> div.style.cursor = "pointer";
> div.style.left = (dimensions.left + 1) + "px";
>
> div.style.width = (dimensions.width - widthReduction) + "px";
>
> div.style.top = (dimensions.top + 1) + "px";
> div.style.height = (dimensions.height - 2) + "px";
> div.style.background = color;
>
> this._eventLayer.appendChild(div);
>
> return {
> left: dimensions.left + 1,
> top: dimensions.top + 1,
> width: dimensions.width - widthReduction,
> height: dimensions.height - 2,
> elmt: 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");
> evt.fillInfoBubble(div, this._params.theme,
> this._band.getLabeller());
>
> SimileAjax.WindowManager.cancelPopups();
> SimileAjax.Graphics.createBubbleForContentAndPoint(div, x, y,
> this._params.theme.event.bubble.width);
> };
>
> Timeline.OriginalEventPainter.prototype._fireOnSelect =
> function(eventID) {
> for (var i = 0; i < this._onSelectListeners.length; i++) {
> this._onSelectListeners[i](eventID);
> }
> };
> -------------------------------------
> cut------------------------------------------
>
> Sincerely,
>
> -Mohsin
>
>
> On Aug 20, 11:27 pm, mohsin beg <[EMAIL PROTECTED]> wrote:
>> Hi,
>>
>> I am looking for suggestions as how I can show an event progress/
>> completion (via a "percentage_complete" event attribute) or some other
>> means (e.g. like showing an event pair aligned vertically etc).
>>
>> I am using timeline (very successfully) to manage a complex project,
>> but it's hard to communicate to other team members about the current
>> status, or percentage complete, of each task (i.e. event).
>>
>> Thank you in advance for your suggestions.
>>
>> Sincerely,
>>
>> -Mohsin
> >
>
--
Sent from Gmail for mobile | mobile.google.com
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"SIMILE Widgets" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/simile-widgets?hl=en
-~----------~----~----~----~------~----~------~--~---