com.laex.j2objc.preferences.ClasspathPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for com.laex.j2objc.preferences.ClasspathPropertyPage.java

Source

/*
 * Copyright (c) 2012, 2013 Hemanta Sapkota.
 * 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:
 * Hemanta Sapkota (laex.pearl@gmail.com)
 */
package com.laex.j2objc.preferences;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.internal.SharedImages;

import com.laex.j2objc.util.LogUtil;
import com.laex.j2objc.util.ProjectUtil;
import com.laex.j2objc.util.PropertiesUtil;

/**
 * The Class ClasspathPropertyPage.
 */
public class ClasspathPropertyPage extends PropertyPage implements IWorkbenchPropertyPage {

    /** The classpath ref. */
    private Set<String> classpathRef = new HashSet<String>();

    /** The table. */
    private Table table;

    /** The checkbox table viewer. */
    private CheckboxTableViewer checkboxTableViewer;

    /** The btn use all classpath libraries. */
    private Button btnUseAllClasspathLibraries;

    /**
     * The Class TableLabelProvider.
     */
    private class TableLabelProvider extends LabelProvider implements ITableLabelProvider {

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java
         * .lang.Object, int)
         */
        public Image getColumnImage(Object element, int columnIndex) {
            if (columnIndex == 0) {
                String elm = (String) element;
                if (elm.endsWith("jar") || elm.endsWith("zip")) {
                    return new org.eclipse.jdt.internal.ui.SharedImages()
                            .getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_JAR);
                } else
                    return new SharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
            }

            return null;
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.
         * lang.Object, int)
         */
        public String getColumnText(Object element, int columnIndex) {
            if (columnIndex == 0) {
                Path p = new Path((String) element);
                return p.lastSegment();
            }

            return (String) element;
        }
    }

    /**
     * The Class ContentProvider.
     */

    private class ContentProvider implements IStructuredContentProvider {

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.IStructuredContentProvider#getElements(
         * java.lang.Object)
         */
        public Object[] getElements(Object inputElement) {
            Object[] o = ((Set<String>) inputElement).toArray();
            Arrays.sort(o);
            return o;
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        public void dispose() {
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse
         * .jface.viewers.Viewer, java.lang.Object, java.lang.Object)
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    /**
     * Instantiates a new classpath property page.
     */
    public ClasspathPropertyPage() {
        setDescription("The selected classpath entires are used at the time of compiling.");
        setMessage("Classpath Preferences");
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse
     * .swt.widgets.Composite)
     */
    @Override
    public Control createContents(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        container.setLayout(new GridLayout(1, false));

        btnUseAllClasspathLibraries = new Button(container, SWT.CHECK);
        btnUseAllClasspathLibraries.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                useAllClasspathLibs();
            }
        });
        btnUseAllClasspathLibraries.setText("Use all classpath libraries");

        Composite composite = new Composite(container, SWT.NONE);
        composite.setLayout(new FillLayout(SWT.HORIZONTAL));
        GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gd_composite.widthHint = 358;
        gd_composite.heightHint = 308;
        composite.setLayoutData(gd_composite);

        checkboxTableViewer = CheckboxTableViewer.newCheckList(composite, SWT.BORDER | SWT.FULL_SELECTION);
        table = checkboxTableViewer.getTable();
        table.setHeaderVisible(true);

        TableViewerColumn tableViewerColumn = new TableViewerColumn(checkboxTableViewer, SWT.NONE);
        TableColumn tblclmnLibraryName = tableViewerColumn.getColumn();
        tblclmnLibraryName.setWidth(116);
        tblclmnLibraryName.setText("Library");

        TableColumn tblclmnClasspath = new TableColumn(table, SWT.NONE);
        tblclmnClasspath.setWidth(400);
        tblclmnClasspath.setText("Classpath");

        checkboxTableViewer.setContentProvider(new ContentProvider());
        checkboxTableViewer.setLabelProvider(new TableLabelProvider());

        // load
        try {
            loadProjectReferencedClasspaths();
            loadUserSelectedClasspaths();
        } catch (CoreException e1) {
            LogUtil.logException(e1);
        } catch (IOException e1) {
            LogUtil.logException(e1);
        }

        return container;
    }

    /**
     * Load project referenced classpaths.
     */
    private void loadProjectReferencedClasspaths() {
        try {
            IClasspathEntry[] refClasspath = ProjectUtil.getJavaProject(getElement()).getResolvedClasspath(true);
            for (IClasspathEntry o : refClasspath) {

                IClasspathEntry entry = JavaCore.getResolvedClasspathEntry((IClasspathEntry) o);
                String path = null;

                // We need to figure out the path for different types of
                // classpath entries.
                // the types of entries are: CPE_LIBRARY, CPE_PROJECT,
                // CPE_SOURCE, CPE_VARIABLE, CPE_CONTAINER
                switch (entry.getEntryKind()) {
                case IClasspathEntry.CPE_LIBRARY:

                    // With CPE Library: some jar files could reside in system,
                    // like JDK jar files
                    // some jar files may reside in workspace, within other
                    // project.
                    // Check if the library resides in workspace project
                    IResource file = ResourcesPlugin.getWorkspace().getRoot().findMember(entry.getPath());
                    // null means, this library does not reside in workspace but
                    // instead in the system
                    if (file == null) {
                        // get the apropriate path
                        path = entry.getPath().makeAbsolute().toOSString();
                    } else {
                        // if resdies in workspace, get the appropriate path
                        if (file.exists()) {
                            path = file.getLocation().makeAbsolute().toOSString();
                        }
                    }

                    break;

                case IClasspathEntry.CPE_PROJECT:
                case IClasspathEntry.CPE_SOURCE:
                    // project and source
                    IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(entry.getPath());
                    if (res.exists()) {
                        path = res.getFullPath().makeAbsolute().toOSString();
                    }
                    break;
                }

                // some path may be folders. In that case, we have to make sure
                // we store the full absolute path to the folders
                boolean isArchive = path.endsWith("jar") || path.endsWith("zip");
                if (!isArchive) {
                    IPath ipath = new Path(path);
                    // We can only get a folder if the segment count is greater
                    // 2 i.e. if the path has at least two segments
                    if (ipath.segmentCount() >= 2) {
                        IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(ipath);
                        if (folder.exists()) {
                            classpathRef.add(folder.getLocation().makeAbsolute().toOSString());
                        }
                    }

                    // If the segment count is 1, then it is probably a project
                    if (ipath.segmentCount() == 1) {
                        IProject refPrj = ResourcesPlugin.getWorkspace().getRoot().getProject(path);
                        // if this is a project, then we assume it has a SRC
                        // folder; and therefore append SRC at the end
                        // this is required because j2objc compiler needs the
                        // path till the src folder to compile properly

                        classpathRef.add(refPrj.getLocation().append("src").makeAbsolute().toOSString());
                    }

                } else {
                    // add whatever archive path we get from the results
                    classpathRef.add(path);
                }

            }

            checkboxTableViewer.setInput(classpathRef);
            checkboxTableViewer.refresh();

        } catch (JavaModelException e) {
            LogUtil.logException(e);
        } catch (CoreException e) {
            LogUtil.logException(e);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.PreferencePage#performOk()
     */
    @Override
    public boolean performOk() {
        PropertiesUtil.persistClasspathEntries(ProjectUtil.getProject(getElement()),
                checkboxTableViewer.getCheckedElements());
        return super.performOk();
    }

    /**
     * Load user selected classpaths.
     *
     * @throws CoreException the core exception
     * @throws IOException Signals that an I/O exception has occurred.
     */
    private void loadUserSelectedClasspaths() throws CoreException, IOException {
        Properties props = PropertiesUtil.getClasspathEntries(ProjectUtil.getProject(getElement()));

        for (Object s : props.keySet()) {
            if (classpathRef.contains(s)) {
                checkboxTableViewer.setChecked(s, true);
            }
        }

        btnUseAllClasspathLibraries
                .setSelection(checkboxTableViewer.getCheckedElements().length == classpathRef.size());
    }

    /**
     * Use all classpath libs.
     */
    private void useAllClasspathLibs() {
        checkboxTableViewer.setAllChecked(btnUseAllClasspathLibraries.getSelection());
        checkboxTableViewer.refresh();
    }
}