package org.openlca.app.editors.systems;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.openlca.app.M;
import org.openlca.app.editors.InfoSection;
import org.openlca.app.editors.ModelPage;
import org.openlca.app.preferencepages.FeatureFlag;
import org.openlca.app.rcp.images.Icon;
import org.openlca.app.util.Controls;
import org.openlca.app.util.Editors;
import org.openlca.app.util.UI;
import org.openlca.app.viewers.ISelectionChangedListener;
import org.openlca.app.viewers.combo.ExchangeViewer;
import org.openlca.app.viewers.combo.FlowPropertyFactorViewer;
import org.openlca.app.viewers.combo.UnitViewer;
import org.openlca.core.model.Exchange;
import org.openlca.core.model.Flow;
import org.openlca.core.model.FlowPropertyFactor;
import org.openlca.core.model.ProductSystem;
import org.openlca.core.model.Unit;
import org.openlca.core.model.UnitGroup;
class ProductSystemInfoPage extends ModelPage<ProductSystem> {
private FormToolkit toolkit;
private ExchangeViewer productViewer;
private FlowPropertyFactorViewer propertyViewer;
private UnitViewer unitViewer;
private Text targetAmountText;
private ScrolledForm form;
ProductSystemInfoPage(ProductSystemEditor editor) {
super(editor, "ProductSystemInfoPage", M.GeneralInformation);
}
@Override
protected void createFormContent(IManagedForm managedForm) {
form = UI.formHeader(managedForm);
updateFormTitle();
if (FeatureFlag.SHOW_REFRESH_BUTTONS.isEnabled())
Editors.addRefresh(form, getEditor());
toolkit = managedForm.getToolkit();
Composite body = UI.formBody(form, toolkit);
InfoSection infoSection = new InfoSection(getEditor());
infoSection.render(body, toolkit);
addCalculationButton(infoSection.getContainer());
createAdditionalInfo(body);
body.setFocus();
form.reflow(true);
}
@Override
protected void updateFormTitle() {
if (form == null)
return;
form.setText(M.ProductSystem + ": " + getModel().getName());
}
private void createAdditionalInfo(Composite body) {
Composite composite = UI.formSection(body, toolkit,
M.Reference);
createLink(M.Process, "referenceProcess", composite);
toolkit.createLabel(composite, M.Product);
productViewer = new ExchangeViewer(composite, ExchangeViewer.OUTPUTS,
ExchangeViewer.PRODUCTS);
toolkit.createLabel(composite, M.FlowProperty);
propertyViewer = new FlowPropertyFactorViewer(composite);
toolkit.createLabel(composite, M.Unit);
unitViewer = new UnitViewer(composite);
productViewer.addSelectionChangedListener(new ProductChangedListener(
propertyViewer));
propertyViewer.addSelectionChangedListener(new PropertyChangedListener(
unitViewer));
productViewer.setInput(getModel().getReferenceProcess());
getBinding().onModel(() -> getModel(), "referenceExchange",
productViewer);
getBinding().onModel(() -> getModel(), "targetFlowPropertyFactor",
propertyViewer);
getBinding().onModel(() -> getModel(), "targetUnit", unitViewer);
targetAmountText = UI.formText(composite,
getManagedForm().getToolkit(), M.TargetAmount);
getBinding().onDouble(() -> getModel(), "targetAmount",
targetAmountText);
}
private void addCalculationButton(Composite composite) {
toolkit.createLabel(composite, "");
Button button = toolkit.createButton(composite, M.Calculate,
SWT.NONE);
button.setImage(Icon.RUN.get());
Controls.onSelect(button, (e) -> CalculationWizard.open(getModel()));
}
private class ProductChangedListener implements
ISelectionChangedListener<Exchange> {
private FlowPropertyFactorViewer propertyViewer;
private ProductChangedListener(FlowPropertyFactorViewer propertyViewer) {
this.propertyViewer = propertyViewer;
}
@Override
public void selectionChanged(Exchange selection) {
Flow flow = selection.getFlow();
propertyViewer.setInput(flow);
propertyViewer.select(flow.getReferenceFactor());
}
}
private class PropertyChangedListener implements
ISelectionChangedListener<FlowPropertyFactor> {
private UnitViewer unitViewer;
private PropertyChangedListener(UnitViewer unitViewer) {
this.unitViewer = unitViewer;
}
@Override
public void selectionChanged(FlowPropertyFactor selection) {
if (selection == null)
return;
UnitGroup unitGroup = selection.getFlowProperty().getUnitGroup();
unitViewer.setInput(unitGroup);
Unit previousSelection = getModel().getTargetUnit();
if (unitGroup.getUnits().contains(previousSelection))
unitViewer.select(previousSelection);
else
unitViewer.select(unitGroup.getReferenceUnit());
}
}
}