net.sf.j2s.ui.property.J2SAddInnerJarAction.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.j2s.ui.property.J2SAddInnerJarAction.java

Source

/*******************************************************************************
 * Copyright (c) 2007 java2script.org 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:
 *     Zhou Renjian - initial API and implementation
 *******************************************************************************/
package net.sf.j2s.ui.property;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.sf.j2s.ui.classpath.IRuntimeClasspathEntry;
import net.sf.j2s.ui.classpath.Resource;
import net.sf.j2s.ui.launching.JavaRuntime;
import net.sf.j2s.ui.resources.ExternalResources;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
import org.eclipse.jdt.internal.debug.ui.actions.ObjectFilter;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;

/**
 * @author zhou renjian
 *
 * 2006-2-1
 */
public class J2SAddInnerJarAction implements SelectionListener {
    J2SConfigPage page;
    File j2sFile;

    private ISelectionStatusValidator validator = new ISelectionStatusValidator() {
        public IStatus validate(Object[] selection) {
            if (selection.length == 0) {
                return new Status(IStatus.ERROR, JDIDebugPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
            }
            for (int i = 0; i < selection.length; i++) {
                if (!(selection[i] instanceof String)) {
                    return new Status(IStatus.ERROR, JDIDebugPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
                }
            }
            return new Status(IStatus.OK, JDIDebugPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
        }
    };

    public J2SAddInnerJarAction(J2SConfigPage page) {
        super();
        this.page = page;
    }

    public void widgetSelected(SelectionEvent e) {
        ViewerFilter filter = new ArchiveFilter(new ArrayList());
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        String rootPath = root.getLocation().toOSString();
        String rootTruePath = new File(rootPath).getAbsolutePath();
        String j2sPath = page.j2sFile.getAbsolutePath();
        String prjName = null;
        if (j2sPath.startsWith(rootTruePath)) {
            j2sPath = j2sPath.substring(rootTruePath.length());
            if (j2sPath.startsWith(File.separator)) {
                j2sPath = j2sPath.substring(1);
            }
            prjName = j2sPath.substring(0, j2sPath.indexOf(File.separatorChar));
        }
        final IProject project = (prjName != null) ? root.getProject(prjName) : null;
        ILabelProvider lp = new LabelProvider() {

            public String getText(Object element) {
                if (element instanceof J2SLibrary[]) {
                    //J2SLibrary[] libs = (J2SLibrary[]) element;
                    return "Inner JS Library";
                } else if (element instanceof J2SLibrary) {
                    J2SLibrary lib = (J2SLibrary) element;
                    String name = lib.getName();
                    return name;
                } else if (element instanceof String) {
                    String res = (String) element;
                    String name = new File(res).getName();
                    if (name.endsWith(".j2x")) {
                        return name.substring(0, name.length() - 4);
                    }
                    return name;
                }
                return super.getText(element);
            }

            public Image getImage(Object element) {
                if (element instanceof J2SLibrary[]) {
                    return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_PACKFRAG_ROOT);
                } else if (element instanceof J2SLibrary) {
                    return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_PACKFRAG_ROOT);
                } else if (element instanceof String) {
                    return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
                }
                return super.getImage(element);
            }

        };
        ITreeContentProvider cp = new ITreeContentProvider() {

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }

            public void dispose() {
            }

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

            public boolean hasChildren(Object element) {
                if (element instanceof J2SLibrary[]) {
                    return true;
                } else if (element instanceof J2SLibrary) {
                    return true;
                }
                return false;
            }

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

            public Object[] getChildren(Object parentElement) {
                if (parentElement instanceof J2SLibrary[]) {
                    J2SLibrary[] libs = (J2SLibrary[]) parentElement;
                    return libs;
                } else if (parentElement instanceof J2SLibrary) {
                    J2SLibrary lib = (J2SLibrary) parentElement;
                    String[] resources = lib.getResources();
                    try {
                        String[] ress = new String[resources.length];
                        for (int i = 0; i < resources.length; i++) {
                            ress[i] = "|" + (new File(resources[i].substring(1)).getCanonicalPath());
                        }
                        return ress;
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    return resources;
                }
                return null;
            }
        };

        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(e.display.getActiveShell(), lp, cp) {
            protected TreeViewer createTreeViewer(Composite parent) {
                TreeViewer treeViewer = super.createTreeViewer(parent);
                treeViewer.expandToLevel(2);
                return treeViewer;
            }
        };
        dialog.setValidator(validator);
        dialog.setTitle("Libraries Selection"); //$NON-NLS-1$
        dialog.setMessage("Choose libraries (*.j2x)"); //$NON-NLS-1$
        //      dialog.addFilter(filter);
        List rr = page.classpathModel.resources;
        List al = new ArrayList(rr.size());
        for (Iterator iter = rr.iterator(); iter.hasNext();) {
            Resource res = (Resource) iter.next();
            try {
                al.add("|" + res.getAbsoluteFile().getCanonicalPath());
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
        dialog.addFilter(new ObjectFilter(al));
        String[] allKeys = ExternalResources.getAllKeys();
        String[] allDescriptions = ExternalResources.getAllDescriptions();
        String[][] allResources = ExternalResources.getAllResources();
        J2SLibrary[] libs = new J2SLibrary[allKeys.length];
        for (int i = 0; i < libs.length; i++) {
            J2SLibrary library = new J2SLibrary();
            library.setName(allKeys[i]);
            library.setDesc(allDescriptions[i]);
            library.setResources(allResources[i]);
            libs[i] = library;
        }
        dialog.setInput(libs);

        if (dialog.open() == Window.OK) {
            Object[] expandedElements = page.viewer.getExpandedElements();
            Object[] elements = dialog.getResult();
            boolean added = false;
            for (int i = 0; i < elements.length; i++) {
                String elem = (String) elements[i];
                String resPath = elem.substring(1);
                IRuntimeClasspathEntry entry = JavaRuntime.newArchiveRuntimeClasspathEntry(resPath);
                if (entry != null) {
                    ((Resource) entry).setAbsolute(true);
                    page.classpathModel.resources.add(entry);
                    added = true;
                }
            }
            if (added) {
                ScrollBar bar = page.viewer.getTree().getVerticalBar();
                double selection = 0;
                if (bar != null) {
                    selection = (0.0 + bar.getSelection()) / bar.getMaximum();
                }
                page.viewer.refresh();
                //viewer.expandToLevel(2);
                page.viewer.setExpandedElements(expandedElements);
                if (bar != null) {
                    bar.setSelection((int) Math.round(selection * bar.getMaximum()));
                }
                page.updateButtonGroup();
                page.fireConfigModified();
            }
            //getViewer().addEntries(res);
        }
    }

    public void widgetDefaultSelected(SelectionEvent e) {

    }

    public File getJ2SFile() {
        return j2sFile;
    }

    public void setJ2SFile(File file) {
        j2sFile = file;
    }

}