/*******************************************************************************
* Copyright (c) 2006-2013, Cloudsmith Inc.
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the copyright holder
* listed above, as the Initial Contributor under such license. The text of
* such license is available at www.eclipse.org.
******************************************************************************/
package org.eclipse.buckminster.ui.editor.cspec;
import java.util.List;
import org.eclipse.buckminster.core.common.model.Documentation;
import org.eclipse.buckminster.core.cspec.builder.CSpecBuilder;
import org.eclipse.buckminster.core.cspec.builder.TopLevelAttributeBuilder;
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.structured.StructuredTable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
/**
* @author Karel Brezina
*
*/
public abstract class AttributesTable<T extends TopLevelAttributeBuilder> extends StructuredTable<T> {
private static final String ERROR_MESSAGE_EMPTY_NAME = Messages.name_cannnot_be_empty;
private CSpecEditor editor;
private CSpecBuilder cspec;
private Text nameText;
private Button publicCheck;
private Text documentationText;
private T currentBuilder;
public AttributesTable(CSpecEditor editor, List<T> data, CSpecBuilder cspec, boolean readOnly) {
super(data, readOnly);
this.editor = editor;
this.cspec = cspec;
}
@Override
public void enableFields(boolean enabled) {
nameText.setEnabled(enabled);
publicCheck.setEnabled(enabled);
documentationText.setEnabled(enabled);
}
public CSpecEditor getCSpecEditor() {
return editor;
}
public T getCurrentBuilder() {
return currentBuilder;
}
@Override
public String[] getTableViewerColumnHeaders() {
return new String[] { Messages.name, Messages.public_label };
}
@Override
public int[] getTableViewerColumnWeights() {
return new int[] { 80, 20 };
}
@Override
public Object getTableViewerField(T builder, int columnIndex) {
switch (columnIndex) {
case 0:
return builder.getName();
case 1:
return Boolean.valueOf(builder.isPublic());
default:
return null;
}
}
protected Control createDocumentationStackLayer(Composite stackComposite) {
Composite docComposite = new Composite(stackComposite, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = layout.marginWidth = 0;
docComposite.setLayout(layout);
EditorUtils.createHeaderLabel(docComposite, Messages.documentation, 1);
documentationText = UiUtils.createGridText(docComposite, 1, 0, isReadOnly(), SWT.MULTI);
documentationText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
documentationText.addModifyListener(FIELD_LISTENER);
docComposite.setData("focusControl", documentationText); //$NON-NLS-1$
return docComposite;
}
protected CSpecBuilder getCSpecBuilder() {
return cspec;
}
protected Text getNameText() {
return nameText;
}
@Override
protected void refreshRow(T builder) {
currentBuilder = builder;
nameText.setText(TextUtils.notNullString(builder.getName()));
publicCheck.setSelection(builder.isPublic());
Documentation doc = builder.getDocumentation();
documentationText.setText(TextUtils.notNullString(doc == null ? null : doc.toString()));
}
protected void setNameText(Text nameText) {
this.nameText = nameText;
nameText.addModifyListener(FIELD_LISTENER);
}
protected void setPublicCheck(Button publicCheck) {
this.publicCheck = publicCheck;
publicCheck.addSelectionListener(FIELD_LISTENER);
}
@Override
protected void setRowValues(T builder) throws ValidatorException {
if (UiUtils.trimmedValue(nameText) == null) {
throw new ValidatorException(ERROR_MESSAGE_EMPTY_NAME);
}
builder.setName(UiUtils.trimmedValue(nameText));
builder.setPublic(publicCheck.getSelection());
String doc = UiUtils.trimmedValue(documentationText);
try {
builder.setDocumentation(doc == null ? null : Documentation.parse(doc));
} catch (Exception e) {
throw new ValidatorException(e.getMessage());
}
}
}