package jqian.slicer.view.global;
import java.util.*;
import java.io.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Composite;
import com.swtdesigner.SWTResourceManager;
/*
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
*/
public class SliceViewer extends TreeViewer {
protected static final String[] columnNames = {
"entity", "total lines", "slice lines", "percentage" };
protected static int _coloredIndex = 3;
protected static int _coloredColumnWidth = 400;
protected static Map<String, Integer> _prop2index = new HashMap<String, Integer>();
static {
for (int i = 0; i < columnNames.length; i++)
_prop2index.put(columnNames[i], new Integer(i));
}
private static class Wrapper{
public Wrapper(File file){
this._content = file;
}
public File _content;
}
protected Shell _shell;
protected Wrapper _root;
protected Tree _tree;
protected SliceDistributionBar _distributionBar;
public SliceViewer(Composite parent) {
super(parent, SWT.FULL_SELECTION | SWT.LINE_DASH | SWT.BORDER);
this._shell = parent.getShell();
_tree = getTree();
_tree.setHeaderVisible(true);
_tree.setLinesVisible(true);
_root = new Wrapper(null);
addColumns();
setContentProvider(new MyTreeContenetProvider());
setLabelProvider(new MyTableLableProvider());
setColumnProperties(columnNames);
//show slice distribution bar
_distributionBar = new SliceDistributionBar(_tree,_coloredIndex);
_distributionBar.enable();
setInput(_root);
addDbClickListener();
}
public void setProject(File projectRoot,ISliceDistribution distribution){
_root._content = projectRoot;
_distributionBar.setProject(projectRoot,distribution);
//should be changed to selective expand, item containing no slicing results not expanded
//expandAll();
selectiveExpand();
refresh();
getTree().redraw();
}
public void run() {
Display display = _shell.getDisplay();
while (!_shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
private void addColumns() {
TreeColumn column = new TreeColumn(_tree, SWT.CENTER);
column.setText(columnNames[0]);
column.setWidth(350);
column = new TreeColumn(_tree, SWT.CENTER);
column.setText(columnNames[1]);
column.setWidth(80);
column = new TreeColumn(_tree, SWT.CENTER);
column.setText(columnNames[2]);
column.setWidth(80);
column = new TreeColumn(_tree, SWT.CENTER);
column.setText(columnNames[3]);
column.setWidth(_coloredColumnWidth);
}
/** Listen to Double-Clicks */
private void addDbClickListener() {
_tree.addListener(SWT.MouseDoubleClick, new Listener() {
public void handleEvent(Event e) {
/*TreeItem[] selection = _tree.getSelection();
if (selection.length == 0)
return;
TreeItem item = selection[0];
MessageDialog.openInformation(_shell, "Dbclick on item", item.toString()); */
}
});
}
private void selectiveExpand(){
expandToLevel(_root, 1);
Object[] childs = getRawChildren(_root);
for(int i=0;i<childs.length;i++){
selectiveExpand(childs[i],1);
}
}
private void selectiveExpand(Object root,int level){
if (root instanceof File) {
File file = (File)root;
if(!file.isDirectory()){
return;
}
if(hasSlice(file)){
expandToLevel(file, level);
}
//level++;
Object[] childs = getRawChildren(file);
for(int i=0;i<childs.length;i++){
selectiveExpand(childs[i],level);
}
}
}
private boolean hasSlice(File file){
boolean flag = false;
File[] contents = file.listFiles();
int size = contents.length;
for(int i=0;!flag && i<size;i++){
File item = contents[i];
if(item.isDirectory()){
flag = flag || hasSlice(item);
}
else if(isJavaFile(item.getName())){
flag = flag || (_distributionBar.getSliceLineCount(item)>0);
}
}
return flag;
}
private 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;
}
class MyTreeContenetProvider implements ITreeContentProvider {
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof File) {
File file = (File)parentElement;
if(!file.isDirectory()){
return new Object[0];
}
//a directory
File[] contents = file.listFiles();
int size = contents.length;
List<File> javaContents = new LinkedList<File>();
for(int i=0;i<size;i++){
File item = contents[i];
if(item.isDirectory() && containsJavaFile(item)){
javaContents.add(item);
}
else if(isJavaFile(item.getName())){
javaContents.add(item);
}
}
return javaContents.toArray();
} else if (parentElement instanceof Wrapper && _root._content!=null) {
Object[] childs = { _root._content };
return childs;
} else
return new Object[0];
}
private boolean containsJavaFile(File file){
if(!file.isDirectory()){
return isJavaFile(file.getName());
}
//a directory
File[] contents = file.listFiles();
int size = contents.length;
boolean containJava = false;
for(int i=0;i<size;i++){
File item = contents[i];
if(item.isDirectory()){
containJava |= containsJavaFile(item);
}
else{
containJava |= isJavaFile(item.getName());
}
if(containJava)
break;
}
return containJava;
}
public Object getParent(Object element) {
if (element instanceof File) {
File file = (File)element;
return file.getParentFile();
} else {
return null;
}
}
public boolean hasChildren(Object element) {
return getChildren(element).length>0;
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
class MyTableLableProvider extends LabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
if(columnIndex>0){
return null;
}
if(element instanceof Wrapper){
return SWTResourceManager.getImage(SliceViewer.class, "/img/javaproject.PNG");
}
else if (element instanceof File){
File file = (File)element;
if(file.isDirectory()){
return SWTResourceManager.getImage(SliceViewer.class, "/img/directory.PNG");
}
else{
return SWTResourceManager.getImage(SliceViewer.class, "/img/javafile.PNG");
}
}/*else if(element instanceof ){
}*/
else{
return null;
}
}
public String getColumnText(Object element, int columnIndex) {
if(element instanceof File){
switch(columnIndex){
case 0:{
File file = (File)element;
return file.getName();
}
case 1:{
int count = _distributionBar.getFileLineCount(element);
if(count==0)
return "";
else
return ""+count;
}
case 2:{
int count = _distributionBar.getSliceLineCount(element);
if(count==0)
return "";
else
return ""+count;
}
default: return "";
}
}
else
return element.toString();
}
public void addListener(ILabelProviderListener listener) {}
public void dispose() {}
public boolean isLabelProperty(Object element, String property) {
return true;
}
public void removeListener(ILabelProviderListener listener) {}
}
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Configurator");
shell.setLayout(new FillLayout());
SliceViewer viewer = new SliceViewer(shell);
viewer.setProject(new File("."),null);
shell.open();
viewer.run();
display.dispose();
}
}