/*******************************************************************************
* 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.general.editor.simple;
import java.util.Arrays;
import org.eclipse.buckminster.ui.general.editor.TableRowDialog;
import org.eclipse.buckminster.ui.general.editor.ValidatorException;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
/**
* Row editor of general table editor TableEditor
*
* @author Karel Brezina
*/
public class SimpleTableRowDialog<T> extends TableRowDialog {
private final ISimpleTable<T> table;
private final int row;
private final boolean newRow;
private IWidgetin[] widgetins;
/**
* Creates row editor
*
* @param parent
* parent shell
* @param windowImage
* window icon
* @param windowTitle
* window title
* @param wizardImage
* wizard image
* @param helpURL
* URL to help info. If not null - help link or icon is displayed
* for accessing help
* @param table
* wrapped editor data
* @param row
* table row number that will be edited or -1 for new row
*/
public SimpleTableRowDialog(Shell parent, Image windowImage, String windowTitle, Image wizardImage, String helpURL, ISimpleTable<T> table,
int row, boolean readOnly) {
super(parent, windowImage, windowTitle, wizardImage, helpURL, (row == -1), readOnly);
this.table = table;
this.row = row;
this.newRow = (row == -1);
this.widgetins = new IWidgetin[table.getColumns()];
}
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
Object[] fields = new Object[table.getColumns()];
for (int i = 0; i < table.getColumns(); i++) {
fields[i] = widgetins[i].getData();
}
try {
if (newRow) {
table.addRow(fields);
} else {
table.setRow(row, fields);
}
} catch (ValidatorException e) {
setErrorMessage(e.getMessage());
getButton(IDialogConstants.OK_ID).setEnabled(false);
return;
}
}
setReturnCode(buttonId);
close();
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
Listener rowModifyListener = new Listener() {
@Override
public void handleEvent(Event event) {
setErrorMessage(event.text);
enableDisableOkButton();
}
};
Composite textComposite = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginTop = 7;
layout.marginWidth = 10;
textComposite.setLayout(layout);
textComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Object[] fields = null;
if (!newRow) {
fields = table.toRowArray(table.getRow(row));
} else {
fields = new Object[table.getColumns()];
Arrays.fill(fields, null);
}
widgetins = table.fillGrid(textComposite, fields);
for (int i = 0; i < table.getColumns(); i++) {
widgetins[i].addListener(ISimpleTable.ERROR_MESSAGE_EVENT_TYPE, rowModifyListener);
}
return textComposite;
}
@Override
protected void enableDisableOkButton() {
if (getButton(IDialogConstants.OK_ID) != null) {
boolean valid = true;
try {
for (int i = 0; i < table.getColumns(); i++) {
table.getFieldValidator(i).validate(widgetins[i].getData());
}
} catch (ValidatorException e1) {
valid = false;
}
getButton(IDialogConstants.OK_ID).setEnabled(valid);
}
}
}