package org.eclipse.buckminster.ui.editor.cspec; import java.util.ArrayList; import java.util.List; import org.eclipse.buckminster.core.cspec.builder.CSpecBuilder; import org.eclipse.buckminster.core.cspec.builder.GroupBuilder; import org.eclipse.buckminster.core.cspec.builder.PrerequisiteBuilder; import org.eclipse.buckminster.core.cspec.model.PrerequisiteAlreadyDefinedException; import org.eclipse.buckminster.core.helpers.TextUtils; import org.eclipse.buckminster.ui.Messages; import org.eclipse.buckminster.ui.UiUtils; import org.eclipse.buckminster.ui.editor.EditorUtils; import org.eclipse.buckminster.ui.general.editor.ValidatorException; import org.eclipse.buckminster.ui.general.editor.simple.SimpleTableEditor; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.swt.SWT; 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.Label; import org.eclipse.swt.widgets.Text; public class GroupsTable extends AttributesTable<GroupBuilder> { private Text rebasePathText; private List<PrerequisiteBuilder> prerequisites = new ArrayList<PrerequisiteBuilder>(); private SimpleTableEditor<PrerequisiteBuilder> prerequisitesEditor; public GroupsTable(CSpecEditor editor, List<GroupBuilder> data, CSpecBuilder cspec, boolean readOnly) { super(editor, data, cspec, readOnly); } @Override public void enableFields(boolean enabled) { super.enableFields(enabled); rebasePathText.setEnabled(enabled); prerequisitesEditor.setEnabled(enabled); } @Override public void fillStack(Composite stackComposite) { addStackMapping(Messages.general, createGeneralStackLayer(stackComposite)); addStackMapping(Messages.documentation, createDocumentationStackLayer(stackComposite)); } @Override protected GroupBuilder createNewRow() { return getCSpecBuilder().createGroupBuilder(); } @Override protected void refreshRow(GroupBuilder builder) { super.refreshRow(builder); IPath rebasePath = builder.getPrerequisiteRebase(); rebasePathText.setText(TextUtils.notNullString(rebasePath == null ? null : rebasePath.toOSString())); CSpecEditorUtils.copyAndSortItems(builder.getPrerequisites(), prerequisites, CSpecEditorUtils.getPrerequisiteComparator()); prerequisitesEditor.refresh(); } @Override protected void setRowValues(GroupBuilder builder) throws ValidatorException { super.setRowValues(builder); String rebasePathString = UiUtils.trimmedValue(rebasePathText); IPath rebasePath = null; if (rebasePathString != null) { rebasePath = Path.fromOSString(rebasePathString); } builder.setPrerequisiteRebase(rebasePath); List<PrerequisiteBuilder> prereqs = builder.getPrerequisites(); if (prereqs != null) { prereqs.clear(); } for (PrerequisiteBuilder prerequisite : prerequisites) { // Original "prerequisite" is created with a different GroupBuilder // (an empty one) // Need to created again and copy attributes PrerequisiteBuilder newPrerequisite = builder.createPrerequisiteBuilder(); newPrerequisite.initFrom(prerequisite.createPrerequisite()); try { builder.addPrerequisite(newPrerequisite); } catch (PrerequisiteAlreadyDefinedException e) { throw new ValidatorException(e.getMessage()); } } } @SuppressWarnings("unchecked") private Control createGeneralStackLayer(Composite stackComposite) { Composite geComposite = new Composite(stackComposite, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginHeight = layout.marginWidth = 0; geComposite.setLayout(layout); EditorUtils.createHeaderLabel(geComposite, Messages.general, 2); UiUtils.createGridLabel(geComposite, Messages.name_with_colon, 1, 0, SWT.NONE); setNameText(UiUtils.createGridText(geComposite, 1, 0, isReadOnly(), SWT.NONE)); UiUtils.createGridLabel(geComposite, Messages.public_with_colon, 1, 0, SWT.NONE); setPublicCheck(UiUtils.createCheckButton(geComposite, null, isReadOnly(), null)); UiUtils.createGridLabel(geComposite, Messages.release_path_with_colon, 1, 0, SWT.NONE); rebasePathText = UiUtils.createGridText(geComposite, 1, 0, isReadOnly(), SWT.NONE); rebasePathText.addModifyListener(FIELD_LISTENER); UiUtils.createEmptyLabel(geComposite); UiUtils.createEmptyLabel(geComposite); Label label = UiUtils.createGridLabel(geComposite, Messages.prerequisites_with_colon, 1, 0, SWT.NONE); GridData gridData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false); gridData.horizontalSpan = 2; label.setLayoutData(gridData); // Uses an empty GroupBuilder (createNewRow()) // "PrerequisiteBuilder"s will be created with this empty GroupBuilder // Need to create "PrerequisiteBuilder"s again while saving them GroupPrerequisitesTable preTable = new GroupPrerequisitesTable(getCSpecEditor(), this, prerequisites, createNewRow(), isReadOnly()); preTable.addTableModifyListener(FIELD_LISTENER); prerequisitesEditor = new SimpleTableEditor<PrerequisiteBuilder>(geComposite, preTable, null, Messages.group_prerequisite_with_dash, null, null, SWT.NONE); gridData = new GridData(GridData.FILL_BOTH); gridData.horizontalSpan = 2; prerequisitesEditor.setLayoutData(gridData); geComposite.setData("focusControl", getNameText()); //$NON-NLS-1$ return geComposite; } }