private static final int MIN_NAME_WIDTH = 6;
private static final int MAX_NAME_WIDTH = 1000;
private static final int DEFAULT_HEIGHT = 22;
- private static final long RECENTERING_MARGIN_FACTOR = 50;
private static final String HIDE_ARROWS_KEY = "hide.arrows"; //$NON-NLS-1$
private static final long DEFAULT_FREQUENCY = 1000000000L;
private static final int H_SCROLLBAR_MAX = Integer.MAX_VALUE - 1;
@Override
public void setSelectionRangeNotify(long beginTime, long endTime) {
+ long time0 = fTime0;
+ long time1 = fTime1;
boolean changed = (beginTime != fSelectionBegin || endTime != fSelectionEnd);
fSelectionBegin = Math.max(fTime0Bound, Math.min(fTime1Bound, beginTime));
fSelectionEnd = Math.max(fTime0Bound, Math.min(fTime1Bound, endTime));
+ ensureVisible(fSelectionEnd);
fTimeGraphCtrl.redraw();
fTimeScaleCtrl.redraw();
+ if ((time0 != fTime0) || (time1 != fTime1)) {
+ notifyRangeListeners();
+ }
if (changed) {
notifyTimeListeners();
}
long time0 = fTime0;
long time1 = fTime1;
if (ensureVisible) {
- long timeSpace = (fTime1 - fTime0) / RECENTERING_MARGIN_FACTOR;
- long timeMid = (fTime1 - fTime0) / 2;
- if (time < fTime0 + timeSpace) {
- long dt = fTime0 - time + timeMid;
- fTime0 -= dt;
- fTime1 -= dt;
- } else if (time > fTime1 - timeSpace) {
- long dt = time - fTime1 + timeMid;
- fTime0 += dt;
- fTime1 += dt;
- }
- if (fTime0 < fTime0Bound) {
- fTime1 = Math.min(fTime1Bound, fTime1 + (fTime0Bound - fTime0));
- fTime0 = fTime0Bound;
- } else if (fTime1 > fTime1Bound) {
- fTime0 = Math.max(fTime0Bound, fTime0 - (fTime1 - fTime1Bound));
- fTime1 = fTime1Bound;
- }
+ ensureVisible(time);
}
- if (fTime1 - fTime0 < fMinTimeInterval) {
- fTime1 = Math.min(fTime1Bound, fTime0 + fMinTimeInterval);
- }
- adjustHorizontalScrollBar();
fTimeGraphCtrl.redraw();
fTimeScaleCtrl.redraw();
}
}
+ private void ensureVisible(long time) {
+ long timeMid = (fTime1 - fTime0) / 2;
+ if (time < fTime0) {
+ long dt = fTime0 - time + timeMid;
+ fTime0 -= dt;
+ fTime1 -= dt;
+ } else if (time > fTime1) {
+ long dt = time - fTime1 + timeMid;
+ fTime0 += dt;
+ fTime1 += dt;
+ }
+ if (fTime0 < fTime0Bound) {
+ fTime1 = Math.min(fTime1Bound, fTime1 + (fTime0Bound - fTime0));
+ fTime0 = fTime0Bound;
+ } else if (fTime1 > fTime1Bound) {
+ fTime0 = Math.max(fTime0Bound, fTime0 - (fTime1 - fTime1Bound));
+ fTime1 = fTime1Bound;
+ }
+ if (fTime1 - fTime0 < fMinTimeInterval) {
+ fTime1 = Math.min(fTime1Bound, fTime0 + fMinTimeInterval);
+ }
+ adjustHorizontalScrollBar();
+ }
+
@Override
public void widgetDefaultSelected(SelectionEvent e) {
if (fSelectedEntry != getSelection()) {
/**
* Callback for when the next event is selected
+ *
+ * @param extend
+ * true to extend selection range, false for single selection
+ * @since 1.0
*/
- public void selectNextEvent() {
- fTimeGraphCtrl.selectNextEvent();
+ public void selectNextEvent(boolean extend) {
+ fTimeGraphCtrl.selectNextEvent(extend);
adjustVerticalScrollBar();
}
/**
* Callback for when the previous event is selected
+ *
+ * @param extend
+ * true to extend selection range, false for single selection
+ * @since 1.0
*/
- public void selectPrevEvent() {
- fTimeGraphCtrl.selectPrevEvent();
+ public void selectPrevEvent(boolean extend) {
+ fTimeGraphCtrl.selectPrevEvent(extend);
adjustVerticalScrollBar();
}
if (fNextEventAction == null) {
fNextEventAction = new Action() {
@Override
- public void run() {
- selectNextEvent();
+ public void runWithEvent(Event event) {
+ boolean extend = (event.stateMask & SWT.SHIFT) != 0;
+ selectNextEvent(extend);
}
};
if (fPrevEventAction == null) {
fPrevEventAction = new Action() {
@Override
- public void run() {
- selectPrevEvent();
+ public void runWithEvent(Event event) {
+ boolean extend = (event.stateMask & SWT.SHIFT) != 0;
+ selectPrevEvent(extend);
}
};
if (fFollowArrowFwdAction == null) {
fFollowArrowFwdAction = new Action() {
@Override
- public void run() {
- fTimeGraphCtrl.followArrowFwd();
+ public void runWithEvent(Event event) {
+ boolean extend = (event.stateMask & SWT.SHIFT) != 0;
+ fTimeGraphCtrl.followArrowFwd(extend);
adjustVerticalScrollBar();
}
};
if (fFollowArrowBwdAction == null) {
fFollowArrowBwdAction = new Action() {
@Override
- public void run() {
- fTimeGraphCtrl.followArrowBwd();
+ public void runWithEvent(Event event) {
+ boolean extend = (event.stateMask & SWT.SHIFT) != 0;
+ fTimeGraphCtrl.followArrowBwd(extend);
adjustVerticalScrollBar();
}
};
private static final int ARROW_HOVER_MAX_DIST = 5;
private static final int NO_STATUS = -1;
+ private static final int STATUS_WITHOUT_CURSOR_TIME = -2;
/** Resource manager */
private LocalResourceManager fResourceManager = new LocalResourceManager(JFaceResources.getResources());
*
* @param n
* 1 for next event, -1 for previous event
+ * @param extend
+ * true to extend selection range, false for single selection
+ * @since 1.0
*/
- public void selectEvent(int n) {
+ public void selectEvent(int n, boolean extend) {
if (null == fTimeProvider) {
return;
}
if (trace == null) {
return;
}
- long selectedTime = fTimeProvider.getSelectionBegin();
+ long selectedTime = fTimeProvider.getSelectionEnd();
long endTime = fTimeProvider.getMaxTime();
ITimeEvent nextEvent;
- if (-1 == n && selectedTime > endTime) {
+ if (n == -1 && selectedTime > endTime) {
nextEvent = Utils.findEvent(trace, selectedTime, 0);
} else {
nextEvent = Utils.findEvent(trace, selectedTime, n);
}
- if (null == nextEvent && -1 == n) {
+ if (null == nextEvent && n == -1) {
nextEvent = Utils.getFirstEvent(trace);
}
if (null != nextEvent) {
// for previous event go to its end time unless we were already there
nextTime = nextEvent.getTime() + nextEvent.getDuration();
}
- fTimeProvider.setSelectedTimeNotify(nextTime, true);
+ if (extend) {
+ fTimeProvider.setSelectionRangeNotify(fTimeProvider.getSelectionBegin(), nextTime);
+ } else {
+ fTimeProvider.setSelectedTimeNotify(nextTime, true);
+ }
fireSelectionChanged();
- } else if (1 == n) {
- fTimeProvider.setSelectedTimeNotify(endTime, true);
+ } else if (n == 1) {
+ if (extend) {
+ fTimeProvider.setSelectionRangeNotify(fTimeProvider.getSelectionBegin(), endTime);
+ } else {
+ fTimeProvider.setSelectedTimeNotify(endTime, true);
+ }
fireSelectionChanged();
}
+ updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
}
/**
* Select the next event
+ *
+ * @param extend
+ * true to extend selection range, false for single selection
+ * @since 1.0
*/
- public void selectNextEvent() {
- selectEvent(1);
+ public void selectNextEvent(boolean extend) {
+ selectEvent(1, extend);
// Notify if visible time window has been adjusted
fTimeProvider.setStartFinishTimeNotify(fTimeProvider.getTime0(), fTimeProvider.getTime1());
}
/**
* Select the previous event
+ *
+ * @param extend
+ * true to extend selection range, false for single selection
+ * @since 1.0
*/
- public void selectPrevEvent() {
- selectEvent(-1);
+ public void selectPrevEvent(boolean extend) {
+ selectEvent(-1, extend);
// Notify if visible time window has been adjusted
fTimeProvider.setStartFinishTimeNotify(fTimeProvider.getTime0(), fTimeProvider.getTime1());
}
/**
* Follow the arrow forward
+ *
+ * @param extend
+ * true to extend selection range, false for single selection
+ * @since 1.0
*/
- public void followArrowFwd() {
+ public void followArrowFwd(boolean extend) {
ITimeGraphEntry trace = getSelectedTrace();
if (trace == null) {
return;
}
- long selectedTime = fTimeProvider.getSelectionBegin();
+ long selectedTime = fTimeProvider.getSelectionEnd();
for (ILinkEvent link : fItemData.fLinks) {
if (link.getEntry() == trace && link.getTime() == selectedTime) {
selectItem(link.getDestinationEntry(), false);
if (link.getDuration() != 0) {
- fTimeProvider.setSelectedTimeNotify(link.getTime() + link.getDuration(), true);
+ if (extend) {
+ fTimeProvider.setSelectionRangeNotify(fTimeProvider.getSelectionBegin(), link.getTime() + link.getDuration());
+ } else {
+ fTimeProvider.setSelectedTimeNotify(link.getTime() + link.getDuration(), true);
+ }
// Notify if visible time window has been adjusted
fTimeProvider.setStartFinishTimeNotify(fTimeProvider.getTime0(), fTimeProvider.getTime1());
}
fireSelectionChanged();
+ updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
return;
}
}
- selectNextEvent();
+ selectNextEvent(extend);
}
/**
* Follow the arrow backward
+ *
+ * @param extend
+ * true to extend selection range, false for single selection
+ * @since 1.0
*/
- public void followArrowBwd() {
+ public void followArrowBwd(boolean extend) {
ITimeGraphEntry trace = getSelectedTrace();
if (trace == null) {
return;
}
- long selectedTime = fTimeProvider.getSelectionBegin();
+ long selectedTime = fTimeProvider.getSelectionEnd();
for (ILinkEvent link : fItemData.fLinks) {
if (link.getDestinationEntry() == trace && link.getTime() + link.getDuration() == selectedTime) {
selectItem(link.getEntry(), false);
if (link.getDuration() != 0) {
- fTimeProvider.setSelectedTimeNotify(link.getTime(), true);
+ if (extend) {
+ fTimeProvider.setSelectionRangeNotify(fTimeProvider.getSelectionBegin(), link.getTime());
+ } else {
+ fTimeProvider.setSelectedTimeNotify(link.getTime(), true);
+ }
// Notify if visible time window has been adjusted
fTimeProvider.setStartFinishTimeNotify(fTimeProvider.getTime0(), fTimeProvider.getTime1());
}
fireSelectionChanged();
+ updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
return;
}
}
- selectPrevEvent();
+ selectPrevEvent(extend);
}
/**
ITimeGraphEntry entry = item.fEntry;
long time0 = timeProvider.getTime0();
long time1 = timeProvider.getTime1();
- long selectedTime = fTimeProvider.getSelectionBegin();
+ long selectedTime = fTimeProvider.getSelectionEnd();
Rectangle nameRect = getNameRect(bounds, i, nameSpace);
if (nameRect.y >= bounds.y + bounds.height) {
} else if (idx > 0) {
idx--;
}
- } else if (SWT.ARROW_LEFT == e.keyCode) {
- selectPrevEvent();
- } else if (SWT.ARROW_RIGHT == e.keyCode) {
- selectNextEvent();
+ } else if (SWT.ARROW_LEFT == e.keyCode && fDragState == DRAG_NONE) {
+ boolean extend = (e.stateMask & SWT.SHIFT) != 0;
+ selectPrevEvent(extend);
+ } else if (SWT.ARROW_RIGHT == e.keyCode && fDragState == DRAG_NONE) {
+ boolean extend = (e.stateMask & SWT.SHIFT) != 0;
+ selectNextEvent(extend);
} else if (SWT.PAGE_DOWN == e.keyCode) {
int page = countPerPage();
idx = getSelectedIndex();
public void focusGained(FocusEvent e) {
fIsInFocus = true;
redraw();
- updateStatusLine(NO_STATUS);
+ updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
}
@Override
TimeFormat tf = tdp.getTimeFormat();
Resolution res = Resolution.NANOSEC;
StringBuilder message = new StringBuilder();
- if (x >= 0 && fDragState == DRAG_NONE) {
- long time = getTimeAtX(x);
- if (time >= 0) {
- if (tdp instanceof ITimeDataProviderConverter) {
- time = ((ITimeDataProviderConverter) tdp).convertTime(time);
- }
- long selectionBegin = tdp.getSelectionBegin();
- long selectionEnd = tdp.getSelectionEnd();
- message.append(NLS.bind("T: {0}{1} T1: {2}{3}", //$NON-NLS-1$
- new Object[] {
- tf == TimeFormat.CALENDAR ? Utils.formatDate(time) + ' ' : "", //$NON-NLS-1$
- Utils.formatTime(time, tf, res),
- tf == TimeFormat.CALENDAR ? Utils.formatDate(selectionBegin) + ' ' : "", //$NON-NLS-1$
- Utils.formatTime(selectionBegin, tf, res)
- }));
- if (selectionBegin != selectionEnd) {
- message.append(NLS.bind(" T2: {0}{1} \u0394: {2}", //$NON-NLS-1$
+ if ((x >= 0 || x == STATUS_WITHOUT_CURSOR_TIME) && fDragState == DRAG_NONE) {
+ if (x != STATUS_WITHOUT_CURSOR_TIME) {
+ long time = getTimeAtX(x);
+ if (time >= 0) {
+ if (tdp instanceof ITimeDataProviderConverter) {
+ time = ((ITimeDataProviderConverter) tdp).convertTime(time);
+ }
+ message.append(NLS.bind("T: {0}{1} ", //$NON-NLS-1$
new Object[] {
- tf == TimeFormat.CALENDAR ? Utils.formatDate(selectionEnd) + ' ' : "", //$NON-NLS-1$
- Utils.formatTime(selectionEnd, tf, res),
- Utils.formatDelta(selectionEnd - selectionBegin, tf, res)
+ tf == TimeFormat.CALENDAR ? Utils.formatDate(time) + ' ' : "", //$NON-NLS-1$
+ Utils.formatTime(time, tf, res)
}));
}
}
+ long selectionBegin = tdp.getSelectionBegin();
+ long selectionEnd = tdp.getSelectionEnd();
+ message.append(NLS.bind("T1: {0}{1}", //$NON-NLS-1$
+ new Object[] {
+ tf == TimeFormat.CALENDAR ? Utils.formatDate(selectionBegin) + ' ' : "", //$NON-NLS-1$
+ Utils.formatTime(selectionBegin, tf, res)
+ }));
+ if (selectionBegin != selectionEnd) {
+ message.append(NLS.bind(" T2: {0}{1} \u0394: {2}", //$NON-NLS-1$
+ new Object[] {
+ tf == TimeFormat.CALENDAR ? Utils.formatDate(selectionEnd) + ' ' : "", //$NON-NLS-1$
+ Utils.formatTime(selectionEnd, tf, res),
+ Utils.formatDelta(selectionEnd - selectionBegin, tf, res)
+ }));
+ }
} else if (fDragState == DRAG_SELECTION || fDragState == DRAG_ZOOM) {
long time0 = fDragBeginMarker ? getTimeAtX(fDragX0) : fDragTime0;
long time = fDragBeginMarker ? fDragTime0 : getTimeAtX(fDragX);
fMouseOverSplitLine = false;
redraw();
}
- updateStatusLine(NO_STATUS);
+ updateStatusLine(STATUS_WITHOUT_CURSOR_TIME);
}
@Override