com.servoy.extensions.plugins.excelxport.ImportSelectSheetPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.servoy.extensions.plugins.excelxport.ImportSelectSheetPanel.java

Source

/*
 This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV
    
 This program is free software; you can redistribute it and/or modify it under
 the terms of the GNU Affero General Public License as published by the Free
 Software Foundation; either version 3 of the License, or (at your option) any
 later version.
    
 This program is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
    
 You should have received a copy of the GNU Affero General Public License along
 with this program; if not, see http://www.gnu.org/licenses or write to the Free
 Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
package com.servoy.extensions.plugins.excelxport;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import javax.swing.table.AbstractTableModel;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;

import com.servoy.j2db.Messages;
import com.servoy.j2db.util.StringComparator;
import com.servoy.j2db.util.gui.SortedComboModel;
import com.servoy.j2db.util.wizard.IWizard;
import com.servoy.j2db.util.wizard.IWizardPanel;
import com.servoy.j2db.util.wizard.IWizardState;

/**
 * @author jblok
 */
public class ImportSelectSheetPanel extends JPanel implements ActionListener, IWizardPanel {
    protected SheetTableModel tableModel;

    protected JComboBox sheetSelect = new JComboBox();

    protected JCheckBox headerRows = new JCheckBox(
            Messages.getString("servoy.plugin.import.rowContainsFieldnames")); //$NON-NLS-1$
    //   protected JComboBox textQualifierCombo = new JComboBox();

    protected boolean canceled = true;
    protected boolean next = true;
    private final JTable table;

    private final IWizard parent;
    private final IWizardState state;

    public ImportSelectSheetPanel(IWizard parent, IWizardState state) {
        this.parent = parent;
        this.state = state;
        setName("SelectSheetPanel"); //$NON-NLS-1$
        setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        setLayout(new BorderLayout());

        table = new JTable();

        table.setPreferredScrollableViewportSize(new Dimension(500, 70));

        //Create the scroll pane and add the table to it. 
        JScrollPane scrollPane = new JScrollPane(table);

        // Lay out topmost Part pane
        JPanel formatPanel = new JPanel();
        formatPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        formatPanel.setBorder(new TitledBorder(BorderFactory.createEtchedBorder(),
                Messages.getString("servoy.plugin.import.chooseSheet"))); //$NON-NLS-1$
        formatPanel.add(sheetSelect);
        sheetSelect.addActionListener(this);
        formatPanel.add(headerRows);
        headerRows.setActionCommand("UseHeaderRows"); //$NON-NLS-1$
        headerRows.addActionListener(this);

        //Lay out the master content pane.
        add(formatPanel, BorderLayout.NORTH);
        add(scrollPane, BorderLayout.CENTER);
    }

    public void actionPerformed(ActionEvent event) {
        String command = event.getActionCommand();
        if (command.equals("UseHeaderRows")) //$NON-NLS-1$
        {
            if (tableModel != null)
                tableModel.setUseHeaderRow(headerRows.isSelected());
        } else if (event.getSource() == sheetSelect) {
            if (sheetSelect.getSelectedItem() != null) {
                HSSFWorkbook wb = (HSSFWorkbook) state.getProperty("workbook"); //$NON-NLS-1$
                HSSFSheet sheet = wb.getSheetAt(wb.getSheetIndex(sheetSelect.getSelectedItem().toString()));
                tableModel = new SheetTableModel(sheet);
                tableModel.setUseHeaderRow(headerRows.isSelected());
                table.setModel(tableModel);
            }
        }
        table.sizeColumnsToFit(JTable.AUTO_RESIZE_ALL_COLUMNS);
        revalidate();
        repaint();
    }

    public AbstractTableModel getModel() {
        return tableModel;
    }

    public String getNextPanelName() {
        return "SpecifyDestinationPanel"; //$NON-NLS-1$
    }

    public boolean isDone() {
        if (tableModel.getRowCount() == 0)
            return false;
        state.setProperty("data", tableModel); //$NON-NLS-1$
        return true;
    }

    public Runnable needsToRunFirst(final boolean forward) {
        return new Runnable() {
            public void run() {
                try {
                    parent.blockGUI(Messages.getString("servoy.plugin.import.status.organizingData")); //$NON-NLS-1$
                    if (forward) {
                        HSSFWorkbook wb = (HSSFWorkbook) state.getProperty("workbook"); //$NON-NLS-1$
                        SortedComboModel dcm = new SortedComboModel(StringComparator.INSTANCE);
                        for (int i = 0; i < wb.getNumberOfSheets(); i++) {
                            dcm.add(wb.getSheetName(i));
                        }
                        sheetSelect.setModel(dcm);

                        HSSFSheet sheet = wb.getSheetAt(0);//take first default
                        tableModel = new SheetTableModel(sheet);
                        tableModel.setUseHeaderRow(headerRows.isSelected());
                        table.setModel(tableModel);
                    }
                } finally {
                    parent.releaseGUI();
                }
            }
        };
    }
}

class SheetTableModel extends AbstractTableModel {
    private final HSSFSheet sheet;

    SheetTableModel(HSSFSheet sheet) {
        this.sheet = sheet;
    }

    private short csize = 0;

    public int getColumnCount() {
        if (csize == 0) {
            short maxcsize = 0;
            for (int i = 0; i < 50; i++)//test 10 rows
            {
                HSSFRow row = sheet.getRow(i);
                if (row != null) {
                    HSSFCell cell;
                    short j = 0;
                    short skipped = 0;
                    for (; j < 100; j++)//test at least 100 columns (to overcome empty columns)
                    {
                        cell = row.getCell(j);
                        if (cell != null) {
                            maxcsize++;
                            maxcsize += skipped;
                            skipped = 0;
                        } else {
                            skipped++;
                        }
                    }
                    while (j > 0 && (cell = row.getCell(j)) != null)//add if there are even more
                    {
                        maxcsize++;
                        j++;
                    }
                    if (csize < maxcsize) {
                        csize = maxcsize;
                    }
                    maxcsize = 0;
                }
            }
        }
        return csize;
    }

    @Override
    public String getColumnName(int column) {
        Object obj = getValueAt(-1, column);
        if (obj == null) {
            if (column < getColumnCount()) {
                return "" + column; //$NON-NLS-1$
            } else {
                return "";
            }
        } else {
            return obj.toString();
        }
    }

    private boolean useHeaderRow = false;

    public void setUseHeaderRow(boolean b) {
        useHeaderRow = b;
        fireTableStructureChanged();
    }

    public int getRowCount() {
        if (useHeaderRow) {
            return sheet.getLastRowNum();
        } else {
            return sheet.getLastRowNum() + 1;
        }
    }

    public Object getValueAt(int r, int c) {
        if (r == -1) {
            r = 0;
        } else if (useHeaderRow) {
            r++;
        }
        HSSFRow row = sheet.getRow(r);
        if (row != null) {
            HSSFCell cell = row.getCell((short) c);
            if (cell != null) {
                switch (cell.getCellType()) {
                case Cell.CELL_TYPE_NUMERIC:
                    Number d = new Double(cell.getNumericCellValue());
                    if (((int) d.doubleValue()) == Math.ceil(d.doubleValue())) {
                        d = new Integer(d.intValue());
                    }
                    return d;
                //               case HSSFCell.CELL_TYPE_NUMERIC:
                //               return cell.getStringCellValue();   

                default:
                    return cell.getStringCellValue();
                }
            }
        }
        return null;
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
}