/*-
* Copyright © 2009 Diamond Light Source Ltd.
*
* This file is part of GDA.
*
* GDA is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License version 3 as published by the Free
* Software Foundation.
*
* GDA is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with GDA. If not, see <http://www.gnu.org/licenses/>.
*/
package uk.ac.gda.ui.file;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import uk.ac.gda.common.rcp.util.IFileUtils;
import uk.ac.gda.util.io.FileUtils;
import com.swtdesigner.SWTResourceManager;
/**
*
*/
public class IFileTreeLabelProvider extends LabelProvider implements ITableLabelProvider {
private boolean isDisposed = false;
private final Image folderImage,fileImage,nexusImage,asciiImage;
private final DateFormat dateFormat;
private final int[] flags;
/**
* The first column is always name.
* Short hand for IFileTreeLabelProvider(SIZE,DATE)
*/
public IFileTreeLabelProvider() {
this(IFileConst.SIZE,IFileConst.DATE);
}
/**
* The first column is always name.
* Subsequent columns can be defined using IFileConst flags
*
* Set from SIZE, PATH, DATE.
* @param flags
*/
public IFileTreeLabelProvider(int... flags) {
this.flags = flags;
this.folderImage = SWTResourceManager.getImage(IFileTreeLabelProvider.class, "/icons/folder.png");
this.fileImage = SWTResourceManager.getImage(IFileTreeLabelProvider.class, "/icons/page.png");
this.nexusImage = SWTResourceManager.getImage(IFileTreeLabelProvider.class, "/icons/nexus.png");
this.asciiImage = SWTResourceManager.getImage(IFileTreeLabelProvider.class, "/icons/page_white_database.png");
this.dateFormat = new SimpleDateFormat("EEE dd MMM yyyy HH:mm:ss z");
}
private Image getImageFromFile(IResource file) {
if (isDisposed()) return null;
if (!file.exists()) return null;
if (file instanceof IContainer) {
return folderImage;
}
if (file.getName().toLowerCase().endsWith(".nxs")) {
return nexusImage;
}
if (file.getName().toLowerCase().endsWith(".dat")) {
return asciiImage;
}
return fileImage;
}
private String getTextFromFile(IResource element) {
return element.getName();
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
if (columnIndex==0) {
return getImageFromFile((IResource)element);
}
final int flag = flags[columnIndex-1];
if (flag == IFileConst.PATH) {
return folderImage;
}
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
final IResource file = (IResource)element;
if (!file.exists()) return null;
if (columnIndex==0) {
return getTextFromFile(file);
}
final int flag = flags[columnIndex-1];
if (flag == IFileConst.DATE) {
return getDate(element);
} else if (flag == IFileConst.SIZE) {
return getSize(element);
} else if (flag == IFileConst.PATH) {
return getPath(element);
}
return null;
}
public String getSize(final Object element) {
try {
return FileUtils.formatSize(IFileUtils.getLength((IResource)element), 3);
} catch (Exception e) {
return "-";
}
}
public String getDate(final Object element) {
try {
return dateFormat.format(new Date(IFileUtils.getLastModified((IResource)element)));
} catch (Exception e) {
return "-";
}
}
public String getPath(final Object element) {
final IResource res = (IResource)element;
return res.getParent().getFullPath().toOSString();
}
@Override
public void dispose() {
isDisposed = true;
super.dispose();
// if (folderImage!=null&&!folderImage.isDisposed()) folderImage.dispose();
// if (fileImage!=null&&!fileImage.isDisposed()) fileImage.dispose();
// if (nexusImage!=null&&!nexusImage.isDisposed()) nexusImage.dispose();
// if (asciiImage!=null&&!asciiImage.isDisposed()) asciiImage.dispose();
}
/**
* @return Returns the isDisposed.
*/
public boolean isDisposed() {
return isDisposed;
}
}