1 /*******************************************************************************
2 * Copyright (c) 2010 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.tmf
.ui
.views
.timechart
;
15 import java
.util
.ArrayList
;
16 import java
.util
.Iterator
;
18 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
19 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.model
.ITimeEvent
;
20 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.model
.ITmfTimeAnalysisEntry
;
21 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.colors
.ColorSettingsManager
;
23 public class TimeChartEvent
implements ITimeEvent
{
25 private static final byte TIMESTAMP_SCALE
= -9;
27 private TimeChartAnalysisEntry fParentEntry
;
29 private long fDuration
;
30 private long fFirstRank
;
31 private long fLastRank
;
32 private RankRangeList fRankRangeList
;
33 private long fNbEvents
;
34 private int fColorSettingPriority
;
35 private boolean fIsBookmark
;
36 private boolean fIsVisible
;
37 private boolean fIsSearchMatch
;
38 private TimeChartAnalysisEntry fItemizedEntry
;
39 private boolean fItemizing
;
41 public TimeChartEvent(TimeChartAnalysisEntry parentEntry
, ITmfEvent event
, long rank
, TimeChartDecorationProvider decorationProvider
) {
42 fParentEntry
= parentEntry
;
43 fTime
= event
.getTimestamp().normalize(0, TIMESTAMP_SCALE
).getValue();
45 fFirstRank
= fLastRank
= rank
;
46 fRankRangeList
= new RankRangeList(rank
);
48 fColorSettingPriority
= ColorSettingsManager
.getColorSettingPriority(event
);
49 fIsBookmark
= decorationProvider
.isBookmark(rank
);
50 fIsVisible
= decorationProvider
.isVisible(event
);
51 fIsSearchMatch
= decorationProvider
.isSearchMatch(event
);
55 public ITmfTimeAnalysisEntry
getEntry() {
60 public long getTime() {
65 public long getDuration() {
69 public long getFirstRank() {
73 public long getLastRank() {
77 public RankRangeList
getRankRangeList() {
78 return fRankRangeList
;
81 public void merge(TimeChartEvent event
) {
82 mergeDecorations(event
);
83 if (fTime
== event
.getTime() && fDuration
== event
.getDuration()) return;
84 long endTime
= Math
.max(fTime
+ fDuration
, event
.getTime() + event
.getDuration());
85 fTime
= Math
.min(fTime
, event
.getTime());
86 fDuration
= endTime
- fTime
;
87 fFirstRank
= Math
.min(fFirstRank
, event
.fFirstRank
);
88 fLastRank
= Math
.max(fLastRank
, event
.fLastRank
);
89 fNbEvents
+= event
.fNbEvents
;
90 fItemizedEntry
= null;
91 synchronized (fRankRangeList
) {
92 fRankRangeList
.merge(event
.getRankRangeList());
96 public void mergeDecorations(TimeChartEvent event
) {
97 fColorSettingPriority
= Math
.min(fColorSettingPriority
, event
.getColorSettingPriority());
98 fIsBookmark
|= event
.fIsBookmark
;
99 fIsVisible
|= event
.fIsVisible
;
100 fIsSearchMatch
|= event
.fIsSearchMatch
;
103 public long getNbEvents() {
107 public int getColorSettingPriority() {
108 return fColorSettingPriority
;
111 public void setColorSettingPriority(int priority
) {
112 fColorSettingPriority
= priority
;
115 public boolean isBookmarked() {
119 public void setIsBookmarked(boolean isBookmarked
) {
120 fIsBookmark
= isBookmarked
;
123 public boolean isVisible() {
127 public void setIsVisible(boolean isVisible
) {
128 fIsVisible
= isVisible
;
131 public boolean isSearchMatch() {
132 return fIsSearchMatch
;
135 public void setIsSearchMatch(boolean isSearchMatch
) {
136 fIsSearchMatch
= isSearchMatch
;
139 public void setItemizedEntry(TimeChartAnalysisEntry timeAnalysisEntry
) {
140 fItemizedEntry
= timeAnalysisEntry
;
143 public TimeChartAnalysisEntry
getItemizedEntry() {
144 return fItemizedEntry
;
147 public boolean isItemizing() {
151 public void setItemizing(boolean itemizing
) {
152 fItemizing
= itemizing
;
155 public class RankRange
{
156 private long firstRank
;
157 private long lastRank
;
159 public RankRange(long firstRank
, long lastRank
) {
160 this.firstRank
= firstRank
;
161 this.lastRank
= lastRank
;
164 public long getFirstRank() {
168 public long getLastRank() {
172 public long distanceFrom(RankRange range
) {
173 if (range
.lastRank
< fFirstRank
) {
174 return fFirstRank
- range
.lastRank
;
175 } else if (range
.firstRank
> fLastRank
) {
176 return range
.firstRank
- fLastRank
;
183 public String
toString() {
184 return "["+firstRank
+","+lastRank
+"]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
188 private class RankRangeList
extends ArrayList
<RankRange
> {
190 private static final long serialVersionUID
= 6060485531208535986L;
192 public RankRangeList(long rank
) {
194 add(new RankRange(rank
, rank
));
197 public void merge(RankRangeList rankRangeList
) {
198 long threshold
= fParentEntry
.getTrace().getCacheSize();
199 for (RankRange newRange
: rankRangeList
) {
200 boolean merged
= false;
201 for (RankRange oldRange
: fRankRangeList
) {
202 if (newRange
.distanceFrom(oldRange
) <= threshold
) {
203 oldRange
.firstRank
= Math
.min(oldRange
.firstRank
, newRange
.firstRank
);
204 oldRange
.lastRank
= Math
.max(oldRange
.lastRank
, newRange
.lastRank
);
213 Iterator
<RankRange
> iterator
= fRankRangeList
.iterator();
214 RankRange previous
= null;
215 while (iterator
.hasNext()) {
216 RankRange range
= iterator
.next();
217 if (previous
!= null && range
.distanceFrom(previous
) <= threshold
) {
218 previous
.firstRank
= Math
.min(previous
.firstRank
, range
.firstRank
);
219 previous
.lastRank
= Math
.max(previous
.lastRank
, range
.lastRank
);