Package bndtools.editor.project

Source Code of bndtools.editor.project.ClassPathPart

/*******************************************************************************
* Copyright (c) 2010 Neil Bartlett.
* 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:
*     Neil Bartlett - initial API and implementation
******************************************************************************/
package bndtools.editor.project;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
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.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.editor.IFormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.ide.ResourceUtil;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import aQute.bnd.build.model.BndEditModel;
import aQute.bnd.osgi.Constants;
import bndtools.Plugin;
import bndtools.utils.ClassFolderFilter;
import bndtools.utils.ClassPathLabelProvider;
import bndtools.utils.FileExtensionFilter;

public class ClassPathPart extends SectionPart implements PropertyChangeListener {

    private final Image imgAddJar = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "/icons/jar_add.gif").createImage();
    private final Image imgAddFolder = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "/icons/folder_add.gif").createImage();

    private List<IPath> classPath;

    private TableViewer viewer;
    private BndEditModel model;

    public ClassPathPart(Composite parent, FormToolkit toolkit, int style) {
        super(parent, toolkit, style);
        createSection(getSection(), toolkit);
    }

    private void createSection(Section section, FormToolkit toolkit) {
        section.setText("Classpath");
        section.setDescription("Define paths for classes that may appear in the bundle. If empty, the Eclipse project classpath will be used.");

        // Section toolbar buttons
        ToolBar toolbar = new ToolBar(section, SWT.FLAT);
        section.setTextClient(toolbar);
        final ToolItem addJarItem = new ToolItem(toolbar, SWT.PUSH);
        addJarItem.setImage(imgAddJar);
        addJarItem.setToolTipText("Add JAR");

        final ToolItem addFolderItem = new ToolItem(toolbar, SWT.PUSH);
        addFolderItem.setImage(imgAddFolder);
        addFolderItem.setToolTipText("Add Class Folder");

        final ToolItem removeItem = new ToolItem(toolbar, SWT.PUSH);
        removeItem.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_DELETE));
        removeItem.setDisabledImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_DELETE_DISABLED));
        removeItem.setToolTipText("Remove");
        removeItem.setEnabled(false);

        // Contents
        Composite composite = toolkit.createComposite(section, SWT.NONE);
        section.setClient(composite);
        Table table = toolkit.createTable(composite, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER);

        viewer = new TableViewer(table);
        viewer.setContentProvider(new ArrayContentProvider());
        viewer.setLabelProvider(new ClassPathLabelProvider());

        // Actions
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                removeItem.setEnabled(!viewer.getSelection().isEmpty());
            }
        });
        addJarItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doAddJar();
            }
        });
        addFolderItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doAddFolder();
            }
        });
        removeItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doRemove();
            }
        });

        // Layout
        GridLayout layout = new GridLayout(1, false);
        layout.horizontalSpacing = 0;
        layout.verticalSpacing = 0;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        composite.setLayout(layout);

        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
        gd.heightHint = 75;
        table.setLayoutData(gd);
    }

    private void doAddJar() {
        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getSection().getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider());
        dialog.setAllowMultiple(true);
        dialog.setTitle("JAR Selection");
        dialog.setMessage("Select JAR Files to add to the Classpath.");
        dialog.addFilter(new FileExtensionFilter("jar")); //$NON-NLS-1$

        IResource resource = getInputResource();
        dialog.setInput(resource.getProject());

        if (dialog.open() == Window.OK) {
            Object[] files = dialog.getResult();
            List<IPath> added = new ArrayList<IPath>(files.length);
            for (Object file : files) {
                IPath newPath = ((IResource) file).getFullPath().makeRelative();
                // Remove the first segment (project name)
                newPath = newPath.removeFirstSegments(1);
                added.add(newPath);
            }
            if (!added.isEmpty()) {
                classPath.addAll(added);
                viewer.add(added.toArray(new IPath[added.size()]));
                markDirty();
            }
        }
    }

    private void doAddFolder() {
        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getSection().getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider());
        dialog.setAllowMultiple(true);
        dialog.setTitle("Class Folder Selection");
        dialog.setMessage("Select Class Folders to add to the Classpath.");
        dialog.addFilter(new ClassFolderFilter());

        IResource resource = getInputResource();
        dialog.setInput(resource.getProject());

        if (dialog.open() == Window.OK) {
            Object[] folders = dialog.getResult();
            List<IPath> added = new ArrayList<IPath>(folders.length);
            for (Object folder : folders) {
                IPath newPath = ((IResource) folder).getFullPath().makeRelative().addTrailingSeparator();
                // Remove the first segment (project name)
                newPath = newPath.removeFirstSegments(1);
                added.add(newPath);
            }
            if (!added.isEmpty()) {
                classPath.addAll(added);
                viewer.add(added.toArray(new IPath[added.size()]));
                markDirty();
            }
        }
    }

    private void doRemove() {
        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
        classPath.removeAll(selection.toList());
        viewer.remove(selection.toArray());
        markDirty();
    }

    private IResource getInputResource() {
        IFormPage formPage = (IFormPage) getManagedForm().getContainer();
        IResource resource = ResourceUtil.getResource(formPage.getEditorInput());
        return resource;
    }

    @Override
    public void refresh() {
        try {
            List<String> temp = model.getClassPath();
            classPath = new ArrayList<IPath>(temp != null ? temp.size() : 5);
            if (temp != null) {
                for (String path : temp) {
                    classPath.add(new Path(path));
                }
            }
            viewer.setInput(classPath);
        } finally {}
        super.refresh();
    }

    @Override
    public void commit(boolean onSave) {
        super.commit(onSave);

        List<String> strings = new ArrayList<String>(classPath.size());
        for (IPath path : classPath) {
            strings.add(path.toString());
        }
        model.setClassPath(strings);
    }

    public void propertyChange(PropertyChangeEvent evt) {
        if (Constants.CLASSPATH.equals(evt.getPropertyName())) {
            IFormPage page = (IFormPage) getManagedForm().getContainer();
            if (page.isActive()) {
                refresh();
            } else {
                markStale();
            }
        }
    }

    @Override
    public void initialize(IManagedForm form) {
        super.initialize(form);
        model = (BndEditModel) form.getInput();
        model.addPropertyChangeListener(Constants.CLASSPATH, this);
    }

    @Override
    public void dispose() {
        model.removePropertyChangeListener(Constants.CLASSPATH, this);
        super.dispose();
        imgAddJar.dispose();
        imgAddFolder.dispose();
    }
}
TOP

Related Classes of bndtools.editor.project.ClassPathPart

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.