/*******************************************************************************
* 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;
}
}