com.jaspersoft.studio.property.descriptor.genericElement.dialog.ParameterPage.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.studio.property.descriptor.genericElement.dialog.ParameterPage.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.descriptor.genericElement.dialog;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRGenericElementParameter;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignGenericElementParameter;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
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.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableCursor;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import com.jaspersoft.studio.editor.expression.ExpressionContext;
import com.jaspersoft.studio.editor.expression.IExpressionContextSetter;
import com.jaspersoft.studio.messages.Messages;
import com.jaspersoft.studio.property.descriptor.expression.JRExpressionCellEditor;
import com.jaspersoft.studio.utils.Misc;

public class ParameterPage extends WizardPage implements IExpressionContextSetter {
    private final class TLabelProvider extends LabelProvider implements ITableLabelProvider {

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            switch (columnIndex) {
            case 0:
                return ((JRGenericElementParameter) element).getName();
            case 1:
                JRGenericElementParameter value2 = (JRGenericElementParameter) element;
                if (value2 != null && value2.getValueExpression() != null)
                    return value2.getValueExpression().getText();
                break;
            case 2:
                return Boolean.toString(((JRGenericElementParameter) element).isSkipWhenEmpty());
            }

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

    private ParameterDTO value;
    private Table table;
    private TableViewer tableViewer;
    private ExpressionContext expContext;

    // private TableCursor cursor;

    public ParameterDTO getValue() {
        return value;
    }

    @Override
    public void dispose() {
        // clear all properties
        List<JRGenericElementParameter> props = (List<JRGenericElementParameter>) tableViewer.getInput();
        value = new ParameterDTO();
        value.setValue(props.toArray(new JRGenericElementParameter[props.size()]));

        super.dispose();
    }

    public void setValue(ParameterDTO value) {
        this.value = value;
        if (value == null) {
            value = new ParameterDTO();
        }
        if (table != null)
            fillTable(table);
    }

    protected ParameterPage(String pageName) {
        super(pageName);
        setTitle(Messages.ParameterPage_generic_elements_parameters);
        setDescription(Messages.ParameterPage_description);

    }

    public void createControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(2, false);
        composite.setLayout(layout);
        setControl(composite);

        buildTable(composite);

        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.horizontalAlignment = GridData.FILL;
        gd.grabExcessHorizontalSpace = true;
        gd.verticalAlignment = GridData.FILL;
        gd.grabExcessVerticalSpace = true;
        gd.verticalSpan = 2;
        gd.heightHint = 400;
        gd.widthHint = 600;
        table.setLayoutData(gd);

        Button addB = new Button(composite, SWT.PUSH | SWT.CENTER);
        addB.setText(Messages.common_add);
        GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
        gridData.widthHint = 80;
        addB.setLayoutData(gridData);
        addB.addSelectionListener(new SelectionAdapter() {

            // Remove the selection and refresh the view
            @Override
            public void widgetSelected(SelectionEvent e) {
                List<JRGenericElementParameter> list = (List<JRGenericElementParameter>) tableViewer.getInput();
                String newName = "NEW PARAMETER"; //$NON-NLS-1$
                for (int i = 1; i < Integer.MAX_VALUE; i++) {
                    if (checkName(newName, list))
                        newName = "NEW PARAMETER " + i; //$NON-NLS-1$
                    else
                        break;
                }
                JRDesignGenericElementParameter p = new JRDesignGenericElementParameter();
                JRDesignExpression expression = new JRDesignExpression();
                p.setValueExpression(expression);
                p.setName(newName); //$NON-NLS-1$
                list.add(p);
                tableViewer.add(p);
                tableViewer.setSelection(new StructuredSelection(p));
                // cursor.setSelection(table.getSelectionIndex(), 0);
                tableViewer.refresh();
                table.setFocus();
            }

            private boolean checkName(String newName, List<JRGenericElementParameter> list) {
                for (JRGenericElementParameter dto : list) {
                    if (dto.getName() == null || dto.getName().trim().equals(newName)) //$NON-NLS-1$
                        return true;
                }
                return false;
            }
        });

        Button delB = new Button(composite, SWT.PUSH | SWT.CENTER);
        delB.setText(Messages.common_delete);
        gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
        gridData.widthHint = 80;
        delB.setLayoutData(gridData);
        delB.addSelectionListener(new SelectionAdapter() {

            // Remove the selection and refresh the view
            @Override
            public void widgetSelected(SelectionEvent e) {
                IStructuredSelection iStructuredSelection = (IStructuredSelection) tableViewer.getSelection();
                JRGenericElementParameter property = (JRGenericElementParameter) iStructuredSelection
                        .getFirstElement();
                Object input = tableViewer.getInput();
                if (input instanceof List<?>) {
                    List<?> list = (List<?>) input;
                    int index = list.indexOf(property);
                    list.remove(property);
                    tableViewer.remove(property);
                    tableViewer.refresh();
                    Object sp = null;
                    if (index >= list.size())
                        index = list.size() - 1;
                    if (index >= 0)
                        sp = list.get(index);

                    if (sp != null) {
                        tableViewer.setSelection(new StructuredSelection(sp));
                        // cursor.setSelection(table.getSelectionIndex(), 0);
                    } else
                        setMessage(Messages.common_table_is_empty);
                }
            }
        });
    }

    private void buildTable(Composite composite) {
        table = new Table(composite, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
        table.setToolTipText("");
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        // cursor = new TableCursor(table, SWT.NONE);

        tableViewer = new TableViewer(table);
        attachContentProvider(tableViewer);
        attachLabelProvider(tableViewer);
        attachCellEditors(tableViewer, table);

        TableLayout tlayout = new TableLayout();
        tlayout.addColumnData(new ColumnWeightData(50, 75, true));
        tlayout.addColumnData(new ColumnWeightData(50, 75, true));
        tlayout.addColumnData(new ColumnWeightData(50, 75, true));
        table.setLayout(tlayout);

        setColumnToolTip();

        TableColumn[] column = new TableColumn[3];
        column[0] = new TableColumn(table, SWT.NONE);
        column[0].setText(Messages.ParameterPage_parameter);

        column[1] = new TableColumn(table, SWT.NONE);
        column[1].setText(Messages.common_expression);

        column[2] = new TableColumn(table, SWT.NONE);
        column[2].setText(Messages.ParameterPage_skip_empty);

        fillTable(table);
        for (int i = 0, n = column.length; i < n; i++) {
            column[i].pack();
        }
        table.addSelectionListener(new SelectionListener() {

            public void widgetSelected(SelectionEvent e) {
                if (e.item instanceof TableItem) {
                    setMessage(getDescription(((TableItem) e.item)));
                }
            }

            public void widgetDefaultSelected(SelectionEvent e) {
            }
        });
    }

    /**
     * @param tableViewer
     * @param cursor
     */
    static void editCell(final TableViewer tableViewer, final TableCursor cursor) {
        tableViewer.editElement(cursor.getRow().getData(), cursor.getColumn());
        // hide cursor only f there is an editor active on the cell
        cursor.setVisible(!tableViewer.isCellEditorActive());
    }

    private void attachContentProvider(TableViewer viewer) {
        viewer.setContentProvider(new IStructuredContentProvider() {
            public Object[] getElements(Object inputElement) {
                return ((List<?>) inputElement).toArray();
            }

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

            }
        });
    }

    private void attachLabelProvider(TableViewer viewer) {
        viewer.setLabelProvider(new TLabelProvider());
    }

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

            public Object getValue(Object element, String property) {
                JRGenericElementParameter prop = (JRGenericElementParameter) element;
                if ("VALUE".equals(property)) //$NON-NLS-1$
                    if (prop.getValueExpression() != null)
                        return Misc.nvl(prop.getValueExpression().getText(), "");
                if ("NAME".equals(property)) //$NON-NLS-1$
                    return prop.getName();
                if ("SKIPONEMPTY".equals(property)) //$NON-NLS-1$
                    return new Integer(prop.isSkipWhenEmpty() ? 0 : 1);

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

            public void modify(Object element, String property, Object value) {
                TableItem tableItem = (TableItem) element;
                setErrorMessage(null);
                setMessage(getDescription(tableItem));
                JRDesignGenericElementParameter data = (JRDesignGenericElementParameter) tableItem.getData();
                if ("VALUE".equals(property)) { //$NON-NLS-1$
                    if (value instanceof JRExpression) {
                        data.setValueExpression((JRExpression) value);
                    }
                } else if ("NAME".equals(property)) { //$NON-NLS-1$
                    List<JRDesignGenericElementParameter> plist = (List<JRDesignGenericElementParameter>) tableViewer
                            .getInput();
                    for (JRDesignGenericElementParameter p : plist) {
                        if (p != data && p.getName() != null && p.getName().equals(value)) {
                            setErrorMessage(Messages.common_error_message_unique_properties);
                            return;
                        }
                    }
                    data.setName((String) value);
                } else if ("SKIPONEMPTY".equals(property)) { //$NON-NLS-1$
                    data.setSkipWhenEmpty(new Boolean(value != null && ((Integer) value).intValue() == 1));
                }
                tableViewer.update(element, new String[] { property });
                tableViewer.refresh();
            }
        });

        JRExpressionCellEditor jrExpressionCellEditor = new JRExpressionCellEditor(parent, expContext);
        viewer.setCellEditors(new CellEditor[] { new TextCellEditor(parent), jrExpressionCellEditor,
                new ComboBoxCellEditor(parent, new String[] { "false", "true" }) }); //$NON-NLS-1$ //$NON-NLS-2$
        viewer.setColumnProperties(new String[] { "NAME", "VALUE", "SKIPONEMPTY" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }

    private void fillTable(Table table) {
        List<JRGenericElementParameter> lst = new ArrayList<JRGenericElementParameter>();
        if (value.getValue() != null)
            lst.addAll(Arrays.asList(value.getValue()));
        tableViewer.setInput(lst);
    }

    private void setColumnToolTip() {
        final Listener labelListener = new Listener() {
            public void handleEvent(Event event) {
                Label label = (Label) event.widget;
                Shell shell = label.getShell();
                switch (event.type) {
                case SWT.MouseDown:
                    Event e = new Event();
                    e.item = (TableItem) label.getData("_TABLEITEM"); //$NON-NLS-1$
                    // Assuming table is single select, set the selection as if
                    // the mouse down event went through to the table
                    table.setSelection(new TableItem[] { (TableItem) e.item });
                    table.notifyListeners(SWT.Selection, e);
                    // fall through
                case SWT.MouseExit:
                    shell.dispose();
                    break;
                }
            }
        };

        Listener tableListener = new Listener() {
            Shell tip = null;

            Label label = null;

            public void handleEvent(Event event) {
                switch (event.type) {
                case SWT.Dispose:
                case SWT.KeyDown:
                case SWT.MouseMove: {
                    if (tip == null)
                        break;
                    tip.dispose();
                    tip = null;
                    label = null;
                    break;
                }
                case SWT.MouseHover: {
                    TableItem item = table.getItem(new Point(event.x, event.y));
                    String description = getDescription(item);
                    if (item != null && !description.equals("")) { //$NON-NLS-1$

                        if (tip != null && !tip.isDisposed())
                            tip.dispose();
                        tip = new Shell(table.getShell(), SWT.ON_TOP | SWT.TOOL);
                        tip.setLayout(new FillLayout());
                        label = new Label(tip, SWT.NONE);
                        label.setForeground(
                                table.getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
                        label.setBackground(
                                table.getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
                        label.setData("_TABLEITEM", item); //$NON-NLS-1$

                        label.setText(description);
                        label.addListener(SWT.MouseExit, labelListener);
                        label.addListener(SWT.MouseDown, labelListener);
                        Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
                        Rectangle rect = item.getBounds(0);
                        Point pt = table.toDisplay(rect.x, rect.y);
                        tip.setBounds(pt.x, pt.y, size.x, size.y);
                        tip.setVisible(true);
                    }
                }
                }
            }
        };
        table.addListener(SWT.Dispose, tableListener);
        table.addListener(SWT.KeyDown, tableListener);
        table.addListener(SWT.MouseMove, tableListener);
        table.addListener(SWT.MouseHover, tableListener);
    }

    private String getDescription(TableItem item) {
        // String key = ((SubreportPropertyDTO) item.getData()).getProperty();
        // List<SubreportPropertyDTO> dp = getDefaultProperties();
        // for (SubreportPropertyDTO p : dp) {
        // if (p.getProperty().equals(key))
        // return p.getDescription();
        // }
        return ""; //$NON-NLS-1$
    }

    public void setExpressionContext(ExpressionContext expContext) {
        this.expContext = expContext;
    }

}