import net.sf.jasperreports.engine.JRAlignment;
import net.sf.jasperreports.engine.JRElement;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignLine;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignStyle;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.view.JasperViewer;

import java.awt.Color;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ProductReport {
    public static void main(String[] args) {
        try {
            List dataList = new ArrayList();
            HashMap dataMap = new HashMap();
            dataMap.put("name", "ProductX");
            dataMap.put("cost", 100.01);
            dataList.add(dataMap);

            dataMap = new HashMap();
            dataMap.put("name", "ProductY");
            dataMap.put("cost", 23.00);
            dataList.add(dataMap);

            dataMap = new HashMap();
            dataMap.put("name", "ProductZ");
            dataMap.put("cost", 99.89);
            dataList.add(dataMap);

            JasperDesign jasperDesign = getProductJasperDesign();
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
            JRBeanCollectionDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(dataList);
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), jrBeanCollectionDataSource);
            JasperViewer.viewReport(jasperPrint);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static JasperDesign getProductJasperDesign() throws JRException {
        JasperDesign jasperDesign = new JasperDesign();
        jasperDesign.setName("Product_Report");
        jasperDesign.setLeftMargin(10);
        jasperDesign.setRightMargin(10);
        jasperDesign.setBottomMargin(20);
        jasperDesign.setTopMargin(20);
        jasperDesign.setPageHeight(800);
        jasperDesign.setPageWidth(600);
        jasperDesign.setColumnWidth(500);
        jasperDesign.setIgnorePagination(true);

        // Add styles to report
        JRDesignStyle titleText = new JRDesignStyle();
        titleText.setName("titleText");
        titleText.setDefault(false);
        titleText.setMode(JRElement.MODE_OPAQUE);
        titleText.setFontName("Arial");
        titleText.setFontSize(16);
        jasperDesign.addStyle(titleText);

        JRDesignStyle headingText = new JRDesignStyle();
        headingText.setName("headingText");
        headingText.setMode(JRElement.MODE_OPAQUE);
        headingText.setFontName("Arial");
        headingText.setForecolor(new Color(16777215));
        headingText.setBackcolor(new Color(6776679));
        headingText.setFontSize(10);
        jasperDesign.addStyle(headingText);

        JRDesignStyle reportingText = new JRDesignStyle();
        reportingText.setName("reportingText");
        reportingText.setDefault(false);
        reportingText.setMode(JRElement.MODE_OPAQUE);
        reportingText.setFontName("Arial");
        reportingText.setBackcolor(new Color(16119285));
        reportingText.setFontSize(9);
        jasperDesign.addStyle(reportingText);

        // End of styles 

        // Field Values
        JRDesignField field = new JRDesignField();

        field = new JRDesignField();
        field.setName("name");
        field.setValueClass(String.class);
        jasperDesign.addField(field);

        field = new JRDesignField();
        field.setName("cost");
        field.setValueClass(Double.class);
        jasperDesign.addField(field);

        JRDesignBand band = new JRDesignBand();
        band.setHeight(40);

        JRDesignStaticText statictextField = new JRDesignStaticText();
        statictextField.setText("Product Record Report");
        statictextField.setX(0);
        statictextField.setY(0);
        statictextField.setWidth(200);
        statictextField.setHeight(26);
        statictextField.setStyle(titleText);

        JRDesignLine line = new JRDesignLine();
        line.setX(0);
        line.setY(26);
        //line.setWidth(515);
        line.setHeight(0);

        band.addElement(statictextField);
        band.addElement(line);

        jasperDesign.setTitle(band);

        // Page header
        band = new JRDesignBand();
        band.setHeight(20);
        statictextField = new JRDesignStaticText();
        statictextField.setX(0);
        statictextField.setY(0);
        statictextField.setWidth(99);
        statictextField.setHeight(20);
        statictextField.setText("Product Name");
        statictextField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
        statictextField.setStyle(headingText);
        band.addElement(statictextField);

        statictextField = new JRDesignStaticText();
        statictextField.setX(100);
        statictextField.setY(0);
        statictextField.setWidth(100);
        statictextField.setHeight(20);
        statictextField.setText("Product Cost");
        statictextField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
        statictextField.setStyle(headingText);
        band.addElement(statictextField);
        jasperDesign.setPageHeader(band);

        // Add Detail Section
        band = new JRDesignBand();
        band.setHeight(19);

        JRDesignTextField textField = new JRDesignTextField();
        textField.setX(0);
        textField.setY(0);
        textField.setWidth(99);
        textField.setHeight(18);
        textField.setStretchWithOverflow(true);
        textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
        textField.setStyle(reportingText);

        JRDesignExpression expression = new JRDesignExpression();
        expression = new JRDesignExpression();
        expression = new JRDesignExpression();
        expression.setValueClass(String.class);
        expression.setText("$F{name}");
        textField.setExpression(expression);

        band.addElement(textField);

        textField = new JRDesignTextField();
        textField.setX(100);
        textField.setY(0);
        textField.setWidth(99);
        textField.setHeight(18);
        textField.setStretchWithOverflow(true);
        textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
        textField.setStyle(reportingText);

        expression = new JRDesignExpression();
        expression.setValueClass(Double.class);
        expression.setText("$F{cost}");
        textField.setExpression(expression);

        band.addElement(textField);

        textField = new JRDesignTextField();
        jasperDesign.setDetail(band);

        //Column footer
        band = new JRDesignBand();
        jasperDesign.setColumnFooter(band);

        //Page footer
        band = new JRDesignBand();
        jasperDesign.setPageFooter(band);

        //Summary
        band = new JRDesignBand();
        jasperDesign.setSummary(band);

        return jasperDesign;
    }
}
