Fixed #13 - added transaction colors
This commit is contained in:
		| @@ -45,14 +45,29 @@ public class StreamPainter extends TrackPainter{ | |||||||
| 		this.seenTx=new TreeSet<ITx>(); | 		this.seenTx=new TreeSet<ITx>(); | ||||||
| 	} | 	} | ||||||
|      |      | ||||||
|  | 	/* | ||||||
|  | 	 * convert java.awt.Color to org.eclipse.swt.graphics.Color  | ||||||
|  | 	 */ | ||||||
|  | 	static org.eclipse.swt.graphics.Color toSwtColor( GC gc, java.awt.Color awtColor ){ | ||||||
|  | 		return new org.eclipse.swt.graphics.Color( gc.getDevice(), awtColor.getRed(), awtColor.getGreen(), awtColor.getBlue() ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	static org.eclipse.swt.graphics.Color[] toSwtColors( GC gc, java.awt.Color[] awtColors ){ | ||||||
|  | 		org.eclipse.swt.graphics.Color[] swtColors = new org.eclipse.swt.graphics.Color[awtColors.length]; | ||||||
|  | 		for( int i=0; i<awtColors.length; i++ ) | ||||||
|  | 			swtColors[i] = toSwtColor( gc, awtColors[i] ); | ||||||
|  | 		return swtColors; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	@SuppressWarnings("unchecked") | 	@SuppressWarnings("unchecked") | ||||||
| 	public void paintArea(GC gc, Rectangle area) { | 	public void paintArea(GC gc, Rectangle area) { | ||||||
| 		if(stream.getEvents().size()==0) return; | 		if(stream.getEvents().size()==0) return; | ||||||
| 		int trackHeight=trackEntry.height/stream.getMaxConcurrency(); | 		int trackHeight=trackEntry.height/stream.getMaxConcurrency(); | ||||||
| 		txBase=trackHeight/5; | 		txBase=trackHeight/5; | ||||||
| 		txHeight=trackHeight*3/5; | 		txHeight=trackHeight*3/5; | ||||||
| 		if(trackEntry.selected) | 		if(trackEntry.selected) { | ||||||
| 			gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]); | 			gc.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]); | ||||||
|  | 		} | ||||||
| 		else | 		else | ||||||
| 			gc.setBackground(this.waveCanvas.colors[even?WaveformColors.TRACK_BG_EVEN.ordinal():WaveformColors.TRACK_BG_ODD.ordinal()]); | 			gc.setBackground(this.waveCanvas.colors[even?WaveformColors.TRACK_BG_EVEN.ordinal():WaveformColors.TRACK_BG_ODD.ordinal()]); | ||||||
| 		gc.setFillRule(SWT.FILL_EVEN_ODD); | 		gc.setFillRule(SWT.FILL_EVEN_ODD); | ||||||
| @@ -61,7 +76,7 @@ public class StreamPainter extends TrackPainter{ | |||||||
| 		long scaleFactor = this.waveCanvas.getScaleFactor(); | 		long scaleFactor = this.waveCanvas.getScaleFactor(); | ||||||
| 		long beginPos = area.x; | 		long beginPos = area.x; | ||||||
| 		long beginTime = (beginPos + waveCanvas.getXOffset())*scaleFactor; | 		long beginTime = (beginPos + waveCanvas.getXOffset())*scaleFactor; | ||||||
| 		long endPos = beginPos + area.width; | 		//long endPos = beginPos + area.width; | ||||||
|         long endTime = beginTime + area.width*scaleFactor; |         long endTime = beginTime + area.width*scaleFactor; | ||||||
|  |  | ||||||
| 		Entry<Long, ?> firstTx=stream.getEvents().floorEntry(beginTime); | 		Entry<Long, ?> firstTx=stream.getEvents().floorEntry(beginTime); | ||||||
| @@ -75,15 +90,15 @@ public class StreamPainter extends TrackPainter{ | |||||||
|          |          | ||||||
|         for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight) |         for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight) | ||||||
|         	gc.drawLine(area.x, y1, area.x+area.width, y1); |         	gc.drawLine(area.x, y1, area.x+area.width, y1); | ||||||
| 		if(firstTx==lastTx) | 		if(firstTx==lastTx) { | ||||||
| 			for(ITxEvent txEvent:(Collection<?  extends ITxEvent>)firstTx.getValue()) | 			for(ITxEvent txEvent:(Collection<?  extends ITxEvent>)firstTx.getValue()) | ||||||
| 				drawTx(gc, area, txEvent.getTransaction());					 | 				drawTx(gc, area, txEvent.getTransaction(), false); | ||||||
| 		else{ | 		}else{ | ||||||
| 			seenTx.clear(); | 			seenTx.clear(); | ||||||
| 			NavigableMap<Long,?> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true); | 			NavigableMap<Long,?> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true); | ||||||
| 			boolean highlighed=false; | 			boolean highlighed=false; | ||||||
| 	        gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]); | 	        gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]); | ||||||
| 	        gc.setBackground(this.waveCanvas.colors[WaveformColors.TX_BG.ordinal()]); | 	         | ||||||
| 	        for(Entry<Long, ?> entry: entries.entrySet()) | 	        for(Entry<Long, ?> entry: entries.entrySet()) | ||||||
| 				for(ITxEvent txEvent:(Collection<?  extends ITxEvent>)entry.getValue()){ | 				for(ITxEvent txEvent:(Collection<?  extends ITxEvent>)entry.getValue()){ | ||||||
| 					if(txEvent.getType()==ITxEvent.Type.BEGIN) | 					if(txEvent.getType()==ITxEvent.Type.BEGIN) | ||||||
| @@ -91,22 +106,27 @@ public class StreamPainter extends TrackPainter{ | |||||||
| 					if(txEvent.getType()==ITxEvent.Type.END){ | 					if(txEvent.getType()==ITxEvent.Type.END){ | ||||||
| 						ITx tx = txEvent.getTransaction(); | 						ITx tx = txEvent.getTransaction(); | ||||||
| 						highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.equals(tx); | 						highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.equals(tx); | ||||||
| 						drawTx(gc, area, tx); | 						drawTx(gc, area, tx, false); | ||||||
| 						seenTx.remove(tx); | 						seenTx.remove(tx); | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			for(ITx tx:seenTx){ | 			for(ITx tx:seenTx){ | ||||||
| 				drawTx(gc, area, tx); | 				drawTx(gc, area, tx, false); | ||||||
| 			} | 			} | ||||||
| 			if(highlighed){ | 			if(highlighed){ | ||||||
| 		        gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE_HIGHLITE.ordinal()]); | 		        gc.setForeground(this.waveCanvas.colors[WaveformColors.LINE_HIGHLITE.ordinal()]); | ||||||
| 		        gc.setBackground(this.waveCanvas.colors[WaveformColors.TX_BG_HIGHLITE.ordinal()]); | 		        drawTx(gc, area, waveCanvas.currentSelection, true); | ||||||
| 				drawTx(gc, area, waveCanvas.currentSelection); |  | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	protected void drawTx(GC gc, Rectangle area, ITx tx) { | 	protected void drawTx(GC gc, Rectangle area, ITx tx, boolean highlighted ) { | ||||||
|  | 		// compute colors | ||||||
|  |         java.awt.Color[] fallbackColors = trackEntry.getColors(); | ||||||
|  |         java.awt.Color[] transColor = TrackEntry.computeColor( tx.getGenerator().getName(), fallbackColors[0], fallbackColors[1] ); | ||||||
|  |          | ||||||
|  |         gc.setBackground( toSwtColor( gc, transColor[highlighted?1:0] ) ); | ||||||
|  |          | ||||||
| 		int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight(); | 		int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight(); | ||||||
| 		Rectangle bb = new Rectangle( | 		Rectangle bb = new Rectangle( | ||||||
| 				(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()-waveCanvas.getXOffset()), area.y+offset+txBase, | 				(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()-waveCanvas.getXOffset()), area.y+offset+txBase, | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ | |||||||
|  *******************************************************************************/ |  *******************************************************************************/ | ||||||
| package com.minres.scviewer.database.swt.internal; | package com.minres.scviewer.database.swt.internal; | ||||||
|  |  | ||||||
|  | import java.awt.Color; | ||||||
| import java.beans.PropertyChangeEvent; | import java.beans.PropertyChangeEvent; | ||||||
| import java.beans.PropertyChangeListener; | import java.beans.PropertyChangeListener; | ||||||
| import java.beans.PropertyChangeSupport; | import java.beans.PropertyChangeSupport; | ||||||
| @@ -489,9 +490,11 @@ public class WaveformViewer implements IWaveformViewer  { | |||||||
| 					}while(firstTx!=null && !isArrayFull(resultsList)); | 					}while(firstTx!=null && !isArrayFull(resultsList)); | ||||||
| 					entry.currentValue=""; | 					entry.currentValue=""; | ||||||
| 					boolean separator=false; | 					boolean separator=false; | ||||||
|  | 									 | ||||||
| 					for(ITx o:resultsList){ | 					for(ITx o:resultsList){ | ||||||
| 						if(separator) entry.currentValue+="|"; | 						if(separator) entry.currentValue+="|"; | ||||||
| 						if(o!=null) entry.currentValue+=((ITx)o).getGenerator().getName(); | 						if(o!=null) entry.currentValue+=((ITx)o).getGenerator().getName(); | ||||||
|  | 											 | ||||||
| 						separator=true; | 						separator=true; | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| @@ -503,6 +506,7 @@ public class WaveformViewer implements IWaveformViewer  { | |||||||
| 		valueListScrolled.redraw(); | 		valueListScrolled.redraw(); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	 | ||||||
| 	private boolean isArrayFull(Object[] array){ | 	private boolean isArrayFull(Object[] array){ | ||||||
| 		for(Object o:array){ | 		for(Object o:array){ | ||||||
| 			if(o==null) return false; | 			if(o==null) return false; | ||||||
| @@ -600,6 +604,9 @@ public class WaveformViewer implements IWaveformViewer  { | |||||||
| 						TrackEntry trackEntry = getEntryForStream(txSel.getStream()); | 						TrackEntry trackEntry = getEntryForStream(txSel.getStream()); | ||||||
| 						if(trackEntry==null && addIfNeeded){ | 						if(trackEntry==null && addIfNeeded){ | ||||||
| 							trackEntry=new TrackEntry(txSel.getStream()); | 							trackEntry=new TrackEntry(txSel.getStream()); | ||||||
|  | 							// compute fallback colors | ||||||
|  | 							Color fallbackColors[] = TrackEntry.computeColor(txSel.getStream().getName(), TrackEntry.fallbackColor, TrackEntry.highlightedFallbackColor); | ||||||
|  | 							trackEntry.setColor(fallbackColors[0], fallbackColors[1]); | ||||||
| 							streams.add(trackEntry); | 							streams.add(trackEntry); | ||||||
| 						} | 						} | ||||||
| 						currentTxSelection = txSel; | 						currentTxSelection = txSel; | ||||||
|   | |||||||
| @@ -10,13 +10,87 @@ | |||||||
|  *******************************************************************************/ |  *******************************************************************************/ | ||||||
| package com.minres.scviewer.database.ui; | package com.minres.scviewer.database.ui; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import java.awt.Color; | ||||||
|  |  | ||||||
| import com.minres.scviewer.database.ISignal; | import com.minres.scviewer.database.ISignal; | ||||||
| import com.minres.scviewer.database.ITxEvent; | import com.minres.scviewer.database.ITxEvent; | ||||||
| import com.minres.scviewer.database.ITxStream; | import com.minres.scviewer.database.ITxStream; | ||||||
| import com.minres.scviewer.database.IWaveform; | import com.minres.scviewer.database.IWaveform; | ||||||
|  |  | ||||||
|  |  | ||||||
| public class TrackEntry { | public class TrackEntry { | ||||||
|  |  | ||||||
|  |  	// color info | ||||||
|  | 	public static Color fallbackColor = new Color(200,0,0); | ||||||
|  | 	public static Color highlightedFallbackColor = new Color(255,0,0); | ||||||
|  | 	private Color[]signalColors; | ||||||
|  | 	 | ||||||
|  | 	// list of random colors | ||||||
|  | 	private static Color[][] randomColors = { | ||||||
|  | 			{ new Color( 170,  66,  37 ), new Color ( 190,  66,  37 ) }, | ||||||
|  | 			{ new Color(  96,  74, 110 ), new Color (  96,  74, 130 ) }, | ||||||
|  | 			{ new Color( 133, 105, 128 ), new Color ( 153, 105, 128 ) }, | ||||||
|  | 			{ new Color(   0, 126, 135 ), new Color (   0, 126, 155 ) }, | ||||||
|  | 			{ new Color( 243, 146,  75 ), new Color ( 255, 146,  75 ) }, | ||||||
|  | 			{ new Color( 206, 135, 163 ), new Color ( 226, 135, 163 ) }, | ||||||
|  | 			{ new Color( 124, 103,  74 ), new Color ( 144, 103,  74 ) }, | ||||||
|  | 			{ new Color( 194, 187, 169 ), new Color ( 214, 187, 169 ) }, | ||||||
|  | 			{ new Color( 104,  73,  71 ), new Color ( 124,  73,  71 ) }, | ||||||
|  | 			{ new Color(  75, 196, 213 ), new Color (  75, 196, 233 ) }, | ||||||
|  | 			{ new Color( 206, 232, 229 ), new Color ( 206, 252, 229 ) }, | ||||||
|  | 			{ new Color( 169, 221, 199 ), new Color ( 169, 241, 199 ) }, | ||||||
|  | 			{ new Color( 100, 165, 197 ), new Color ( 100, 165, 217 ) }, | ||||||
|  | 			{ new Color( 150, 147, 178 ), new Color ( 150, 147, 198 ) }, | ||||||
|  | 			{ new Color( 200, 222, 182 ), new Color ( 200, 242, 182 ) }, | ||||||
|  | 			{ new Color( 147, 208, 197 ), new Color ( 147, 228, 197 ) } | ||||||
|  | 	}; | ||||||
|  | 	 | ||||||
|  | 	public static Color[] computeColor (String streamValue, Color fallback, Color highlightedFallback) { | ||||||
|  | 	 | ||||||
|  | 		Color[]result = new Color[2]; | ||||||
|  | 				 | ||||||
|  | 		result[0] = fallback; | ||||||
|  | 		result[1] = highlightedFallback; | ||||||
|  | 		 | ||||||
|  | 		// assign colors to standard values | ||||||
|  | 		if (streamValue.contains("read")){ | ||||||
|  | 			result[0] = new Color(86,174,53); | ||||||
|  | 			result[1] = new Color (86,194,53); | ||||||
|  | 		}else if (streamValue.contains("rdata")){ | ||||||
|  | 			result[0] = new Color(138,151,71); | ||||||
|  | 			result[1] = new Color (138,171,71); | ||||||
|  | 		}else if (streamValue.contains("addr")){ | ||||||
|  | 			result[0] = new Color(233,187,68); | ||||||
|  | 			result[1] = new Color (233,207,68); | ||||||
|  | 		}else if (streamValue.contains("write")){ | ||||||
|  | 			result[0] = new Color(1,128,191); | ||||||
|  | 			result[1] = new Color (1,128,211); | ||||||
|  | 		}else if (streamValue.contains("wdata")){ | ||||||
|  | 			result[0] = new Color(2,181,160); | ||||||
|  | 			result[1] = new Color (2,201,160); | ||||||
|  | 			 | ||||||
|  | 		}else { | ||||||
|  | 			// assign "random" color here, one name always results in the same color! | ||||||
|  | 			if( randomColors.length > 0 ) { | ||||||
|  | 				int index = streamValue.hashCode() % randomColors.length; | ||||||
|  | 				result[0] = randomColors[index][0]; | ||||||
|  | 				result[1] = randomColors[index][1]; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		return result; | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public void setColor(Color changedColor, Color highlightColor) { | ||||||
|  | 		signalColors[0] = changedColor; | ||||||
|  | 		signalColors[1] = highlightColor; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public Color[] getColors() { | ||||||
|  | 		return signalColors; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
| 	public enum ValueDisplay { | 	public enum ValueDisplay { | ||||||
| 		DEFAULT, SIGNED, UNSIGNED | 		DEFAULT, SIGNED, UNSIGNED | ||||||
|  |  | ||||||
| @@ -45,6 +119,9 @@ public class TrackEntry { | |||||||
| 		vOffset=0; | 		vOffset=0; | ||||||
| 		height=0; | 		height=0; | ||||||
| 		selected=false; | 		selected=false; | ||||||
|  | 		signalColors = new Color[2]; | ||||||
|  | 		signalColors[0] = fallbackColor; | ||||||
|  | 		signalColors[1] = highlightedFallbackColor; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public boolean isStream(){ | 	public boolean isStream(){ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Brita Keller
					Brita Keller