package org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.composite.XComposite.LayoutMode;
import org.nightlabs.base.ui.language.I18nTextEditor;
import org.nightlabs.base.ui.table.TableLabelProvider;
import org.nightlabs.i18n.I18nText;
import org.nightlabs.i18n.I18nTextBuffer;
import org.nightlabs.jfire.base.dashboard.clientscripts.ui.resource.Messages;
import org.nightlabs.jfire.base.dashboard.ui.AbstractDashbardGadgetConfigPage;
import org.nightlabs.jfire.dashboard.DashboardGadgetClientScriptsConfig;
import org.nightlabs.jfire.dashboard.DashboardGadgetClientScriptsConfig.ClientScript;
import org.nightlabs.jfire.dashboard.DashboardGadgetLayoutEntry;
/**
*
* @author Frederik Loeser <!-- frederik [AT] nightlabs [DOT] de -->
*/
public class DashboardGadgetClientScriptsConfigPage extends AbstractDashbardGadgetConfigPage<Object> {
private I18nTextEditor gadgetTitle;
private Button buttonConfirmProcessing;
private List<ClientScript> clientScripts;
private boolean confirmProcessing;
private TableViewer tableViewer;
private Button buttonRemove;
private Button buttonEdit;
private Button buttonMoveUp;
private Button buttonMoveDown;
private DashboardGadgetClientScriptsConfig config;
public DashboardGadgetClientScriptsConfigPage() {
super(DashboardGadgetClientScriptsConfigPage.class.getName());
setTitle(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.page.title")); //$NON-NLS-1$
}
private int amountOfColumns = 3;
@Override
public Control createPageContents(final Composite parent) {
final XComposite wrapper = new XComposite(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER, amountOfColumns);
final Label labelDescription1 = new Label(wrapper, SWT.WRAP);
labelDescription1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, amountOfColumns, 1));
labelDescription1.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.gadget.description.text")); //$NON-NLS-1$
final Label labelTitle = new Label(wrapper, SWT.NONE);
labelTitle.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
labelTitle.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.gadget.title.text")); //$NON-NLS-1$
gadgetTitle = new I18nTextEditor(wrapper);
gadgetTitle.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
gadgetTitle.setI18nText(!getLayoutEntry().getEntryName().isEmpty() ? getLayoutEntry().getEntryName() : createInitialName());
createUpperWidgets(wrapper);
createTableWidget(wrapper);
createButtonWidgets(wrapper);
tableViewer.setInput(clientScripts);
return wrapper;
}
private void createUpperWidgets(final Composite parent) {
GridData gd;
buttonConfirmProcessing = new Button(parent, SWT.CHECK);
gd = new GridData(SWT.FILL, SWT.CENTER, true, false, amountOfColumns, 1);
gd.verticalIndent = 10;
buttonConfirmProcessing.setLayoutData(gd);
buttonConfirmProcessing.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.buttonConfirmProcessing.text")); //$NON-NLS-1$
buttonConfirmProcessing.setSelection(confirmProcessing);
buttonConfirmProcessing.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
confirmProcessing = !confirmProcessing;
}
});
final Label labelDescription2 = new Label(parent, SWT.WRAP);
labelDescription2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, amountOfColumns, 1));
labelDescription2.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.description.text")); //$NON-NLS-1$
}
private void createTableWidget(final Composite parent) {
final Table table = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
gridData.verticalIndent = 5;
table.setLayoutData(gridData);
table.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(final Event event) {
updateButtonStates();
}
});
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(final MouseEvent e) {
if (table.getSelectionIndex() > -1)
editClientScript();
}
});
tableViewer = new TableViewer(table);
attachContentProvider();
attachLabelProvider();
}
private void createButtonWidgets(final Composite parent_) {
final Composite parent = new Composite(parent_, SWT.NONE);
parent.setLayout(new GridLayout());
GridData gd;
final Button buttonNew = new Button(parent, SWT.PUSH);
gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
buttonNew.setLayoutData(gd);
buttonNew.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.buttonNew.text")); //$NON-NLS-1$
buttonNew.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
createClientScript();
if (tableViewer.getTable().getSelectionIndex() > -1)
updateButtonStates();
}
});
buttonRemove = new Button(parent, SWT.PUSH);
gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
buttonRemove.setLayoutData(gd);
buttonRemove.setEnabled(false);
buttonRemove.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.buttonRemove.text")); //$NON-NLS-1$
buttonRemove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
removeClientScript();
updateButtonStates();
}
});
buttonEdit = new Button(parent, SWT.PUSH);
gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
buttonEdit.setLayoutData(gd);
buttonEdit.setEnabled(false);
buttonEdit.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.buttonEdit.text")); //$NON-NLS-1$
buttonEdit.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
editClientScript();
}
});
buttonMoveUp = new Button(parent, SWT.PUSH);
gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
buttonMoveUp.setLayoutData(gd);
buttonMoveUp.setEnabled(false);
buttonMoveUp.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.buttonUp.text")); //$NON-NLS-1$
buttonMoveUp.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
updateItemOrder(true);
updateButtonStates();
}
});
buttonMoveDown = new Button(parent, SWT.PUSH);
gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
buttonMoveDown.setLayoutData(gd);
buttonMoveDown.setEnabled(false);
buttonMoveDown.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsConfigPage.buttonDown.text")); //$NON-NLS-1$
buttonMoveDown.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
updateItemOrder(false);
updateButtonStates();
}
});
}
static class ClientScriptPropertiesWrapper {
private String clientScriptName;
private String clientScriptContent;
public ClientScriptPropertiesWrapper() {
}
public ClientScriptPropertiesWrapper(final String clientScriptName, final String clientScriptContent) {
this.clientScriptName = clientScriptName;
this.clientScriptContent = clientScriptContent;
}
public String getClientScriptName() {
return clientScriptName;
}
public String getClientScriptContent() {
return clientScriptContent;
}
public void setClientScriptName(final String clientScriptName) {
this.clientScriptName = clientScriptName;
}
public void setClientScriptContent(final String clientScriptContent) {
this.clientScriptContent = clientScriptContent;
}
}
@SuppressWarnings("unchecked")
private void createClientScript() {
final ClientScriptPropertiesWrapper data = new ClientScriptPropertiesWrapper();
if (clientScripts == null) // if config has not been called yet
clientScripts = new ArrayList<ClientScript>();
final DashboardGadgetClientScriptsNewEditDialog dialog = new DashboardGadgetClientScriptsNewEditDialog(getShell(), clientScripts, data);
if (dialog.open() == Window.OK) {
// Create new ClientScript instance and insert it into the table (not persisted yet)
final ClientScript clientScript = new ClientScript(data.getClientScriptName(), data.getClientScriptContent());
if (tableViewer.getInput() instanceof List<?>) {
clientScripts = (List<ClientScript>) tableViewer.getInput();
}
clientScripts.add(clientScript);
tableViewer.setInput(clientScripts);
}
}
private void editClientScript() {
final Object data_ = tableViewer.getTable().getItem(tableViewer.getTable().getSelectionIndex()).getData();
if (data_ instanceof ClientScript) {
final ClientScript clientScript = (ClientScript) data_;
final ClientScriptPropertiesWrapper data = new ClientScriptPropertiesWrapper(clientScript.getName(), clientScript.getContent());
final DashboardGadgetClientScriptsNewEditDialog dialog = new DashboardGadgetClientScriptsNewEditDialog(getShell(), clientScripts, data);
if (dialog.open() == Window.OK)
for (final ClientScript clientScript_ : clientScripts)
if (clientScript_.getName().equals(clientScript.getName())) {
clientScript_.setName(data.getClientScriptName());
clientScript_.setContent(data.getClientScriptContent());
tableViewer.setInput(clientScripts); // perhaps update(...) instead of setInput(...)
break;
}
}
}
private void removeClientScript() {
final int amount = tableViewer.getTable().getSelectionCount();
final int[] indices = tableViewer.getTable().getSelectionIndices();
final ClientScript[] clientScriptsToRemove = new ClientScript[amount];
for (int i = 0; i < amount; i++) {
final Object data_ = tableViewer.getTable().getItem(indices[i]).getData();
if (data_ instanceof ClientScript) {
final ClientScript clientScript = (ClientScript) data_;
clientScriptsToRemove[i] = clientScript;
}
}
clientScripts.removeAll(Arrays.asList(clientScriptsToRemove));
tableViewer.remove(clientScriptsToRemove);
}
private void updateItemOrder(final boolean up) {
final int sourceIdx = tableViewer.getTable().getSelectionIndex();
final int targetIdx = up ? sourceIdx - 1 : sourceIdx + 1;
final Object dataSource = tableViewer.getTable().getItem(sourceIdx).getData();
final Object dataTarget = tableViewer.getTable().getItem(targetIdx).getData();
if (dataSource instanceof ClientScript && dataTarget instanceof ClientScript) {
final ClientScript clientScriptSource = (ClientScript) dataSource;
final ClientScript clientScriptTarget = (ClientScript) dataTarget;
for (int i = 0; i < clientScripts.size(); i++) {
final ClientScript clientScript_ = clientScripts.get(i);
if (clientScript_.getName().equals(up ? clientScriptTarget.getName() : clientScriptSource.getName())) {
final String nameTmp = clientScript_.getName();
final String contentTmp = clientScript_.getContent();
clientScript_.setName(up ? clientScriptSource.getName() : clientScriptTarget.getName());
clientScript_.setContent(up ? clientScriptSource.getContent() : clientScriptTarget.getContent());
clientScripts.get(i + 1).setName(nameTmp);
clientScripts.get(i + 1).setContent(contentTmp);
break;
}
}
tableViewer.setInput(clientScripts);
tableViewer.getTable().setSelection(targetIdx);
}
}
private void updateButtonStates() {
final int idx = tableViewer.getTable().getSelectionIndex();
final int amount = tableViewer.getTable().getSelectionCount();
final boolean singleItemSelected = amount == 1 ? true : false;
buttonRemove.setEnabled(amount > 0);
buttonEdit.setEnabled(singleItemSelected);
buttonMoveUp.setEnabled(singleItemSelected && idx > 0);
buttonMoveDown.setEnabled(singleItemSelected && idx < tableViewer.getTable().getItemCount() - 1);
}
private void attachContentProvider() {
tableViewer.setContentProvider(new ArrayContentProvider());
}
private void attachLabelProvider() {
tableViewer.setLabelProvider(new TableLabelProvider() {
@Override
public String getColumnText(final Object element, final int columnIndex) {
if (element instanceof ClientScript)
return ((ClientScript) element).getName();
return null;
}
});
}
private I18nText createInitialName() {
final I18nTextBuffer textBuffer = new I18nTextBuffer();
initializeGadgetName(textBuffer, "clientScriptsGadget.title"); //$NON-NLS-1$
return textBuffer;
}
private void initializeGadgetName(final I18nText gadgetName, final String nameKeySuffix) {
gadgetName.readFromProperties(
Messages.BUNDLE_NAME,
DashboardGadgetClientScriptsConfigPage.class.getClassLoader(),
DashboardGadgetClientScriptsConfigPage.class.getName() + "." + nameKeySuffix); //$NON-NLS-1$
}
@Override
public void initialize(final DashboardGadgetLayoutEntry<?> layoutEntry) {
super.initialize(layoutEntry);
final Object config_ = getLayoutEntry().getConfig();
if (config_ instanceof DashboardGadgetClientScriptsConfig) {
config = (DashboardGadgetClientScriptsConfig) config_;
clientScripts = config.getClientScripts();
confirmProcessing = config.isConfirmProcessing();
}
}
@Override
public void configure(final DashboardGadgetLayoutEntry layoutEntry) {
layoutEntry.getEntryName().copyFrom(gadgetTitle != null ? gadgetTitle.getI18nText() : createInitialName());
final DashboardGadgetClientScriptsConfig config = new DashboardGadgetClientScriptsConfig();
config.setClientScripts(clientScripts);
config.setConfirmProcessing(confirmProcessing);
layoutEntry.setConfig(config);
}
}