/*
* Copyright 2009-2012 Amazon Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://aws.amazon.com/apache2.0
*
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and
* limitations under the License.
*/
package com.amazonaws.eclipse.datatools.enablement.simpledb.editor.wizard;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.datatools.sqltools.data.internal.core.editor.RowDataImpl;
import org.eclipse.datatools.sqltools.data.internal.ui.editor.TableDataCell;
import org.eclipse.datatools.sqltools.data.internal.ui.editor.TableDataEditor;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import com.amazonaws.eclipse.datatools.enablement.simpledb.Activator;
import com.amazonaws.eclipse.datatools.enablement.simpledb.editor.Messages;
public class SDBTableDataWizardPage extends WizardPage {
private static final int INDENT = 6;
private final TableDataEditor editor;
private int col;
private RowDataImpl rowData;
private Table table;
private Button edit;
private Button add;
private Button remove;
private TableColumn tColumn;
public SDBTableDataWizardPage(final TableDataEditor editor) {
super(Messages.pageTitle);
setTitle(Messages.pageTitle);
setMessage(Messages.mainMessage);
this.editor = editor;
}
public void createControl(final Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
FormLayout layout = new FormLayout();
layout.marginWidth = INDENT;
layout.marginHeight = INDENT;
composite.setLayout(layout);
final Label l = new Label(composite, SWT.None);
l.setText(Messages.labelEditAttributeValues);
this.table = new Table(composite, SWT.FULL_SELECTION | SWT.HIDE_SELECTION | SWT.BORDER | SWT.V_SCROLL
| SWT.H_SCROLL | SWT.MULTI);
this.add = new Button(composite, SWT.None);
this.remove = new Button(composite, SWT.None);
this.edit = new Button(composite, SWT.None);
this.table.addSelectionListener(new SelectionListener() {
public void widgetSelected(final SelectionEvent se) {
SDBTableDataWizardPage.this.edit.setEnabled(SDBTableDataWizardPage.this.table.getSelection().length == 1);
SDBTableDataWizardPage.this.remove.setEnabled(SDBTableDataWizardPage.this.table.getSelection().length > 0);
}
public void widgetDefaultSelected(final SelectionEvent arg0) {
}
});
this.table.addMouseListener(new MouseListener() {
public void mouseUp(final MouseEvent arg0) {
}
public void mouseDown(final MouseEvent arg0) {
}
public void mouseDoubleClick(final MouseEvent arg0) {
if (SDBTableDataWizardPage.this.table.getSelectionCount() > 0) {
String newValue = getNewValue(SDBTableDataWizardPage.this.table.getSelection()[0].getText());
if (newValue != null) {
SDBTableDataWizardPage.this.table.getSelection()[0].setText(newValue);
SDBTableDataWizardPage.this.tColumn.pack();
}
}
}
});
this.tColumn = new TableColumn(this.table, SWT.NONE);
createContent();
this.tColumn.pack();
this.edit.addSelectionListener(new SelectionListener() {
public void widgetSelected(final SelectionEvent arg0) {
String newValue = getNewValue(SDBTableDataWizardPage.this.table.getSelection()[0].getText());
if (newValue != null) {
SDBTableDataWizardPage.this.table.getSelection()[0].setText(newValue);
SDBTableDataWizardPage.this.tColumn.pack();
}
}
public void widgetDefaultSelected(final SelectionEvent arg0) {
}
});
this.add.addSelectionListener(new SelectionListener() {
public void widgetSelected(final SelectionEvent arg0) {
String newValue = getNewValue(Messages.newValue);
if (newValue != null) {
TableItem item = createItem(newValue);
SDBTableDataWizardPage.this.table.setSelection(item);
SDBTableDataWizardPage.this.remove.setEnabled(true);
SDBTableDataWizardPage.this.edit.setEnabled(true);
SDBTableDataWizardPage.this.tColumn.pack();
}
}
public void widgetDefaultSelected(final SelectionEvent arg0) {
}
});
this.remove.addSelectionListener(new SelectionListener() {
public void widgetSelected(final SelectionEvent arg0) {
int[] selectionIndices = SDBTableDataWizardPage.this.table.getSelectionIndices();
SDBTableDataWizardPage.this.table.remove(selectionIndices);
if (selectionIndices != null && SDBTableDataWizardPage.this.table.getItemCount() > 0) {
int minSelected = Integer.MAX_VALUE;
for (int i = 0; i < selectionIndices.length; i++) {
if (selectionIndices[i] < minSelected) {
minSelected = selectionIndices[i];
}
}
--minSelected;
if (minSelected < 0 || minSelected == Integer.MAX_VALUE) {
minSelected = 0;
}
try {
SDBTableDataWizardPage.this.table.setSelection(minSelected);
} catch (Exception e) { // just to be on the safe side
e.printStackTrace();
}
}
SDBTableDataWizardPage.this.edit.setEnabled(SDBTableDataWizardPage.this.table.getSelection().length == 1);
SDBTableDataWizardPage.this.remove.setEnabled(SDBTableDataWizardPage.this.table.getSelection().length > 0);
SDBTableDataWizardPage.this.tColumn.pack();
}
public void widgetDefaultSelected(final SelectionEvent arg0) {
}
});
FormData d = new FormData();
d.top = new FormAttachment(0, 0);
d.left = new FormAttachment(0, 0);
d.right = new FormAttachment(100, 0);
l.setLayoutData(d);
d = new FormData();
d.top = new FormAttachment(l, INDENT);
d.left = new FormAttachment(0, 0);
d.right = new FormAttachment(this.remove, -INDENT);
d.bottom = new FormAttachment(100, 0);
this.table.setLayoutData(d);
this.add.setText(Messages.add);
d = new FormData();
d.right = new FormAttachment(100, 0);
d.top = new FormAttachment(l, INDENT);
d.width = 70;
this.add.setLayoutData(d);
this.remove.setText(Messages.remove);
d = new FormData();
d.top = new FormAttachment(this.add, 0);
d.right = new FormAttachment(100, 0);
d.width = 70;
this.remove.setLayoutData(d);
this.edit.setText(Messages.edit);
d = new FormData();
d.right = new FormAttachment(100, 0);
d.top = new FormAttachment(this.remove, INDENT);
d.width = 70;
this.edit.setLayoutData(d);
setControl(composite);
}
private String getNewValue(final String value) {
InputDialog id = new InputDialog(this.editor.getEditorSite().getShell(), Messages.dialogTitle,
Messages.dialogDescription, value, new IInputValidator() {
public String isValid(final String s) {
if (s.getBytes().length > 1024) {
return Messages.valueToLong;
}
return null;
}
});
if (id.open() == Window.OK) {
return id.getValue();
} else {
return null;
}
}
protected void saveData() {
TableItem[] items = this.table.getItems();
if (this.rowData != null) {
if (items.length == 0) {
this.rowData.updateValue(this.col, null);
} else if (items.length == 1) {
this.rowData.updateValue(this.col, items[0].getText());
} else {
String[] s = createValue(items);
this.rowData.updateValue(this.col, s);
}
try {
Class<?> c = Class.forName(TableDataEditor.class.getCanonicalName());
Field f1 = c.getDeclaredField("tableViewer");//$NON-NLS-1$
f1.setAccessible(true);
TableViewer tv = (TableViewer) f1.get(this.editor);
tv.refresh(this.rowData);
this.editor.getCursor().redraw();
Method m = c.getDeclaredMethod("setDirty", new Class[] { java.lang.Boolean.TYPE });//$NON-NLS-1$
m.setAccessible(true);
m.invoke(this.editor, new Object[] { Boolean.TRUE });
this.editor.setDirtyBackground(this.col, this.editor.getCursor().getRow());
} catch (SecurityException e) {
Activator.logMessage(e.getMessage(), e, IStatus.ERROR);
} catch (ClassNotFoundException e) {
Activator.logMessage(e.getMessage(), e, IStatus.ERROR);
} catch (NoSuchFieldException e) {
Activator.logMessage(e.getMessage(), e, IStatus.ERROR);
} catch (IllegalArgumentException e) {
Activator.logMessage(e.getMessage(), e, IStatus.ERROR);
} catch (IllegalAccessException e) {
Activator.logMessage(e.getMessage(), e, IStatus.ERROR);
} catch (NoSuchMethodException e) {
Activator.logMessage(e.getMessage(), e, IStatus.ERROR);
} catch (InvocationTargetException e) {
Activator.logMessage(e.getMessage(), e, IStatus.ERROR);
}
}
}
private String[] createValue(final TableItem[] items) {
String[] s = new String[items.length];
for (int i = 0; i < items.length; i++) {
TableItem it = items[i];
s[i] = it.getText();
}
return s;
}
@SuppressWarnings("unchecked")
private void createContent() {
this.col = this.editor.getCursor().getColumn();
StructuredSelection selection = (StructuredSelection) this.editor.getSelectionProvider().getSelection();
TableDataCell firstElement = (TableDataCell) selection.getFirstElement();
Object value = null;
if (firstElement.getRow() instanceof RowDataImpl) {
this.rowData = (RowDataImpl) firstElement.getRow();
value = this.rowData.getValue(this.col);
} else {
//There is no rowData yet, we need to create it ourselves
// ITableData tableData = this.editor.getTableData();
this.rowData = (RowDataImpl) this.editor.getOrCreateRow();
value = firstElement.getRow();
}
if (value instanceof String) {
createItem((String) value);
} else if (value instanceof String[]) {
String[] strings = (String[]) value;
for (String s : strings) {
createItem(s);
}
} else if (value instanceof ArrayList) {
List<String> strings = (List<String>) value;
for (String s : strings) {
createItem(s);
}
}
if (this.table.getItems().length > 0) {
this.table.setSelection(0);
this.remove.setEnabled(true);
this.edit.setEnabled(true);
} else {
this.remove.setEnabled(false);
this.edit.setEnabled(false);
}
}
private TableItem createItem(final String value) {
TableItem item = new TableItem(this.table, SWT.NONE);
item.setText(new String[] { value });
return item;
}
}