com.aptana.ui.preferences.ProjectBuildPathPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ui.preferences.ProjectBuildPathPropertyPage.java

Source

/**
 * Aptana Studio
 * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
 * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
 * Please see the license.html included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.ui.preferences;

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

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;

import com.aptana.buildpath.core.BuildPathEntry;
import com.aptana.buildpath.core.BuildPathManager;
import com.aptana.index.core.RebuildIndexJob;

public class ProjectBuildPathPropertyPage extends PropertyPage implements IWorkbenchPropertyPage {
    private IProject project;
    private CheckboxTableViewer tableViewer;

    /**
     * ProjectBuildPathPropertyPage
     */
    public ProjectBuildPathPropertyPage() {
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createContents(Composite parent) {
        // get project
        project = (IProject) getElement().getAdapter(IResource.class);

        // get entire list and selected items in that list
        Set<BuildPathEntry> entries = getBuildPathEntries(project);
        Set<BuildPathEntry> selectedEntries = getSelectedBuildPathEntries(project);

        // top-level composite
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout());
        composite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());

        // labels
        setDescription(
                MessageFormat.format(Messages.ProjectBuildPathPropertyPage_TableDescription, project.getName()));
        Label description = createDescriptionLabel(composite);
        description.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());

        // table composite
        Composite tableComposite = new Composite(composite, SWT.NONE);
        tableComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).create());
        tableComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());

        // table
        tableViewer = CheckboxTableViewer.newCheckList(tableComposite, SWT.TOP | SWT.BORDER);
        Table table = tableViewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        table.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());

        TableColumn column1 = new TableColumn(table, SWT.LEFT);
        column1.setText(Messages.ProjectBuildPathPropertyPage_LibraryColumnLabel);
        column1.setWidth(165);

        TableColumn column2 = new TableColumn(table, SWT.LEFT);
        column2.setText(Messages.ProjectBuildPathPropertyPage_PathColumnLabel);
        column2.setWidth(350);

        tableViewer.setContentProvider(getContentProvider());
        tableViewer.setLabelProvider(getLabelProvider());
        tableViewer.setComparator(getCompartor());
        tableViewer.setInput(entries);
        tableViewer.setCheckedElements(selectedEntries.toArray());

        return composite;
    }

    /**
     * @return
     */
    private ViewerComparator getCompartor() {
        return new ViewerComparator() {

            public int compare(Viewer viewer, Object e1, Object e2) {
                if (e1 instanceof BuildPathEntry && e2 instanceof BuildPathEntry) {
                    BuildPathEntry bpe1 = (BuildPathEntry) e1;
                    BuildPathEntry bpe2 = (BuildPathEntry) e2;

                    return bpe1.getDisplayName().compareTo(bpe2.getDisplayName());
                }

                return 0;
            }
        };
    }

    /**
     * getBuildPathEntries
     * 
     * @param project
     * @return
     */
    private Set<BuildPathEntry> getBuildPathEntries(IProject project) {
        return BuildPathManager.getInstance().getBuildPaths();
    }

    /**
     * getSelectedBuildPathEntries
     * 
     * @param project
     * @return
     */
    private Set<BuildPathEntry> getSelectedBuildPathEntries(IProject project) {
        return BuildPathManager.getInstance().getBuildPaths(project);
    }

    /**
     * getContentProvider
     * 
     * @return
     */
    private IStructuredContentProvider getContentProvider() {
        return new BaseWorkbenchContentProvider() {
            /*
             * (non-Javadoc)
             * @see org.eclipse.ui.model.BaseWorkbenchContentProvider#getChildren(java.lang.Object)
             */
            @Override
            public Object[] getChildren(Object element) {
                if (element instanceof Set<?>) {
                    return ((Set<?>) element).toArray();
                }
                return super.getChildren(element);
            }
        };
    }

    /**
     * getLabelProvider
     * 
     * @return
     */
    private IBaseLabelProvider getLabelProvider() {
        return new ITableLabelProvider() {

            public void addListener(ILabelProviderListener listener) {
            }

            public void dispose() {
            }

            public boolean isLabelProperty(Object element, String property) {
                return false;
            }

            public void removeListener(ILabelProviderListener listener) {
            }

            public Image getColumnImage(Object element, int columnIndex) {
                return null;
            }

            public String getColumnText(Object element, int columnIndex) {
                if (element instanceof BuildPathEntry) {
                    BuildPathEntry entry = (BuildPathEntry) element;

                    switch (columnIndex) {
                    case 0:
                        return entry.getDisplayName();
                    case 1:
                        String result = entry.getPath().toString();

                        if (result != null && result.startsWith("file:")) //$NON-NLS-1$
                        {
                            File f = new File(entry.getPath());
                            return f.getAbsolutePath();
                        }
                        return result;
                    }
                }

                return null;
            }
        };
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#performOk()
     */
    @Override
    public boolean performOk() {
        Object[] items = tableViewer.getCheckedElements();
        List<BuildPathEntry> entries = new ArrayList<BuildPathEntry>();

        for (Object item : items) {
            if (item instanceof BuildPathEntry) {
                entries.add((BuildPathEntry) item);
            }
        }

        BuildPathManager manager = BuildPathManager.getInstance();

        // determine if the selection has changed
        Set<BuildPathEntry> currentEntries = manager.getBuildPaths(project);
        Set<BuildPathEntry> newEntries = new HashSet<BuildPathEntry>(entries);

        if (!newEntries.equals(currentEntries)) {
            BuildPathManager.getInstance().setBuildPaths(project, entries);

            // rebuild project index
            RebuildIndexJob job = new RebuildIndexJob(project.getLocationURI());

            job.run(new NullProgressMonitor());
        }

        return true;
    }
}