com.jaspersoft.studio.property.dataset.dialog.ParametersTable.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.studio.property.dataset.dialog.ParametersTable.java

Source

/*******************************************************************************
 * Copyright (C) 2005 - 2014 TIBCO Software Inc. All rights reserved. http://www.jaspersoft.com.
 * 
 * Unless you have purchased a commercial license agreement from Jaspersoft, the following license terms apply:
 * 
 * This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
 ******************************************************************************/
package com.jaspersoft.studio.property.dataset.dialog;

import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.design.JRDesignDataset;
import net.sf.jasperreports.engine.design.JRDesignParameter;

import org.eclipse.gef.dnd.TemplateTransfer;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.part.PluginTransfer;

import com.jaspersoft.studio.dnd.NodeDragListener;
import com.jaspersoft.studio.messages.Messages;
import com.jaspersoft.studio.property.descriptor.NullEnum;
import com.jaspersoft.studio.property.descriptor.checkbox.CheckBoxLabelProvider;
import com.jaspersoft.studio.property.descriptor.classname.ClassTypeComboCellEditor;
import com.jaspersoft.studio.swt.widgets.table.DeleteButton;
import com.jaspersoft.studio.swt.widgets.table.INewElement;
import com.jaspersoft.studio.swt.widgets.table.ListContentProvider;
import com.jaspersoft.studio.swt.widgets.table.NewButton;
import com.jaspersoft.studio.utils.Misc;
import com.jaspersoft.studio.utils.UIUtil;

public class ParametersTable extends AbstractModifyTable {
    private TableViewer tviewer;
    private Composite composite;
    private JRDesignDataset dataset;
    private Color background;
    private boolean isMainDataset;

    public ParametersTable(Composite parent, JRDesignDataset dataset, Color background, boolean isMainDataset) {
        this.background = background;
        this.isMainDataset = isMainDataset;
        this.dataset = dataset;
        createControl(parent);
    }

    public Composite getControl() {
        return composite;
    }

    private void createControl(Composite parent) {
        composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(2, false));
        composite.setBackground(background);
        composite.setBackgroundMode(SWT.INHERIT_FORCE);

        wtable = new Table(composite, SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 100;
        wtable.setLayoutData(gd);
        wtable.setHeaderVisible(true);
        wtable.setLinesVisible(true);

        TableColumn[] col = new TableColumn[4];
        col[0] = new TableColumn(wtable, SWT.NONE);
        col[0].setText(Messages.ParametersTable_name);

        col[1] = new TableColumn(wtable, SWT.NONE);
        col[1].setText(Messages.ParametersTable_isForPrompt);

        col[2] = new TableColumn(wtable, SWT.NONE);
        col[2].setText(Messages.ParametersTable_class);

        col[3] = new TableColumn(wtable, SWT.NONE);
        col[3].setText(Messages.ParametersTable_description);

        for (TableColumn tc : col)
            tc.pack();

        TableLayout tlayout = new TableLayout();
        tlayout.addColumnData(new ColumnWeightData(25, false));
        tlayout.addColumnData(new ColumnWeightData(25, false));
        tlayout.addColumnData(new ColumnWeightData(25, false));
        tlayout.addColumnData(new ColumnWeightData(25, false));
        wtable.setLayout(tlayout);

        tviewer = new TableViewer(wtable);
        tviewer.setContentProvider(new ListContentProvider());
        tviewer.setLabelProvider(new TLabelProvider());
        attachCellEditors(tviewer, wtable);
        UIUtil.setViewerCellEditingOnDblClick(tviewer);

        Composite bGroup = new Composite(composite, SWT.NONE);
        bGroup.setLayout(new GridLayout(1, false));
        bGroup.setLayoutData(new GridData(GridData.FILL_VERTICAL));
        bGroup.setBackground(background);

        new NewButton() {
            @Override
            protected void afterElementAdded(Object selement) {
                try {
                    dataset.removeParameter((JRParameter) selement);
                    dataset.addParameter((JRDesignParameter) selement);
                    fireModifyListeners();
                } catch (JRException e) {
                    e.printStackTrace();
                }
            }
        }.createNewButtons(bGroup, tviewer, new INewElement() {

            public Object newElement(List<?> input, int pos) {
                JRDesignParameter f = new JRDesignParameter();
                f.setName(getName());
                f.setValueClass(String.class);
                return f;
            }

            private String getName() {
                List<JRDesignParameter> list = (List<JRDesignParameter>) tviewer.getInput();
                String name = "Parameter"; //$NON-NLS-1$
                boolean match = false;
                String tmp = name;
                for (int i = 1; i < 100000; i++) {
                    tmp = name + i;// ModelUtils.getNameFormat(name, i);

                    for (JRDesignParameter f : list) {
                        match = f.getName().equals(tmp);
                        if (match)
                            break;
                    }
                    if (!match)
                        break;
                }
                return tmp;
            }

        });
        final DeleteButton delb = new DeleteButton() {
            @Override
            protected void afterElementDeleted(Object element) {
                JRParameter todel = null;
                for (JRParameter p : dataset.getParametersList())
                    if (p.getName().equals(((JRDesignParameter) element).getName())) {
                        todel = p;
                        break;
                    }
                if (todel != null) {
                    dataset.removeParameter(todel);
                    fireModifyListeners();
                }
            }
        };
        delb.createDeleteButton(bGroup, tviewer);

        List<JRParameter> fields = dataset.getParametersList();
        if (fields == null)
            fields = new ArrayList<JRParameter>();
        setFields(fields);

        tviewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                StructuredSelection sel = (StructuredSelection) event.getSelection();
                if (!sel.isEmpty()) {
                    JRDesignParameter prm = (JRDesignParameter) sel.getFirstElement();
                    delb.setEnabled(!prm.isSystemDefined());
                }
            }
        });

        tviewer.addDragSupport(DND.DROP_COPY | DND.DROP_MOVE,
                new Transfer[] { TemplateTransfer.getInstance(), PluginTransfer.getInstance() },
                new NodeDragListener(tviewer));
    }

    public <T extends JRParameter> void setFields(List<T> fields) {
        tviewer.setInput(new ArrayList(fields));
        tviewer.refresh();
    }

    public List<JRDesignParameter> getParameters() {
        return (List<JRDesignParameter>) tviewer.getInput();
    }

    private void attachCellEditors(final TableViewer viewer, Composite parent) {
        viewer.setCellModifier(new ICellModifier() {
            public boolean canModify(Object element, String property) {
                JRDesignParameter field = (JRDesignParameter) element;
                if (field.isSystemDefined())
                    return false;
                if (property.equals("NAME")) //$NON-NLS-1$
                    return true;
                if (property.equals("ISFORPROMPT")) //$NON-NLS-1$
                    return true;
                if (property.equals("TYPE")) //$NON-NLS-1$
                    return true;
                if (property.equals("DESCRIPTION")) //$NON-NLS-1$
                    return true;
                return false;
            }

            public Object getValue(Object element, String property) {
                JRDesignParameter prop = (JRDesignParameter) element;
                if ("NAME".equals(property)) //$NON-NLS-1$
                    return prop.getName();
                if ("ISFORPROMPT".equals(property)) //$NON-NLS-1$
                    return prop.isForPrompting();
                if ("TYPE".equals(property)) //$NON-NLS-1$
                    return prop.getValueClassName();
                if ("DESCRIPTION".equals(property)) //$NON-NLS-1$
                    return Misc.nvl(prop.getDescription(), ""); //$NON-NLS-1$

                return ""; //$NON-NLS-1$
            }

            public void modify(Object element, String property, Object value) {
                TableItem tableItem = (TableItem) element;
                JRDesignParameter field = (JRDesignParameter) tableItem.getData();
                if ("NAME".equals(property)) { //$NON-NLS-1$
                    String old = field.getName();
                    JRDesignParameter oldParam = (JRDesignParameter) dataset.getParametersMap().get(old);
                    if (oldParam != null) {
                        field.setName((String) value);
                        oldParam.setName((String) value);
                        dataset.getParametersMap().remove(old);
                        dataset.getParametersMap().put(field.getName(), oldParam);
                        propertyChangeSupport.firePropertyChange(new java.beans.PropertyChangeEvent(field,
                                JRDesignParameter.PROPERTY_NAME, old, field.getName()));
                    }
                } else if ("ISFORPROMPT".equals(property) && isMainDataset) { //$NON-NLS-1$
                    field.setForPrompting((Boolean) value);
                } else if ("TYPE".equals(property)) { //$NON-NLS-1$
                    field.setValueClassName((String) value);
                } else if ("DESCRIPTION".equals(property)) { //$NON-NLS-1$
                    field.setDescription((String) value);
                }
                tviewer.update(element, new String[] { property });
                tviewer.refresh();

            }
        });

        viewer.setCellEditors(new CellEditor[] { new TextCellEditor(parent), new CheckboxCellEditor(parent),
                new ClassTypeComboCellEditor(parent), new TextCellEditor(parent) });
        viewer.setColumnProperties(new String[] { "NAME", "ISFORPROMPT", "TYPE", "DESCRIPTION" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    private PropertyChangeSupport propertyChangeSupport;

    public PropertyChangeSupport getPropertyChangeSupport() {
        if (propertyChangeSupport == null)
            propertyChangeSupport = new PropertyChangeSupport(this);
        return propertyChangeSupport;
    }

    private final class TLabelProvider extends LabelProvider implements ITableLabelProvider {
        private CheckBoxLabelProvider cblp = new CheckBoxLabelProvider(NullEnum.NOTNULL);

        public Image getColumnImage(Object element, int columnIndex) {
            JRDesignParameter field = (JRDesignParameter) element;
            switch (columnIndex) {
            case 1:
                if (!field.isSystemDefined())
                    return cblp.getCellEditorImage(field.isForPrompting());
            }
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            JRDesignParameter field = (JRDesignParameter) element;
            switch (columnIndex) {
            case 0:
                return field.getName();
            case 1:
                if (field.isSystemDefined())
                    return ""; //$NON-NLS-1$
                else
                    return Boolean.toString(field.isForPrompting());
            case 2:
                return Misc.nvl(field.getValueClassName(), ""); //$NON-NLS-1$
            case 3:
                return Misc.nvl(field.getDescription(), ""); //$NON-NLS-1$
            }
            return ""; //$NON-NLS-1$
        }

    }
}