/*******************************************************************************
* 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.structured;
import org.eclipse.buckminster.ui.Messages;
import org.eclipse.buckminster.ui.UiUtils;
import org.eclipse.buckminster.ui.general.editor.ValidatorException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
/**
* @author Karel Brezina
*
*/
public class OnePageTableEditor<T> extends StructuredTableEditor<T> {
private final boolean disableNew; // disables New button
private final boolean disableRemove; // disables Remove button
public OnePageTableEditor(Composite parent, IStructuredTable<T> table, boolean swapButtonsFlag, boolean disableNew, boolean disableRemove,
int style) {
super(parent, table, swapButtonsFlag, style);
this.disableNew = disableNew;
this.disableRemove = disableRemove;
}
public OnePageTableEditor(Composite parent, IStructuredTable<T> table, boolean swapButtonsFlag, int style) {
this(parent, table, swapButtonsFlag, false, false, style);
}
public void cancelRow() {
enableDisableButtonGroup();
refreshRow();
}
@Override
public void refresh() {
refreshTable();
enableDisableButtonGroup();
refreshRow();
}
public boolean save() {
return save(null);
}
public boolean save(IActivator activator) {
if (getTableViewer().getTable().getSelectionIndex() >= 0) {
try {
saveRow();
} catch (ValidatorException e) {
if (activator != null)
activator.activate();
MessageDialog.openError(getShell(), Messages.error, e.getMessage());
getTableViewer().getTable().select(getLastSelectedRow());
return false;
}
enableDisableButtonGroup();
}
return true;
}
public boolean show(T row, String tab) {
int stackIdx = getTable().getStackKeys().indexOf(tab);
if (stackIdx == -1)
return false;
if (!selectRow(row))
return false;
refreshRow();
setStackOption(stackIdx);
return true;
}
@Override
protected void createTableButtons(Composite parent) {
Composite buttonBox = new Composite(parent, SWT.NONE);
buttonBox.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
FillLayout layout = new FillLayout(SWT.VERTICAL);
layout.marginWidth = layout.marginHeight = 0;
layout.spacing = 3;
buttonBox.setLayout(layout);
Composite buttonBox1 = new Composite(buttonBox, SWT.NULL);
// buttonBox1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
// false));
layout = new FillLayout(SWT.HORIZONTAL);
layout.marginWidth = layout.marginHeight = 0;
buttonBox1.setLayout(layout);
setNewButton(UiUtils.createPushButton(buttonBox1, Messages.new_label, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
newRow();
}
}));
setRemoveButton(UiUtils.createPushButton(buttonBox1, Messages.remove, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
removeRow();
}
}));
if (isSwapButtonAllowed()) {
Composite buttonBox2 = new Composite(buttonBox, SWT.NULL);
// buttonBox2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
// false));
layout = new FillLayout(SWT.HORIZONTAL);
layout.marginWidth = layout.marginHeight = 0;
buttonBox2.setLayout(layout);
setMoveUpButton(UiUtils.createPushButton(buttonBox2, Messages.move_up, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
swapAndReselect(0, -1);
}
}));
setMoveDownButton(UiUtils.createPushButton(buttonBox2, Messages.move_down, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
swapAndReselect(1, 0);
}
}));
}
}
@Override
protected Composite createTableGroupComposite(Composite parent) {
Composite componentTableGroup = new Composite(parent, SWT.NONE);
GridLayout gl = new GridLayout(1, false);
gl.marginHeight = gl.marginWidth = 0;
componentTableGroup.setLayout(gl);
componentTableGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
return componentTableGroup;
}
@Override
protected void editRow(boolean newRow, boolean readOnly) {
// automatic
}
@Override
protected void enableDisableButtonGroup() {
Table table = getTableViewer().getTable();
int top = table.getItemCount();
int idx = table.getSelectionIndex();
if (isEnabled() && !getTable().isReadOnly()) {
getNewButton().setEnabled(!disableNew);
getRemoveButton().setEnabled(!disableRemove && (idx >= 0));
if (isSwapButtonAllowed()) {
getMoveUpButton().setEnabled(idx > 0);
getMoveDownButton().setEnabled(idx >= 0 && idx < top - 1);
}
} else {
getNewButton().setEnabled(false);
getRemoveButton().setEnabled(false);
if (isSwapButtonAllowed()) {
getMoveUpButton().setEnabled(false);
getMoveDownButton().setEnabled(false);
}
}
if (isEnabled())
enableFields(idx >= 0);
else
enableFields(false);
// getTableViewer().getTable().setEnabled(isEnabled());
// getTableViewer().getTable().setForeground(isEnabled()
// ? null
// :
// getTableViewer().getTable().getDisplay().getSystemColor(SWT.COLOR_GRAY));
}
@Override
protected void initComposite() {
GridLayout layout = new GridLayout(3, false);
layout.marginHeight = layout.marginWidth = 0;
setLayout(layout);
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
setLayoutData(gridData);
createTableGroup(this);
createStackOptions(this);
createStack(this);
fillStackOptions();
}
@Override
protected void newRow() {
if (getSelectionIndex() >= 0)
if (!save())
return;
T row = getTable().addEmptyRow();
refreshTable();
selectRow(row);
updateLastRow();
enableDisableButtonGroup();
refreshRow();
focusStackComposite();
}
@Override
protected boolean rowSelectionEvent() {
if (!save())
return false;
enableDisableButtonGroup();
refreshRow();
return true;
}
}