at.bestsolution.bridge.iconview.IconView.java Source code

Java tutorial

Introduction

Here is the source code for at.bestsolution.bridge.iconview.IconView.java

Source

/*******************************************************************************
 * Copyright (c) 2010 BestSolution.at and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
 ******************************************************************************/
package at.bestsolution.bridge.iconview;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.nebula.jface.galleryviewer.GalleryTreeViewer;
import org.eclipse.nebula.widgets.gallery.NoGroupRenderer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;

import at.bestsolution.bridge.iconview.internal.CustomGalleryItemRenderer;

@SuppressWarnings("restriction")
public class IconView {

    private GalleryTreeViewer viewer;
    private IContainer container;
    private IWorkspace workspace;

    private Map<IResource, Image> imageMap = new HashMap<IResource, Image>();

    @Inject
    public IconView(IWorkspace workspace) {
        this.workspace = workspace;
        this.workspace.addResourceChangeListener(resourceListener);
    }

    @PostConstruct
    public void createPartControl(Composite parent) {
        parent.setLayout(new FillLayout());
        viewer = new GalleryTreeViewer(parent, SWT.MULTI | SWT.V_SCROLL);
        viewer.getGallery().setItemRenderer(new CustomGalleryItemRenderer());

        NoGroupRenderer renderer = new NoGroupRenderer();
        renderer.setItemHeight(50);

        viewer.getGallery().setGroupRenderer(renderer);
        viewer.setContentProvider(contentProvider);

        viewer.setLabelProvider(new LabelProvider() {
            @Override
            public Image getImage(Object element) {
                if (element instanceof IFile) {
                    Image image = imageMap.get(element);

                    if (image == null) {
                        image = loadImage((IFile) element);
                        imageMap.put((IResource) element, image);
                    }

                    return image;
                }
                return super.getImage(element);
            }

            @Override
            public String getText(Object element) {
                if (element instanceof IFile) {
                    IFile resource = (IFile) element;
                    return resource.getName();
                }
                return super.getText(element);
            }
        });
    }

    @PreDestroy
    public void dispose() {
        this.workspace.removeResourceChangeListener(resourceListener);
    }

    @Focus
    public void setFocus() {
        viewer.getControl().setFocus();
    }

    @Inject
    void setFolder(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional Object selection) {
        IContainer container = null;
        if (selection instanceof IContainer) {
            container = (IContainer) selection;
        } else if (selection instanceof IStructuredSelection) {
            if (((IStructuredSelection) selection).getFirstElement() instanceof IContainer) {
                container = (IContainer) ((IStructuredSelection) selection).getFirstElement();
            }
        } else if (selection instanceof List<?>) {
            if (!((List<?>) selection).isEmpty() && ((List<?>) selection).get(0) instanceof IContainer) {
                container = (IContainer) ((List<?>) selection).get(0);
            }
        }

        this.container = container;
        if (viewer != null) {
            refreshViewer();
        }
    }

    private IResourceChangeListener resourceListener = new IResourceChangeListener() {
        public void resourceChanged(IResourceChangeEvent event) {
            if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
                try {
                    event.getDelta().accept(new IResourceDeltaVisitor() {
                        public boolean visit(IResourceDelta delta) throws CoreException {
                            if (delta.getKind() == IResourceDelta.ADDED) {
                                handleChange(delta.getResource(), delta.getResource().getParent(), true);
                            } else if (delta.getKind() == IResourceDelta.REMOVED) {
                                handleChange(delta.getResource(), delta.getResource().getParent(), false);
                            }
                            return true;
                        }

                        private void handleChange(final IResource resource, final IContainer parent,
                                final boolean added) {
                            if (parent == container) {
                                if (added) {
                                    isImageFile(resource);
                                    viewer.add(null, resource);
                                } else {
                                    viewer.remove(resource);
                                    Image image = imageMap.remove(resource);
                                    if (image != null) {
                                        image.dispose();
                                    }
                                }
                            }
                        }
                    });
                } catch (CoreException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    };

    private ITreeContentProvider contentProvider = new ITreeContentProvider() {
        private List<IResource> input = new ArrayList<IResource>();
        private String root = "Elements";

        @SuppressWarnings("unchecked")
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            this.input = (List<IResource>) newInput;
        }

        public void dispose() {

        }

        public boolean hasChildren(Object element) {
            return root == element;
        }

        public Object getParent(Object element) {
            return root;
        }

        public Object[] getElements(Object inputElement) {
            return new Object[] { root };
        }

        public Object[] getChildren(Object parentElement) {
            return input.toArray();
        }
    };

    private Image loadImage(final IFile file) {
        InputStream contents;
        try {
            contents = file.getContents();
            try {
                ImageData imageData = new ImageData(contents);
                Point size = getBestSize(imageData.width, imageData.height, 16, 16);
                ImageData scaled = imageData.scaledTo(size.x, size.y);
                return new Image(viewer.getControl().getDisplay(), scaled);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

        return null;
    }

    private Point getBestSize(int originalX, int originalY, int maxX, int maxY) {
        double widthRatio = (double) originalX / (double) maxX;
        double heightRatio = (double) originalY / (double) maxY;

        double bestRatio = widthRatio > heightRatio ? widthRatio : heightRatio;

        int newWidth = (int) ((double) originalX / bestRatio);
        int newHeight = (int) ((double) originalY / bestRatio);

        return new Point(newWidth, newHeight);
    }

    private boolean isImageFile(IResource resource) {
        if (resource.getType() == IResource.FILE) {
            IFile file = (IFile) resource;
            String extension = file.getFileExtension();
            if (extension != null && ("png".equalsIgnoreCase(extension) || "jpg".equalsIgnoreCase(extension)
                    || "gif".equalsIgnoreCase(extension))) {
                return true;
            }
        }

        return false;
    }

    private void refreshViewer() {
        Map<IResource, Image> imageMap = this.imageMap;
        this.imageMap = new HashMap<IResource, Image>();

        final List<IResource> input = new ArrayList<IResource>();
        if (container != null) {
            try {
                container.accept(new IResourceVisitor() {

                    public boolean visit(IResource resource) throws CoreException {
                        if (resource.equals(IconView.this.container)) {
                            return true;
                        } else if (isImageFile(resource)) {
                            input.add(resource);
                        }

                        return false;
                    }
                });
            } catch (CoreException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        viewer.setInput(input);

        for (Image img : imageMap.values()) {
            img.dispose();
        }
    }
}