package jqian.slicer.view.global; import java.io.File; import java.util.*; import jqian.util.metric.LineCounter; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Tree; public class SliceDistributionBar extends DistributionDisplayBar { //protected int _projectLines; protected int _maxFileLines; protected int _maxSlicedLinesInFile; protected ISliceDistribution _distribution; public SliceDistributionBar(Tree tree,int barLocatingColumn){ super(tree,barLocatingColumn,tree.getShell().getDisplay().getSystemColor(SWT.COLOR_CYAN)); //_projectLines = LineCounter.countProjectLines(projectRoot); } public void setProject(File projectRoot,ISliceDistribution distribution){ this._distribution = distribution; _maxFileLines = LineCounter.countMaxFileLinesInProject(projectRoot); _maxSlicedLinesInFile = countMaxSliceInFile(projectRoot); _file2Info.clear(); } private static boolean isJavaFile(String name){ int length = name.length(); String ext = ""; name = name.toLowerCase(); if(length>5){ ext = name.substring(length-5); } if(ext.equals(".java")) return true; else return false; } public int countMaxSliceInFile(File projectRoot){ int line = 0; if(!projectRoot.isDirectory()){ if(isJavaFile(projectRoot.getName())) return _distribution.getLines(projectRoot).size(); else return 0; } //a directory File[] contents = projectRoot.listFiles(); int size = contents.length; for(int i=0;i<size;i++){ File item = contents[i]; int t = 0; if(item.isDirectory()){ t = countMaxSliceInFile(item); } else if(isJavaFile(item.getName())){ t = _distribution.getLines(item).size(); } line = (t>line)? t: line; } return line; } public int getFileLineCount(Object itemdata){ if(itemdata instanceof File){ File file = (File)itemdata; FileInfo info = getFileInfo(file); return info._lines; } else{ return 0; } } public int getSliceLineCount(Object itemdata){ if(itemdata instanceof File){ File file = (File)itemdata; FileInfo info = getFileInfo(file); if(info._sliceLines==null) return 0; else return info._sliceLines.size(); } else{ return 0; } } @Override protected String getBarText(Object itemdata) { if(itemdata instanceof File){ File file = (File)itemdata; FileInfo info = getFileInfo(file); if(info._lines==0 ||info._sliceLines.size()==0){ return ""; } float percent = ((float)(info._sliceLines.size()))/info._lines; return percentToString(percent); } else{ return ""; } } @Override protected int getBarWidth(Object itemdata) { int width = 0; if(itemdata instanceof File){ File file = (File)itemdata; FileInfo info = getFileInfo(file); //width = (info._lines*_columnWidth)/_maxFileLines; if(_maxSlicedLinesInFile>0){ width = (info._sliceLines.size()*_columnWidth)/_maxSlicedLinesInFile; } } return width; } @Override protected Collection<Float> getDistributions(Object itemdata){ Collection<Float> slice = new LinkedList<Float>(); if(!(itemdata instanceof File)) return slice; File file = (File)itemdata; if(file.isDirectory()) return slice; FileInfo info = getFileInfo(file); int totalLine = info._lines; Collection<Integer> sliceLines = info._sliceLines; for(Iterator<Integer> it=sliceLines.iterator();it.hasNext();){ float sline = (float)it.next(); float pos = sline/totalLine; slice.add(pos); } return slice; } private FileInfo getFileInfo(File file){ FileInfo info = _file2Info.get(file.getPath()); if(info==null){ info = new FileInfo(); if(!file.isDirectory()){ info._lines = LineCounter.countFileLine(file); Collection<Integer> slices = _distribution.getLines(file); if(slices==null){ slices = Collections.emptySet(); } info._sliceLines = slices; } else{ info._sliceLines = Collections.emptySet(); } _file2Info.put(file.getPath(), info); } return info; } private static class FileInfo{ public int _lines; public Collection<Integer> _sliceLines; } private Map<String,FileInfo> _file2Info = new HashMap<String,FileInfo>(); }