com.ibm.xsp.extlib.designer.bluemix.manifest.editor.ManifestTableEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.ibm.xsp.extlib.designer.bluemix.manifest.editor.ManifestTableEditor.java

Source

/*
 *  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);
    }
}