/*******************************************************************************
* Copyright (c) 2017 Pivotal Software, Inc.
* 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:
* Pivotal Software, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.boot.wizard;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.springframework.ide.eclipse.boot.core.initializr.InitializrServiceSpec.Dependency;
import org.springframework.ide.eclipse.boot.wizard.CheckBoxesSection.CheckBoxModel;
import org.springsource.ide.eclipse.commons.livexp.core.LiveExpression;
import org.springsource.ide.eclipse.commons.livexp.core.SelectionModel;
import org.springsource.ide.eclipse.commons.livexp.core.UIValueListener;
import org.springsource.ide.eclipse.commons.livexp.core.ValidationResult;
import org.springsource.ide.eclipse.commons.livexp.ui.IPageWithSections;
import org.springsource.ide.eclipse.commons.livexp.ui.SimpleLabelProvider;
import org.springsource.ide.eclipse.commons.livexp.ui.WizardPageSection;
import org.springsource.ide.eclipse.commons.livexp.util.Filter;
/**
* This is one of the columns in a three-column version of the Spring starter
* wizard: column 1 is the category selection section.
*
*
*
*/
@Deprecated
public class ColumnSectionForCategories extends WizardPageSection {
private SelectionModel<String> selection;
private String[] categories; //The elements to choose from
private final NewSpringBootWizardModel model;
private TableViewer viewer;
private ILabelProvider labelProvider = new SimpleLabelProvider();
List<String> hiddenCategories = new ArrayList<>();
public ColumnSectionForCategories(IPageWithSections owner, NewSpringBootWizardModel model, SelectionModel<String> selection) {
super(owner);
this.selection = selection;
this.model = model;
this.categories = model.dependencies.getCategories().toArray(new String[]{});
model.getDependencyFilter().addListener(new UIValueListener<Filter<Dependency>>() {
@Override
protected void uiGotValue(
LiveExpression<Filter<Dependency>> exp,
Filter<Dependency> value
) {
applyFilter(value);
}
});
}
@Override
public LiveExpression<ValidationResult> getValidator() {
return selection.validator;
}
@Override
public void createContents(Composite page) {
Composite area = area(page);
viewer = new TableViewer(area, SWT.SINGLE|SWT.BORDER|SWT.V_SCROLL);
viewer.addFilter(new ChoicesFilter());
viewer.setLabelProvider(labelProvider);
viewer.setContentProvider(ArrayContentProvider.getInstance());
viewer.setInput(categories);
GridDataFactory grab = GridDataFactory.fillDefaults().grab(true, true);
grab.applyTo(viewer.getTable());
whenVisible(viewer.getControl(), () -> setSelectionInViewer());
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
ISelection sel = viewer.getSelection();
if (sel instanceof IStructuredSelection){
IStructuredSelection ss = (IStructuredSelection) sel;
String val = (String)ss.getFirstElement();
if (val != null) {
selection.selection.setValue(val);
}
}
}
});
}
protected Composite area(Composite parent) {
Composite area = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(1).applyTo(area);
GridDataFactory.fillDefaults().grab(true, true).applyTo(area);
return area;
}
protected void setSelectionInViewer() {
if (viewer != null && !viewer.getControl().isDisposed()) {
String preSelect = selection.selection.getValue();
if (preSelect != null) {
viewer.setSelection(new StructuredSelection(preSelect), true);
} else {
viewer.setSelection(StructuredSelection.EMPTY, true);
}
}
}
private void whenVisible(final Control control, final Runnable runnable) {
PaintListener l = new PaintListener() {
public void paintControl(PaintEvent e) {
runnable.run();
control.removePaintListener(this);
}
};
control.addPaintListener(l);
}
private void applyFilter(Filter<Dependency> filter) {
hiddenCategories.clear();
if (viewer != null && !viewer.getControl().isDisposed()) {
for (String cat : model.dependencies.getCategories()) {
MultiSelectionFieldModel<Dependency> dependencyGroup = model.dependencies.getContents(cat);
List<CheckBoxModel<Dependency>> checkBoxModels = dependencyGroup.getCheckBoxModels();
boolean showCategory = false;
if (checkBoxModels != null) {
for (CheckBoxModel<Dependency> checkBoxModel : checkBoxModels) {
// If filter applies to at least one item, show the category
if (applyFilterOnItem(filter, checkBoxModel)) {
showCategory = true;
break;
}
}
}
if (!showCategory) {
hiddenCategories.add(cat);
}
}
setSelectionInViewer();
viewer.refresh(true);
}
}
private boolean applyFilterOnItem(Filter<Dependency> filter, CheckBoxModel<Dependency> model) {
return filter.accept(model.getValue());
}
private class ChoicesFilter extends ViewerFilter {
public ChoicesFilter() {
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
String label = labelProvider.getText(element);
if (match(label)) {
return true;
}
return false;
}
private boolean match(String categoryLabel) {
return !hiddenCategories.contains(categoryLabel);
}
}
}