package org.openlca.app.editors.reports; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.openlca.app.M; import org.openlca.app.editors.projects.ProjectEditor; import org.openlca.app.editors.reports.model.Report; import org.openlca.app.editors.reports.model.ReportComponent; import org.openlca.app.editors.reports.model.ReportSection; import org.openlca.app.rcp.images.Icon; import org.openlca.app.util.Actions; import org.openlca.app.util.Question; import org.openlca.app.util.UI; import org.openlca.app.util.viewers.Viewers; class SectionList { private Report report; private ProjectEditor editor; private Composite parent; private FormToolkit toolkit; private ScrolledForm form; private List<Sec> sections = new ArrayList<>(); SectionList(ProjectEditor editor, Composite parent, ScrolledForm form, FormToolkit toolkit) { this.editor = editor; report = editor.getReport(); this.parent = parent; this.toolkit = toolkit; this.form = form; report.sections.sort((s1, s2) -> s1.index - s2.index); report.sections.forEach((model) -> sections.add(new Sec(model))); } private void swap(int i, int j) { Sec sec1 = sections.get(i); Sec sec2 = sections.get(j); ReportSection model1 = sec1.model; ReportSection model2 = sec2.model; sec1.setModel(model2); sec2.setModel(model1); model1.index = j; model2.index = i; report.sections.sort((s1, s2) -> s1.index - s2.index); } void addNew() { ReportSection model = new ReportSection(); model.index = report.sections.size(); report.sections.add(model); model.title = M.NewSection; model.text = ""; Sec section = new Sec(model); sections.add(section); form.reflow(true); section.ui.setFocus(); editor.setDirty(true); } private class Sec { ReportSection model; Section ui; Text titleText; Text descriptionText; ComboViewer componentViewer; Sec(ReportSection model) { this.model = model; createUi(); } void setModel(ReportSection model) { this.model = model; String title = model.title != null ? model.title : ""; String text = model.text != null ? model.text : ""; ReportComponent component = ReportComponent.getForId( model.componentId); ui.setText(title); titleText.setText(title); descriptionText.setText(text); componentViewer.setSelection(new StructuredSelection(component)); } private void createUi() { ui = UI.section(parent, toolkit, model.title); Composite comp = UI.sectionClient(ui, toolkit); createTitleText(comp); createDescriptionText(comp); createComponentViewer(comp); createActions(); } private void createTitleText(Composite comp) { titleText = UI.formText(comp, toolkit, M.Section); if (model.title != null) titleText.setText(model.title); titleText.addModifyListener(e -> { String t = titleText.getText(); model.title = t; ui.setText(t); editor.setDirty(true); }); } private void createDescriptionText(Composite comp) { descriptionText = UI.formMultiText(comp, toolkit, M.Text); if (model.text != null) descriptionText.setText(model.text); descriptionText.addModifyListener(e -> { model.text = descriptionText.getText(); editor.setDirty(true); }); } private void createComponentViewer(Composite composite) { UI.formLabel(composite, toolkit, M.Component); componentViewer = new ComboViewer(composite); UI.gridData(componentViewer.getControl(), false, false).widthHint = 250; componentViewer.setContentProvider(ArrayContentProvider .getInstance()); componentViewer.setLabelProvider(new ComponentLabel()); componentViewer.setInput(ReportComponent.values()); componentViewer.addSelectionChangedListener((evt) -> { ReportComponent c = Viewers.getFirst(evt.getSelection()); if (c == null || c == ReportComponent.NONE) model.componentId = null; else model.componentId = c.getId(); editor.setDirty(true); }); if (model.componentId != null) componentViewer.setSelection(new StructuredSelection( ReportComponent.getForId(model.componentId))); } private void createActions() { Action up = Actions.create( M.MoveUp, Icon.UP.descriptor(), () -> moveUp()); Action down = Actions.create( M.MoveDown, Icon.DOWN.descriptor(), () -> moveDown()); Action delete = Actions.create( M.DeleteSection, Icon.DELETE.descriptor(), () -> delete()); Actions.bind(ui, up, down, delete); } private void delete() { boolean b = Question.ask(M.DeleteSection, M.DeleteReportSectionQuestion); if (!b) return; report.sections.remove(model); sections.remove(this); ui.dispose(); for (int i = model.index; i < sections.size(); i++) { Sec sec = sections.get(i); sec.model.index = i; } form.reflow(true); editor.setDirty(true); } private void moveUp() { int i = model.index; if (i <= 0) return; swap(i, i - 1); } private void moveDown() { int i = model.index; if (i >= (sections.size() - 1)) return; swap(i, i + 1); } } private class ComponentLabel extends LabelProvider { @Override public String getText(Object element) { if (!(element instanceof ReportComponent)) return null; ReportComponent component = (ReportComponent) element; return getLabel(component); } private String getLabel(ReportComponent component) { switch (component) { case NONE: return M.None; case VARIANT_DESCRIPTION_TABLE: return M.VariantDescriptionTable; case INDICATOR_DESCRIPTION_TABLE: return M.LciaCategoryDescriptionTable; case PARAMETER_DESCRIPTION_TABLE: return M.ParameterDescriptionTable; case PARAMETER_VALUE_TABLE: return M.ParameterValueTable; case IMPACT_RESULT_TABLE: return M.LciaResultTable; case PROCESS_CONTRIBUTION_CHART: return M.ProcessContributionChart; case NORMALISATION_RESULT_TABLE: return M.NormalisationResultTable; case SINGLE_SCORE_TABLE: return M.SingleScoreTable; case INDICATOR_BAR_CHART: return M.IndicatorBarChart; case NORMALISATION_BAR_CHART: return M.NormalisationBarChart; case NORMALISATION_RADAR_CHART: return M.NormalisationRadarChart; case RELATIVE_INDICATOR_BAR_CHART: return M.RelativeLciaResultsBarChart; case RELATIVE_INDICATOR_RADAR_CHART: return M.RelativeLciaResultsRadarChart; case SINGLE_SCORE_BAR_CHART: return M.SingleScoreBarChart; case LCC_ADDED_VALUES_TABLE: return M.LCCAddedValuesTable; case LCC_NET_COSTS_TABLE: return M.LCCNetcostsTable; default: return M.Unknown; } } } }