de.uni_koeln.spinfo.strings.plugin.dotviewer.ImageView.java Source code

Java tutorial

Introduction

Here is the source code for de.uni_koeln.spinfo.strings.plugin.dotviewer.ImageView.java

Source

/*******************************************************************************
 * Copyright (c) 2005 The Eclipse Foundation. 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: The Eclipse Foundation - initial API and implementation
 *******************************************************************************/
package de.uni_koeln.spinfo.strings.plugin.dotviewer;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;

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.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.dialogs.ResourceListSelectionDialog;
import org.eclipse.ui.part.ViewPart;

public class ImageView extends ViewPart {
    protected static final String FORMAT_PNG = "png";

    protected static final String FORMAT_PDF = "pdf";

    ImageViewer viewer;

    Image image;

    private IFile file;

    /*
     * The selectionListener listens for changes in the workbench's selection
     * service.
     */
    private ISelectionListener selectionListener = new ISelectionListener() {
        public void selectionChanged(IWorkbenchPart part, ISelection selection) {
            System.out.println("Selection: " + selection);
            if (selection instanceof IStructuredSelection) {
                selectionChanged((IStructuredSelection) selection);
            }
        }

        private void selectionChanged(IStructuredSelection selection) {
            if (selection.size() == 0)
                return;
            Object first = selection.getFirstElement();
            if (first instanceof IFile) {
                file = (IFile) first;
                selectionChanged(file);
            }
        }

        private void selectionChanged(IFile file) {
            setImage(file, true, FORMAT_PNG, false);
        }

    };

    DotDrawer drawer;

    public void createPartControl(Composite parent) {
        parent.setLayout(new FillLayout());
        viewer = new ImageViewer(parent, SWT.NONE);
        // getSelectionService().addSelectionListener(selectionListener);

        addLoadButton();
        addExportButton();
        addResetButton();

        // IWorkspace workspace = ResourcesPlugin.getWorkspace();
        // DotFileListener listener = new DotFileListener(this);
        // workspace.addResourceChangeListener(listener);
    }

    private void addExportButton() {
        Action addItemAction = new Action("Export") {
            public void run() {

                setImage(file, true, FORMAT_PDF, true);

            }
        };
        // TODO somethigns wrong here...
        ImageDescriptor desc = ImageViewerPlugin.getImageDescriptor("icons/pdf.gif");
        // Bundle bundle = Platform.getBundle(ImageViewerPlugin.ID);
        // IPath path = new Path("icons/update.gif");
        // URL url = FileLocator.find(bundle, path, new HashMap());
        // ImageDescriptor desc = ImageDescriptor.createFromURL(url);
        addItemAction.setImageDescriptor(desc);
        IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
        mgr.add(addItemAction);
        mgr.add(new Separator());
    }

    private void addResetButton() {
        Action addItemAction = new Action("Reset") {
            public void run() {
                ImageViewerPlugin.getDefault().getPreferenceStore().setValue("dotpath", //$NON-NLS-1$
                        "");
                drawer.initPaths(viewer.getShell());
            }
        };
        // TODO somethigns wrong here...
        ImageDescriptor desc = ImageViewerPlugin.getImageDescriptor("icons/graphviz.gif");
        // Bundle bundle = Platform.getBundle(ImageViewerPlugin.ID);
        // IPath path = new Path("icons/update.gif");
        // URL url = FileLocator.find(bundle, path, new HashMap());
        // ImageDescriptor desc = ImageDescriptor.createFromURL(url);
        addItemAction.setImageDescriptor(desc);
        IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
        mgr.add(addItemAction);
    }

    private void addLoadButton() {
        Action addItemAction = new Action("Load") {
            public void run() {
                ResourceListSelectionDialog d;
                d = new ResourceListSelectionDialog(viewer.getShell(), ResourcesPlugin.getWorkspace().getRoot(),
                        IResource.FILE);
                if (d.open() == ResourceListSelectionDialog.OK) {
                    Object[] result2 = d.getResult();
                    if (result2 != null) {
                        file = (IFile) result2[0];

                        setImage(file, true, FORMAT_PNG, false);

                    }
                    for (Object object : result2) {
                        System.out.println("Object: " + object + ", class: " + object.getClass());
                    }
                    IWorkspace workspace = ResourcesPlugin.getWorkspace();
                    IResourceChangeListener listener = new IResourceChangeListener() {
                        public void resourceChanged(IResourceChangeEvent event) {
                            System.out.println("Change: " + event.getType());

                            // we are only interested in POST_CHANGE events
                            if (event.getType() != IResourceChangeEvent.POST_BUILD
                                    && event.getType() != IResourceChangeEvent.POST_CHANGE)
                                return;
                            IResourceDelta rootDelta = event.getDelta();
                            // ausgegeben...
                            IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {

                                public boolean visit(IResourceDelta delta) {
                                    // only interested in changed resources
                                    // (not added or
                                    // removed)
                                    // if (delta.getKind() !=
                                    // IResourceDelta.CHANGED
                                    // && delta.getKind() !=
                                    // IResourceDelta.REPLACED
                                    // && delta.getKind() !=
                                    // IResourceDelta.ADDED)
                                    // return true;
                                    // // only interested in content changes
                                    // if ((delta.getFlags() &
                                    // IResourceDelta.CONTENT) == 0)
                                    // return true;
                                    IResource resource = delta.getResource();
                                    // if (!resource.getLocation().lastSegment()
                                    // .equals(
                                    // file.getLocation()
                                    // .lastSegment()))
                                    // return false;
                                    // only interested in files with the
                                    // right
                                    // extension
                                    if (resource.getType() == IResource.FILE
                                            && "dot".equalsIgnoreCase(resource.getFileExtension())) {
                                        // IPath location =
                                        // resource.getLocation();
                                        // System.out.println("Resource
                                        // changed: " + location);
                                        try {
                                            final IFile f = (IFile) resource;
                                            final String l = f.getLocation().toString();
                                            // TODO externalize
                                            IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
                                                public void run(IProgressMonitor monitor) throws CoreException {
                                                    if (l.endsWith("." + "dot")) {
                                                        setImage(f, true, FORMAT_PNG, false);
                                                    }
                                                }
                                            };
                                            IWorkspace workspace = ResourcesPlugin.getWorkspace();
                                            workspace.run(runnable, null);

                                        } catch (Exception e) {
                                            // FIXME throws NullPointer...
                                            e.printStackTrace();
                                        }

                                    }
                                    return true;
                                }
                            };
                            try {
                                rootDelta.accept(visitor);
                            } catch (CoreException e) {
                                e.printStackTrace();
                            }
                        }
                    };
                    workspace.addResourceChangeListener(listener,
                            IResourceChangeEvent.POST_BUILD | IResourceChangeEvent.POST_CHANGE);
                }

            }
        };
        // TODO somethigns wrong here...
        ImageDescriptor desc = ImageViewerPlugin.getImageDescriptor("icons/open.gif");
        // Bundle bundle = Platform.getBundle(ImageViewerPlugin.ID);
        // IPath path = new Path("icons/update.gif");
        // URL url = FileLocator.find(bundle, path, new HashMap());
        // ImageDescriptor desc = ImageDescriptor.createFromURL(url);
        addItemAction.setImageDescriptor(desc);
        IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
        mgr.add(addItemAction);
    }

    protected void setImage(IFile file, boolean refresh, String format, boolean generateOnly) {
        this.file = file;
        InputStream in = null;
        try {
            if (file.getFileExtension().equals("dot")) {
                file = generateImageFromDot(file, refresh, format);
            }
            if (!generateOnly) {
                in = file.getContents();
                Image newImage = new Image(Display.getDefault(), in);
                viewer.setImage(newImage);
                disposeImage();
                image = newImage;
            }
        } catch (Exception e) {
            // If there's an exception, do nothing. Life goes on...
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private IFile generateImageFromDot(final IFile file, boolean refresh, String format) {
        // String inFolder = Platform.getInstanceLocation().getURL().getPath()
        // + file.getParent().getFullPath().toString().substring(1) + "/";
        String folder = Platform.getInstanceLocation().getURL().getPath()
                + file.getParent().getFullPath().toString().substring(1) + "/";
        System.out.println("in: " + folder);
        System.out.println("out: " + folder);
        String name = file.getName().split("\\.")[0] + "." + format;

        drawer = new DotDrawer(folder, folder, file.getName(), name);
        drawer.initPaths(this.getViewSite().getShell());
        try {

            int i = drawer.renderImage(format);
            if (i != 0) {
                // MessageDialog dia = new MessageDialog(this.getViewSite()
                // .getShell(), null, null, "Error while Rendering",
                // MessageDialog.ERROR, new String[] { "OK" }, 0);
                // dia.open();
                final Shell parent = this.getViewSite().getShell();
                ImageViewerPlugin.getDefault().getLog()
                        .log(new Status(Status.ERROR, ImageViewerPlugin.ID, "Error while Rendering: " + file));
                // Display.getDefault().asyncExec(new Runnable() {
                // public void run() {
                // MessageDialog.openError(parent, null,
                // );
                // }
                // });
            }
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (refresh) {
            try {
                file.getParent().refreshLocal(IResource.DEPTH_ONE, null);
            } catch (CoreException e) {
                e.printStackTrace();
            }
        }
        IFile res = (IFile) file.getParent().findMember(new Path(name));
        return res;
    }

    public void dispose() {
        super.dispose();
        getSelectionService().removeSelectionListener(selectionListener);
        disposeImage();
    }

    private void disposeImage() {
        if (image == null)
            return;
        image.dispose();
        image = null;
    }

    public void setFocus() {
        viewer.setFocus();
    }

    private ISelectionService getSelectionService() {
        return getSite().getWorkbenchWindow().getSelectionService();
    }
}