/*
* � Copyright IBM Corp. 2015, 2016
*
* 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://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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.ibm.xsp.extlib.designer.bluemix.manifest.editor;
import java.util.ArrayList;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TableItem;
import com.ibm.commons.swt.controls.custom.CustomTable;
import com.ibm.commons.swt.controls.custom.CustomTableColumn;
import com.ibm.commons.util.StringUtil;
import com.ibm.xsp.extlib.designer.bluemix.util.BluemixUtil;
/**
* @author Gary Marjoram
*
*/
public class ManifestTableEditor {
private final TableViewer _tableViewer;
private final CustomTable _table;
private final CellEditorCallback _callback;
private final boolean _editable;
public ManifestTableEditor(Composite parent, int span, String[] colNames, String[] colLabels, boolean header, boolean lines, int rows, int width,
String tableId, ArrayList<EditTableItem> input, boolean editable, CellEditorCallback callback, SelectionListener selListener,
IDoubleClickListener doubleClickListener) {
_callback = callback;
_editable = editable;
// Create the table
_table = new CustomTable(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION, tableId);
if (selListener != null) {
_table.addSelectionListener(selListener);
}
GridData gd = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
gd.horizontalSpan = span;
_table.setLayoutData(gd);
_table.setLinesVisible(lines);
_table.setHeaderVisible(header);
_table.setRows(rows);
_table.setCols(width);
// Create the columns
int numCols = colNames.length;
for (int i=0; i < numCols; i++) {
String colLabel = colLabels[i];
String colName = colNames[i];
CustomTableColumn col = new CustomTableColumn(_table, SWT.NONE, tableId + "." + colName);
col.setText(colLabel);
if (i == numCols-1) {
col.setWidthUnit(CustomTableColumn.UNIT_REMAINDER);
} else {
col.setWidthUnit(CustomTableColumn.UNIT_PERCENT);
col.setColWidth(100 / numCols);
}
}
// Create the Table Viewer
_tableViewer = new TableViewer(_table);
if (doubleClickListener != null) {
_tableViewer.addDoubleClickListener(doubleClickListener);
}
// Create the Label Provider
_tableViewer.setLabelProvider(new ITableLabelProvider() {
@Override
public void addListener(ILabelProviderListener arg0) {
}
@Override
public void dispose() {
}
@Override
public boolean isLabelProperty(Object arg0, String arg1) {
return false;
}
@Override
public void removeListener(ILabelProviderListener arg0) {
}
@Override
public Image getColumnImage(Object arg0, int arg1) {
return null;
}
@Override
public String getColumnText(Object obj, int col) {
if (obj instanceof EditTableItem) {
return ((EditTableItem) obj).getColumn(col);
}
return null;
}
});
// Create the content provider
_tableViewer.setContentProvider(new IStructuredContentProvider() {
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
}
@SuppressWarnings("unchecked") // $NON-NLS-1$
@Override
public Object[] getElements(Object input) {
return ((ArrayList<EditTableItem>)input).toArray();
}
});
// In Cell Editing
_tableViewer.setCellModifier(new ICellModifier() {
@Override
public boolean canModify(Object element, String property) {
return _editable;
}
@Override
public Object getValue(Object element, String property) {
if (element instanceof EditTableItem) {
return ((EditTableItem)element).getValue(property);
}
return "";
}
@Override
public void modify(Object element, String property, Object value) {
if(element != null){
if (element instanceof TableItem) {
Object data = ((TableItem)element).getData();
if (data instanceof EditTableItem) {
EditTableItem item = (EditTableItem) data;
if (!StringUtil.equals(item.getValue(property), (String)value)) {
item.setValue(property, (String) value);
_tableViewer.refresh();
if (_callback != null) {
_callback.contentsChanged(((CustomTable)_tableViewer.getTable()).getId());
}
}
}
}
}
}
});
_tableViewer.setCellEditors(new CellEditor[] {new TextCellEditor(_tableViewer.getTable()), new TextCellEditor(_tableViewer.getTable())});
_tableViewer.setColumnProperties(colNames);
_tableViewer.setInput(input);
}
public void refresh() {
_tableViewer.refresh();
}
@SuppressWarnings("unchecked") // $NON-NLS-1$
public void createItem(EditTableItem item) {
((ArrayList<EditTableItem>)_tableViewer.getInput()).add(item);
_tableViewer.refresh();
_tableViewer.getTable().select(((ArrayList<EditTableItem>)_tableViewer.getInput()).size()-1);
_tableViewer.getTable().showSelection();
if (_callback != null) {
_callback.contentsChanged(((CustomTable)_tableViewer.getTable()).getId());
}
}
@SuppressWarnings("unchecked") // $NON-NLS-1$
public void deleteItem() {
int selIndex = _tableViewer.getTable().getSelectionIndex();
if (selIndex >= 0) {
if(MessageDialog.openQuestion(null, BluemixUtil.productizeString("%BM_PRODUCT%"), "Are you sure you want to delete this item?")) { // $NON-NLS-1$ $NLX-ManifestTableEditor.Areyousureyouwanttodeletethisitem-2$
((ArrayList<EditTableItem>)_tableViewer.getInput()).remove(selIndex);
_tableViewer.refresh();
if (_callback != null) {
_callback.contentsChanged(((CustomTable)_tableViewer.getTable()).getId());
}
}
}
}
public Object getLayoutData() {
return _table.getLayoutData();
}
public int getSelectedRow() {
return _table.getSelectionIndex();
}
public CustomTable getTable() {
return _table;
}
public static abstract class EditTableItem {
public abstract String getColumn (int col);
public abstract String getValue (String item);
public abstract void setValue (String item, String value);
}
public interface CellEditorCallback {
public void contentsChanged(String controlId);
}
}