private final Color fLastEventColor = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED);
private final Color fHistoBarColor = new Color(Display.getDefault(), 74, 112, 139);
private final Color fLostEventColor = new Color(Display.getCurrent(), 208, 62, 120);
+ private final Color fFillColor = Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
// ------------------------------------------------------------------------
// Attributes
synchronized (fDataModel) {
if (fScaledData != null) {
fCanvas.redraw();
- if (fDataModel.getNbEvents() != 0) {
- // Display histogram and update X-,Y-axis
- // labels
- fTimeRangeStartText.setText(TmfTimestampFormat.getDefaulTimeFormat().format(fDataModel.getFirstBucketTime()));
- fTimeRangeEndText.setText(TmfTimestampFormat.getDefaulTimeFormat().format(fDataModel.getEndTime()));
- } else {
- fTimeRangeStartText.setText(""); //$NON-NLS-1$
- fTimeRangeEndText.setText(""); //$NON-NLS-1$
- }
+ // Display histogram and update X-,Y-axis labels
+ updateRangeTextControls();
long maxNbEvents = HistogramScaledData.hideLostEvents ? fScaledData.fMaxValue : fScaledData.fMaxCombinedValue;
fMaxNbEventsText.setText(Long.toString(maxNbEvents));
// The Y-axis area might need to be re-sized
// ------------------------------------------------------------------------
private void updateSelectionTime() {
+ fSelectionBegin = Math.min(fSelectionBegin, fDataModel.getEndTime());
+ fSelectionEnd = Math.min(fSelectionEnd, fDataModel.getEndTime());
((HistogramView) fParentView).updateSelectionTime(fSelectionBegin, fSelectionEnd);
}
+ /**
+ * Update the range text controls
+ */
+ private void updateRangeTextControls() {
+ if (fDataModel != null && fDataModel.getStartTime() < fDataModel.getEndTime()) {
+ fTimeRangeStartText.setText(TmfTimestampFormat.getDefaulTimeFormat().format(fDataModel.getStartTime()));
+ fTimeRangeEndText.setText(TmfTimestampFormat.getDefaulTimeFormat().format(fDataModel.getEndTime()));
+ } else {
+ fTimeRangeStartText.setText(""); //$NON-NLS-1$
+ fTimeRangeEndText.setText(""); //$NON-NLS-1$
+ }
+ }
+
// ------------------------------------------------------------------------
// PaintListener
// ------------------------------------------------------------------------
}
}
- // Add a dashed line as a delimiter (at the right of the last bar)
- int lastEventIndex = limit - 1;
- while (lastEventIndex >= 0 && scaledData.fData[lastEventIndex] == 0) {
- lastEventIndex--;
- }
- lastEventIndex += (lastEventIndex < limit - 1) ? 1 : 0;
- drawDelimiter(imageGC, fLastEventColor, height, lastEventIndex);
+ // Add a dashed line as a delimiter
+ int delimiterIndex = (int) ((getDataModel().getEndTime() - scaledData.getFirstBucketTime()) / scaledData.fBucketDuration) + 1;
+ drawDelimiter(imageGC, fLastEventColor, height, delimiterIndex);
+
+ // Fill the area to the right of delimiter with background color
+ imageGC.setBackground(fFillColor);
+ imageGC.fillRectangle(delimiterIndex + 1, 0, width - (delimiterIndex + 1), height);
// Draw the selection bars
int alpha = imageGC.getAlpha();
if (beginBucket >= 0 && beginBucket < limit) {
imageGC.drawLine(beginBucket, 0, beginBucket, height);
}
- final int endBucket = Math.min(lastEventIndex, scaledData.fSelectionEndBucket);
+ final int endBucket = scaledData.fSelectionEndBucket;
if (endBucket >= 0 && endBucket < limit && endBucket != beginBucket) {
imageGC.drawLine(endBucket, 0, endBucket, height);
}
return;
}
- String newTS = TmfTimestampFormat.getDefaulTimeFormat().format(fDataModel.getFirstBucketTime());
- fTimeRangeStartText.setText(newTS);
-
- newTS = TmfTimestampFormat.getDefaulTimeFormat().format(fDataModel.getEndTime());
- fTimeRangeEndText.setText(newTS);
+ updateRangeTextControls();
fComposite.layout();
}
// Timestamps
private long fFirstBucketTime; // could be negative when analyzing events with descending order!!!
private long fFirstEventTime;
- private long fLastEventTime;
+ private long fEndTime;
private long fSelectionBegin;
private long fSelectionEnd;
private long fTimeLimit;
* @since 2.0
*/
public HistogramDataModel(long startTime, int nbBuckets) {
- fFirstBucketTime = fFirstEventTime = fLastEventTime = startTime;
+ fFirstBucketTime = fFirstEventTime = fEndTime = startTime;
fNbBuckets = nbBuckets;
fBuckets = new long[nbBuckets];
fLostEventsBuckets = new long[nbBuckets];
fLastBucket = other.fLastBucket;
fFirstBucketTime = other.fFirstBucketTime;
fFirstEventTime = other.fFirstEventTime;
- fLastEventTime = other.fLastEventTime;
+ fEndTime = other.fEndTime;
fSelectionBegin = other.fSelectionBegin;
fSelectionEnd = other.fSelectionEnd;
fTimeLimit = other.fTimeLimit;
* @since 2.0
*/
public void setTimeRange(long startTime, long endTime) {
- fFirstBucketTime = fFirstEventTime = fLastEventTime = startTime;
+ fFirstBucketTime = fFirstEventTime = fEndTime = startTime;
fBucketDuration = 1;
updateEndTime();
while (endTime >= fTimeLimit) {
}
/**
- * Returns the time of the last event in the model.
+ * Set the end time. Setting this ensures that the corresponding bucket is
+ * displayed regardless of the event counts.
*
- * @return the time of last event.
+ * @param endTime
+ * the time of the last used bucket
+ * @since 2.2
+ */
+ public void setEndTime(long endTime) {
+ fEndTime = endTime;
+ fLastBucket = (int) ((endTime - fFirstBucketTime) / fBucketDuration);
+ }
+
+ /**
+ * Returns the end time.
+ *
+ * @return the time of the last used bucket
*/
public long getEndTime() {
- return fLastEventTime;
+ return fEndTime;
}
/**
Arrays.fill(fLostEventsBuckets, 0);
fNbEvents = 0;
fFirstBucketTime = 0;
- fLastEventTime = 0;
+ fEndTime = 0;
fSelectionBegin = 0;
fSelectionEnd = 0;
fLastBucket = 0;
fFirstEventTime = timestamp;
}
- if (fLastEventTime < timestamp) {
- fLastEventTime = timestamp;
+ if (fEndTime < timestamp) {
+ fEndTime = timestamp;
}
if (timestamp >= fFirstBucketTime) {
// Set selection begin and end index in the scaled histogram
if (fSelectionBegin < fFirstBucketTime) {
result.fSelectionBeginBucket = -1;
- } else if (fSelectionBegin > fLastEventTime) {
+ } else if (fSelectionBegin > fEndTime) {
result.fSelectionBeginBucket = fLastBucket;
} else {
result.fSelectionBeginBucket = (int) ((fSelectionBegin - fFirstBucketTime) / fBucketDuration) / bucketsPerBar;
}
if (fSelectionEnd < fFirstBucketTime) {
result.fSelectionEndBucket = -1;
- } else if (fSelectionEnd > fLastEventTime) {
+ } else if (fSelectionEnd > fEndTime) {
result.fSelectionEndBucket = fLastBucket;
} else {
result.fSelectionEndBucket = (int) ((fSelectionEnd - fFirstBucketTime) / fBucketDuration) / bucketsPerBar;