com.siteview.mde.internal.ui.editor.build.BuildClasspathSection.java Source code

Java tutorial

Introduction

Here is the source code for com.siteview.mde.internal.ui.editor.build.BuildClasspathSection.java

Source

/*******************************************************************************
 *  Copyright (c) 2000, 2008 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.siteview.mde.internal.ui.editor.build;

import com.siteview.mde.core.monitor.IMonitorModelBase;
import com.siteview.mde.core.monitor.MonitorRegistry;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.Window;
import com.siteview.mde.core.IModelChangedEvent;
import com.siteview.mde.core.IModelChangedListener;
import com.siteview.mde.core.build.*;
import org.eclipse.pde.internal.build.IBuildPropertiesConstants;
import com.siteview.mde.internal.core.natures.MDE;
import com.siteview.mde.internal.ui.MDEPlugin;
import com.siteview.mde.internal.ui.MDEUIMessages;
import com.siteview.mde.internal.ui.editor.*;
import com.siteview.mde.internal.ui.editor.context.InputContext;
import com.siteview.mde.internal.ui.elements.DefaultContentProvider;
import com.siteview.mde.internal.ui.parts.EditableTablePart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.forms.widgets.*;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;

public class BuildClasspathSection extends TableSection implements IModelChangedListener {

    private TableViewer fTableViewer;
    private boolean fEnabled = true;

    /**
     * Implementation of a <code>ISelectionValidator</code> to validate the
     * type of an element.
     * Empty selections are not accepted.
     */
    class ElementSelectionValidator implements ISelectionStatusValidator {

        private Class[] fAcceptedTypes;
        private boolean fAllowMultipleSelection;

        /**
         * @param acceptedTypes The types accepted by the validator
         * @param allowMultipleSelection If set to <code>true</code>, the validator
         * allows multiple selection.
         */
        public ElementSelectionValidator(Class[] acceptedTypes, boolean allowMultipleSelection) {
            Assert.isNotNull(acceptedTypes);
            fAcceptedTypes = acceptedTypes;
            fAllowMultipleSelection = allowMultipleSelection;
        }

        /*
         * @see org.eclipse.ui.dialogs.ISelectionValidator#isValid(java.lang.Object)
         */
        public IStatus validate(Object[] elements) {
            if (isValid(elements)) {
                return new Status(IStatus.OK, MDEPlugin.getPluginId(), IStatus.OK, "", //$NON-NLS-1$
                        null);
            }
            return new Status(IStatus.ERROR, MDEPlugin.getPluginId(), IStatus.ERROR, "", //$NON-NLS-1$
                    null);
        }

        private boolean isOfAcceptedType(Object o) {
            for (int i = 0; i < fAcceptedTypes.length; i++) {
                if (fAcceptedTypes[i].isInstance(o)) {
                    return true;
                }
            }
            return false;
        }

        private boolean isValid(Object[] selection) {
            if (selection.length == 0) {
                return false;
            }

            if (!fAllowMultipleSelection && selection.length != 1) {
                return false;
            }

            for (int i = 0; i < selection.length; i++) {
                Object o = selection[i];
                if (!isOfAcceptedType(o)) {
                    return false;
                }
            }
            return true;
        }
    }

    class TableContentProvider extends DefaultContentProvider implements IStructuredContentProvider {
        public Object[] getElements(Object parent) {
            if (parent instanceof IBuildModel) {
                IBuild build = ((IBuildModel) parent).getBuild();
                IBuildEntry entry = build.getEntry(IBuildPropertiesConstants.PROPERTY_JAR_EXTRA_CLASSPATH);
                if (entry != null) {
                    return entry.getTokens();
                }
            }
            return new Object[0];
        }
    }

    class TableLabelProvider extends LabelProvider implements ITableLabelProvider {
        public String getColumnText(Object obj, int index) {
            return obj.toString();
        }

        public Image getColumnImage(Object obj, int index) {
            ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
            return sharedImages.getImage(ISharedImages.IMG_OBJ_FILE);
        }
    }

    public BuildClasspathSection(MDEFormPage page, Composite parent) {
        super(page, parent, Section.DESCRIPTION | ExpandableComposite.TWISTIE,
                new String[] { MDEUIMessages.BuildEditor_ClasspathSection_add,
                        MDEUIMessages.BuildEditor_ClasspathSection_remove, null, null });
        getSection().setText(MDEUIMessages.BuildEditor_ClasspathSection_title);
        getSection().setDescription(MDEUIMessages.BuildEditor_ClasspathSection_desc);
        initialize();

    }

    private IBuildModel getBuildModel() {
        InputContext context = getPage().getMDEEditor().getContextManager()
                .findContext(BuildInputContext.CONTEXT_ID);
        if (context == null)
            return null;
        return (IBuildModel) context.getModel();
    }

    public void initialize() {
        getBuildModel().addModelChangedListener(this);
        IBuildEntry entry = getBuildModel().getBuild()
                .getEntry(IBuildPropertiesConstants.PROPERTY_JAR_EXTRA_CLASSPATH);
        getSection().setExpanded(entry != null && entry.getTokens().length > 0);
    }

    public void createClient(Section section, FormToolkit toolkit) {
        Composite container = createClientContainer(section, 2, toolkit);
        createViewerPartControl(container, SWT.FULL_SELECTION, 2, toolkit);

        EditableTablePart tablePart = getTablePart();
        tablePart.setEditable(true);
        fTableViewer = tablePart.getTableViewer();

        fTableViewer.setContentProvider(new TableContentProvider());
        fTableViewer.setLabelProvider(new TableLabelProvider());
        fTableViewer.setInput(getBuildModel());

        toolkit.paintBordersFor(container);
        enableSection(true);
        section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1));
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        section.setLayoutData(data);
        data.horizontalSpan = 2;
        section.setClient(container);
    }

    protected void fillContextMenu(IMenuManager manager) {
        ISelection selection = fTableViewer.getSelection();

        // add NEW action
        Action action = new Action(MDEUIMessages.BuildEditor_ClasspathSection_add) {
            public void run() {
                handleNew();
            }
        };
        action.setEnabled(fEnabled);
        manager.add(action);

        manager.add(new Separator());

        // add DELETE action
        action = new Action(MDEUIMessages.BuildEditor_ClasspathSection_remove) {
            public void run() {
                handleDelete();
            }
        };
        action.setEnabled(!selection.isEmpty() && fEnabled);
        manager.add(action);

        getPage().getMDEEditor().getContributor().contextMenuAboutToShow(manager, false);
    }

    public void dispose() {
        IBuildModel model = getBuildModel();
        if (model != null)
            model.removeModelChangedListener(this);
        super.dispose();
    }

    public void refresh() {
        fTableViewer.refresh();
    }

    public boolean doGlobalAction(String actionId) {
        if (actionId.equals(ActionFactory.DELETE.getId())) {
            if (fEnabled) {
                handleDelete();
            }
            return true;
        }
        return false;
    }

    public void enableSection(boolean enable) {
        fEnabled = enable;
        EditableTablePart tablePart = getTablePart();
        tablePart.setButtonEnabled(1, enable && !fTableViewer.getSelection().isEmpty());
        tablePart.setButtonEnabled(0, enable);
    }

    protected void selectionChanged(IStructuredSelection selection) {
        getPage().getMDEEditor().setSelection(selection);
        getTablePart().setButtonEnabled(1, selection != null && selection.size() > 0 && fEnabled);
    }

    private void handleDelete() {
        Object selection = ((IStructuredSelection) fTableViewer.getSelection()).getFirstElement();
        if (selection != null && selection instanceof String) {
            IBuild build = getBuildModel().getBuild();
            IBuildEntry entry = build.getEntry(IBuildPropertiesConstants.PROPERTY_JAR_EXTRA_CLASSPATH);
            if (entry != null) {
                try {
                    entry.removeToken(selection.toString());

                    String[] tokens = entry.getTokens();
                    if (tokens.length == 0)
                        build.remove(entry);

                } catch (CoreException e) {
                    MDEPlugin.logException(e);
                }
            }
        }
    }

    private void initializeDialogSettings(ElementTreeSelectionDialog dialog) {
        Class[] acceptedClasses = new Class[] { IFile.class };
        dialog.setValidator(new ElementSelectionValidator(acceptedClasses, true));
        dialog.setTitle(MDEUIMessages.BuildEditor_ClasspathSection_jarsTitle);
        dialog.setMessage(MDEUIMessages.BuildEditor_ClasspathSection_jarsDesc);
        dialog.addFilter(new JARFileFilter());
        dialog.addFilter(new ViewerFilter() {
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                if (element instanceof IProject) {
                    try {
                        return ((IProject) element).hasNature(MDE.PLUGIN_NATURE);
                    } catch (CoreException e) {
                    }
                    return false;
                } else if (element instanceof IResource) {
                    IBuildModel model = getBuildModel();
                    IBuildEntry entry = model.getBuild()
                            .getEntry(IBuildPropertiesConstants.PROPERTY_JAR_EXTRA_CLASSPATH);
                    if (entry != null)
                        return !entry.contains(getRelativePathTokenName((IResource) element));
                }
                return true;
            }
        });
        dialog.setInput(MDEPlugin.getWorkspace().getRoot());
        dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
        dialog.setInitialSelection(getBuildModel().getUnderlyingResource().getProject());

    }

    private void handleNew() {
        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getSection().getShell(),
                new WorkbenchLabelProvider(), new WorkbenchContentProvider());

        initializeDialogSettings(dialog);
        if (dialog.open() == Window.OK) {
            Object[] elements = dialog.getResult();
            for (int i = 0; i < elements.length; i++) {
                IResource elem = (IResource) elements[i];
                String tokenName = getRelativePathTokenName(elem);
                if (tokenName == null)
                    continue;
                addClasspathToken(tokenName);
            }
        }
    }

    private void addClasspathToken(String tokenName) {
        IBuildModel model = getBuildModel();
        IBuildEntry entry = model.getBuild().getEntry(IBuildPropertiesConstants.PROPERTY_JAR_EXTRA_CLASSPATH);
        try {
            if (entry == null) {
                entry = model.getFactory().createEntry(IBuildPropertiesConstants.PROPERTY_JAR_EXTRA_CLASSPATH);
                model.getBuild().add(entry);
            }
            if (!entry.contains(tokenName))
                entry.addToken(tokenName);
        } catch (CoreException e) {
            MDEPlugin.logException(e);
        }
    }

    private String getRelativePathTokenName(IResource elem) {
        IProject thisProject = getBuildModel().getUnderlyingResource().getProject();
        IProject elemProject = elem.getProject();
        String projectRelative = elem.getProjectRelativePath().toString();
        if (thisProject == elemProject)
            return projectRelative;

        IMonitorModelBase model = MonitorRegistry.findModel(elemProject);
        if (model != null)
            return "platform:/plugin/" + model.getMonitorBase().getId() + '/' + projectRelative; //$NON-NLS-1$
        return null;
    }

    protected void buttonSelected(int index) {
        switch (index) {
        case 0:
            handleNew();
            break;
        case 1:
            handleDelete();
            break;
        default:
            break;
        }
    }

    public void modelChanged(IModelChangedEvent event) {
        if (event.getChangeType() == IModelChangedEvent.WORLD_CHANGED)
            markStale();
        else if (event.getChangeType() == IModelChangedEvent.CHANGE) {
            Object changeObject = event.getChangedObjects()[0];

            if (changeObject instanceof IBuildEntry
                    && ((IBuildEntry) changeObject).getName().equals(IBuildEntry.JARS_EXTRA_CLASSPATH)) {
                Table table = fTableViewer.getTable();
                int index = table.getSelectionIndex();
                fTableViewer.refresh();
                int count = table.getItemCount();
                if (index == -1 || index >= count || event.getOldValue() == null)
                    index = count - 1;
                if (count == 0)
                    fTableViewer.setSelection(null);
                else
                    fTableViewer.setSelection(new StructuredSelection(table.getItem(index).getData()));
                table.setFocus();
            }
        }
    }
}