package tk.eclipse.plugin.htmleditor.views;
import java.util.ArrayList;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
import tk.eclipse.plugin.htmleditor.HTMLPlugin;
/**
* ImageViewer.
*/
public class ImageView extends ViewPart implements ISelectionListener {
private ArrayList<Image> imageList = new ArrayList<Image>();
private ArrayList<Image> iconList = new ArrayList<Image>();
private SashForm sash;
private Table table;
private ScaleableImageCanvas canvas;
public ImageView(){
super();
}
@Override
public void init(IViewSite site) throws PartInitException {
super.init(site);
site.getPage().addSelectionListener(this);
}
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
updateView(selection);
}
@Override
public void dispose(){
getSite().getPage().removeSelectionListener(this);
sash.dispose();
super.dispose();
}
private void updateView(ISelection selection){
table.removeAll();
canvas.setImage(null);
for(int i=0;i<imageList.size();i++){
imageList.get(i).dispose();
iconList.get(i).dispose();
}
imageList.clear();
iconList.clear();
if(selection instanceof IStructuredSelection){
Object obj = ((IStructuredSelection)selection).getFirstElement();
if(obj instanceof IContainer){
showContainer((IContainer)obj);
} else if(obj instanceof IFile){
showContainer(((IFile)obj).getParent());
} else if(obj instanceof IJavaElement){
IResource resource = ((IJavaElement)obj).getResource();
if(resource instanceof IContainer){
showContainer((IContainer)resource);
} else if(resource instanceof IFile){
showContainer(((IFile)resource).getParent());
}
}
}
}
private void showContainer(IContainer folder){
try {
IResource[] resources = folder.members();
for(int i=0;i<resources.length;i++){
if(resources[i] instanceof IFile){
IFile file = (IFile)resources[i];
for(int j=0;j<HTMLPlugin.SUPPORTED_IMAGE_TYPES.length;j++){
if(file.getFileExtension().equalsIgnoreCase(HTMLPlugin.SUPPORTED_IMAGE_TYPES[j])){
addImage(file);
break;
}
}
}
}
} catch(Exception ex){
}
}
private void addImage(IFile file){
try {
ImageData data = new ImageData(file.getLocation().makeAbsolute().toFile().getAbsolutePath());
Image image = new Image(Display.getDefault(),data);
Image i = new Image(Display.getDefault(), 32, 32);
GC gc = new GC(i);
gc.drawImage(
image,0,0,
image.getImageData().width,
image.getImageData().height,
0,0,32,32);
gc.dispose();
TableItem item = new TableItem(table,SWT.NULL);
item.setImage(i);
item.setText(file.getName() + " (" + image.getImageData().width + " * " + image.getImageData().height + ")");
imageList.add(image);
iconList.add(i);
} catch(Exception ex){
ex.printStackTrace();
}
}
@Override
public void createPartControl(Composite parent) {
sash = new SashForm(parent,SWT.VERTICAL);
table = new Table(sash,SWT.BORDER);
table.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent evt){
int index = table.getSelectionIndex();
if(index >= 0){
canvas.setImage(imageList.get(index));
}
}
});
Composite composite = new Composite(sash,SWT.NULL);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
CLabel label = new CLabel(composite,SWT.NULL);
label.setText(HTMLPlugin.getResourceString("ImageView.Preview"));
label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
canvas = new ScaleableImageCanvas(composite,SWT.BORDER);
canvas.setLayoutData(new GridData(GridData.FILL_BOTH));
}
@Override
public void setFocus() {
table.setFocus();
}
private class ScaleableImageCanvas extends Canvas {
private Image image;
private int width;
private int height;
private int ix = 0;
private int iy = 0;
public ScaleableImageCanvas(Composite parent, int style) {
super(parent, style);
setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
if(image==null){
e.gc.fillRectangle(0,0,getSize().x,getSize().y);
return;
}
int scaledWidth = getSize().x;
int scaledHeight = getSize().y;
if(width <= scaledWidth && height <= scaledHeight){
scaledWidth = width;
scaledHeight = height;
} else {
double scale = (double) scaledWidth / width;
if(height * scale <= scaledHeight){
scaledHeight = (int)(height * scale);
} else {
scale = (double) scaledHeight / height;
scaledWidth = (int)(width * scale);
}
}
e.gc.drawImage(
ScaleableImageCanvas.this.image,
0, 0, width, height, ix, iy, scaledWidth, scaledHeight);
}
});
}
public void setImage(Image image){
this.image = image;
if(image!=null){
this.width = image.getImageData().width;
this.height = image.getImageData().height;
}
redraw();
}
@Override
public void dispose() {
super.dispose();
}
}
}