/*******************************************************************************
* 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 org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.springframework.ide.eclipse.boot.core.initializr.InitializrServiceSpec.Dependency;
import org.springsource.ide.eclipse.commons.livexp.core.LiveExpression;
import org.springsource.ide.eclipse.commons.livexp.core.ValueListener;
import org.springsource.ide.eclipse.commons.livexp.ui.IPageWithSections;
import org.springsource.ide.eclipse.commons.livexp.ui.Scroller;
import org.springsource.ide.eclipse.commons.livexp.ui.WizardPageSection;
import org.springsource.ide.eclipse.commons.livexp.util.Filter;
import com.google.common.collect.ImmutableSet;
public class SelectedDependenciesSection extends WizardPageSection {
private Composite dependencyArea;
private Scroller scroller;
private LiveExpression<Filter<Dependency>> filter;
private Point sizeHint = new Point(SWT.DEFAULT, SWT.DEFAULT);
private HierarchicalMultiSelectionFieldModel<Dependency> dependencies;
public SelectedDependenciesSection(IPageWithSections owner, HierarchicalMultiSelectionFieldModel<Dependency> deps) {
super(owner);
this.dependencies = deps;
this.filter = createFilter(deps);
}
public SelectedDependenciesSection(IPageWithSections owner, NewSpringBootWizardModel model) {
this(owner, model.dependencies);
}
@Override
public void createContents(Composite page) {
scroller = new Scroller(page);
GridDataFactory.fillDefaults().grab(true, true).hint(sizeHint).applyTo(scroller);
dependencyArea = scroller.getBody();
GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(dependencyArea);
GridDataFactory.fillDefaults().grab(true, true).applyTo(dependencyArea);
for (String cat : dependencies.getCategories()) {
MultiSelectionFieldModel<Dependency> dependencyGroup = dependencies.getContents(cat);
SelectedSection<Dependency> checkboxesSection = new SelectedSection<>(owner,
dependencyGroup.getCheckBoxModels(), /* no label */ null);
checkboxesSection.createContents(dependencyArea);
this.filter.addListener((exp, value) -> onFilter(checkboxesSection, cat));
}
}
private void onFilter(SelectedSection<Dependency> checkboxesSection, String cat) {
checkboxesSection.applyFilter(filter.getValue());
if (checkboxesSection.isCreated()) {
boolean hasVisible = checkboxesSection.hasVisible();
checkboxesSection.setVisible(hasVisible);
}
layout();
}
private void layout() {
if (dependencyArea != null && !dependencyArea.isDisposed()) {
dependencyArea.layout(true);
dependencyArea.getParent().layout(true);
}
}
private static LiveExpression<Filter<Dependency>> createFilter(HierarchicalMultiSelectionFieldModel<Dependency> dependencies) {
LiveExpression<Filter<Dependency>> filter = new LiveExpression<Filter<Dependency>>() {
@Override
protected Filter<Dependency> compute() {
ImmutableSet<Dependency> currentSelection = ImmutableSet
.copyOf(dependencies.getCurrentSelection());
return (dependency) -> currentSelection.contains(dependency);
}
};
ValueListener<Boolean> selectionListener = (exp, val) -> {
filter.refresh();
};
for (String cat : dependencies.getCategories()) {
MultiSelectionFieldModel<Dependency> dependencyGroup = dependencies.getContents(cat);
dependencyGroup.addSelectionListener(selectionListener);
}
return filter;
}
public SelectedDependenciesSection sizeHint(Point sizeHint) {
if (sizeHint != null) {
this.sizeHint = sizeHint;
}
return this;
}
}