uk.chromis.pos.imports.JPanelCSVImport.java Source code

Java tutorial

Introduction

Here is the source code for uk.chromis.pos.imports.JPanelCSVImport.java

Source

//    Chromis POS  - The New Face of Open Source POS
//    Copyright (c) (c) 2015-2016
//    http://www.chromis.co.uk 3.81
//
//    This file is part of Chromis POS
//
//     Chromis POS is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    Chromis POS 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 General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with Chromis POS.  If not, see <http://www.gnu.org/licenses/>.
//    CSV Import Panel added by JDL - February 2013
//    Additonal library required - javacsv
package uk.chromis.pos.imports;

import com.csvreader.CsvReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.commons.lang.StringUtils;
import uk.chromis.basic.BasicException;
import uk.chromis.data.gui.ComboBoxValModel;
import uk.chromis.data.loader.DataResultSet;
import uk.chromis.data.loader.Datas;
import uk.chromis.data.loader.PreparedSentence;
import uk.chromis.data.loader.SentenceList;
import uk.chromis.data.loader.SerializerWriteBasicExt;
import uk.chromis.data.loader.Session;
import uk.chromis.data.user.SaveProvider;
import uk.chromis.format.Formats;
import uk.chromis.pos.forms.AppConfig;
import uk.chromis.pos.forms.AppLocal;
import uk.chromis.pos.forms.AppProperties;
import uk.chromis.pos.forms.AppView;
import uk.chromis.pos.forms.DataLogicSales;
import uk.chromis.pos.forms.DataLogicSystem;
import uk.chromis.pos.forms.JPanelView;
import uk.chromis.pos.inventory.TaxCategoryInfo;
import uk.chromis.pos.sales.TaxesLogic;
import uk.chromis.pos.ticket.ProductInfoExt;
import uk.chromis.pos.util.BarcodeValidator;

/**
 * Graphical User Interface and code for importing data from a CSV file allowing
 * adding or updating many products quickly and easily.
 *
 * @author John L - Version 1.0
 * @author Walter Wojcik - Version 2.0+
 * @version 2.0 - Added functionality to remember the last folder opened and
 * importing categories from CVS.
 * @version 2.1 complete re-write of the core code, to make use of the core
 * classes available within Unicenta
 * @version 2.2(TJMChan) Fixed Indexing issue and added additional input fields
 */
public class JPanelCSVImport extends JPanel implements JPanelView {

    private AppView m_App;
    private AppProperties m_props;
    private ArrayList<String> Headers = new ArrayList<>();
    private Session s;
    private Connection con;
    private String csvFileName;
    private Double dOriginalRate;
    private String dCategory;
    private String csvMessage = "";
    private CsvReader products;
    private double oldSellPrice = 0;
    private double oldBuyPrice = 0;
    private double currentRecord;
    private double rowCount = 0.0;
    private String last_folder;
    private File config_file;
    private static String category_disable_text = "[ USE DEFAULT CATEGORY ]";
    private static String reject_bad_categories_text = "[ REJECT ITEMS WITH BAD CATEGORIES ]";
    private DataLogicSales m_dlSales;
    private DataLogicSystem m_dlSystem;

    protected SaveProvider spr;
    private String productReference;
    private String productBarcode;
    private String productName;
    private String Category;
    private Double productBuyPrice;
    private Double productSellPrice;
    private Double stockSecurity;
    private Double stockMaximum;
    private String stockLocation;
    private SentenceList m_sentcat;
    private ComboBoxValModel m_CategoryModel;
    private SentenceList taxcatsent;
    private ComboBoxValModel taxcatmodel;
    private SentenceList taxsent;
    private TaxesLogic taxeslogic;
    private DocumentListener documentListener;
    private HashMap cat_list = new HashMap();
    private ArrayList badCategories = new ArrayList();
    private ProductInfoExt prodInfo;
    private String recordType = null;
    private int newRecords = 0;
    private int invalidRecords = 0;
    private int priceUpdates = 0;
    private int missingData = 0;
    private int noChanges = 0;
    private int badPrice = 0;
    private double dTaxRate;
    private Integer progress = 0;

    // Addtional Items
    private String buttonText;
    private String remotePrint;
    private String service;
    private String varPrice;
    private String warranty;
    private String textTip;
    private String prop;
    private String aux;
    private String shortName;
    private String isPack;
    private Double packSize;
    private String packOf;

    /**
     * Constructs a new JPanelCSVImport object
     *
     * @param oApp AppView
     */
    public JPanelCSVImport(AppView app) {

        m_App = app;
        m_props = m_App.getProperties();

        initComponents();

        m_dlSales = (DataLogicSales) m_App.getBean("uk.chromis.pos.forms.DataLogicSales");
        m_dlSystem = (DataLogicSystem) m_App.getBean("uk.chromis.pos.forms.DataLogicSystem");

        spr = new SaveProvider(m_dlSales.getProductCatUpdate(), m_dlSales.getProductCatInsert(),
                m_dlSales.getProductCatDelete());

        // Save Last file for later use.
        last_folder = AppConfig.getInstance().getProperty("CSV.last_folder");
        // config_file = m_props.getConfigFile();

        documentListener = new DocumentListener() {
            @Override
            public void changedUpdate(DocumentEvent documentEvent) {
                jHeaderRead.setEnabled(true);
            }

            @Override
            public void insertUpdate(DocumentEvent documentEvent) {
                if (!"".equals(jFileName.getText().trim())) {
                    jHeaderRead.setEnabled(true);
                }
            }

            @Override
            public void removeUpdate(DocumentEvent documentEvent) {
                if (jFileName.getText().trim().equals("")) {
                    jHeaderRead.setEnabled(false);
                }
            }
        };
        jFileName.getDocument().addDocumentListener(documentListener);

    }

    /**
     * Reads the headers from the CSV file and initializes subsequent form
     * fields. This function first reads the headers from the CSVFileName file,
     * then puts them into the header combo boxes and enables the other form
     * inputs.
     *
     * @todo Simplify this method by stripping the file reading and writing
     * functionality out into it's own class. Also make the enabling fields
     * section into it's own function and return the 'Headers' to the calling
     * function to be added there.
     *
     * @param CSVFileName Name of the file (including the path) to open and read
     * CSV data from
     * @throws IOException If there is an issue reading the CSV file
     */
    private void GetheadersFromFile(String CSVFileName) throws IOException {

        File f = new File(CSVFileName);
        if (f.exists()) {
            //products = new CsvReader(CSVFileName);
            products = new CsvReader(new InputStreamReader(new FileInputStream(CSVFileName), "UTF-8"));
            products.setDelimiter(((String) jComboSeparator.getSelectedItem()).charAt(0));
            products.readHeaders();
            // We need a minimum of 5 columns to map all required fields                            
            if (products.getHeaderCount() < 5) {
                JOptionPane.showMessageDialog(null, "Insufficient headers found in file", "Invalid Header Count.",
                        JOptionPane.WARNING_MESSAGE);
                products.close();
                return;
            }
            rowCount = 0.0;
            int i = 0;
            Headers.clear();
            Headers.add("");
            jComboName.addItem("");
            jComboReference.addItem("");
            jComboBarcode.addItem("");
            jComboBuy.addItem("");
            jComboSell.addItem("");
            jComboCategory.addItem("");
            jComboMaximum.addItem("");
            jComboSecurity.addItem("");

            //additional Items Information
            jComboBoxButtonText.addItem("");
            jComboBoxRemotePrint.addItem("");
            jComboBoxService.addItem("");
            jComboBoxVarPrice.addItem("");
            jComboBoxWarranty.addItem("");
            jComboBoxTextTip.addItem("");
            jComboBoxProp.addItem("");
            jComboBoxAux.addItem("");
            jComboBoxShortName.addItem("");
            jComboBoxIspack.addItem("");
            jComboBoxPackSize.addItem("");
            jComboBoxPackOf.addItem("");

            /**
             * @todo Return header list for processing elsewhere
             */
            while (i < products.getHeaderCount()) {
                jComboName.addItem(products.getHeader(i));
                jComboReference.addItem(products.getHeader(i));
                jComboBarcode.addItem(products.getHeader(i));
                jComboBuy.addItem(products.getHeader(i));
                jComboSell.addItem(products.getHeader(i));
                jComboCategory.addItem(products.getHeader(i));
                jComboSecurity.addItem(products.getHeader(i));
                jComboMaximum.addItem(products.getHeader(i));
                Headers.add(products.getHeader(i));

                //additional Items Information
                jComboBoxButtonText.addItem(products.getHeader(i));
                jComboBoxRemotePrint.addItem(products.getHeader(i));
                jComboBoxService.addItem(products.getHeader(i));
                jComboBoxVarPrice.addItem(products.getHeader(i));
                jComboBoxWarranty.addItem(products.getHeader(i));
                jComboBoxTextTip.addItem(products.getHeader(i));
                jComboBoxProp.addItem(products.getHeader(i));
                jComboBoxAux.addItem(products.getHeader(i));
                jComboBoxShortName.addItem(products.getHeader(i));
                jComboBoxIspack.addItem(products.getHeader(i));
                jComboBoxPackSize.addItem(products.getHeader(i));
                jComboBoxPackOf.addItem(products.getHeader(i));

                ++i;
            }

            //enable all the chsck boxes ready for use
            enableCheckBoxes();

            //Count the records found
            while (products.readRecord()) {
                ++rowCount;
            }

            jTextRecords.setText(Integer.toString((int) rowCount));
            // close the file we will open again when required                        
            products.close();

        } else {
            JOptionPane.showMessageDialog(null, "Unable to locate " + CSVFileName, "File not found",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    /**
     * Enables all the selection options on the for to allow the user to
     * interact with the routine.
     *
     */
    private void enableCheckBoxes() {
        jHeaderRead.setEnabled(false);
        jImport.setEnabled(false);
        jComboReference.setEnabled(true);
        jComboName.setEnabled(true);
        jComboBarcode.setEnabled(true);
        jComboBuy.setEnabled(true);
        jComboSell.setEnabled(true);
        jComboCategory.setEnabled(true);
        jComboSecurity.setEnabled(true);
        jComboMaximum.setEnabled(true);
        jComboDefaultCategory.setEnabled(true);
        jComboTax.setEnabled(true);
        jCheckInCatalogue.setEnabled(true);
        jCheckSellIncTax.setEnabled(true);
        jCheckAddStockLevels.setEnabled(true);

        //additional Items Information
        jComboBoxButtonText.setEnabled(true);
        jComboBoxRemotePrint.setEnabled(true);
        jComboBoxService.setEnabled(true);
        jComboBoxVarPrice.setEnabled(true);
        jComboBoxWarranty.setEnabled(true);
        jComboBoxTextTip.setEnabled(true);
        jComboBoxProp.setEnabled(true);
        jComboBoxAux.setEnabled(true);
        jComboBoxShortName.setEnabled(true);
        jComboBoxIspack.setEnabled(true);
        jComboBoxPackSize.setEnabled(true);
        jComboBoxPackOf.setEnabled(true);
    }

    /**
     * Imports the CVS File using specifications from the form.
     *
     * @param CSVFileName Name of the file (including path) to import.
     * @throws IOException If there are file reading issues.
     */
    private class workProcess implements Runnable {

        @Override
        public void run() {
            try {
                ImportCsvFile(jFileName.getText());
            } catch (IOException ex) {
                Logger.getLogger(JPanelCSVImport.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        private void ImportCsvFile(String CSVFileName) throws IOException {

            File f = new File(CSVFileName);
            if (f.exists()) {

                // Read file
                //products = new CsvReader(CSVFileName);
                products = new CsvReader(new InputStreamReader(new FileInputStream(CSVFileName), "UTF-8"));
                products.setDelimiter(((String) jComboSeparator.getSelectedItem()).charAt(0));
                products.readHeaders();

                try {
                    stockLocation = (String) ((Object[]) jParamsLocation.createValue())[1];
                } catch (BasicException ex) {
                    jCheckAddStockLevels.setSelected(false);
                }

                currentRecord = 0;
                while (products.readRecord()) {
                    productReference = products.get((String) jComboReference.getSelectedItem());
                    productName = products.get((String) jComboName.getSelectedItem());
                    productBarcode = products.get((String) jComboBarcode.getSelectedItem());
                    String BuyPrice = products.get((String) jComboBuy.getSelectedItem());
                    String SellPrice = products.get((String) jComboSell.getSelectedItem());
                    Category = products.get((String) jComboCategory.getSelectedItem());
                    String StockSecurity = products.get((String) jComboSecurity.getSelectedItem());
                    String StockMaximum = products.get((String) jComboMaximum.getSelectedItem());
                    //additional items
                    buttonText = products.get((String) jComboBoxButtonText.getSelectedItem());
                    remotePrint = products.get((String) jComboBoxRemotePrint.getSelectedItem());
                    service = products.get((String) jComboBoxService.getSelectedItem());
                    varPrice = products.get((String) jComboBoxVarPrice.getSelectedItem());
                    warranty = products.get((String) jComboBoxWarranty.getSelectedItem());
                    textTip = products.get((String) jComboBoxTextTip.getSelectedItem());
                    prop = products.get((String) jComboBoxProp.getSelectedItem());
                    aux = products.get((String) jComboBoxAux.getSelectedItem());
                    shortName = products.get((String) jComboBoxShortName.getSelectedItem());
                    isPack = products.get((String) jComboBoxIspack.getSelectedItem());
                    String boxPackSize = products.get((String) jComboBoxPackSize.getSelectedItem());
                    packOf = products.get((String) jComboBoxPackOf.getSelectedItem());

                    currentRecord++;

                    progress = ((int) ((currentRecord / rowCount) * 100));

                    // Strip Currency Symbols
                    BuyPrice = StringUtils.replaceChars(BuyPrice, "$", ""); // Remove Dolar, Euro and Pound sign Sign
                    SellPrice = StringUtils.replaceChars(SellPrice, "$", ""); // Remove Dolar, Euro and Pound Sign
                    BuyPrice = StringUtils.replaceChars(BuyPrice, "", ""); // Remove Dolar, Euro and Pound sign Sign
                    SellPrice = StringUtils.replaceChars(SellPrice, "", ""); // Remove Dolar, Euro and Pound Sign
                    BuyPrice = StringUtils.replaceChars(BuyPrice, "", ""); // Remove Dolar, Euro and Pound sign Sign
                    SellPrice = StringUtils.replaceChars(SellPrice, "", ""); // Remove Dolar, Euro and Pound Sign

                    dCategory = getCategory();

                    // set the csvMessage to a default value
                    if ("Bad Category".equals(dCategory)) {
                        csvMessage = "Bad category details";
                    } else {
                        csvMessage = "Missing data or Invalid number";
                    }

                    // Validate and convert the prices or change them to null
                    if (validateNumber(BuyPrice)) {
                        productBuyPrice = Double.parseDouble(BuyPrice);
                    } else {
                        productBuyPrice = null;
                    }

                    if (validateNumber(SellPrice)) {
                        productSellPrice = getSellPrice(SellPrice);
                    } else {
                        productSellPrice = null;
                    }

                    if (validateNumber(StockSecurity)) {
                        stockSecurity = Double.parseDouble(StockSecurity);
                    } else {
                        stockSecurity = null;
                    }

                    if (validateNumber(StockMaximum)) {
                        stockMaximum = Double.parseDouble(StockMaximum);
                    } else {
                        stockMaximum = null;
                    }

                    /**
                     * Check to make sure our entries aren't bad or blank or the
                     * category is not bad
                     *
                     */
                    if ("".equals(productReference) && "".equals(productName) && "".equals(productBarcode)
                            && "".equals(BuyPrice) && "".equals(SellPrice)) {
                        // Ignore blank lines in the import file
                    } else if ("".equals(productReference) | "".equals(productName) | "".equals(productBarcode)
                            | "".equals(BuyPrice) | "".equals(SellPrice) | productBuyPrice == null
                            | productSellPrice == null | "Bad Category".equals(dCategory)) {
                        if (productBuyPrice == null | productSellPrice == null) {
                            badPrice++;
                        } else {
                            missingData++;
                        }
                        createCSVEntry(csvMessage, null, null);
                    } else {
                        // We know that the data passes the basic checks, so get more details about the product
                        recordType = getRecord();
                        switch (recordType) {
                        case "new":
                            createProduct("new");
                            newRecords++;
                            createCSVEntry("New product", null, null);
                            break;
                        case "name error":
                        case "barcode error":
                        case "reference error":
                        case "Duplicate Reference found.":
                        case "Duplicate Barcode found.":
                        case "Duplicate Description found.":
                        case "Exception":
                            invalidRecords++;
                            createCSVEntry(recordType, null, null);
                            break;
                        default:
                            updateRecord(recordType);
                            break;
                        }
                    }
                }
                products.close();
            } else {
                JOptionPane.showMessageDialog(null, "Unable to locate " + CSVFileName, "File not found",
                        JOptionPane.WARNING_MESSAGE);
            }

            // update the record fields on the form
            jTextNew.setText(Integer.toString(newRecords));
            jTextUpdate.setText(Integer.toString(priceUpdates));
            jTextInvalid.setText(Integer.toString(invalidRecords));
            jTextMissing.setText(Integer.toString(missingData));
            jTextNoChange.setText(Integer.toString(noChanges));
            jTextBadPrice.setText(Integer.toString(badPrice));
            if (badCategories.size() == 1 && badCategories.get(0) == "") {
                jTextBadCats.setText("0");
            } else {
                jTextBadCats.setText(Integer.toString(badCategories.size()));
            }
        }
    }

    /**
     * Tests <code>testString</code> for validity as a number
     *
     * @param testString the string to be checked
     * @return <code>True<code> if a real number <code>False<code> if not
     */
    private Boolean validateNumber(String testString) {
        try {
            Double res = Double.parseDouble(testString);
            return (true);
        } catch (NumberFormatException e) {
            return (false);
        }
    }

    /*
     * Get the category to be used for the new product
     * returns category id as string
     */
    private String getCategory() {
        // get the category to be used for the product
        if (jComboCategory.getSelectedItem() != category_disable_text) {
            // get the category ID of the catergory passed
            String cat = (String) cat_list.get(Category);
            // only if we have a valid category 
            if (cat != null) {
                return (cat);
            }
        }

        if (jCreateCat.isSelected()) {
            if (!Category.equals("")) {
                // lets create the category if it does not exist.
                Object[] newcat = new Object[3];
                newcat[0] = UUID.randomUUID().toString();
                newcat[1] = Category;
                newcat[2] = true;

                try {
                    m_dlSales.insertCategory(newcat);
                    cat_list = new HashMap<>();
                    for (Object category : m_sentcat.list()) {
                        m_CategoryModel.setSelectedItem(category);
                        cat_list.put(category.toString(), m_CategoryModel.getSelectedKey().toString());
                    }
                    String cat = (String) cat_list.get(Category);
                    return (cat);
                } catch (BasicException ex) {
                    Logger.getLogger(JPanelCSVImport.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

        if (!badCategories.contains(Category)) {
            badCategories.add(Category.trim()); // Save a list of the bad categories so we can tell the user later
        }
        return ((jComboDefaultCategory.getSelectedItem() == reject_bad_categories_text) ? "Bad Category"
                : (String) cat_list.get(m_CategoryModel.getSelectedText()));
    }

    /**
     * Adjusts the sell price for included taxes if needed and converted to
     * <code>double</code>
     *
     * @param pSellPrice sell price to be converted
     * @return sell price after adjustment for included taxes and converted to
     * <code>double</double>
     */
    private Double getSellPrice(String pSellPrice) {
        // Check if the selling price icludes taxes 
        dTaxRate = taxeslogic.getTaxRate((TaxCategoryInfo) taxcatmodel.getSelectedItem());
        if (jCheckSellIncTax.isSelected()) {
            return ((Double.parseDouble(pSellPrice)) / (1 + dTaxRate));
        } else {
            return (Double.parseDouble(pSellPrice));
        }
    }

    /**
     * Updated the record in the database with the new prices and category if
     * needed.
     *
     * @param pID Unique product id of the record to be updated It then creates
     * an updated record for the product, subject to the prices be different
     *
     */
    private void updateRecord(String pID) {
        prodInfo = new ProductInfoExt();
        try {
            prodInfo = m_dlSales.getProductInfo(pID);
            dOriginalRate = taxeslogic.getTaxRate(prodInfo.getTaxCategoryID());
            dCategory = ((String) cat_list.get(prodInfo.getCategoryID()) == null) ? prodInfo.getCategoryID()
                    : (String) cat_list.get(prodInfo.getCategoryID());
            oldBuyPrice = prodInfo.getPriceBuy();
            oldSellPrice = prodInfo.getPriceSell();
            //  productSellPrice *= (1 + dOriginalRate);
            if ((oldBuyPrice != productBuyPrice) || (oldSellPrice != productSellPrice)) {
                //   createCSVEntry("Updated Price Details", oldBuyPrice, oldSellPrice * (1 + dOriginalRate));
                createCSVEntry("Updated Price Details", oldBuyPrice,
                        (jCheckSellIncTax.isSelected()) ? oldSellPrice * (1 + dOriginalRate) : oldSellPrice);
                createProduct("update");
                priceUpdates++;
            } else {
                noChanges++;
            }
        } catch (BasicException ex) {
            Logger.getLogger(JPanelCSVImport.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Gets the title of the current panel
     *
     * @return The name of the panel
     */
    @Override
    public String getTitle() {
        return AppLocal.getIntString("Menu.CSVImport");
    }

    /**
     * Returns this object
     *
     * @return
     */
    @Override
    public JComponent getComponent() {
        return this;
    }

    /**
     * Loads Location, Tax and category data into their combo boxes.
     *
     * @throws uk.chromis.basic.BasicException
     */
    @Override
    public void activate() throws BasicException {
        // Get tax details and logic
        taxsent = m_dlSales.getTaxList(); //get details taxes table
        taxeslogic = new TaxesLogic(taxsent.list());
        taxcatsent = m_dlSales.getTaxCategoriesList();
        taxcatmodel = new ComboBoxValModel(taxcatsent.list());
        jComboTax.setModel(taxcatmodel);

        // Get categories list
        m_sentcat = m_dlSales.getCategoriesList();
        m_CategoryModel = new ComboBoxValModel(m_sentcat.list());
        m_CategoryModel.add(reject_bad_categories_text);
        jComboDefaultCategory.setModel(m_CategoryModel);

        // Build the cat_list for later use
        cat_list = new HashMap<>();
        for (Object category : m_sentcat.list()) {
            m_CategoryModel.setSelectedItem(category);
            cat_list.put(category.toString(), m_CategoryModel.getSelectedKey().toString());
        }

        // reset the selected to the first in the list
        m_CategoryModel.setSelectedItem(null);
        taxcatmodel.setSelectedFirst();

        // Set the column delimiter
        jComboSeparator.removeAllItems();
        jComboSeparator.addItem(",");
        jComboSeparator.addItem(";");
        jComboSeparator.addItem("~");
        jComboSeparator.addItem("^");
        jComboSeparator.addItem("|");

        jParamsLocation.init(m_App);
        jParamsLocation.activate();
    }

    private void setWorker() {
        progress = 0;
        pb.setStringPainted(true);
        final SwingWorker<Integer, Integer> backgroundWork = new SwingWorker<Integer, Integer>() {
            @Override
            protected final Integer doInBackground() throws Exception {
                while ((progress >= 0) && (progress < 100)) {
                    Thread.sleep(50);
                    this.publish(progress);
                }
                this.publish(100);
                this.done();
                return 100;
            }

            @Override
            protected final void process(final List<Integer> chunks) {
                pb.setValue(chunks.get(0));
                pb.setString("Processed " + progress + "% of import");
            }
        };
        backgroundWork.execute();
    }

    /**
     * Resets all the form fields, update 7.4.14 JDL To fix display error if
     * user does not exit before running next import
     */
    public void resetFields() {
        // Clear the form
        jComboReference.removeAllItems();
        jComboReference.setEnabled(false);
        jComboName.removeAllItems();
        jComboName.setEnabled(false);
        jComboBarcode.removeAllItems();
        jComboBarcode.setEnabled(false);
        jComboBuy.removeAllItems();
        jComboBuy.setEnabled(false);
        jComboSell.removeAllItems();
        jComboSell.setEnabled(false);
        jComboCategory.removeAllItems();
        jComboCategory.setEnabled(false);
        jComboDefaultCategory.setEnabled(false);
        jComboSecurity.removeAllItems();
        jComboSecurity.setEnabled(false);
        jComboMaximum.removeAllItems();
        jComboMaximum.setEnabled(false);
        jComboTax.setEnabled(false);

        //additional Information
        jComboBoxButtonText.setEnabled(false);
        jComboBoxButtonText.removeAllItems();
        jComboBoxRemotePrint.setEnabled(false);
        jComboBoxRemotePrint.removeAllItems();
        jComboBoxService.setEnabled(false);
        jComboBoxService.removeAllItems();
        jComboBoxVarPrice.setEnabled(false);
        jComboBoxVarPrice.removeAllItems();
        jComboBoxWarranty.setEnabled(false);
        jComboBoxWarranty.removeAllItems();
        jComboBoxTextTip.setEnabled(false);
        jComboBoxTextTip.removeAllItems();
        jComboBoxProp.setEnabled(false);
        jComboBoxProp.removeAllItems();
        jComboBoxAux.setEnabled(false);
        jComboBoxAux.removeAllItems();
        jComboBoxShortName.setEnabled(false);
        jComboBoxShortName.removeAllItems();
        jComboBoxIspack.setEnabled(false);
        jComboBoxIspack.removeAllItems();
        jComboBoxPackSize.setEnabled(false);
        jComboBoxPackSize.removeAllItems();
        jComboBoxPackOf.setEnabled(false);
        jComboBoxPackOf.removeAllItems();

        jImport.setEnabled(false);
        jHeaderRead.setEnabled(false);
        jCheckInCatalogue.setSelected(true);
        jCheckInCatalogue.setEnabled(false);
        jCheckSellIncTax.setSelected(false);
        jCheckSellIncTax.setEnabled(false);
        jCheckAddStockLevels.setSelected(false);
        jCheckAddStockLevels.setEnabled(false);
        jCreateCat.setSelected(false);
        jFileName.setText(null);
        csvFileName = "";
        jTextNew.setText("");
        jTextUpdate.setText("");
        jTextInvalid.setText("");
        jTextMissing.setText("");
        jTextNoChange.setText("");
        jTextRecords.setText("");
        jTextBadPrice.setText("");
        jTextBadCats.setText("");
        Headers.clear();
        newRecords = 0;
        invalidRecords = 0;
        priceUpdates = 0;
        missingData = 0;
        noChanges = 0;
        badPrice = 0;
    }

    /**
     * Checks the field mappings to ensure all compulsory fields have been
     * completed to allow import to proceed
     */
    public void checkFieldMapping() {
        boolean bStockOK = !jCheckAddStockLevels.isSelected();

        if (!bStockOK) {
            if (jComboSecurity.getSelectedItem() != "" && jComboMaximum.getSelectedItem() != "") {
                bStockOK = true;
            }
        }

        if (bStockOK && jComboReference.getSelectedItem() != "" && jComboName.getSelectedItem() != ""
                && jComboBarcode.getSelectedItem() != "" && jComboBuy.getSelectedItem() != ""
                && jComboSell.getSelectedItem() != "" && jComboCategory.getSelectedItem() != ""
                && m_CategoryModel.getSelectedText() != null) {
            jImport.setEnabled(true);
        } else {
            jImport.setEnabled(false);
        }
    }

    /**
     * Deactivates and resets all form fields.
     *
     * @return
     */
    @Override
    public boolean deactivate() {
        resetFields();
        progress = -1;
        return (true);
    }

    public void createLocationStock(String ProductID, String LocationID, Double security, Double maximum)
            throws BasicException {

        // This should only be called on new products - we dont support updates to stock levels
        Object[] values = new Object[5];
        values[0] = UUID.randomUUID().toString(); // ID string
        values[1] = LocationID; // Reference string
        values[2] = ProductID; // Barcode String        
        values[3] = (double) security; // Name string        
        values[4] = (double) maximum; // IScomment flag (Attribute modifier)

        PreparedSentence sentence = new PreparedSentence(m_App.getSession(),
                "INSERT INTO STOCKLEVEL (ID, LOCATION, PRODUCT, STOCKSECURITY, STOCKMAXIMUM) VALUES (?, ?, ?, ?, ?)",
                new SerializerWriteBasicExt(
                        (new Datas[] { Datas.STRING, Datas.STRING, Datas.STRING, Datas.DOUBLE, Datas.DOUBLE }),
                        new int[] { 0, 1, 2, 3, 4 }));

        sentence.exec(values);

    }

    public void updateLocationStock(String ProductID, String LocationID, Double security, Double maximum)
            throws BasicException {

        // This should only be called on new products - we dont support updates to stock levels
        Object[] values = new Object[4];
        values[0] = (double) security; // Name string        
        values[1] = (double) maximum; // IScomment flag (Attribute modifier)
        values[2] = ProductID; // Barcode String        
        values[3] = LocationID; // Reference string

        PreparedSentence sentence = new PreparedSentence(m_App.getSession(),
                "UPDATE STOCKLEVEL SET STOCKSECURITY = ?, STOCKMAXIMUM = ? WHERE PRODUCT = ? AND LOCATION = ?",
                new SerializerWriteBasicExt(
                        (new Datas[] { Datas.DOUBLE, Datas.DOUBLE, Datas.STRING, Datas.STRING }),
                        new int[] { 0, 1, 2, 3 }));

        sentence.exec(values);

    }

    /**
     *
     * @return
     */
    public Boolean isExistingLocationStock(String ProductID, String LocationID) throws BasicException {
        Boolean bExists = false;

        // This should only be called on new products - we dont support updates to stock levels
        Object[] values = new Object[2];
        values[0] = ProductID; // Barcode String        
        values[1] = LocationID; // Reference string

        PreparedSentence sentence = new PreparedSentence(m_App.getSession(),
                "SELECT * FROM STOCKLEVEL WHERE PRODUCT = ? AND LOCATION = ?",
                new SerializerWriteBasicExt((new Datas[] { Datas.STRING, Datas.STRING }), new int[] { 0, 1 }));

        DataResultSet results = sentence.openExec(values);

        if (results.next()) {
            bExists = true;
        }

        return bExists;
    }

    public void UpdateOrCreateLocationStock(String ProductID, String LocationID, Double security, Double maximum)
            throws BasicException {

        if (isExistingLocationStock(ProductID, LocationID)) {
            updateLocationStock(ProductID, LocationID, security, maximum);
        } else {
            createLocationStock(ProductID, LocationID, security, maximum);
        }
    }

    /**
     *
     * @param pType
     */
    public void createProduct(String pType) {
        // create a new product and save it using DalaLogicSales
        Object propBlob;
        try {
            if (prop.isEmpty()) {
                propBlob = null;
            } else {
                propBlob = Formats.BYTEA.parseValue(prop);
            }
        } catch (BasicException e) {
            propBlob = null;
        }

        Object[] myprod = new Object[DataLogicSales.FIELD_COUNT];
        myprod[DataLogicSales.INDEX_ID] = UUID.randomUUID().toString(); // ID string
        myprod[DataLogicSales.INDEX_REFERENCE] = productReference; // Reference string
        myprod[DataLogicSales.INDEX_CODE] = productBarcode; // Barcode String
        myprod[DataLogicSales.INDEX_CODETYPE] = BarcodeValidator.BarcodeValidate(productBarcode); // Barcode Type
        myprod[DataLogicSales.INDEX_NAME] = productName; // Name string        
        myprod[DataLogicSales.INDEX_ISCOM] = ((aux != null) && !aux.isEmpty()
                && (aux.equals("1") || aux.equalsIgnoreCase("yes"))); // IScondiment flag (Auxiliary modifier)
        myprod[DataLogicSales.INDEX_ISSCALE] = false; // ISscale flag
        myprod[DataLogicSales.INDEX_PRICEBUY] = productBuyPrice; // Buy price double
        myprod[DataLogicSales.INDEX_PRICESELL] = productSellPrice; // Sell price double
        myprod[DataLogicSales.INDEX_CATEGORY] = dCategory; // Category string
        myprod[DataLogicSales.INDEX_TAXCAT] = taxcatmodel.getSelectedKey(); // Tax string
        myprod[DataLogicSales.INDEX_ATTRIBUTESET_ID] = null; // Attributeset string
        myprod[DataLogicSales.INDEX_IMAGE] = null; // Image
        myprod[DataLogicSales.INDEX_STOCKCOST] = (double) 0; // Stock cost double
        myprod[DataLogicSales.INDEX_STOCKVOLUME] = (double) 0; // Stock volume double
        myprod[DataLogicSales.INDEX_ISCATALOG] = jCheckInCatalogue.isSelected(); // In catalog flag
        myprod[DataLogicSales.INDEX_CATORDER] = null; // catalog order        
        myprod[DataLogicSales.INDEX_ATTRIBUTES] = ((propBlob == null) ? null : propBlob); // Attributes (Product Properites)
        myprod[DataLogicSales.INDEX_ISKITCHEN] = ((remotePrint != null) && !remotePrint.isEmpty()
                && (remotePrint.equals("1") || remotePrint.equalsIgnoreCase("yes"))); // IsKitchen flag
        myprod[DataLogicSales.INDEX_ISSERVICE] = ((service != null) && !service.isEmpty()
                && (service.equals("1") || service.equalsIgnoreCase("yes"))); // isService flag
        myprod[DataLogicSales.INDEX_DISPLAY] = ((buttonText != null) && !buttonText.isEmpty()) ? buttonText
                : "<HTML>" + productName; // Button Text     
        myprod[DataLogicSales.INDEX_ISVPRICE] = ((varPrice != null) && !varPrice.isEmpty()
                && (varPrice.equals("1") || varPrice.equalsIgnoreCase("yes"))); // isVariable price flag
        myprod[DataLogicSales.INDEX_ISVERPATRIB] = false; // Compulsory Att flag
        myprod[DataLogicSales.INDEX_TEXTTIP] = ((textTip.isEmpty()) ? productName : textTip); // Text tip string
        myprod[DataLogicSales.INDEX_WARRANTY] = ((warranty != null) && !warranty.isEmpty()
                && (warranty.equals("1") || warranty.equalsIgnoreCase("yes"))); // Warranty flag
        myprod[DataLogicSales.INDEX_STOCKUNITS] = 0.0;
        myprod[DataLogicSales.INDEX_ALIAS] = shortName; // Alias
        myprod[DataLogicSales.INDEX_ALWAYSAVAILABLE] = false; // AlwaysAvailable flag
        myprod[DataLogicSales.INDEX_DISCOUNTED] = "no";
        myprod[DataLogicSales.INDEX_CANDISCOUNT] = false;
        myprod[DataLogicSales.INDEX_ISPACK] = ((isPack != null) && !isPack.isEmpty()
                && (isPack.equals("1") || isPack.equalsIgnoreCase("yes"))); // Is a pack
        myprod[DataLogicSales.INDEX_PACKQUANTITY] = packSize; // PackQuantity
        myprod[DataLogicSales.INDEX_PACKPRODUCT] = (packOf.equals("") ? null : packOf); // Pack Product
        myprod[DataLogicSales.INDEX_PROMOTIONID] = null;
        myprod[DataLogicSales.INDEX_MANAGESTOCK] = true;

        try {
            if ("new".equals(pType)) {
                spr.insertData(myprod);

                if (jCheckAddStockLevels.isSelected()) {
                    createLocationStock(myprod[0].toString(), stockLocation, stockSecurity, stockMaximum);
                }
            } else {
                myprod[0] = prodInfo.getID();
                spr.updateData(myprod);

                if (jCheckAddStockLevels.isSelected()) {
                    UpdateOrCreateLocationStock(myprod[0].toString(), stockLocation, stockSecurity, stockMaximum);
                }
            }

        } catch (BasicException ex) {
            Logger.getLogger(JPanelCSVImport.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     *
     * @param csvError
     * @param PreviousBuy
     * @param previousSell
     */
    public void createCSVEntry(String csvError, Double PreviousBuy, Double previousSell) {
        // create a new csv entry and save it using DataLogicSystem
        Object[] myprod = new Object[11];
        myprod[0] = UUID.randomUUID().toString(); // ID string
        myprod[1] = Integer.toString((int) currentRecord); // Record number
        myprod[2] = csvError; // Error description
        myprod[3] = productReference; // Reference string
        myprod[4] = productBarcode; // Barcode String        
        myprod[5] = productName.replaceAll("\'", ""); // Name string        
        myprod[6] = productBuyPrice; // Buy price
        myprod[7] = productSellPrice; // Sell price
        myprod[8] = PreviousBuy; // Previous Buy price double
        myprod[9] = previousSell; // Previous Sell price double
        myprod[10] = Category;

        try {
            m_dlSystem.execAddCSVEntry(myprod);
        } catch (BasicException ex) {
            Logger.getLogger(JPanelCSVImport.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     *
     * @return
     */
    public String getRecord() {
        // Get record type using using DataLogicSystem
        Object[] myprod = new Object[3];
        myprod[0] = productReference;
        myprod[1] = productBarcode;
        myprod[2] = productName;
        try {
            return (m_dlSystem.getProductRecordType(myprod));
        } catch (BasicException ex) {
            Logger.getLogger(JPanelCSVImport.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "Exception";
    }

    /**
     *
     * Returns true if any entry in the combo boxes is in use
     *
     * @param entry
     * @return
     */
    public boolean isEntryInUse(String entry) {

        return ((entry == jComboCategory.getSelectedItem()) | (entry == jComboReference.getSelectedItem())
                | (entry == jComboName.getSelectedItem()) | (entry == jComboBuy.getSelectedItem())
                | (entry == jComboSell.getSelectedItem()) | (entry == jComboMaximum.getSelectedItem())
                | (entry == jComboSecurity.getSelectedItem()) | (entry == jComboBarcode.getSelectedItem())
                | (entry == jComboBoxButtonText.getSelectedItem())
                | (entry == jComboBoxRemotePrint.getSelectedItem()) | (entry == jComboBoxService.getSelectedItem())
                | (entry == jComboBoxVarPrice.getSelectedItem()) | (entry == jComboBoxWarranty.getSelectedItem())
                | (entry == jComboBoxTextTip.getSelectedItem()) | (entry == jComboBoxProp.getSelectedItem())
                | (entry == jComboBoxAux.getSelectedItem()) | (entry == jComboBoxShortName.getSelectedItem())
                | (entry == jComboBoxIspack.getSelectedItem()) | (entry == jComboBoxPackSize.getSelectedItem())
                | (entry == jComboBoxPackOf.getSelectedItem()));

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jHeader = new javax.swing.JPanel();
        jComboSeparator = new javax.swing.JComboBox();
        jLabel17 = new javax.swing.JLabel();
        jLabel18 = new javax.swing.JLabel();
        jFileChooserPanel = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jFileName = new javax.swing.JTextField();
        jbtnDbDriverLib = new javax.swing.JButton();
        jHeaderRead = new javax.swing.JButton();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel4 = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jComboReference = new javax.swing.JComboBox();
        jComboBarcode = new javax.swing.JComboBox();
        jComboName = new javax.swing.JComboBox();
        jComboBuy = new javax.swing.JComboBox();
        jComboSell = new javax.swing.JComboBox();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        jLabel20 = new javax.swing.JLabel();
        jLabel22 = new javax.swing.JLabel();
        jComboSecurity = new javax.swing.JComboBox();
        jComboBoxShortName = new javax.swing.JComboBox();
        jLabelShortName = new javax.swing.JLabel();
        jComboMaximum = new javax.swing.JComboBox();
        jLabel23 = new javax.swing.JLabel();
        jPanel3 = new javax.swing.JPanel();
        jLabel11 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jComboCategory = new javax.swing.JComboBox();
        jComboDefaultCategory = new javax.swing.JComboBox();
        jComboTax = new javax.swing.JComboBox();
        jCheckAddStockLevels = new eu.hansolo.custom.SteelCheckBox();
        jCheckInCatalogue = new eu.hansolo.custom.SteelCheckBox();
        jCheckSellIncTax = new eu.hansolo.custom.SteelCheckBox();
        jCreateCat = new eu.hansolo.custom.SteelCheckBox();
        jCustom = new javax.swing.JPanel();
        jCustom1 = new javax.swing.JPanel();
        jLabelButtonText = new javax.swing.JLabel();
        jComboBoxButtonText = new javax.swing.JComboBox();
        jLabelWarranty = new javax.swing.JLabel();
        jComboBoxWarranty = new javax.swing.JComboBox();
        jLabelProp = new javax.swing.JLabel();
        jComboBoxProp = new javax.swing.JComboBox();
        jLabelVarPrice = new javax.swing.JLabel();
        jComboBoxVarPrice = new javax.swing.JComboBox();
        jComboBoxIspack = new javax.swing.JComboBox();
        jLabelProp1 = new javax.swing.JLabel();
        jComboBoxPackOf = new javax.swing.JComboBox();
        jLabelProp2 = new javax.swing.JLabel();
        jCustom3 = new javax.swing.JPanel();
        jCustom2 = new javax.swing.JPanel();
        jLabelService = new javax.swing.JLabel();
        jComboBoxService = new javax.swing.JComboBox();
        jLabelAux = new javax.swing.JLabel();
        jComboBoxAux = new javax.swing.JComboBox();
        jLabelRemotePrint = new javax.swing.JLabel();
        jComboBoxRemotePrint = new javax.swing.JComboBox();
        jLabelTextTip = new javax.swing.JLabel();
        jComboBoxTextTip = new javax.swing.JComboBox();
        jComboBoxPackSize = new javax.swing.JComboBox();
        jLabelTextTip1 = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jLabel9 = new javax.swing.JLabel();
        jLabel14 = new javax.swing.JLabel();
        jLabel16 = new javax.swing.JLabel();
        jTextUpdates = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel15 = new javax.swing.JLabel();
        jLabel13 = new javax.swing.JLabel();
        jTextRecords = new javax.swing.JTextField();
        jTextNew = new javax.swing.JTextField();
        jTextInvalid = new javax.swing.JTextField();
        jTextUpdate = new javax.swing.JTextField();
        jTextMissing = new javax.swing.JTextField();
        jTextBadPrice = new javax.swing.JTextField();
        jTextNoChange = new javax.swing.JTextField();
        jLabel19 = new javax.swing.JLabel();
        jTextBadCats = new javax.swing.JTextField();
        jFooter = new javax.swing.JPanel();
        jParamsLocation = new uk.chromis.pos.reports.JParamsLocation();
        jImport = new javax.swing.JButton();
        pb = new javax.swing.JProgressBar();

        setOpaque(false);
        setPreferredSize(new java.awt.Dimension(630, 430));

        jComboSeparator.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jComboSeparator.setPreferredSize(new java.awt.Dimension(50, 30));

        jLabel17.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N

        jLabel18.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("pos_messages"); // NOI18N
        jLabel18.setText(bundle.getString("label.csvdelimit")); // NOI18N
        jLabel18.setPreferredSize(new java.awt.Dimension(100, 30));

        jLabel1.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel1.setText(bundle.getString("label.csvfile")); // NOI18N
        jLabel1.setPreferredSize(new java.awt.Dimension(100, 30));

        jFileName.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jFileName.setPreferredSize(new java.awt.Dimension(275, 30));
        jFileName.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jFileNameActionPerformed(evt);
            }
        });

        jbtnDbDriverLib
                .setIcon(new javax.swing.ImageIcon(getClass().getResource("/uk/chromis/images/fileopen.png"))); // NOI18N
        jbtnDbDriverLib.setMaximumSize(new java.awt.Dimension(64, 32));
        jbtnDbDriverLib.setMinimumSize(new java.awt.Dimension(64, 32));
        jbtnDbDriverLib.setPreferredSize(new java.awt.Dimension(64, 32));
        jbtnDbDriverLib.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnDbDriverLibActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jFileChooserPanelLayout = new javax.swing.GroupLayout(jFileChooserPanel);
        jFileChooserPanel.setLayout(jFileChooserPanelLayout);
        jFileChooserPanelLayout.setHorizontalGroup(jFileChooserPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jFileChooserPanelLayout.createSequentialGroup()
                        .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jFileName, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jbtnDbDriverLib, javax.swing.GroupLayout.PREFERRED_SIZE, 81,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(99, 99, 99)));
        jFileChooserPanelLayout.setVerticalGroup(jFileChooserPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jFileChooserPanelLayout.createSequentialGroup().addGroup(jFileChooserPanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jFileName, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addComponent(jbtnDbDriverLib, javax.swing.GroupLayout.DEFAULT_SIZE,
                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));

        jHeaderRead.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N
        jHeaderRead.setText(bundle.getString("label.csvread")); // NOI18N
        jHeaderRead.setEnabled(false);
        jHeaderRead.setPreferredSize(new java.awt.Dimension(120, 30));
        jHeaderRead.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jHeaderReadActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jHeaderLayout = new javax.swing.GroupLayout(jHeader);
        jHeader.setLayout(jHeaderLayout);
        jHeaderLayout.setHorizontalGroup(
                jHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(
                                javax.swing.GroupLayout.Alignment.TRAILING,
                                jHeaderLayout
                                        .createSequentialGroup()
                                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jLabel17).addContainerGap())
                        .addGroup(jHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(jHeaderLayout.createSequentialGroup().addContainerGap()
                                        .addGroup(jHeaderLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addGroup(jHeaderLayout
                                                        .createSequentialGroup().addGap(4, 4, 4)
                                                        .addComponent(
                                                                jFileChooserPanel,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                                .addGroup(jHeaderLayout.createSequentialGroup()
                                                        .addComponent(jLabel18,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                                        .addComponent(jComboSeparator,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addGap(106, 106, 106).addComponent(jHeaderRead,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)))
                                        .addContainerGap(340, Short.MAX_VALUE))));
        jHeaderLayout.setVerticalGroup(jHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jHeaderLayout.createSequentialGroup()
                        .addComponent(jLabel17, javax.swing.GroupLayout.PREFERRED_SIZE, 0,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 113, Short.MAX_VALUE))
                .addGroup(jHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(jHeaderLayout.createSequentialGroup().addGap(23, 23, 23)
                                .addComponent(jFileChooserPanel, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(jHeaderLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(jComboSeparator, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(jLabel18, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(jHeaderRead, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))));

        jPanel4.setLayout(new javax.swing.BoxLayout(jPanel4, javax.swing.BoxLayout.LINE_AXIS));

        jComboReference.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboReference.setMaximumRowCount(12);
        jComboReference.setEnabled(false);
        jComboReference.setMinimumSize(new java.awt.Dimension(32, 25));
        jComboReference.setPreferredSize(new java.awt.Dimension(100, 30));
        jComboReference.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });

        jComboBarcode.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBarcode.setMaximumRowCount(12);
        jComboBarcode.setEnabled(false);
        jComboBarcode.setMinimumSize(new java.awt.Dimension(32, 25));
        jComboBarcode.setPreferredSize(new java.awt.Dimension(275, 30));
        jComboBarcode.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboItemStateChanged(evt);
            }
        });
        jComboBarcode.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });

        jComboName.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboName.setMaximumRowCount(12);
        jComboName.setEnabled(false);
        jComboName.setMinimumSize(new java.awt.Dimension(32, 25));
        jComboName.setPreferredSize(new java.awt.Dimension(275, 30));
        jComboName.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboItemStateChanged(evt);
            }
        });
        jComboName.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });

        jComboBuy.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBuy.setMaximumRowCount(12);
        jComboBuy.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "" }));
        jComboBuy.setSelectedIndex(-1);
        jComboBuy.setEnabled(false);
        jComboBuy.setMinimumSize(new java.awt.Dimension(32, 25));
        jComboBuy.setPreferredSize(new java.awt.Dimension(275, 30));
        jComboBuy.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboItemStateChanged(evt);
            }
        });
        jComboBuy.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });

        jComboSell.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboSell.setMaximumRowCount(12);
        jComboSell.setEnabled(false);
        jComboSell.setMinimumSize(new java.awt.Dimension(32, 25));
        jComboSell.setPreferredSize(new java.awt.Dimension(275, 30));
        jComboSell.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboItemStateChanged(evt);
            }
        });
        jComboSell.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });

        jLabel3.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel3.setText(bundle.getString("label.prodref")); // NOI18N
        jLabel3.setPreferredSize(new java.awt.Dimension(100, 30));

        jLabel4.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel4.setText(bundle.getString("label.prodbarcode")); // NOI18N
        jLabel4.setPreferredSize(new java.awt.Dimension(100, 30));

        jLabel5.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel5.setText(bundle.getString("label.prodname")); // NOI18N
        jLabel5.setPreferredSize(new java.awt.Dimension(100, 30));

        jLabel10.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel10.setText(bundle.getString("label.prodpricebuy")); // NOI18N
        jLabel10.setPreferredSize(new java.awt.Dimension(100, 30));

        jLabel20.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel20.setText(bundle.getString("label.prodpricesell")); // NOI18N
        jLabel20.setPreferredSize(new java.awt.Dimension(100, 30));

        jLabel22.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel22.setText("Security");

        jComboSecurity.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboSecurity.setMaximumRowCount(12);
        jComboSecurity.setEnabled(false);

        jComboBoxShortName.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxShortName.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxShortName.setSelectedIndex(-1);
        jComboBoxShortName.setEnabled(false);
        jComboBoxShortName.setPreferredSize(new java.awt.Dimension(100, 30));
        jComboBoxShortName.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });

        jLabelShortName.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelShortName.setText(bundle.getString("Label.Alias")); // NOI18N

        jComboMaximum.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboMaximum.setMaximumRowCount(12);
        jComboMaximum.setEnabled(false);

        jLabel23.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel23.setText(bundle.getString("label.maximum")); // NOI18N

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(jPanel1Layout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGroup(
                                        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jLabel22).addComponent(jLabel23))
                                .addGap(53, 53, 53)
                                .addGroup(jPanel1Layout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(jComboMaximum, 0, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                Short.MAX_VALUE)
                                        .addComponent(jComboSecurity, 0, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                Short.MAX_VALUE)))
                        .addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel10, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel20, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabelShortName))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(jPanel1Layout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                        .addComponent(jComboName, javax.swing.GroupLayout.Alignment.LEADING, 0, 1,
                                                Short.MAX_VALUE)
                                        .addComponent(jComboSell, 0, 1, Short.MAX_VALUE)
                                        .addComponent(jComboReference, 0, 191, Short.MAX_VALUE)
                                        .addComponent(jComboBuy, javax.swing.GroupLayout.Alignment.LEADING, 0, 1,
                                                Short.MAX_VALUE)
                                        .addComponent(jComboBarcode, javax.swing.GroupLayout.Alignment.LEADING, 0,
                                                1, Short.MAX_VALUE)
                                        .addComponent(jComboBoxShortName, 0, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                Short.MAX_VALUE))
                                .addGap(0, 0, Short.MAX_VALUE)))
                        .addContainerGap()));
        jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup().addGap(2, 2, 2).addGroup(jPanel1Layout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jComboReference, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jComboBarcode, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jComboName, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jComboBoxShortName, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabelShortName))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jComboBuy, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel10, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jComboSell, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel20, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 62, Short.MAX_VALUE)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jComboSecurity, javax.swing.GroupLayout.PREFERRED_SIZE, 32,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel22, javax.swing.GroupLayout.PREFERRED_SIZE, 26,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jComboMaximum, javax.swing.GroupLayout.PREFERRED_SIZE, 33,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel23, javax.swing.GroupLayout.PREFERRED_SIZE, 26,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(10, 10, 10)));

        jPanel4.add(jPanel1);

        jLabel11.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel11.setText(bundle.getString("label.prodcategory")); // NOI18N
        jLabel11.setPreferredSize(new java.awt.Dimension(100, 30));

        jLabel6.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel6.setText(bundle.getString("label.proddefaultcategory")); // NOI18N
        jLabel6.setPreferredSize(new java.awt.Dimension(100, 30));

        jLabel7.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel7.setText(bundle.getString("label.prodtaxcode")); // NOI18N
        jLabel7.setPreferredSize(new java.awt.Dimension(100, 30));

        jComboCategory.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboCategory.setMaximumRowCount(12);
        jComboCategory.setEnabled(false);
        jComboCategory.setMinimumSize(new java.awt.Dimension(32, 25));
        jComboCategory.setName(""); // NOI18N
        jComboCategory.setPreferredSize(new java.awt.Dimension(275, 30));
        jComboCategory.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jComboCategoryItemStateChanged(evt);
            }
        });
        jComboCategory.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });

        jComboDefaultCategory.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboDefaultCategory.setMaximumRowCount(12);
        jComboDefaultCategory.setEnabled(false);
        jComboDefaultCategory.setMinimumSize(new java.awt.Dimension(32, 25));
        jComboDefaultCategory.setPreferredSize(new java.awt.Dimension(275, 30));
        jComboDefaultCategory.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboDefaultCategoryActionPerformed(evt);
            }
        });

        jComboTax.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboTax.setMaximumRowCount(12);
        jComboTax.setEnabled(false);
        jComboTax.setPreferredSize(new java.awt.Dimension(275, 30));

        jCheckAddStockLevels.setText("Include Stock Levels ?");

        jCheckInCatalogue.setText(bundle.getString("label.prodincatalog")); // NOI18N

        jCheckSellIncTax.setText(bundle.getString("label.csvsellingintax")); // NOI18N

        jCreateCat.setText(bundle.getString("label.createcat")); // NOI18N

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout
                .setHorizontalGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(jPanel3Layout.createSequentialGroup().addGap(113, 113, 113)
                                .addGroup(jPanel3Layout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                        .addComponent(jCheckInCatalogue, javax.swing.GroupLayout.DEFAULT_SIZE, 224,
                                                Short.MAX_VALUE)
                                        .addComponent(
                                                jCheckSellIncTax, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGroup(jPanel3Layout.createSequentialGroup().addGroup(jPanel3Layout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(jPanel3Layout.createSequentialGroup().addContainerGap().addGroup(
                                        jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jLabel11, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addPreferredGap(
                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addGroup(jPanel3Layout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
                                                        false)
                                                .addComponent(jComboDefaultCategory,
                                                        javax.swing.GroupLayout.Alignment.TRAILING, 0, 193,
                                                        Short.MAX_VALUE)
                                                .addComponent(jComboTax, javax.swing.GroupLayout.Alignment.TRAILING,
                                                        0, 1, Short.MAX_VALUE)
                                                .addComponent(jComboCategory, 0, 1, Short.MAX_VALUE)))
                                .addGroup(jPanel3Layout.createSequentialGroup().addGap(114, 114, 114)
                                        .addGroup(jPanel3Layout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jCheckAddStockLevels,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE)
                                                .addComponent(jCreateCat, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                                .addContainerGap()));
        jPanel3Layout.setVerticalGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel3Layout.createSequentialGroup().addContainerGap()
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jComboCategory, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel11, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jComboDefaultCategory, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jComboTax, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 110, Short.MAX_VALUE)
                        .addComponent(jCreateCat, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckAddStockLevels, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckInCatalogue, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckSellIncTax, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(13, 13, 13)));

        jPanel4.add(jPanel3);

        jTabbedPane1.addTab(bundle.getString("label.general"), jPanel4); // NOI18N

        jCustom.setLayout(new javax.swing.BoxLayout(jCustom, javax.swing.BoxLayout.LINE_AXIS));

        jCustom1.setMaximumSize(new java.awt.Dimension(320, 348));
        jCustom1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabelButtonText.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelButtonText.setText("Button Text");
        jCustom1.add(jLabelButtonText, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 73, -1, -1));

        jComboBoxButtonText.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxButtonText.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxButtonText.setSelectedIndex(-1);
        jComboBoxButtonText.setEnabled(false);
        jComboBoxButtonText.setLightWeightPopupEnabled(false);
        jComboBoxButtonText.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxButtonText.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom1.add(jComboBoxButtonText, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 69, 200, -1));

        jLabelWarranty.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelWarranty.setText("Warranty");
        jCustom1.add(jLabelWarranty, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 15, 61, -1));

        jComboBoxWarranty.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxWarranty.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxWarranty.setSelectedIndex(-1);
        jComboBoxWarranty.setEnabled(false);
        jComboBoxWarranty.setMaximumSize(new java.awt.Dimension(200, 23));
        jComboBoxWarranty.setPreferredSize(new java.awt.Dimension(200, 23));
        jComboBoxWarranty.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom1.add(jComboBoxWarranty, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 11, -1, -1));

        jLabelProp.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelProp.setText(bundle.getString("label.prodproperties")); // NOI18N
        jCustom1.add(jLabelProp, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 102, 90, -1));

        jComboBoxProp.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxProp.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxProp.setSelectedIndex(-1);
        jComboBoxProp.setEnabled(false);
        jComboBoxProp.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxProp.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom1.add(jComboBoxProp, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 98, 200, -1));

        jLabelVarPrice.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelVarPrice.setText("Var Price");
        jCustom1.add(jLabelVarPrice, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 44, -1, -1));

        jComboBoxVarPrice.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxVarPrice.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxVarPrice.setSelectedIndex(-1);
        jComboBoxVarPrice.setEnabled(false);
        jComboBoxVarPrice.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxVarPrice.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom1.add(jComboBoxVarPrice, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 40, 200, -1));

        jComboBoxIspack.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxIspack.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxIspack.setSelectedIndex(-1);
        jComboBoxIspack.setEnabled(false);
        jComboBoxIspack.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxIspack.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom1.add(jComboBoxIspack, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 127, 200, -1));

        jLabelProp1.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelProp1.setText(bundle.getString("label.ispack")); // NOI18N
        jCustom1.add(jLabelProp1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 127, 90, 23));

        jComboBoxPackOf.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxPackOf.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxPackOf.setSelectedIndex(-1);
        jComboBoxPackOf.setEnabled(false);
        jComboBoxPackOf.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxPackOf.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom1.add(jComboBoxPackOf, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 156, 200, -1));

        jLabelProp2.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelProp2.setText(bundle.getString("label.productinpack")); // NOI18N
        jCustom1.add(jLabelProp2, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 160, 90, -1));

        jCustom.add(jCustom1);

        javax.swing.GroupLayout jCustom3Layout = new javax.swing.GroupLayout(jCustom3);
        jCustom3.setLayout(jCustom3Layout);
        jCustom3Layout.setHorizontalGroup(jCustom3Layout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 40, Short.MAX_VALUE));
        jCustom3Layout.setVerticalGroup(jCustom3Layout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 355, Short.MAX_VALUE));

        jCustom.add(jCustom3);

        jCustom2.setMaximumSize(new java.awt.Dimension(320, 348));
        jCustom2.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabelService.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelService.setText("Service Item");
        jCustom2.add(jLabelService, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 15, -1, -1));

        jComboBoxService.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxService.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxService.setSelectedIndex(-1);
        jComboBoxService.setEnabled(false);
        jComboBoxService.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxService.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom2.add(jComboBoxService, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 11, 200, -1));

        jLabelAux.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelAux.setText("Aux Product");
        jCustom2.add(jLabelAux, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 44, -1, -1));

        jComboBoxAux.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxAux.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxAux.setSelectedIndex(-1);
        jComboBoxAux.setEnabled(false);
        jComboBoxAux.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxAux.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom2.add(jComboBoxAux, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 40, 200, -1));

        jLabelRemotePrint.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelRemotePrint.setText("Remote Print");
        jCustom2.add(jLabelRemotePrint, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 73, -1, -1));

        jComboBoxRemotePrint.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxRemotePrint.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxRemotePrint.setSelectedIndex(-1);
        jComboBoxRemotePrint.setEnabled(false);
        jComboBoxRemotePrint.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxRemotePrint.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom2.add(jComboBoxRemotePrint, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 69, 200, -1));

        jLabelTextTip.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelTextTip.setText(bundle.getString("label.texttip")); // NOI18N
        jCustom2.add(jLabelTextTip, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 102, -1, -1));

        jComboBoxTextTip.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxTextTip.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxTextTip.setSelectedIndex(-1);
        jComboBoxTextTip.setEnabled(false);
        jComboBoxTextTip.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxTextTip.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom2.add(jComboBoxTextTip, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 98, 200, -1));

        jComboBoxPackSize.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N
        jComboBoxPackSize.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jComboBoxPackSize.setSelectedIndex(-1);
        jComboBoxPackSize.setEnabled(false);
        jComboBoxPackSize.setMaximumSize(new java.awt.Dimension(66, 23));
        jComboBoxPackSize.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jComboBoxFocusGained(evt);
            }
        });
        jCustom2.add(jComboBoxPackSize, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 127, 200, -1));

        jLabelTextTip1.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabelTextTip1.setText(bundle.getString("label.packsof")); // NOI18N
        jCustom2.add(jLabelTextTip1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 127, 96, 23));

        jCustom.add(jCustom2);

        jTabbedPane1.addTab(bundle.getString("label.attributes"), jCustom); // NOI18N

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(
                new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true),
                bundle.getString("title.CSVImport"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
                javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Arial", 1, 12),
                new java.awt.Color(102, 102, 102))); // NOI18N

        jLabel9.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel9.setText(bundle.getString("label.csvrecordsfound")); // NOI18N
        jLabel9.setPreferredSize(new java.awt.Dimension(100, 25));

        jLabel14.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel14.setText(bundle.getString("label.csvnewproducts")); // NOI18N
        jLabel14.setMaximumSize(new java.awt.Dimension(77, 14));
        jLabel14.setMinimumSize(new java.awt.Dimension(77, 14));
        jLabel14.setPreferredSize(new java.awt.Dimension(100, 25));

        jLabel16.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel16.setText(bundle.getString("label.cvsinvalid")); // NOI18N
        jLabel16.setPreferredSize(new java.awt.Dimension(100, 25));

        jTextUpdates.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jTextUpdates.setText(bundle.getString("label.csvpriceupdated")); // NOI18N
        jTextUpdates.setPreferredSize(new java.awt.Dimension(100, 25));

        jLabel2.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel2.setText(bundle.getString("label.csvmissing")); // NOI18N
        jLabel2.setPreferredSize(new java.awt.Dimension(100, 25));

        jLabel15.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel15.setText(bundle.getString("label.csvbad")); // NOI18N
        jLabel15.setPreferredSize(new java.awt.Dimension(100, 25));

        jLabel13.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel13.setText(bundle.getString("label.cvsnotchanged")); // NOI18N
        jLabel13.setPreferredSize(new java.awt.Dimension(100, 25));

        jTextRecords.setBackground(new java.awt.Color(224, 223, 227));
        jTextRecords.setFont(new java.awt.Font("Arial", 1, 11)); // NOI18N
        jTextRecords.setForeground(new java.awt.Color(102, 102, 102));
        jTextRecords.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextRecords.setBorder(null);
        jTextRecords.setDisabledTextColor(new java.awt.Color(0, 0, 0));
        jTextRecords.setEnabled(false);
        jTextRecords.setPreferredSize(new java.awt.Dimension(70, 25));

        jTextNew.setBackground(new java.awt.Color(224, 223, 227));
        jTextNew.setFont(new java.awt.Font("Arial", 1, 11)); // NOI18N
        jTextNew.setForeground(new java.awt.Color(102, 102, 102));
        jTextNew.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextNew.setBorder(null);
        jTextNew.setDisabledTextColor(new java.awt.Color(0, 0, 0));
        jTextNew.setEnabled(false);
        jTextNew.setPreferredSize(new java.awt.Dimension(70, 25));

        jTextInvalid.setBackground(new java.awt.Color(224, 223, 227));
        jTextInvalid.setFont(new java.awt.Font("Arial", 1, 11)); // NOI18N
        jTextInvalid.setForeground(new java.awt.Color(102, 102, 102));
        jTextInvalid.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextInvalid.setBorder(null);
        jTextInvalid.setDisabledTextColor(new java.awt.Color(0, 0, 0));
        jTextInvalid.setEnabled(false);
        jTextInvalid.setPreferredSize(new java.awt.Dimension(70, 25));

        jTextUpdate.setBackground(new java.awt.Color(224, 223, 227));
        jTextUpdate.setFont(new java.awt.Font("Arial", 1, 11)); // NOI18N
        jTextUpdate.setForeground(new java.awt.Color(102, 102, 102));
        jTextUpdate.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextUpdate.setBorder(null);
        jTextUpdate.setDisabledTextColor(new java.awt.Color(0, 0, 0));
        jTextUpdate.setEnabled(false);
        jTextUpdate.setPreferredSize(new java.awt.Dimension(70, 25));

        jTextMissing.setBackground(new java.awt.Color(224, 223, 227));
        jTextMissing.setFont(new java.awt.Font("Arial", 1, 11)); // NOI18N
        jTextMissing.setForeground(new java.awt.Color(102, 102, 102));
        jTextMissing.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextMissing.setBorder(null);
        jTextMissing.setDisabledTextColor(new java.awt.Color(0, 0, 0));
        jTextMissing.setEnabled(false);
        jTextMissing.setPreferredSize(new java.awt.Dimension(70, 25));

        jTextBadPrice.setBackground(new java.awt.Color(224, 223, 227));
        jTextBadPrice.setFont(new java.awt.Font("Arial", 1, 11)); // NOI18N
        jTextBadPrice.setForeground(new java.awt.Color(102, 102, 102));
        jTextBadPrice.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextBadPrice.setBorder(null);
        jTextBadPrice.setDisabledTextColor(new java.awt.Color(0, 0, 0));
        jTextBadPrice.setEnabled(false);
        jTextBadPrice.setPreferredSize(new java.awt.Dimension(70, 25));

        jTextNoChange.setBackground(new java.awt.Color(224, 223, 227));
        jTextNoChange.setFont(new java.awt.Font("Arial", 1, 11)); // NOI18N
        jTextNoChange.setForeground(new java.awt.Color(102, 102, 102));
        jTextNoChange.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextNoChange.setBorder(null);
        jTextNoChange.setDisabledTextColor(new java.awt.Color(0, 0, 0));
        jTextNoChange.setEnabled(false);
        jTextNoChange.setPreferredSize(new java.awt.Dimension(70, 25));

        jLabel19.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
        jLabel19.setText(bundle.getString("label.cvsbadcats")); // NOI18N
        jLabel19.setPreferredSize(new java.awt.Dimension(100, 25));

        jTextBadCats.setBackground(new java.awt.Color(224, 223, 227));
        jTextBadCats.setFont(new java.awt.Font("Arial", 1, 11)); // NOI18N
        jTextBadCats.setForeground(new java.awt.Color(102, 102, 102));
        jTextBadCats.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextBadCats.setBorder(null);
        jTextBadCats.setDisabledTextColor(new java.awt.Color(0, 0, 0));
        jTextBadCats.setEnabled(false);
        jTextBadCats.setPreferredSize(new java.awt.Dimension(70, 25));

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(jPanel2Layout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addGroup(jPanel2Layout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(jPanel2Layout.createSequentialGroup()
                                .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jTextRecords, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(jPanel2Layout.createSequentialGroup()
                                .addGroup(jPanel2Layout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                        .addComponent(jLabel19, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jLabel16, javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jTextUpdates, javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jLabel15, javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jLabel14, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(
                                        jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jTextBadCats, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextNew, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextInvalid, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextUpdate, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextMissing, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextBadPrice, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextNoChange, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE))))
                        .addContainerGap(26, Short.MAX_VALUE)));
        jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel2Layout.createSequentialGroup().addGap(0, 0, 0).addGroup(jPanel2Layout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jTextRecords, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel14, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jTextNew, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel16, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jTextInvalid, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jTextUpdates, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jTextUpdate, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jTextMissing, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel15, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jTextBadPrice, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel13, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jTextNoChange, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel19, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jTextBadCats, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        jImport.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N
        jImport.setText(bundle.getString("label.csvimpostbtn")); // NOI18N
        jImport.setEnabled(false);
        jImport.setPreferredSize(new java.awt.Dimension(120, 30));
        jImport.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jImportActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jFooterLayout = new javax.swing.GroupLayout(jFooter);
        jFooter.setLayout(jFooterLayout);
        jFooterLayout.setHorizontalGroup(jFooterLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jFooterLayout.createSequentialGroup()
                        .addComponent(jParamsLocation, javax.swing.GroupLayout.PREFERRED_SIZE, 361,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 175, Short.MAX_VALUE)
                        .addComponent(jImport, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap()));
        jFooterLayout.setVerticalGroup(jFooterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jFooterLayout.createSequentialGroup()
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(jFooterLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jParamsLocation, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(jFooterLayout.createSequentialGroup().addGap(14, 14, 14).addComponent(
                                        jImport, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)))));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jHeader, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addGroup(layout.createSequentialGroup()
                                        .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 666,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addGroup(layout.createSequentialGroup()
                                        .addGroup(layout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jFooter, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(pb, javax.swing.GroupLayout.PREFERRED_SIZE, 666,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGap(0, 0, Short.MAX_VALUE)))));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addComponent(jHeader, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(pb, javax.swing.GroupLayout.PREFERRED_SIZE, 30,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jFooter, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
    }// </editor-fold>//GEN-END:initComponents

    private void jHeaderReadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jHeaderReadActionPerformed
        try {
            GetheadersFromFile(jFileName.getText());
        } catch (IOException ex) {
            Logger.getLogger(JPanelCSVImport.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_jHeaderReadActionPerformed

    private void jImportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jImportActionPerformed
        // prevent any more key presses
        jImport.setEnabled(false);

        workProcess work = new workProcess();
        Thread thread2 = new Thread(work);
        thread2.start();

    }//GEN-LAST:event_jImportActionPerformed

    private void jFileNameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jFileNameActionPerformed
        jImport.setEnabled(false);
        jHeaderRead.setEnabled(true);
    }//GEN-LAST:event_jFileNameActionPerformed

    private void jbtnDbDriverLibActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnDbDriverLibActionPerformed
        resetFields();
        setWorker();
        // If CSV.last_file is null then use c:\ otherwise use saved dir
        JFileChooser chooser = new JFileChooser(last_folder == null ? "C:\\" : last_folder);
        FileNameExtensionFilter filter = new FileNameExtensionFilter("csv files", "csv");
        chooser.setFileFilter(filter);
        chooser.showOpenDialog(null);
        File csvFile = chooser.getSelectedFile();
        // check if a file was selected        
        if (csvFile == null) {
            return;
        }

        File current_folder = chooser.getCurrentDirectory();
        // If we have a file lets save the directory for later use if it's different from the old
        if (last_folder == null || !last_folder.equals(current_folder.getAbsolutePath())) {
            AppConfig.getInstance().setProperty("CSV.last_folder", current_folder.getAbsolutePath());
            last_folder = current_folder.getAbsolutePath();
            try {
                AppConfig.getInstance().save();
            } catch (IOException ex) {
                Logger.getLogger(JPanelCSVImport.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        String csv = csvFile.getName();
        if (!(csv.trim().equals(""))) {
            csvFileName = csvFile.getAbsolutePath();
            jFileName.setText(csvFileName);
        }
    }//GEN-LAST:event_jbtnDbDriverLibActionPerformed

    private void jComboDefaultCategoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboDefaultCategoryActionPerformed
        checkFieldMapping();
    }//GEN-LAST:event_jComboDefaultCategoryActionPerformed

    private void jComboCategoryItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jComboCategoryItemStateChanged
        // if we have not selected [ USE DEFAULT CATEGORY ] allow the [ REJECT ITEMS WITH BAD CATEGORIES ] to be used in default category combo box
        try {
            if (jComboCategory.getSelectedItem() == "[ USE DEFAULT CATEGORY ]") {
                m_CategoryModel = new ComboBoxValModel(m_sentcat.list());
                jComboDefaultCategory.setModel(m_CategoryModel);
            } else {
                m_CategoryModel = new ComboBoxValModel(m_sentcat.list());
                m_CategoryModel.add(reject_bad_categories_text);
                jComboDefaultCategory.setModel(m_CategoryModel);
            }
        } catch (BasicException ex) {
            Logger.getLogger(JPanelCSVImport.class.getName()).log(Level.SEVERE, null, ex);
        }
        checkFieldMapping();

    }//GEN-LAST:event_jComboCategoryItemStateChanged

    private void jComboBoxFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jComboBoxFocusGained
        JComboBox myJComboBox = ((javax.swing.JComboBox) (evt.getComponent()));
        myJComboBox.removeAllItems();
        int i = 1;
        myJComboBox.addItem("");
        while (i < Headers.size()) {
            if (!isEntryInUse(Headers.get(i))) {
                myJComboBox.addItem(Headers.get(i));
            }
            ++i;
        }
        jComboCategory.addItem(category_disable_text);
    }//GEN-LAST:event_jComboBoxFocusGained

    private void jComboItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jComboItemStateChanged
        checkFieldMapping();
    }//GEN-LAST:event_jComboItemStateChanged

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private eu.hansolo.custom.SteelCheckBox jCheckAddStockLevels;
    private eu.hansolo.custom.SteelCheckBox jCheckInCatalogue;
    private eu.hansolo.custom.SteelCheckBox jCheckSellIncTax;
    private javax.swing.JComboBox jComboBarcode;
    private javax.swing.JComboBox jComboBoxAux;
    private javax.swing.JComboBox jComboBoxButtonText;
    private javax.swing.JComboBox jComboBoxIspack;
    private javax.swing.JComboBox jComboBoxPackOf;
    private javax.swing.JComboBox jComboBoxPackSize;
    private javax.swing.JComboBox jComboBoxProp;
    private javax.swing.JComboBox jComboBoxRemotePrint;
    private javax.swing.JComboBox jComboBoxService;
    private javax.swing.JComboBox jComboBoxShortName;
    private javax.swing.JComboBox jComboBoxTextTip;
    private javax.swing.JComboBox jComboBoxVarPrice;
    private javax.swing.JComboBox jComboBoxWarranty;
    private javax.swing.JComboBox jComboBuy;
    private javax.swing.JComboBox jComboCategory;
    private javax.swing.JComboBox jComboDefaultCategory;
    private javax.swing.JComboBox jComboMaximum;
    private javax.swing.JComboBox jComboName;
    private javax.swing.JComboBox jComboReference;
    private javax.swing.JComboBox jComboSecurity;
    private javax.swing.JComboBox jComboSell;
    private javax.swing.JComboBox jComboSeparator;
    private javax.swing.JComboBox jComboTax;
    private eu.hansolo.custom.SteelCheckBox jCreateCat;
    private javax.swing.JPanel jCustom;
    private javax.swing.JPanel jCustom1;
    private javax.swing.JPanel jCustom2;
    private javax.swing.JPanel jCustom3;
    private javax.swing.JPanel jFileChooserPanel;
    private javax.swing.JTextField jFileName;
    private javax.swing.JPanel jFooter;
    private javax.swing.JPanel jHeader;
    private javax.swing.JButton jHeaderRead;
    private javax.swing.JButton jImport;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel17;
    private javax.swing.JLabel jLabel18;
    private javax.swing.JLabel jLabel19;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel20;
    private javax.swing.JLabel jLabel22;
    private javax.swing.JLabel jLabel23;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JLabel jLabelAux;
    private javax.swing.JLabel jLabelButtonText;
    private javax.swing.JLabel jLabelProp;
    private javax.swing.JLabel jLabelProp1;
    private javax.swing.JLabel jLabelProp2;
    private javax.swing.JLabel jLabelRemotePrint;
    private javax.swing.JLabel jLabelService;
    private javax.swing.JLabel jLabelShortName;
    private javax.swing.JLabel jLabelTextTip;
    private javax.swing.JLabel jLabelTextTip1;
    private javax.swing.JLabel jLabelVarPrice;
    private javax.swing.JLabel jLabelWarranty;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private uk.chromis.pos.reports.JParamsLocation jParamsLocation;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTextField jTextBadCats;
    private javax.swing.JTextField jTextBadPrice;
    private javax.swing.JTextField jTextInvalid;
    private javax.swing.JTextField jTextMissing;
    private javax.swing.JTextField jTextNew;
    private javax.swing.JTextField jTextNoChange;
    private javax.swing.JTextField jTextRecords;
    private javax.swing.JTextField jTextUpdate;
    private javax.swing.JLabel jTextUpdates;
    private javax.swing.JButton jbtnDbDriverLib;
    private javax.swing.JProgressBar pb;
    // End of variables declaration//GEN-END:variables
}