package com.example.e4.filebrowser.parts; import java.io.File; import java.net.URL; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import org.eclipse.e4.ui.di.Focus; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.osgi.framework.Bundle; import org.osgi.framework.FrameworkUtil; public class FileBrowserPart { private TreeViewer viewer; private Image image; @PostConstruct public void createControls(Composite parent) { createImage(); viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setInput(File.listRoots()); } private void createImage() { Bundle bundle = FrameworkUtil.getBundle(ViewLabelProvider.class); URL url = FileLocator.find(bundle, new Path("icons/folder.png"), null); ImageDescriptor imageDcr = ImageDescriptor.createFromURL(url); this.image = imageDcr.createImage(); } class ViewContentProvider implements ITreeContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } @Override public void dispose() { } @Override public Object[] getElements(Object inputElement) { return (File[]) inputElement; } @Override public Object[] getChildren(Object parentElement) { File file = (File) parentElement; return file.listFiles(); } @Override public Object getParent(Object element) { File file = (File) element; return file.getParentFile(); } @Override public boolean hasChildren(Object element) { File file = (File) element; if (file.isDirectory()) { return true; } return false; } } class ViewLabelProvider extends StyledCellLabelProvider { @Override public void update(ViewerCell cell) { Object element = cell.getElement(); StyledString text = new StyledString(); File file = (File) element; if (file.isDirectory()) { text.append(getFileName(file)); cell.setImage(image); String[] files = file.list(); if (files != null) { text.append(" ( " + files.length + " ) ", StyledString.COUNTER_STYLER); } } else { text.append(getFileName(file)); } cell.setText(text.toString()); cell.setStyleRanges(text.getStyleRanges()); super.update(cell); } private String getFileName(File file) { String name = file.getName(); return name.isEmpty() ? file.getPath() : name; } } @Focus public void setFocus() { viewer.getControl().setFocus(); } @PreDestroy public void dispose() { image.dispose(); } }