org.eclipse.e4.xwt.tools.ui.designer.dialogs.ImageDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.e4.xwt.tools.ui.designer.dialogs.ImageDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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:
 *     Soyatec - initial API and implementation
 *******************************************************************************/
package org.eclipse.e4.xwt.tools.ui.designer.dialogs;

import java.io.File;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.e4.xwt.utils.PathHelper;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

/**
 * @author jliu (jin.liu@soyatec.com)
 */
public class ImageDialog extends Dialog {

    private IProject project;
    private IFile file;
    private String imagePath;
    private Label imageLabel;
    private Label previewLable;

    private Image image;

    public ImageDialog(Shell parentShell, IFile file) {
        super(parentShell);
        this.file = file;
        if (file != null) {
            this.project = file.getProject();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText("Image Dialog");
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
     */
    protected boolean isResizable() {
        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#getInitialSize()
     */
    protected Point getInitialSize() {
        Point point = super.getInitialSize();
        if (point.y < 343) {
            point.y = 343;
        }
        if (point.x < 440) {
            point.x = 440;
        }
        return point;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    protected Control createDialogArea(Composite parent) {
        Composite dialogArea = (Composite) super.createDialogArea(parent);
        GridLayout layout = (GridLayout) dialogArea.getLayout();
        layout.numColumns = 2;

        Group leftComp = new Group(dialogArea, SWT.NONE);
        leftComp.setText("types");
        layout = new GridLayout(2, false);
        leftComp.setLayout(layout);
        leftComp.setLayoutData(new GridData(GridData.FILL_BOTH));

        final Button projRadio = new Button(leftComp, SWT.RADIO);
        projRadio.setText("Project");
        projRadio.setSelection(true);
        projRadio.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER));
        new Label(leftComp,
                SWT.NONE)/* .setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.GRAB_VERTICAL)) */;

        final Button fileRadio = new Button(leftComp, SWT.RADIO);
        fileRadio.setText("File System");
        fileRadio.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER));
        final Button browserButton = new Button(leftComp, SWT.PUSH);
        browserButton.setText("Browser");
        // browserButton.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.GRAB_VERTICAL));
        browserButton.setEnabled(false);

        Group previewer = new Group(dialogArea, SWT.NONE);
        previewer.setText("Preview");
        previewer.setLayout(new FillLayout());
        previewLable = new Label(previewer, SWT.CENTER | SWT.SHADOW_IN);
        GridData gd = new GridData(GridData.FILL_BOTH);
        // gd.heightHint = 50;
        // gd.widthHint = 50;
        // gd.horizontalSpan = 2;
        previewer.setLayoutData(gd);

        final TreeViewer viewer = new TreeViewer(dialogArea, SWT.BORDER);
        GridData layoutData = new GridData(GridData.FILL_BOTH);
        layoutData.horizontalSpan = 2;
        viewer.getControl().setLayoutData(layoutData);
        viewer.setContentProvider(new ImageContentProvider());
        JavaElementLabelProvider labelProvider = new JavaElementLabelProvider() {
            public String getText(Object element) {
                // Need a slight override, for source roots, want to show the entire path so that the project shows up.
                // It doesn't look as good because you can't tell what project the root is in when there are required projects.
                String result = super.getText(element);
                if (element instanceof IPackageFragmentRoot)
                    result = MessageFormat.format("{0} - {1}", new Object[] { result,
                            ((IPackageFragmentRoot) element).getJavaProject().getElementName() });
                return result;
            }
        };
        viewer.setLabelProvider(labelProvider);
        if (project != null) {
            viewer.setInput(JavaCore.create(project));
        }
        viewer.expandToLevel(2);
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                Object firstElement = selection.getFirstElement();
                if (firstElement instanceof IFile) {
                    IPath fullPath = ((IFile) firstElement).getLocation();
                    String path = fullPath.toString();
                    if (file != null) {
                        String sourcePath = file.getLocation().toString();
                        path = PathHelper.getRelativePath(sourcePath, path);
                    }
                    setImagePath(path);
                }
            }
        });
        Listener listener = new Listener() {
            public void handleEvent(Event event) {
                setImagePath(null);
                if (event.widget == projRadio) {
                    viewer.getControl().setEnabled(true);
                    browserButton.setEnabled(false);
                } else if (event.widget == fileRadio) {
                    viewer.getControl().setEnabled(false);
                    browserButton.setEnabled(true);
                } else if (event.widget == browserButton) {
                    chooseImage();
                }
            }
        };
        projRadio.addListener(SWT.Selection, listener);
        fileRadio.addListener(SWT.Selection, listener);
        browserButton.addListener(SWT.Selection, listener);

        Composite bottomComp = new Composite(dialogArea, SWT.NONE);
        layout = new GridLayout(2, false);
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        bottomComp.setLayout(layout);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        bottomComp.setLayoutData(gd);
        new Label(bottomComp, SWT.NONE).setText("Image:");
        imageLabel = new Label(bottomComp, SWT.NONE);
        imageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        return dialogArea;
    }

    protected void chooseImage() {
        FileDialog dialog = new FileDialog(getShell());
        dialog.setFilterExtensions(new String[] { "*.png", "*.gif", "*.*" });
        setImagePath(dialog.open());
    }

    private void setImagePath(String imagePath) {
        this.imagePath = imagePath;
        if (imagePath != null) {
            imageLabel.setText(imagePath);
        } else {
            imageLabel.setText("");
        }
        previewImage(imagePath);
    }

    private void previewImage(String imagePath) {
        if (image != null) {
            image.dispose();
        }
        if (imagePath == null) {
            previewLable.setImage(null);
        } else {
            File imageFile = new File(imagePath);
            if (imageFile.exists()) {
                image = new Image(null, imageFile.getAbsolutePath());
            } else if (file != null) {
                String absolutePath = PathHelper.getAbsolutePath(file.getLocation().toString(), imagePath);
                imageFile = new File(absolutePath);
                if (imageFile.exists()) {
                    image = new Image(null, imageFile.getAbsolutePath());
                }
            }
        }
        if (image != null && !image.isDisposed()) {
            previewLable.setImage(image);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#close()
     */
    public boolean close() {
        boolean close = super.close();
        if (image != null) {
            image.dispose();
        }
        return close;
    }

    public String getImagePath() {
        return imagePath;
    }

    /*
     * Content provider for java for our requirements. We extend the standard because it does some important things. We will just fine tune it here.
     */
    private static class ImageContentProvider extends StandardJavaElementContentProvider {

        private boolean validRoot(IPackageFragmentRoot root) {
            return !root.isExternal() && !root.isArchive();
        }

        /*
         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
         */
        public Object[] getElements(Object inputElement) {
            // This would be a project, and since it is the root, we want all packageFragmentRoots, including from required projects.
            try {
                if (inputElement instanceof IJavaProject) {
                    IPackageFragmentRoot[] roots = ((IJavaProject) inputElement).getAllPackageFragmentRoots();
                    ArrayList<IPackageFragmentRoot> newRoots = new ArrayList<IPackageFragmentRoot>(roots.length);
                    for (int i = 0; i < roots.length; i++) {
                        if (validRoot(roots[i]))
                            newRoots.add(roots[i]);
                    }

                    return newRoots.toArray();
                }
            } catch (JavaModelException e) {
            }
            return StandardJavaElementContentProvider.NO_CHILDREN;
        }

        /*
         * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)
         */
        public Object[] getChildren(Object parentElement) {
            try {
                // I don't need all types, I'm looking specifically only for package fragment roots. They are the only
                // element in this environment that can have children.
                if (parentElement instanceof IPackageFragmentRoot) {
                    return ((IPackageFragmentRoot) parentElement).getChildren(); // Get just the package fragments.
                } else if (parentElement instanceof IJavaElement) {
                    Object[] children = super.getChildren(parentElement);
                    List<Object> result = new ArrayList<Object>();
                    for (Object child : children) {
                        if (child instanceof IFile) {
                            String ext = ((IFile) child).getFileExtension();
                            if (ext != null && ("png".equals(ext) || "gif".equals(ext))) {
                                result.add(child);
                            }
                        }
                    }
                    return result.toArray(new Object[0]);
                }
            } catch (JavaModelException e) {
            }

            return StandardJavaElementContentProvider.NO_CHILDREN;
        }

        /*
         * @see org.eclipse.jdt.ui.StandardJavaElementContentProvider#hasChildren(Object)
         */
        public boolean hasChildren(Object element) {
            return super.hasChildren(element);
        }

        protected Object skipProjectPackageFragmentRoot(IPackageFragmentRoot root) {
            // We don't want to skip roots that are the project. We don't show the project in
            // our tree. Because of this we can never programatically select fragments.
            // So instead we return the root as is.
            return root;
        }

    }

}