org.springframework.ide.eclipse.beans.ui.properties.ConfigLocatorTab.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.ide.eclipse.beans.ui.properties.ConfigLocatorTab.java

Source

/*******************************************************************************
 * Copyright (c) 2008 Spring IDE Developers
 * 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:
 *     Spring IDE Developers - initial API and implementation
 *******************************************************************************/
package org.springframework.ide.eclipse.beans.ui.properties;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
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.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.springframework.ide.eclipse.beans.core.BeansCorePlugin;
import org.springframework.ide.eclipse.beans.core.model.locate.BeansConfigLocatorDefinition;
import org.springframework.ide.eclipse.beans.core.model.locate.BeansConfigLocatorFactory;
import org.springframework.ide.eclipse.beans.ui.BeansUIImages;
import org.springframework.ide.eclipse.beans.ui.BeansUIPlugin;
import org.springframework.ide.eclipse.ui.SpringUIMessages;

/**
 * @author Christian Dupuis
 * @since 2.0.5
 */
public class ConfigLocatorTab {

    private static class BeansConfigLocatorDefinitionContentProvider implements IStructuredContentProvider {

        private List<BeansConfigLocatorDefinition> beansConfigLocatorDefinitions;

        public BeansConfigLocatorDefinitionContentProvider(
                List<BeansConfigLocatorDefinition> projectBuilderDefinitions) {
            this.beansConfigLocatorDefinitions = projectBuilderDefinitions;
        }

        public void dispose() {
        }

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

        public Object[] getElements(Object inputElement) {
            return beansConfigLocatorDefinitions.toArray();
        }
    }

    private class BeansConfigLocatorLabelProvider extends LabelProvider implements IColorProvider {

        public String getText(Object element) {
            if (element instanceof BeansConfigLocatorDefinition) {
                return ((BeansConfigLocatorDefinition) element).getName();
            }
            return super.getText(element);
        }

        public Image getImage(Object element) {
            return BeansUIImages.getImage(BeansUIImages.IMG_OBJS_XSD);
        }

        public Color getBackground(Object element) {
            return null;
        }

        public Color getForeground(Object element) {
            if (element instanceof BeansConfigLocatorDefinition
                    && !((BeansConfigLocatorDefinition) element).getBeansConfigLocator().supports(project)) {
                return grayColor;
            }
            return null;
        }

        @Override
        public void dispose() {
            super.dispose();
            if (grayColor != null) {
                grayColor.dispose();
            }
        }
    }

    private List<BeansConfigLocatorDefinition> beansConfigLocatorDefinitions;

    private CheckboxTableViewer builderViewer;

    private Text descriptionText;

    private IProject project;

    private Color grayColor = new Color(Display.getDefault(), 150, 150, 150);

    public ConfigLocatorTab(IProject project) {
        this.beansConfigLocatorDefinitions = BeansConfigLocatorFactory.getBeansConfigLocatorDefinitions();
        this.project = project;
    }

    public Control createContents(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 3;
        layout.marginWidth = 3;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        if (!BeansCorePlugin.getDefault().isAutoDetectionEnabled()) {
            //We allow users to edit these settings... even though they have been all globally disabled.
            //At least warn the user of this. 
            Label warning = new Label(composite, SWT.WRAP);
            warning.setText(
                    "Warning: Autodetection has been globally disabled. Editing these setting will have no effect!");
            warning.setForeground(warning.getDisplay().getSystemColor(SWT.COLOR_RED));
        }

        Label beansLabel = new Label(composite, SWT.NONE);
        beansLabel.setText(
                BeansUIPlugin.getResourceString("ConfigurationPropertyPage.tabConfigLocators.description"));
        // config set list viewer
        builderViewer = CheckboxTableViewer.newCheckList(composite, SWT.BORDER);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 150;
        builderViewer.getTable().setLayoutData(gd);
        builderViewer.setContentProvider(
                new BeansConfigLocatorDefinitionContentProvider(this.beansConfigLocatorDefinitions));
        builderViewer.setLabelProvider(new BeansConfigLocatorLabelProvider());
        builderViewer.setInput(this); // activate content provider
        builderViewer.setCheckedElements(getEnabledBeansConfigLocatorDefinitions().toArray());
        builderViewer.setGrayedElements(getGreyedBeansConfigLocatorDefinitions().toArray());
        builderViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (event.getSelection() instanceof IStructuredSelection) {
                    IStructuredSelection sel = (IStructuredSelection) event.getSelection();
                    BeansConfigLocatorDefinition definition = (BeansConfigLocatorDefinition) sel.getFirstElement();
                    if (definition == null)
                        clearDescription();
                    else
                        showDescription(definition);
                }
            }
        });
        builderViewer.addCheckStateListener(new ICheckStateListener() {

            public void checkStateChanged(CheckStateChangedEvent event) {
                BeansConfigLocatorDefinition obj = (BeansConfigLocatorDefinition) event.getElement();
                if (!obj.getBeansConfigLocator().supports(project) && event.getChecked()) {
                    builderViewer.setChecked(obj, false);
                }
            }
        });

        Label descriptionLabel = new Label(composite, SWT.NONE);
        descriptionLabel.setText(SpringUIMessages.ProjectBuilderPropertyPage_builderDescription);

        descriptionText = new Text(composite, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY | SWT.BORDER | SWT.H_SCROLL);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.heightHint = 30;
        descriptionText.setLayoutData(data);

        return composite;
    }

    private List<BeansConfigLocatorDefinition> getEnabledBeansConfigLocatorDefinitions() {
        List<BeansConfigLocatorDefinition> builderDefinitions = beansConfigLocatorDefinitions;
        List<BeansConfigLocatorDefinition> filteredBuilderDefinitions = new ArrayList<BeansConfigLocatorDefinition>();
        for (BeansConfigLocatorDefinition builderDefinition : builderDefinitions) {
            if (builderDefinition.isEnabled(project)
                    && builderDefinition.getBeansConfigLocator().supports(project)) {
                filteredBuilderDefinitions.add(builderDefinition);
            }
        }
        return filteredBuilderDefinitions;
    }

    private List<BeansConfigLocatorDefinition> getGreyedBeansConfigLocatorDefinitions() {
        List<BeansConfigLocatorDefinition> builderDefinitions = beansConfigLocatorDefinitions;
        List<BeansConfigLocatorDefinition> filteredBuilderDefinitions = new ArrayList<BeansConfigLocatorDefinition>();
        for (BeansConfigLocatorDefinition builderDefinition : builderDefinitions) {
            if (!builderDefinition.getBeansConfigLocator().supports(project)) {
                filteredBuilderDefinitions.add(builderDefinition);
            }
        }
        return filteredBuilderDefinitions;
    }

    /**
     * Show the selected description in the text.
     */
    private void showDescription(BeansConfigLocatorDefinition definition) {
        if (descriptionText == null || descriptionText.isDisposed()) {
            return;
        }
        String text = "";
        if (!definition.getBeansConfigLocator().supports(project)) {
            text = "This configuration file detector does not support the current project!\n\r";
        }
        text += definition.getDescription();

        if (text == null || text.length() == 0) {
            descriptionText.setText(SpringUIMessages.ProjectBuilderPropertyPage_noBuilderDescription);
        } else {
            descriptionText.setText(text);
        }
    }

    /**
     * Clear the selected description in the text.
     */
    private void clearDescription() {
        if (descriptionText == null || descriptionText.isDisposed()) {
            return;
        }
        descriptionText.setText(""); //$NON-NLS-1$
    }

    public boolean performOk() {
        if (Arrays.deepEquals(getEnabledBeansConfigLocatorDefinitions().toArray(),
                this.builderViewer.getCheckedElements())) {
            return true;
        }
        final List checkElements = Arrays.asList(this.builderViewer.getCheckedElements());

        WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {

            @Override
            protected void execute(IProgressMonitor monitor)
                    throws CoreException, InvocationTargetException, InterruptedException {
                for (BeansConfigLocatorDefinition beansConfigLocatorDefinition : beansConfigLocatorDefinitions) {
                    if (checkElements.contains(beansConfigLocatorDefinition)) {
                        beansConfigLocatorDefinition.setEnabled(true, project);
                    } else {
                        beansConfigLocatorDefinition.setEnabled(false, project);
                    }
                }
            }
        };

        try {
            operation.run(new NullProgressMonitor());
        } catch (InvocationTargetException e) {
        } catch (InterruptedException e) {
        }
        return true;
    }
}