liredemo.LireDemoFrame.java Source code

Java tutorial

Introduction

Here is the source code for liredemo.LireDemoFrame.java

Source

/*
 * This file is part of the LIRE project: http://lire-project.net
 * LIRE 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 2 of the License, or
 * (at your option) any later version.
 *
 * LIRE 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 LIRE; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * We kindly ask you to refer the any or one of the following publications in
 * any publication mentioning or employing Lire:
 *
 * Lux Mathias, Savvas A. Chatzichristofis. Lire: Lucene Image Retrieval 
 * An Extensible Java CBIR Library. In proceedings of the 16th ACM International
 * Conference on Multimedia, pp. 1085-1088, Vancouver, Canada, 2008
 * URL: http://doi.acm.org/10.1145/1459359.1459577
 *
 * Lux Mathias. Content Based Image Retrieval with LIRE. In proceedings of the
 * 19th ACM International Conference on Multimedia, pp. 735-738, Scottsdale,
 * Arizona, USA, 2011
 * URL: http://dl.acm.org/citation.cfm?id=2072432
 *
 * Mathias Lux, Oge Marques. Visual Information Retrieval using Java and LIRE
 * Morgan & Claypool, 2013
 * URL: http://www.morganclaypool.com/doi/abs/10.2200/S00468ED1V01Y201301ICR025
 *
 * Copyright statement:
 * ====================
 * (c) 2002-2013 by Mathias Lux (mathias@juggle.at)
 *  http://www.semanticmetadata.net/lire, http://www.lire-project.net
 *
 * Updated: 29.01.15 09:43
 */

/*
 * LireDemoFrame.java
 *
 * Created on 20th of February 2007, 10:37
 */
package liredemo;

import edu.uniklu.itec.mosaix.ImageFunctions;
import edu.uniklu.itec.mosaix.engine.Engine;
import liredemo.flickr.FlickrIndexingThread;
import net.semanticmetadata.lire.builders.DocumentBuilder;
import net.semanticmetadata.lire.filters.LsaFilter;
import net.semanticmetadata.lire.filters.RerankFilter;
import net.semanticmetadata.lire.imageanalysis.features.global.*;
import net.semanticmetadata.lire.imageanalysis.features.global.joint.JointHistogram;
import net.semanticmetadata.lire.searchers.GenericFastImageSearcher;
import net.semanticmetadata.lire.searchers.ImageSearchHits;
import net.semanticmetadata.lire.searchers.ImageSearcher;
import net.semanticmetadata.lire.utils.ImageUtils;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.FSDirectory;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.*;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URI;
import java.net.URL;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;

import static org.apache.lucene.store.FSDirectory.open;

/**
 * This file is part of the Caliph and Emir project:
 * http://www.SemanticMetadata.net
 *
 * @author Mathias Lux, mathias@juggle.at
 */
public class LireDemoFrame extends javax.swing.JFrame {

    private Color highlightHoverColor = Color.decode("#dddddd");
    private Color highlightSelectColor = Color.decode("#eeeeee");
    private SearchResultsTableModel tableModel = new SearchResultsTableModel();
    private IndexReader browseReader = null;

    /**
     * Creates new form LireDemoFrame
     */
    public LireDemoFrame() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            // UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception e) {
        }
        initComponents();
        try {
            Image icon = ImageIO.read(getClass().getResource("/resources/viewmag16.png"));
            if (icon != null) {
                setIconImage(icon);
            }
        } catch (IOException ex) {
            Logger.getLogger(LireDemoFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
        selectboxDocumentBuilder.setSelectedIndex(5);
        buttonSwitchIndex.setBackground(highlightSelectColor);
        DropTarget t = new DropTarget(searchPanel, new DropTargetListener() {
            public void dragEnter(DropTargetDragEvent dtde) {
            }

            public void dragOver(DropTargetDragEvent dtde) {
            }

            public void dropActionChanged(DropTargetDragEvent dtde) {
            }

            public void dragExit(DropTargetEvent dte) {
            }

            public void drop(DropTargetDropEvent dtde) {
                try {
                    Transferable tr = dtde.getTransferable();
                    DataFlavor[] flavors = tr.getTransferDataFlavors();
                    for (int i = 0; i < flavors.length; i++) {
                        System.out.println("Possible flavor: " + flavors[i].getMimeType());
                        if (flavors[i].isFlavorJavaFileListType()) {
                            dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                            java.util.List list = (java.util.List) tr.getTransferData(flavors[i]);
                            textfieldSearchImage.setText(list.get(0).toString());
                            dtde.dropComplete(true);
                            return;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        // add my custom image panel at the right place ...
        browseImageContainerPanel.add(browseImagePanel, BorderLayout.CENTER);
    }

    /**
     * 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() {

        sameSearchMenu = new javax.swing.JMenu();
        searchMpeg7Descriptors = new javax.swing.JMenuItem();
        searchColorLayout = new javax.swing.JMenuItem();
        searchEdgeHistogram = new javax.swing.JMenuItem();
        searchScalableColor = new javax.swing.JMenuItem();
        searchAutoColorCorrelation = new javax.swing.JMenuItem();
        mosaicButtons = new javax.swing.ButtonGroup();
        browseImagePanel = new liredemo.ImagePanel();
        topPane = new javax.swing.JPanel();
        controlPane = new javax.swing.JPanel();
        switchButtonsPanel = new javax.swing.JPanel();
        jPanel5 = new javax.swing.JPanel();
        buttonSwitchIndex = new javax.swing.JButton();
        buttonSwitchSearch = new javax.swing.JButton();
        buttonSwitchBrowse = new javax.swing.JButton();
        buttonSwitchMosaic = new javax.swing.JButton();
        buttonSwitchOptions = new javax.swing.JButton();
        buttonSwitchAbout = new javax.swing.JButton();
        cardPanel = new javax.swing.JPanel();
        indexPanel = new javax.swing.JPanel();
        textfieldImageDirectoryToIndex = new javax.swing.JTextField();
        buttonOpenDir = new javax.swing.JButton();
        buttonStartIndexing = new javax.swing.JButton();
        progressBarIndexing = new javax.swing.JProgressBar();
        jLabel6 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        checkBoxAddToExisintgIndex = new javax.swing.JCheckBox();
        searchPanel = new javax.swing.JPanel();
        textfieldSearchImage = new javax.swing.JTextField();
        buttonOpenImage = new javax.swing.JButton();
        buttonStartSearch = new javax.swing.JButton();
        progressSearch = new javax.swing.JProgressBar();
        jLabel5 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        browsePanel = new javax.swing.JPanel();
        jLabel10 = new javax.swing.JLabel();
        labelDocCount = new javax.swing.JLabel();
        jLabel11 = new javax.swing.JLabel();
        spinnerCurrentDocNum = new javax.swing.JSpinner();
        buttonSearchFromBrowse = new javax.swing.JButton();
        browseImageContainerPanel = new javax.swing.JPanel();
        mosaicPanel = new javax.swing.JPanel();
        textfieldMosaicImage = new javax.swing.JTextField();
        buttonOpenMosaicImage = new javax.swing.JButton();
        buttonStartMosaicing = new javax.swing.JButton();
        progressMosaic = new javax.swing.JProgressBar();
        labelMosaicTitle = new javax.swing.JLabel();
        mosaicTileCountSlider = new javax.swing.JSlider();
        jLabel12 = new javax.swing.JLabel();
        mosaicImageLable = new javax.swing.JLabel();
        buttonMosaicSave = new javax.swing.JButton();
        jLabel13 = new javax.swing.JLabel();
        mosaicAdvanceOptionsPanel = new javax.swing.JPanel();
        panelMosaicOptionsHidden = new javax.swing.JPanel();
        panelMosaicOptionsShown = new javax.swing.JPanel();
        mosaicOptionsColorLayout = new javax.swing.JRadioButton();
        mosaicOptionsAutocolorcorrelogram = new javax.swing.JRadioButton();
        mosaicOptionsCedd = new javax.swing.JRadioButton();
        checkboxMosaicAdvanceOptions = new javax.swing.JCheckBox();
        labelMosaicSliderValue = new javax.swing.JLabel();
        checkboxAvoidDuplicates = new javax.swing.JCheckBox();
        optionsPanel = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        selectboxDocumentBuilder = new javax.swing.JComboBox();
        jLabel2 = new javax.swing.JLabel();
        textfieldIndexName = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        textfieldNumSearchResults = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        jLabel17 = new javax.swing.JLabel();
        textFieldFlickrDownloadMax = new javax.swing.JTextField();
        jLabel14 = new javax.swing.JLabel();
        selectboxRerankFeature = new javax.swing.JComboBox();
        resultsCardPane = new javax.swing.JPanel();
        resultsPane = new javax.swing.JScrollPane();
        resultsTable = new javax.swing.JTable();
        jPanel2 = new javax.swing.JPanel();
        buttonBackToSearch = new javax.swing.JButton();
        jLabel9 = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        buttonBackToOptions = new javax.swing.JButton();
        jPanel3 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        frameMenu = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        fileMenuExit = new javax.swing.JMenuItem();
        viewMenu = new javax.swing.JMenu();
        vieMenuStartPage = new javax.swing.JMenuItem();
        viewMenuResults = new javax.swing.JMenuItem();
        viewMenuOptions = new javax.swing.JMenuItem();
        devMenu = new javax.swing.JMenu();
        researchMenu = new javax.swing.JMenu();
        accSearch = new javax.swing.JMenuItem();
        ceddSearch = new javax.swing.JMenuItem();
        clSearch = new javax.swing.JMenuItem();
        ehSearch = new javax.swing.JMenuItem();
        fcthSearch = new javax.swing.JMenuItem();
        jcdSearch = new javax.swing.JMenuItem();
        jpegCoeffSearch = new javax.swing.JMenuItem();
        colorhistSearch = new javax.swing.JMenuItem();
        scSearch = new javax.swing.JMenuItem();
        rerankMenu = new javax.swing.JMenu();
        rerankFeature = new javax.swing.JMenuItem();
        rerankLsa = new javax.swing.JMenuItem();
        bovwMenu = new javax.swing.JMenu();
        indexAll = new javax.swing.JMenuItem();
        indexMissing = new javax.swing.JMenuItem();
        helpMenu = new javax.swing.JMenu();
        helpMenuAbout = new javax.swing.JMenuItem();
        helpMenuHomepage = new javax.swing.JMenuItem();
        helpMenuWiki = new javax.swing.JMenuItem();
        helpMenuMailinglist = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        helpMenuDonate = new javax.swing.JMenuItem();

        sameSearchMenu.setText("Search again using ...");

        searchMpeg7Descriptors.setText("MPEG-7 descripors");
        searchMpeg7Descriptors.setActionCommand("all");
        searchMpeg7Descriptors.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchMpeg7DescriptorsActionPerformed(evt);
            }
        });
        sameSearchMenu.add(searchMpeg7Descriptors);

        searchColorLayout.setText("MPEG-7 color layout");
        searchColorLayout.setActionCommand("cl");
        searchColorLayout.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchMpeg7DescriptorsActionPerformed(evt);
            }
        });
        sameSearchMenu.add(searchColorLayout);

        searchEdgeHistogram.setText("MPEG-7 edge histogram");
        searchEdgeHistogram.setActionCommand("eh");
        searchEdgeHistogram.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchMpeg7DescriptorsActionPerformed(evt);
            }
        });
        sameSearchMenu.add(searchEdgeHistogram);

        searchScalableColor.setText("MPEG-7 scalable color");
        searchScalableColor.setActionCommand("sc");
        searchScalableColor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchMpeg7DescriptorsActionPerformed(evt);
            }
        });
        sameSearchMenu.add(searchScalableColor);

        searchAutoColorCorrelation.setText("Auto color correlogram");
        searchAutoColorCorrelation.setActionCommand("acc");
        searchAutoColorCorrelation.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchMpeg7DescriptorsActionPerformed(evt);
            }
        });
        sameSearchMenu.add(searchAutoColorCorrelation);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("Bundle"); // NOI18N
        setTitle(bundle.getString("liredemo.frame.titel")); // NOI18N
        setIconImages(null);

        topPane.setLayout(new java.awt.CardLayout());

        controlPane.setLayout(new java.awt.BorderLayout());

        switchButtonsPanel.setBackground(new java.awt.Color(255, 255, 255));
        switchButtonsPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        switchButtonsPanel.setLayout(new java.awt.BorderLayout());

        jPanel5.setBackground(new java.awt.Color(255, 255, 255));
        jPanel5.setLayout(new java.awt.GridLayout(1, 0));

        buttonSwitchIndex.setBackground(new java.awt.Color(255, 255, 255));
        buttonSwitchIndex.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/run.png"))); // NOI18N
        buttonSwitchIndex.setText("Index");
        buttonSwitchIndex.setBorderPainted(false);
        buttonSwitchIndex.setFocusPainted(false);
        buttonSwitchIndex.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        buttonSwitchIndex.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        buttonSwitchIndex.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                buttonMouseOver(evt);
            }

            public void mouseExited(java.awt.event.MouseEvent evt) {
                buttonMouseOut(evt);
            }
        });
        buttonSwitchIndex.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonSwitchIndexActionPerformed(evt);
            }
        });
        jPanel5.add(buttonSwitchIndex);

        buttonSwitchSearch.setBackground(new java.awt.Color(255, 255, 255));
        buttonSwitchSearch.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/viewmag.png"))); // NOI18N
        buttonSwitchSearch.setText("Search");
        buttonSwitchSearch.setBorderPainted(false);
        buttonSwitchSearch.setFocusPainted(false);
        buttonSwitchSearch.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        buttonSwitchSearch.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        buttonSwitchSearch.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                buttonMouseOver(evt);
            }

            public void mouseExited(java.awt.event.MouseEvent evt) {
                buttonMouseOut(evt);
            }
        });
        buttonSwitchSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonSwitchIndexActionPerformed(evt);
            }
        });
        jPanel5.add(buttonSwitchSearch);

        buttonSwitchBrowse.setBackground(new java.awt.Color(255, 255, 255));
        buttonSwitchBrowse.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/contents.png"))); // NOI18N
        buttonSwitchBrowse.setText("Browse");
        buttonSwitchBrowse.setBorderPainted(false);
        buttonSwitchBrowse.setFocusPainted(false);
        buttonSwitchBrowse.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        buttonSwitchBrowse.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        buttonSwitchBrowse.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                buttonMouseOver(evt);
            }

            public void mouseExited(java.awt.event.MouseEvent evt) {
                buttonMouseOut(evt);
            }
        });
        buttonSwitchBrowse.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonSwitchIndexActionPerformed(evt);
            }
        });
        jPanel5.add(buttonSwitchBrowse);

        buttonSwitchMosaic.setBackground(new java.awt.Color(254, 254, 254));
        buttonSwitchMosaic.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/paint.png"))); // NOI18N
        buttonSwitchMosaic.setText("Mosaic");
        buttonSwitchMosaic.setBorderPainted(false);
        buttonSwitchMosaic.setFocusPainted(false);
        buttonSwitchMosaic.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        buttonSwitchMosaic.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        buttonSwitchMosaic.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonSwitchIndexActionPerformed(evt);
            }
        });
        jPanel5.add(buttonSwitchMosaic);

        buttonSwitchOptions.setBackground(new java.awt.Color(255, 255, 255));
        buttonSwitchOptions.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/configure.png"))); // NOI18N
        buttonSwitchOptions.setText("Options");
        buttonSwitchOptions.setBorderPainted(false);
        buttonSwitchOptions.setFocusPainted(false);
        buttonSwitchOptions.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        buttonSwitchOptions.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        buttonSwitchOptions.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                buttonMouseOver(evt);
            }

            public void mouseExited(java.awt.event.MouseEvent evt) {
                buttonMouseOut(evt);
            }
        });
        buttonSwitchOptions.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonSwitchIndexActionPerformed(evt);
            }
        });
        jPanel5.add(buttonSwitchOptions);

        buttonSwitchAbout.setBackground(new java.awt.Color(255, 255, 255));
        buttonSwitchAbout.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/help.png"))); // NOI18N
        buttonSwitchAbout.setText("About");
        buttonSwitchAbout.setBorderPainted(false);
        buttonSwitchAbout.setFocusPainted(false);
        buttonSwitchAbout.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        buttonSwitchAbout.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        buttonSwitchAbout.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                buttonMouseOver(evt);
            }

            public void mouseExited(java.awt.event.MouseEvent evt) {
                buttonMouseOut(evt);
            }
        });
        buttonSwitchAbout.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonSwitchIndexActionPerformed(evt);
            }
        });
        jPanel5.add(buttonSwitchAbout);

        switchButtonsPanel.add(jPanel5, java.awt.BorderLayout.WEST);

        controlPane.add(switchButtonsPanel, java.awt.BorderLayout.NORTH);

        cardPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
        cardPanel.setLayout(new java.awt.CardLayout());

        textfieldImageDirectoryToIndex.setEditable(false);
        textfieldImageDirectoryToIndex.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                textfieldIndexDirActionPerformed(evt);
            }
        });

        buttonOpenDir.setText(bundle.getString("button.open.indexdirectory")); // NOI18N
        buttonOpenDir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonOpenDirActionPerformed(evt);
            }
        });

        buttonStartIndexing.setText(bundle.getString("button.start.indexing")); // NOI18N
        buttonStartIndexing.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonStartIndexingActionPerformed(evt);
            }
        });

        progressBarIndexing.setFocusable(false);
        progressBarIndexing.setName(bundle.getString("progressbar.indexing.name")); // NOI18N
        progressBarIndexing.setString(bundle.getString("progressbar.indexing.name")); // NOI18N
        progressBarIndexing.setStringPainted(true);

        jLabel6.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel6.setText("Image Indexing:");

        jLabel8.setText(
                "<html><b>Hints:</b>\n<ul>\n<li> JPEG images in the selected directory and all <i>subdirectories</i> will be indexed.\n<li> If you don't specify a directory and press <i>start</i> photos are downloaded from <i>Flickr</i>.Use options panel to configure how many.\n</ul>");

        checkBoxAddToExisintgIndex.setText("add to existing index");
        checkBoxAddToExisintgIndex.setToolTipText(bundle.getString("index.addToExistingIndex")); // NOI18N
        checkBoxAddToExisintgIndex.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        checkBoxAddToExisintgIndex.setMargin(new java.awt.Insets(0, 0, 0, 0));

        javax.swing.GroupLayout indexPanelLayout = new javax.swing.GroupLayout(indexPanel);
        indexPanel.setLayout(indexPanelLayout);
        indexPanelLayout.setHorizontalGroup(indexPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jLabel6)
                .addGroup(indexPanelLayout.createSequentialGroup().addContainerGap().addGroup(indexPanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel8, javax.swing.GroupLayout.DEFAULT_SIZE, 742, Short.MAX_VALUE)
                        .addComponent(progressBarIndexing, javax.swing.GroupLayout.DEFAULT_SIZE, 742,
                                Short.MAX_VALUE)
                        .addGroup(indexPanelLayout.createSequentialGroup()
                                .addComponent(textfieldImageDirectoryToIndex, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        629, Short.MAX_VALUE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(buttonOpenDir, javax.swing.GroupLayout.PREFERRED_SIZE, 107,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                indexPanelLayout.createSequentialGroup().addComponent(checkBoxAddToExisintgIndex)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(buttonStartIndexing, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                108, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addContainerGap()));
        indexPanelLayout.setVerticalGroup(indexPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(indexPanelLayout.createSequentialGroup().addComponent(jLabel6)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(indexPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(buttonOpenDir).addComponent(textfieldImageDirectoryToIndex,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(progressBarIndexing, javax.swing.GroupLayout.PREFERRED_SIZE, 17,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(indexPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(buttonStartIndexing, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(checkBoxAddToExisintgIndex))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(288, 288, 288)));

        cardPanel.add(indexPanel, "card3");

        textfieldSearchImage.setEditable(false);
        textfieldSearchImage.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                textfieldSearchImageActionPerformed(evt);
            }
        });

        buttonOpenImage.setText(bundle.getString("button.open.searchimage")); // NOI18N
        buttonOpenImage.setActionCommand(bundle.getString("openImageButton")); // NOI18N
        buttonOpenImage.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonOpenImageActionPerformed(evt);
            }
        });

        buttonStartSearch.setText(bundle.getString("button.start.search")); // NOI18N
        buttonStartSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonStartSearchActionPerformed(evt);
            }
        });

        progressSearch.setString("Search state ...");
        progressSearch.setStringPainted(true);

        jLabel5.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel5.setText("Search for digital images:");

        jLabel7.setText(
                "<html>\n<b>Hints:</b>\n<ul>\n<li> Note that a double click on a row within the search results starts a new search for the clicked image.\n<li>Use Drag'n'Drop to select query image from file explorer\n</ul>\n</html>");

        javax.swing.GroupLayout searchPanelLayout = new javax.swing.GroupLayout(searchPanel);
        searchPanel.setLayout(searchPanelLayout);
        searchPanelLayout.setHorizontalGroup(searchPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jLabel5)
                .addGroup(searchPanelLayout.createSequentialGroup().addContainerGap().addGroup(searchPanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(progressSearch, javax.swing.GroupLayout.DEFAULT_SIZE, 742, Short.MAX_VALUE)
                        .addGroup(searchPanelLayout.createSequentialGroup()
                                .addComponent(textfieldSearchImage, javax.swing.GroupLayout.DEFAULT_SIZE, 631,
                                        Short.MAX_VALUE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(buttonOpenImage))
                        .addComponent(buttonStartSearch, javax.swing.GroupLayout.Alignment.TRAILING,
                                javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(searchPanelLayout.createSequentialGroup()
                                .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(0, 212, Short.MAX_VALUE)))
                        .addContainerGap()));
        searchPanelLayout.setVerticalGroup(searchPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(searchPanelLayout.createSequentialGroup().addComponent(jLabel5)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(textfieldSearchImage, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(buttonOpenImage))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(progressSearch, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(buttonStartSearch)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(288, Short.MAX_VALUE)));

        cardPanel.add(searchPanel, "card2");

        jLabel10.setText("Current document");

        labelDocCount.setText("(out of 100)");

        jLabel11.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel11.setText("Browse Index:");

        spinnerCurrentDocNum.setValue(1);
        spinnerCurrentDocNum.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                spinnerCurrentDocNumStateChanged(evt);
            }
        });

        buttonSearchFromBrowse.setText("Search");
        buttonSearchFromBrowse.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonSearchFromBrowseActionPerformed(evt);
            }
        });

        browseImageContainerPanel.setLayout(new java.awt.BorderLayout());

        javax.swing.GroupLayout browsePanelLayout = new javax.swing.GroupLayout(browsePanel);
        browsePanel.setLayout(browsePanelLayout);
        browsePanelLayout.setHorizontalGroup(browsePanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(browsePanelLayout.createSequentialGroup().addGroup(browsePanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jLabel11)
                        .addGroup(browsePanelLayout.createSequentialGroup().addContainerGap().addComponent(jLabel10)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(labelDocCount)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(spinnerCurrentDocNum, javax.swing.GroupLayout.PREFERRED_SIZE, 75,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18).addComponent(buttonSearchFromBrowse)))
                        .addGap(354, 354, 354))
                .addComponent(browseImageContainerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 762,
                        Short.MAX_VALUE));
        browsePanelLayout.setVerticalGroup(browsePanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(browsePanelLayout.createSequentialGroup().addComponent(jLabel11)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(browsePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel10)
                                .addComponent(spinnerCurrentDocNum, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(buttonSearchFromBrowse).addComponent(labelDocCount))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(browseImageContainerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 397,
                                Short.MAX_VALUE)));

        cardPanel.add(browsePanel, "card5");

        textfieldMosaicImage.setEditable(false);

        buttonOpenMosaicImage.setText(bundle.getString("button.open.searchimage")); // NOI18N
        buttonOpenMosaicImage.setToolTipText(bundle.getString("mosaic.openImageButton.tooltip")); // NOI18N
        buttonOpenMosaicImage.setActionCommand(bundle.getString("openImageButton")); // NOI18N
        buttonOpenMosaicImage.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonOpenMosaicImageActionPerformed(evt);
            }
        });

        buttonStartMosaicing.setText(bundle.getString("button.start.search")); // NOI18N
        buttonStartMosaicing.setToolTipText(bundle.getString("mosaic.startButton.tooltip")); // NOI18N
        buttonStartMosaicing.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonStartMosaicingActionPerformed(evt);
            }
        });

        progressMosaic.setToolTipText(bundle.getString("mosaic.progress.tooltip")); // NOI18N
        progressMosaic.setString(bundle.getString("progressbar.mosaic.name")); // NOI18N
        progressMosaic.setStringPainted(true);

        labelMosaicTitle.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        labelMosaicTitle.setText("Select image to create Mosaic:");

        mosaicTileCountSlider.setPaintLabels(true);
        mosaicTileCountSlider.setToolTipText(bundle.getString("mosaic.slider.tooltip")); // NOI18N
        mosaicTileCountSlider.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                mosaicTileCountSliderStateChanged(evt);
            }
        });

        jLabel12.setText("Number of tiles:");
        jLabel12.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);

        mosaicImageLable.setBackground(new java.awt.Color(255, 255, 255));
        mosaicImageLable.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        mosaicImageLable.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        mosaicImageLable.setDoubleBuffered(true);
        mosaicImageLable.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        mosaicImageLable.setMinimumSize(new java.awt.Dimension(260, 260));

        buttonMosaicSave.setText("Save result ....");
        buttonMosaicSave.setToolTipText(bundle.getString("mosaic.saveButton.tooltip")); // NOI18N
        buttonMosaicSave.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonMosaicSaveActionPerformed(evt);
            }
        });

        jLabel13.setFont(new java.awt.Font("DejaVu Sans", 2, 13)); // NOI18N
        jLabel13.setText("Mosaic creation code was contributed by Lukas Esterle & Manuel Warum");

        mosaicAdvanceOptionsPanel.setLayout(new java.awt.CardLayout());

        javax.swing.GroupLayout panelMosaicOptionsHiddenLayout = new javax.swing.GroupLayout(
                panelMosaicOptionsHidden);
        panelMosaicOptionsHidden.setLayout(panelMosaicOptionsHiddenLayout);
        panelMosaicOptionsHiddenLayout.setHorizontalGroup(panelMosaicOptionsHiddenLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 244, Short.MAX_VALUE));
        panelMosaicOptionsHiddenLayout.setVerticalGroup(panelMosaicOptionsHiddenLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 191, Short.MAX_VALUE));

        mosaicAdvanceOptionsPanel.add(panelMosaicOptionsHidden, "card2");

        mosaicButtons.add(mosaicOptionsColorLayout);
        mosaicOptionsColorLayout.setText("MPEG-7 features");
        mosaicOptionsColorLayout.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mosaicOptionsColorLayoutActionPerformed(evt);
            }
        });

        mosaicButtons.add(mosaicOptionsAutocolorcorrelogram);
        mosaicOptionsAutocolorcorrelogram.setText("AutoColorCorrelogram");

        mosaicButtons.add(mosaicOptionsCedd);
        mosaicOptionsCedd.setSelected(true);
        mosaicOptionsCedd.setText("CEDD");

        javax.swing.GroupLayout panelMosaicOptionsShownLayout = new javax.swing.GroupLayout(
                panelMosaicOptionsShown);
        panelMosaicOptionsShown.setLayout(panelMosaicOptionsShownLayout);
        panelMosaicOptionsShownLayout.setHorizontalGroup(panelMosaicOptionsShownLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(panelMosaicOptionsShownLayout.createSequentialGroup()
                        .addGroup(panelMosaicOptionsShownLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(panelMosaicOptionsShownLayout.createSequentialGroup().addGap(6, 6, 6)
                                        .addComponent(mosaicOptionsColorLayout))
                                .addGroup(panelMosaicOptionsShownLayout.createSequentialGroup().addContainerGap()
                                        .addComponent(mosaicOptionsAutocolorcorrelogram))
                                .addGroup(panelMosaicOptionsShownLayout.createSequentialGroup().addContainerGap()
                                        .addComponent(mosaicOptionsCedd)))
                        .addContainerGap(105, Short.MAX_VALUE)));
        panelMosaicOptionsShownLayout.setVerticalGroup(
                panelMosaicOptionsShownLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(panelMosaicOptionsShownLayout.createSequentialGroup().addContainerGap()
                                .addComponent(mosaicOptionsColorLayout)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(mosaicOptionsAutocolorcorrelogram)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(mosaicOptionsCedd).addContainerGap(109, Short.MAX_VALUE)));

        mosaicAdvanceOptionsPanel.add(panelMosaicOptionsShown, "card3");

        checkboxMosaicAdvanceOptions.setText("advanced options");
        checkboxMosaicAdvanceOptions.setToolTipText(bundle.getString("mosaic.advancedOptions.tooltip")); // NOI18N
        checkboxMosaicAdvanceOptions.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        checkboxMosaicAdvanceOptions.setMargin(new java.awt.Insets(0, 0, 0, 0));
        checkboxMosaicAdvanceOptions.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                checkboxMosaicAdvanceOptionsActionPerformed(evt);
            }
        });

        labelMosaicSliderValue.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
        labelMosaicSliderValue.setText("50");

        checkboxAvoidDuplicates.setText("avoid duplicates in mosaic");
        checkboxAvoidDuplicates.setToolTipText("This might reduce the 'quality' of the outcome.");
        checkboxAvoidDuplicates.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        checkboxAvoidDuplicates.setMargin(new java.awt.Insets(0, 0, 0, 0));
        checkboxAvoidDuplicates.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                checkboxAvoidDuplicatesStateChanged(evt);
            }
        });

        javax.swing.GroupLayout mosaicPanelLayout = new javax.swing.GroupLayout(mosaicPanel);
        mosaicPanel.setLayout(mosaicPanelLayout);
        mosaicPanelLayout.setHorizontalGroup(mosaicPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(labelMosaicTitle)
                .addGroup(mosaicPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(mosaicPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(mosaicPanelLayout.createSequentialGroup().addGroup(mosaicPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addComponent(mosaicImageLable, javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, 492, Short.MAX_VALUE)
                                        .addComponent(textfieldMosaicImage, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                492, Short.MAX_VALUE))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)))
                        .addGroup(mosaicPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(mosaicPanelLayout.createSequentialGroup().addComponent(jLabel12)
                                        .addGap(18, 18, 18).addComponent(labelMosaicSliderValue,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addComponent(buttonStartMosaicing, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(buttonOpenMosaicImage, javax.swing.GroupLayout.Alignment.TRAILING,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        Short.MAX_VALUE)
                                .addComponent(mosaicTileCountSlider, javax.swing.GroupLayout.Alignment.TRAILING,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        Short.MAX_VALUE)
                                .addComponent(checkboxAvoidDuplicates).addComponent(checkboxMosaicAdvanceOptions)
                                .addComponent(buttonMosaicSave, javax.swing.GroupLayout.Alignment.TRAILING,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        Short.MAX_VALUE)
                                .addComponent(progressMosaic, javax.swing.GroupLayout.Alignment.TRAILING,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        Short.MAX_VALUE)
                                .addComponent(mosaicAdvanceOptionsPanel, javax.swing.GroupLayout.Alignment.TRAILING,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        Short.MAX_VALUE))
                        .addContainerGap()));
        mosaicPanelLayout.setVerticalGroup(mosaicPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(mosaicPanelLayout.createSequentialGroup().addGroup(mosaicPanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(mosaicPanelLayout.createSequentialGroup().addComponent(labelMosaicTitle)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(textfieldMosaicImage, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(mosaicImageLable, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGroup(mosaicPanelLayout.createSequentialGroup().addGap(28, 28, 28)
                                .addComponent(buttonOpenMosaicImage).addGap(12, 12, 12)
                                .addGroup(mosaicPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(jLabel12).addComponent(labelMosaicSliderValue))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(mosaicTileCountSlider, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(buttonStartMosaicing)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(progressMosaic, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(checkboxAvoidDuplicates)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(checkboxMosaicAdvanceOptions)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(mosaicAdvanceOptionsPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(buttonMosaicSave)))
                        .addGap(6, 6, 6).addComponent(jLabel13)));

        cardPanel.add(mosaicPanel, "card2");

        jLabel1.setText("Type of IndexSearcher:");

        selectboxDocumentBuilder.setModel(new javax.swing.DefaultComboBoxModel(
                new String[] { "Color Layout (MPEG-7)", "Scalable Color (MPEG-7)", "Edge Histogram (MPEG-7)",
                        "Auto Color Correlogram", "CEDD", "FCTH", "JCD", "RGB Color Histogram",
                        "Tamura Texture Features", "GaborTexture Features", "JPEG Coefficients Histogram",
                        "SURF BoVW", "Joint Histogram", "Opponent Histogram", "Luminance Layout", "PHOG" }));
        selectboxDocumentBuilder.setToolTipText(bundle.getString("options.tooltip.documentbuilderselection")); // NOI18N
        selectboxDocumentBuilder.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                selectboxDocumentBuilderActionPerformed(evt);
            }
        });

        jLabel2.setText("Use index directory:");

        textfieldIndexName.setText("index");
        textfieldIndexName.setToolTipText(bundle.getString("options.tooltip.indexname")); // NOI18N

        jLabel3.setText("Number of search results:");

        textfieldNumSearchResults.setText("12");
        textfieldNumSearchResults.setToolTipText(bundle.getString("options.tooltip.numsearchresults")); // NOI18N

        jLabel4.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel4.setText("Options:");

        jLabel17.setText("Flickr download maximum:");

        textFieldFlickrDownloadMax.setText("100");
        textFieldFlickrDownloadMax.setToolTipText(
                "If no directory to index is given images can be downloaded from Flickr. This is the maximum of images retrieved in one batch.");

        jLabel14.setText("Re-ranking feature:");

        selectboxRerankFeature.setModel(new javax.swing.DefaultComboBoxModel(
                new String[] { "Color Layout (MPEG-7)", "Scalable Color (MPEG-7)", "Edge Histogram (MPEG-7)",
                        "Auto Color Correlogram", "CEDD", "FCTH", "JCD", "RGB Color Histogram",
                        "Tamura Texture Features", "GaborTexture Features", "JPEG Coefficients Histogram",
                        "Joint Histogram", "Opponent Histogram", "Luminance Layout", "PHOG" }));

        javax.swing.GroupLayout optionsPanelLayout = new javax.swing.GroupLayout(optionsPanel);
        optionsPanel.setLayout(optionsPanelLayout);
        optionsPanelLayout.setHorizontalGroup(optionsPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(optionsPanelLayout.createSequentialGroup().addGroup(optionsPanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jLabel4)
                        .addGroup(optionsPanelLayout.createSequentialGroup().addContainerGap()
                                .addGroup(optionsPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(jLabel1).addComponent(jLabel2).addComponent(jLabel3)
                                        .addComponent(jLabel17).addComponent(jLabel14))
                                .addGap(14, 14, 14)
                                .addGroup(optionsPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addComponent(selectboxRerankFeature, 0, 604, Short.MAX_VALUE)
                                        .addComponent(textfieldNumSearchResults,
                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, 604, Short.MAX_VALUE)
                                        .addComponent(selectboxDocumentBuilder,
                                                javax.swing.GroupLayout.Alignment.LEADING, 0, 604, Short.MAX_VALUE)
                                        .addComponent(textfieldIndexName, javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, 604, Short.MAX_VALUE)
                                        .addComponent(textFieldFlickrDownloadMax,
                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, 604, Short.MAX_VALUE))))
                        .addContainerGap()));
        optionsPanelLayout.setVerticalGroup(optionsPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(optionsPanelLayout.createSequentialGroup().addComponent(jLabel4)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(optionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(selectboxDocumentBuilder, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(optionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel2).addComponent(textfieldIndexName,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(optionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(textfieldNumSearchResults, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel3))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(optionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabel17).addComponent(textFieldFlickrDownloadMax,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(optionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(selectboxRerankFeature, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel14))
                        .addContainerGap(307, Short.MAX_VALUE)));

        cardPanel.add(optionsPanel, "card4");

        controlPane.add(cardPanel, java.awt.BorderLayout.CENTER);

        topPane.add(controlPane, "card2");

        resultsCardPane.setLayout(new java.awt.BorderLayout());

        resultsTable.setModel(tableModel);
        resultsTable.setToolTipText(bundle.getString("table.tooltip")); // NOI18N
        resultsTable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                resultsTableMouseClicked(evt);
            }
        });
        resultsPane.setViewportView(resultsTable);

        resultsCardPane.add(resultsPane, java.awt.BorderLayout.CENTER);

        jPanel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
        jPanel2.setLayout(new java.awt.BorderLayout());

        buttonBackToSearch.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/viewmag16.png"))); // NOI18N
        buttonBackToSearch.setToolTipText("Go back to search ...");
        buttonBackToSearch.setBorderPainted(false);
        buttonBackToSearch.setFocusPainted(false);
        buttonBackToSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonBackToSearchActionPerformed(evt);
            }
        });
        jPanel2.add(buttonBackToSearch, java.awt.BorderLayout.EAST);

        jLabel9.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel9.setText("Search Results");
        jLabel9.setComponentPopupMenu(sameSearchMenu.getPopupMenu());
        jPanel2.add(jLabel9, java.awt.BorderLayout.WEST);

        jPanel1.setLayout(new java.awt.BorderLayout());

        buttonBackToOptions
                .setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/configure16.png"))); // NOI18N
        buttonBackToOptions.setToolTipText("Go  to options ...");
        buttonBackToOptions.setBorderPainted(false);
        buttonBackToOptions.setFocusPainted(false);
        buttonBackToOptions.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonBackToOptionsActionPerformed(evt);
            }
        });
        jPanel1.add(buttonBackToOptions, java.awt.BorderLayout.EAST);

        jPanel3.setLayout(new java.awt.BorderLayout());

        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/filter16.png"))); // NOI18N
        jButton1.setToolTipText("Filter search results.");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rerankFeatureActionPerformed(evt);
            }
        });
        jPanel3.add(jButton1, java.awt.BorderLayout.EAST);

        jPanel1.add(jPanel3, java.awt.BorderLayout.CENTER);

        jPanel2.add(jPanel1, java.awt.BorderLayout.CENTER);

        resultsCardPane.add(jPanel2, java.awt.BorderLayout.NORTH);

        topPane.add(resultsCardPane, "card4");

        getContentPane().add(topPane, java.awt.BorderLayout.CENTER);

        fileMenu.setText(bundle.getString("menu.file")); // NOI18N

        fileMenuExit.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X,
                java.awt.event.InputEvent.ALT_MASK));
        fileMenuExit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/cancel16.png"))); // NOI18N
        fileMenuExit.setText(bundle.getString("menu.file.exit")); // NOI18N
        fileMenuExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fileMenuExitActionPerformed(evt);
            }
        });
        fileMenu.add(fileMenuExit);

        frameMenu.add(fileMenu);

        viewMenu.setText("View");

        vieMenuStartPage.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S,
                java.awt.event.InputEvent.ALT_MASK));
        vieMenuStartPage.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/run16.png"))); // NOI18N
        vieMenuStartPage.setText("Start page");
        vieMenuStartPage.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                vieMenuStartPageActionPerformed(evt);
            }
        });
        viewMenu.add(vieMenuStartPage);

        viewMenuResults.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R,
                java.awt.event.InputEvent.ALT_MASK));
        viewMenuResults.setText("Results");
        viewMenuResults.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                viewMenuResultsActionPerformed(evt);
            }
        });
        viewMenu.add(viewMenuResults);

        viewMenuOptions.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O,
                java.awt.event.InputEvent.ALT_MASK));
        viewMenuOptions.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/configure16.png"))); // NOI18N
        viewMenuOptions.setText("Options");
        viewMenuOptions.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                viewMenuOptionsActionPerformed(evt);
            }
        });
        viewMenu.add(viewMenuOptions);

        frameMenu.add(viewMenu);

        devMenu.setText("Developer");

        researchMenu.setText("Re-do search with ...");
        researchMenu.setEnabled(false);

        accSearch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_1,
                java.awt.event.InputEvent.ALT_MASK));
        accSearch.setText("Auto Color Correlogram");
        accSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchWithAcc(evt);
            }
        });
        researchMenu.add(accSearch);

        ceddSearch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_2,
                java.awt.event.InputEvent.ALT_MASK));
        ceddSearch.setText("CEDD");
        ceddSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchWithCedd(evt);
            }
        });
        researchMenu.add(ceddSearch);

        clSearch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_3,
                java.awt.event.InputEvent.ALT_MASK));
        clSearch.setText("Color Layout");
        clSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchWithColorLayout(evt);
            }
        });
        researchMenu.add(clSearch);

        ehSearch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_4,
                java.awt.event.InputEvent.ALT_MASK));
        ehSearch.setText("Edge Histogram");
        ehSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchWithEdgeHistogram(evt);
            }
        });
        researchMenu.add(ehSearch);

        fcthSearch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_5,
                java.awt.event.InputEvent.ALT_MASK));
        fcthSearch.setText("FCTH");
        fcthSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchWithFCTH(evt);
            }
        });
        researchMenu.add(fcthSearch);

        jcdSearch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_6,
                java.awt.event.InputEvent.ALT_MASK));
        jcdSearch.setText("JCD");
        jcdSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchWithJcd(evt);
            }
        });
        researchMenu.add(jcdSearch);

        jpegCoeffSearch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_7,
                java.awt.event.InputEvent.ALT_MASK));
        jpegCoeffSearch.setText("JPEG Coefficient Histogram");
        jpegCoeffSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchWithJpegCoeffs(evt);
            }
        });
        researchMenu.add(jpegCoeffSearch);

        colorhistSearch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_8,
                java.awt.event.InputEvent.ALT_MASK));
        colorhistSearch.setText("RGB Color Histogram");
        colorhistSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchWithColorHist(evt);
            }
        });
        researchMenu.add(colorhistSearch);

        scSearch.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_9,
                java.awt.event.InputEvent.ALT_MASK));
        scSearch.setText("Scalable Color");
        scSearch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchWithScalableColor(evt);
            }
        });
        researchMenu.add(scSearch);

        devMenu.add(researchMenu);

        rerankMenu.setText("Re-rank results ...");

        rerankFeature.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/filter16.png"))); // NOI18N
        rerankFeature.setText("Using a different feature");
        rerankFeature.setEnabled(false);
        rerankFeature.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rerankFeatureActionPerformed(evt);
            }
        });
        rerankMenu.add(rerankFeature);

        rerankLsa.setText("Using Latent Semantic Analysis");
        rerankLsa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rerankLsaActionPerformed(evt);
            }
        });
        rerankMenu.add(rerankLsa);

        devMenu.add(rerankMenu);

        bovwMenu.setText("Bag of visual words");

        indexAll.setText("Index all");
        indexAll.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                indexAllActionPerformed(evt);
            }
        });
        bovwMenu.add(indexAll);

        indexMissing.setText("Index missing");
        indexMissing.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                indexMissingActionPerformed(evt);
            }
        });
        bovwMenu.add(indexMissing);

        devMenu.add(bovwMenu);

        frameMenu.add(devMenu);

        helpMenu.setText(bundle.getString("menu.help")); // NOI18N

        helpMenuAbout.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0));
        helpMenuAbout.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/help16.png"))); // NOI18N
        helpMenuAbout.setText(bundle.getString("menu.help.about")); // NOI18N
        helpMenuAbout.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpMenuAboutActionPerformed(evt);
            }
        });
        helpMenu.add(helpMenuAbout);

        helpMenuHomepage.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/browser16.png"))); // NOI18N
        helpMenuHomepage.setText("Homepage");
        helpMenuHomepage.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpMenuHomepageActionPerformed(evt);
            }
        });
        helpMenu.add(helpMenuHomepage);

        helpMenuWiki.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/editcopy16.png"))); // NOI18N
        helpMenuWiki.setText("Developer Wiki");
        helpMenuWiki.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpMenuWikiActionPerformed(evt);
            }
        });
        helpMenu.add(helpMenuWiki);

        helpMenuMailinglist
                .setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/mail_generic16.png"))); // NOI18N
        helpMenuMailinglist.setText("Mailing List");
        helpMenuMailinglist.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpMenuMailinglistActionPerformed(evt);
            }
        });
        helpMenu.add(helpMenuMailinglist);
        helpMenu.add(jSeparator1);

        helpMenuDonate.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/money16.png"))); // NOI18N
        helpMenuDonate.setText("Donate");
        helpMenuDonate.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpMenuDonateActionPerformed(evt);
            }
        });
        helpMenu.add(helpMenuDonate);

        frameMenu.add(helpMenu);

        setJMenuBar(frameMenu);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void checkboxAvoidDuplicatesStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_checkboxAvoidDuplicatesStateChanged
        // TODO: set / unset in Engine.
        Engine.setAvoidDuplicateTileImages(checkboxAvoidDuplicates.isSelected());
    }//GEN-LAST:event_checkboxAvoidDuplicatesStateChanged

    private void mosaicTileCountSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_mosaicTileCountSliderStateChanged
        labelMosaicSliderValue.setText(mosaicTileCountSlider.getValue() + "");
    }//GEN-LAST:event_mosaicTileCountSliderStateChanged

    private void checkboxMosaicAdvanceOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkboxMosaicAdvanceOptionsActionPerformed
        CardLayout cl = (CardLayout) mosaicAdvanceOptionsPanel.getLayout();
        if (checkboxMosaicAdvanceOptions.isSelected()) {
            cl.last(mosaicAdvanceOptionsPanel);
        } else {
            cl.first(mosaicAdvanceOptionsPanel);
        }
    }//GEN-LAST:event_checkboxMosaicAdvanceOptionsActionPerformed

    private void buttonMosaicSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonMosaicSaveActionPerformed
        try {
            JFileChooser saveIt = new JFileChooser("Save image as PNG ...");
            if (saveIt.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
                javax.imageio.ImageIO.write(javax.imageio.ImageIO.read(new java.io.File("result.png")), "png",
                        new java.io.FileOutputStream(saveIt.getSelectedFile()));
            }
        } catch (IOException ex) {
            Logger.getLogger("global").log(Level.SEVERE, null, ex);
        }

    }//GEN-LAST:event_buttonMosaicSaveActionPerformed

    private void buttonStartMosaicingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartMosaicingActionPerformed
        try {
            if (!DirectoryReader.indexExists(open(Paths.get(textfieldIndexName.getText())))) {
                JOptionPane.showMessageDialog(this,
                        "Did not find existing index!\n" + "Use the \"Index\" function to create a new one.",
                        "Error", JOptionPane.ERROR_MESSAGE);
            } else if (textfieldMosaicImage.getText().length() > 4) {
                mosaicImage();
            } else {
                JOptionPane.showMessageDialog(this,
                        "Please select an image to create mosaic first.\n"
                                + "Use the \"Open image ...\" button to do this.",
                        "Error", JOptionPane.ERROR_MESSAGE);
            }
        } catch (IOException e) {
            e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
        }
    }//GEN-LAST:event_buttonStartMosaicingActionPerformed

    private void buttonOpenMosaicImageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOpenMosaicImageActionPerformed
        JFileChooser jfc = new JFileChooser(".");
        jfc.setDialogTitle("Select image to create mosaic ...");
        FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG, PNG & GIF Images", "jpg", "gif", "png");
        jfc.setFileFilter(filter);
        if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            try {
                textfieldMosaicImage.setText(jfc.getSelectedFile().getCanonicalPath());
                BufferedImage img = ImageIO.read(new java.io.FileInputStream(textfieldMosaicImage.getText()));
                mosaicTileCountSlider.setMinimum(2);
                mosaicTileCountSlider.setValue(Math.min(img.getWidth() / 8, 10));
                mosaicImageLable.setIcon(new ImageIcon(ImageUtils.scaleImage(img, 256)));
            } catch (IOException ex) {
                Logger.getLogger("global").log(Level.SEVERE, null, ex);
            }
        }
    }//GEN-LAST:event_buttonOpenMosaicImageActionPerformed

    private void searchMpeg7DescriptorsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchMpeg7DescriptorsActionPerformed
        String command = evt.getActionCommand();
        if (command.equals("all")) {
            selectboxDocumentBuilder.setSelectedIndex(0);
        } else if (command.equals("eh")) {
            selectboxDocumentBuilder.setSelectedIndex(2);
        } else if (command.equals("sc")) {
            selectboxDocumentBuilder.setSelectedIndex(1);
        } else if (command.equals("cl")) {
            selectboxDocumentBuilder.setSelectedIndex(3);
        } else if (command.equals("acc")) {
            selectboxDocumentBuilder.setSelectedIndex(4);
        }
        // search for document in selected row ...
        int row = 0;
        if (resultsTable.getSelectedRow() > -1) {
            row = resultsTable.getSelectedRow();
        }
        searchForDocument(row);
    }//GEN-LAST:event_searchMpeg7DescriptorsActionPerformed

    private void buttonBackToSearchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonBackToSearchActionPerformed
        ((CardLayout) topPane.getLayout()).first(topPane);
    }//GEN-LAST:event_buttonBackToSearchActionPerformed

    private void viewMenuResultsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewMenuResultsActionPerformed
        ((CardLayout) topPane.getLayout()).last(topPane);
    }//GEN-LAST:event_viewMenuResultsActionPerformed

    private void vieMenuStartPageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vieMenuStartPageActionPerformed
        ((CardLayout) topPane.getLayout()).first(topPane);
    }//GEN-LAST:event_vieMenuStartPageActionPerformed

    private void buttonSwitchIndexActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSwitchIndexActionPerformed
        JButton button = (JButton) evt.getSource();
        if (!button.equals(buttonSwitchAbout)) {
            resetColor();
            button.setBackground(highlightSelectColor);
            CardLayout cl = (CardLayout) cardPanel.getLayout();
            cl.first(cardPanel);
            if (button.equals(buttonSwitchOptions)) {
                cl.last(cardPanel);
            } else if (button.equals(buttonSwitchMosaic)) {
                cl.next(cardPanel);
                cl.next(cardPanel);
                cl.next(cardPanel);
            } else if (button.equals(buttonSwitchBrowse)) {
                cl.next(cardPanel);
                cl.next(cardPanel);
                initReader();
            } else if (button.equals(buttonSwitchSearch)) {
                cl.next(cardPanel);
            }
        } else {
            showAbout();
        }
    }//GEN-LAST:event_buttonSwitchIndexActionPerformed

    private void initReader() {
        try {
            if (browseReader == null) {
                browseReader = DirectoryReader.open(FSDirectory.open(Paths.get(textfieldIndexName.getText())));
            } else {
                browseReader.close();
                browseReader = DirectoryReader.open(FSDirectory.open(Paths.get(textfieldIndexName.getText())));
            }
            labelDocCount.setText("(out of " + browseReader.maxDoc() + "):");
            int docID = ((Integer) spinnerCurrentDocNum.getValue()).intValue() - 1;
            if (!(docID < 0 || docID > browseReader.maxDoc())) {
                setDocumentImageIcon(docID);
            } else {
                if (docID < 0) {
                    spinnerCurrentDocNum.setValue(1);
                } else {
                    spinnerCurrentDocNum.setValue(browseReader.maxDoc());
                }
            }

        } catch (IOException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(this,
                    "Could not open index. Please ensure that an index has been created.", "Error opening index",
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    private void setDocumentImageIcon(int docID) {
        if (docID < 0) {
            return;
        }
        if (docID > browseReader.maxDoc()) {
            return;
        }
        try {
            Document d = browseReader.document(docID);
            BufferedImage img = null;
            String file = d.getField(DocumentBuilder.FIELD_NAME_IDENTIFIER).stringValue();
            if (!file.startsWith("http:")) {
                img = ImageIO.read(new java.io.FileInputStream(file));
            } else {
                img = ImageIO.read(new URL(file));
            }
            browseImagePanel.setImage(img);
            browseImagePanel.repaint();
        } catch (Exception e) {
            JOptionPane.showConfirmDialog(this, "Error loading image:\n" + e.toString(), "An error occurred",
                    JOptionPane.ERROR_MESSAGE);
            System.err.println(e.toString());
        }

    }

    private void resetColor() {
        buttonSwitchIndex.setBackground(Color.white);
        buttonSwitchSearch.setBackground(Color.white);
        buttonSwitchOptions.setBackground(Color.white);
        buttonSwitchBrowse.setBackground(Color.white);
        buttonSwitchMosaic.setBackground(Color.white);
    }

    private void buttonMouseOut(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_buttonMouseOut
        JButton button = (JButton) evt.getSource();
        if (button.getBackground().equals(highlightHoverColor)) {
            button.setBackground(Color.white);
        }
    }//GEN-LAST:event_buttonMouseOut

    private void buttonMouseOver(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_buttonMouseOver
        JButton button = (JButton) evt.getSource();
        if (button.getBackground().equals(Color.white)) {
            button.setBackground(highlightHoverColor);
        }
    }//GEN-LAST:event_buttonMouseOver

    private void resultsTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_resultsTableMouseClicked
        try {
            IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(textfieldIndexName.getText())));
            if (evt.getButton() == MouseEvent.BUTTON3) {
                int imageID = resultsTable.rowAtPoint(evt.getPoint()) * 3
                        + resultsTable.columnAtPoint(evt.getPoint());
                if (imageID >= 0 && imageID < tableModel.getHits().length()) {
                    String file = reader.document(tableModel.getHits().documentID(imageID))
                            .getField(DocumentBuilder.FIELD_NAME_IDENTIFIER).stringValue();

                    try {
                        Desktop.getDesktop().open(new File(file));
                    } catch (IOException ex) {
                        Logger.getLogger(LireDemoFrame.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            if (evt.getClickCount() == 2) {
                searchForDocument(resultsTable.getSelectedRow() * 3 + resultsTable.getSelectedColumn());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }//GEN-LAST:event_resultsTableMouseClicked

    private void searchForDocument(int tableRow) {
        try {
            IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(textfieldIndexName.getText())));
            searchForDocument(reader.document(tableModel.getHits().documentID(tableRow)));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void mosaicImage() {
        final int numTiles = mosaicTileCountSlider.getValue();
        progressMosaic.setString("Running ...");
        enableMosaicControls(false);
        final ProgressMonitor progressMonitor = new ProgressMonitor(progressMosaic);
        Runnable r = new Runnable() {
            public void run() {
                try {
                    float colorhist = 0f;
                    float colordist = 0f;
                    float texture = 0f;
                    if (mosaicOptionsAutocolorcorrelogram.isSelected()) {
                        texture = 1f;
                    } else if (mosaicOptionsCedd.isSelected()) {
                        colorhist = 1f;
                    } else {
                        colordist = 1f;
                    }
                    ImageFunctions iFunc = new ImageFunctions();
                    BufferedImage mosaic = iFunc.getMosaic(
                            javax.imageio.ImageIO.read(new java.io.FileInputStream(textfieldMosaicImage.getText())),
                            new java.awt.Dimension(320, 320), new java.awt.Dimension(numTiles, numTiles), colorhist,
                            colordist, texture, textfieldIndexName.getText(), progressMonitor);
                    mosaicImageLable.setIcon(new ImageIcon(ImageUtils.scaleImage(mosaic,
                            Math.min(mosaicImageLable.getSize().width, mosaicImageLable.getSize().height))));
                    ImageIO.write(mosaic, "png", new FileOutputStream("result.png"));
                    progressMosaic.setString("Finished");
                    enableMosaicControls(true);
                } catch (IOException ex) {
                    Logger.getLogger("global").log(Level.SEVERE, null, ex);
                }
            }
        };
        new Thread(r).start();
    }

    private void enableMosaicControls(boolean enable) {
        buttonOpenMosaicImage.setEnabled(enable);
        buttonStartMosaicing.setEnabled(enable);
        mosaicTileCountSlider.setEnabled(enable);
        buttonMosaicSave.setEnabled(enable);
        checkboxAvoidDuplicates.setEnabled(enable);
        checkboxMosaicAdvanceOptions.setEnabled(enable);
        mosaicOptionsAutocolorcorrelogram.setEnabled(enable);
        mosaicOptionsCedd.setEnabled(enable);
        mosaicOptionsColorLayout.setEnabled(enable);
        //spinnerMosaicOptionCl.setEnabled(enable);
        //spinnerMosaicOptionEh.setEnabled(enable);
        //spinnerMosaicOptionSc.setEnabled(enable);
    }

    private void searchForDocument(Document d) {
        final Document myDoc = d;
        // setting to search panel:
        ((CardLayout) cardPanel.getLayout()).first(cardPanel);
        ((CardLayout) cardPanel.getLayout()).next(cardPanel);
        // switching away from search results ...
        ((CardLayout) topPane.getLayout()).first(topPane);
        resultsTable.setEnabled(false);
        final JPanel frame = topPane;
        Thread t = new Thread() {
            public void run() {
                try {
                    progressSearch.setValue(0);
                    IndexReader reader = DirectoryReader
                            .open(FSDirectory.open(Paths.get(textfieldIndexName.getText())));
                    ImageSearcher searcher = getSearcher();
                    // System.out.println(searcher.getClass().getName() + " " + searcher.toString());
                    progressSearch.setString("Searching for matching images: " + searcher.getClass().getName());
                    ImageSearchHits hits = searcher.search(myDoc, reader);
                    tableModel.setHits(hits, progressSearch, reader);
                    reader.close();
                    // scroll to first row:
                    Rectangle bounds = resultsTable.getCellRect(0, 0, true);
                    resultsPane.getViewport().setViewPosition(bounds.getLocation());
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, "An error occurred while searching: " + e.getMessage()
                            + "\nIf you tried to search for local features (SURF) then please \n"
                            + "make sure you used the menu item Developer -> Bag of Visual Words -> Index All first ",
                            "Error while searching", JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                } finally {
                    resultsTable.setRowHeight(220);
                    // resultsTable.getColumnModel().getColumn(0).setMaxWidth(64);
                    // resultsTable.getColumnModel().getColumn(0).setMinWidth(64);
                    // resultsTable.getColumnModel().getColumn(1).setMaxWidth(150);
                    // resultsTable.getColumnModel().getColumn(1).setMinWidth(150);
                    resultsTable.setShowGrid(false);
                    resultsTable.setTableHeader(null);
                    ((CardLayout) topPane.getLayout()).last(frame);
                    resultsTable.setEnabled(true);
                    // enable the menu for searching & re-ranking using alternative descriptors.
                    researchMenu.setEnabled(true);
                    rerankFeature.setEnabled(true);
                }
            }
        };
        t.start();
    }

    private void buttonStartSearchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartSearchActionPerformed
        if (textfieldSearchImage.getText().length() > 4) {
            try {
                searchForImage(textfieldSearchImage.getText());
            } catch (FileNotFoundException ex) {
                Logger.getLogger("global").log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger("global").log(Level.SEVERE, null, ex);
            }

        } else {
            JOptionPane.showMessageDialog(this,
                    "Please select a query image first.\n" + "Use the \"Open image ...\" button to do this.",
                    "Error", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_buttonStartSearchActionPerformed

    private void buttonStartIndexingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartIndexingActionPerformed
        if (textfieldImageDirectoryToIndex.getText().length() > 1) {
            IndexingThread t = new IndexingThread(this);
            buttonStartIndexing.setEnabled(false);
            t.start();
        } else {
            int result = JOptionPane.showConfirmDialog(this,
                    "You did not specify images to index.\n"
                            + "Should LireDemo download random Flickr images for indexing?.\n"
                            + "Note that this is rather slow an consumes a lot of bandwidth.");
            if (result == JOptionPane.OK_OPTION) {
                FlickrIndexingThread t = new FlickrIndexingThread(this,
                        Integer.parseInt(textFieldFlickrDownloadMax.getText()));
                buttonStartIndexing.setEnabled(false);
                t.start();
            }

            //            JOptionPane.showMessageDialog(this, "Please select a directory to index first.\n" +
            //                    "At least some digital image should be found there.", "Error", JOptionPane.ERROR_MESSAGE);
        }

    }//GEN-LAST:event_buttonStartIndexingActionPerformed

    private void buttonOpenDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOpenDirActionPerformed
        JFileChooser jfc = new JFileChooser(".");
        jfc.setDialogTitle("Select directory to index ...");
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            try {
                textfieldImageDirectoryToIndex.setText(jfc.getSelectedFile().getCanonicalPath());
            } catch (IOException ex) {
                Logger.getLogger("global").log(Level.SEVERE, null, ex);
            }
        }
    }//GEN-LAST:event_buttonOpenDirActionPerformed

    private void helpMenuAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpMenuAboutActionPerformed
        JOptionPane.showMessageDialog(this,
                "<html><center><b>Simple demo for Lucene Image Retrieval (LIRE) library.</b><br>"
                        + "<br>Visit http://lire-project.net for more information.<br>"
                        + "<br>&copy; 2007-2016 by Mathias Lux<br>" + "mathias@juggle.at<br></center></html>",
                "About LIRE demo", JOptionPane.PLAIN_MESSAGE);
    }//GEN-LAST:event_helpMenuAboutActionPerformed

    private void showAbout() {
        JOptionPane.showMessageDialog(this,
                "<html><center><b>Simple demo for<br>Lucene Image Retrieval (LIRE) library.</b><br>"
                        + "<br>Visit http://lire-project.net<br>for more information.<br>"
                        + "<br>&copy; 2007-2016 by Mathias Lux<br>" + "mathias@juggle.at<br></center></html>",
                "About LIRE demo", JOptionPane.PLAIN_MESSAGE);
    }

    private void fileMenuExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileMenuExitActionPerformed
        System.exit(0);
    }//GEN-LAST:event_fileMenuExitActionPerformed

    private void buttonOpenImageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOpenImageActionPerformed
        JFileChooser jfc = new JFileChooser(".");
        jfc.setDialogTitle("Select image to search for ...");
        FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG, PNG & GIF Images", "jpg", "gif", "png");
        jfc.setFileFilter(filter);
        if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            try {
                textfieldSearchImage.setText(jfc.getSelectedFile().getCanonicalPath());
            } catch (IOException ex) {
                Logger.getLogger("global").log(Level.SEVERE, null, ex);
            }
        }
    }//GEN-LAST:event_buttonOpenImageActionPerformed

    private void selectboxDocumentBuilderActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectboxDocumentBuilderActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_selectboxDocumentBuilderActionPerformed

    private void textfieldIndexDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_textfieldIndexDirActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_textfieldIndexDirActionPerformed

    private void mosaicOptionsColorLayoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mosaicOptionsColorLayoutActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_mosaicOptionsColorLayoutActionPerformed

    private void buttonBackToOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonBackToOptionsActionPerformed
        // change to options tab ...
        CardLayout cl = (CardLayout) cardPanel.getLayout();
        cl.first(cardPanel);
        cl.last(cardPanel);
        // hide results ...
        ((CardLayout) topPane.getLayout()).first(topPane);
    }//GEN-LAST:event_buttonBackToOptionsActionPerformed

    private void viewMenuOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewMenuOptionsActionPerformed
        // TODO add your handling code here:
        buttonBackToOptionsActionPerformed(evt);
    }//GEN-LAST:event_viewMenuOptionsActionPerformed

    private void searchWithJcd(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchWithJcd
        selectboxDocumentBuilder.setSelectedIndex(6);
        searchForDocument(0);
    }//GEN-LAST:event_searchWithJcd

    private void searchWithAcc(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchWithAcc
        selectboxDocumentBuilder.setSelectedIndex(3);
        searchForDocument(0);
    }//GEN-LAST:event_searchWithAcc

    private void searchWithCedd(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchWithCedd
        selectboxDocumentBuilder.setSelectedIndex(4);
        searchForDocument(0);
    }//GEN-LAST:event_searchWithCedd

    private void searchWithFCTH(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchWithFCTH
        selectboxDocumentBuilder.setSelectedIndex(5);
        searchForDocument(0);
    }//GEN-LAST:event_searchWithFCTH

    private void searchWithColorHist(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchWithColorHist
        selectboxDocumentBuilder.setSelectedIndex(7);
        searchForDocument(0);
    }//GEN-LAST:event_searchWithColorHist

    private void searchWithColorLayout(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchWithColorLayout
        selectboxDocumentBuilder.setSelectedIndex(0);
        searchForDocument(0);
    }//GEN-LAST:event_searchWithColorLayout

    private void searchWithEdgeHistogram(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchWithEdgeHistogram
        selectboxDocumentBuilder.setSelectedIndex(2);
        searchForDocument(0);
    }//GEN-LAST:event_searchWithEdgeHistogram

    private void searchWithJpegCoeffs(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchWithJpegCoeffs
        selectboxDocumentBuilder.setSelectedIndex(10);
        searchForDocument(0);
    }//GEN-LAST:event_searchWithJpegCoeffs

    private void searchWithScalableColor(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchWithScalableColor
        selectboxDocumentBuilder.setSelectedIndex(1);
        searchForDocument(0);
    }//GEN-LAST:event_searchWithScalableColor

    private void rerankFeatureActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rerankFeatureActionPerformed
        RerankFilter filter = null;
        filter = new RerankFilter(ColorLayout.class, DocumentBuilder.FIELD_NAME_COLORLAYOUT);
        if (selectboxRerankFeature.getSelectedIndex() == 1) { // ScalableColor
            filter = new RerankFilter(ScalableColor.class, DocumentBuilder.FIELD_NAME_SCALABLECOLOR);
        } else if (selectboxRerankFeature.getSelectedIndex() == 2) { // EdgeHistogram
            filter = new RerankFilter(EdgeHistogram.class, DocumentBuilder.FIELD_NAME_EDGEHISTOGRAM);
        } else if (selectboxRerankFeature.getSelectedIndex() == 3) { // ACC
            filter = new RerankFilter(AutoColorCorrelogram.class, DocumentBuilder.FIELD_NAME_AUTOCOLORCORRELOGRAM);
        } else if (selectboxRerankFeature.getSelectedIndex() == 4) { // CEDD
            filter = new RerankFilter(CEDD.class, DocumentBuilder.FIELD_NAME_CEDD);
        } else if (selectboxRerankFeature.getSelectedIndex() == 5) { // FCTH
            filter = new RerankFilter(FCTH.class, DocumentBuilder.FIELD_NAME_FCTH);
        } else if (selectboxRerankFeature.getSelectedIndex() == 6) { // JCD
            filter = new RerankFilter(JCD.class, DocumentBuilder.FIELD_NAME_JCD);
        } else if (selectboxRerankFeature.getSelectedIndex() == 7) { // SimpleColorHistogram
            filter = new RerankFilter(SimpleColorHistogram.class, DocumentBuilder.FIELD_NAME_COLORHISTOGRAM);
        } else if (selectboxRerankFeature.getSelectedIndex() == 8) { // Tamura
            filter = new RerankFilter(Tamura.class, DocumentBuilder.FIELD_NAME_TAMURA);
        } else if (selectboxRerankFeature.getSelectedIndex() == 9) { // Gabor
            filter = new RerankFilter(Gabor.class, DocumentBuilder.FIELD_NAME_GABOR);
        } else if (selectboxRerankFeature.getSelectedIndex() == 10) { // JPEG Coeffs
            filter = new RerankFilter(JpegCoefficientHistogram.class, DocumentBuilder.FIELD_NAME_JPEGCOEFFS);
        } else if (selectboxRerankFeature.getSelectedIndex() == 11) { // Joint Histogram
            filter = new RerankFilter(JointHistogram.class, DocumentBuilder.FIELD_NAME_JOINT_HISTOGRAM);
        } else if (selectboxRerankFeature.getSelectedIndex() == 12) { // OpponentHistogram
            filter = new RerankFilter(OpponentHistogram.class, DocumentBuilder.FIELD_NAME_OPPONENT_HISTOGRAM);
        } else if (selectboxRerankFeature.getSelectedIndex() == 13) { // LuminanceLayout
            filter = new RerankFilter(LuminanceLayout.class, DocumentBuilder.FIELD_NAME_LUMINANCE_LAYOUT);
        } else if (selectboxRerankFeature.getSelectedIndex() >= 14) { // PHOG
            filter = new RerankFilter(PHOG.class, DocumentBuilder.FIELD_NAME_PHOG);
        }
        try {
            IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(textfieldIndexName.getText())));
            tableModel.setHits(
                    filter.filter(tableModel.hits, reader, reader.document(tableModel.hits.documentID(0))), null,
                    reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }//GEN-LAST:event_rerankFeatureActionPerformed

    private void helpMenuHomepageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpMenuHomepageActionPerformed
        try {
            Desktop.getDesktop().browse(new URI("http://lire-project.net"));
        } catch (Exception ex) {
            Logger.getLogger(LireDemoFrame.class.getName()).log(Level.INFO, null, ex);
        }
    }//GEN-LAST:event_helpMenuHomepageActionPerformed

    private void helpMenuWikiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpMenuWikiActionPerformed
        // http://www.semanticmetadata.net/wiki/doku.php?id=start
        try {
            Desktop.getDesktop().browse(new URI("http://www.semanticmetadata.net/wiki/doku.php?id=start"));
        } catch (Exception ex) {
            Logger.getLogger(LireDemoFrame.class.getName()).log(Level.INFO, null, ex);
        }
    }//GEN-LAST:event_helpMenuWikiActionPerformed

    private void helpMenuMailinglistActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpMenuMailinglistActionPerformed
        try {
            Desktop.getDesktop().browse(new URI("http://groups.google.com/group/lire-dev"));
        } catch (Exception ex) {
            Logger.getLogger(LireDemoFrame.class.getName()).log(Level.INFO, null, ex);
        }
    }//GEN-LAST:event_helpMenuMailinglistActionPerformed

    private void helpMenuDonateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpMenuDonateActionPerformed
        try {
            Desktop.getDesktop().browse(new URI("https://sourceforge.net/donate/index.php?group_id=105915"));
        } catch (Exception ex) {
            Logger.getLogger(LireDemoFrame.class.getName()).log(Level.INFO, null, ex);
        }
    }//GEN-LAST:event_helpMenuDonateActionPerformed

    private void rerankLsaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rerankLsaActionPerformed
        LsaFilter filter = null;
        filter = new LsaFilter(ColorLayout.class, DocumentBuilder.FIELD_NAME_COLORLAYOUT);
        if (selectboxDocumentBuilder.getSelectedIndex() == 1) { // ScalableColor
            filter = new LsaFilter(ScalableColor.class, DocumentBuilder.FIELD_NAME_SCALABLECOLOR);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 2) { // EdgeHistogram
            filter = new LsaFilter(EdgeHistogram.class, DocumentBuilder.FIELD_NAME_EDGEHISTOGRAM);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 3) { // ACC
            filter = new LsaFilter(AutoColorCorrelogram.class, DocumentBuilder.FIELD_NAME_AUTOCOLORCORRELOGRAM);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 4) { // CEDD
            filter = new LsaFilter(CEDD.class, DocumentBuilder.FIELD_NAME_CEDD);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 5) { // FCTH
            filter = new LsaFilter(FCTH.class, DocumentBuilder.FIELD_NAME_FCTH);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 6) { // JCD
            filter = new LsaFilter(JCD.class, DocumentBuilder.FIELD_NAME_JCD);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 7) { // SimpleColorHistogram
            filter = new LsaFilter(SimpleColorHistogram.class, DocumentBuilder.FIELD_NAME_COLORHISTOGRAM);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 8) { // Tamura
            filter = new LsaFilter(Tamura.class, DocumentBuilder.FIELD_NAME_TAMURA);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 9) { // Gabor
            filter = new LsaFilter(Gabor.class, DocumentBuilder.FIELD_NAME_GABOR);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 10) { // JPEG Coeffs
            filter = new LsaFilter(JpegCoefficientHistogram.class, DocumentBuilder.FIELD_NAME_JPEGCOEFFS);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 12) { // Joint Histogram
            filter = new LsaFilter(JointHistogram.class, DocumentBuilder.FIELD_NAME_JOINT_HISTOGRAM);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 13) { // OpponentHistogram
            filter = new LsaFilter(OpponentHistogram.class, DocumentBuilder.FIELD_NAME_OPPONENT_HISTOGRAM);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 14) { // LuminanceLayout
            filter = new LsaFilter(LuminanceLayout.class, DocumentBuilder.FIELD_NAME_LUMINANCE_LAYOUT);
        } else if (selectboxDocumentBuilder.getSelectedIndex() >= 15) { // PHOG
            filter = new LsaFilter(PHOG.class, DocumentBuilder.FIELD_NAME_PHOG);
        }
        try {
            IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(textfieldIndexName.getText())));
            tableModel.setHits(
                    filter.filter(tableModel.hits, reader, reader.document(tableModel.hits.documentID(0))), null,
                    reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }//GEN-LAST:event_rerankLsaActionPerformed

    private void indexAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_indexAllActionPerformed
        //        try {
        //            IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(textfieldIndexName.getText())));
        //            int samples = Math.max(1000, reader.numDocs() / 2);
        //            final BOVWBuilder builder = new BOVWBuilder(reader, new SurfFeature(), samples, 500);
        //            builder.setProgressMonitor(new javax.swing.ProgressMonitor(this, "Progress of BoVW indexing (~)", "", 0, 100));
        //            Thread t = new Thread(new Runnable() {
        //                public void run() {
        //                    try {
        //                        builder.index();
        //                    } catch (IOException e) {
        //                        e.printStackTrace();
        //                    }
        //                }
        //            });
        //            t.start();
        //        } catch (IOException e) {
        //            e.printStackTrace();
        //        }
    }//GEN-LAST:event_indexAllActionPerformed

    private void indexMissingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_indexMissingActionPerformed
        //        try {
        //            IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(textfieldIndexName.getText())));
        //            BOVWBuilder builder = new BOVWBuilder(reader, new SurfFeature(), reader.maxDoc() / 10, 2000);
        //            builder.indexMissing();
        //        } catch (IOException e) {
        //            e.printStackTrace();
        //        }
    }//GEN-LAST:event_indexMissingActionPerformed

    private void textfieldSearchImageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_textfieldSearchImageActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_textfieldSearchImageActionPerformed

    private void buttonSearchFromBrowseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSearchFromBrowseActionPerformed
        int docID = ((Integer) spinnerCurrentDocNum.getValue()).intValue() - 1;
        if (!(docID < 0 || docID > browseReader.maxDoc())) {
            try {
                searchForDocument(browseReader.document(docID));
            } catch (Exception e) {
                System.err.println(e);
            }
        }
    }//GEN-LAST:event_buttonSearchFromBrowseActionPerformed

    private void spinnerCurrentDocNumStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerCurrentDocNumStateChanged
        int docID = (Integer) spinnerCurrentDocNum.getValue() - 1;
        if (docID >= 0 && docID < browseReader.maxDoc()) {
            setDocumentImageIcon(docID);
        } else {
            if (docID < 0) {
                spinnerCurrentDocNum.setValue(1);
            } else {
                spinnerCurrentDocNum.setValue(browseReader.maxDoc());
            }
        }
    }//GEN-LAST:event_spinnerCurrentDocNumStateChanged

    private void searchForImage(String imagePath) throws FileNotFoundException, IOException {
        // setting to search panel:
        ((CardLayout) cardPanel.getLayout()).first(cardPanel);
        ((CardLayout) cardPanel.getLayout()).next(cardPanel);
        // switching away from search results ...
        ((CardLayout) topPane.getLayout()).first(topPane);
        final String path = imagePath;
        final JPanel frame = topPane;
        Thread t = new Thread() {
            public void run() {
                try {
                    IndexReader reader = DirectoryReader
                            .open(FSDirectory.open(Paths.get(textfieldIndexName.getText())));
                    int numDocs = reader.numDocs();
                    System.out.println("numDocs = " + numDocs);
                    ImageSearcher searcher = getSearcher();
                    ImageSearchHits hits = searcher.search(ImageIO.read(new FileInputStream(path)), reader);
                    tableModel.setHits(hits, progressSearch, reader);
                    reader.close();
                    Rectangle bounds = resultsTable.getCellRect(0, 0, true);
                    resultsPane.getViewport().setViewPosition(bounds.getLocation());
                } catch (Exception e) {
                    // Nothing to do here ....
                } finally {
                    resultsTable.setRowHeight(150);
                    // resultsTable.getColumnModel().getColumn(0).setMaxWidth(64);
                    // resultsTable.getColumnModel().getColumn(0).setMinWidth(64);
                    resultsTable.getColumnModel().getColumn(1).setMaxWidth(150);
                    resultsTable.getColumnModel().getColumn(1).setMinWidth(150);
                    ((CardLayout) topPane.getLayout()).last(frame);
                    resultsTable.setEnabled(true);
                }
            }
        };
        t.start();

    }

    private ImageSearcher getSearcher() {
        int numResults = 50;
        try {
            numResults = Integer.parseInt(textfieldNumSearchResults.getText());
        } catch (Exception e) {
            // nothing to do ...
        }
        ImageSearcher searcher = new GenericFastImageSearcher(numResults, ColorLayout.class);
        if (selectboxDocumentBuilder.getSelectedIndex() == 1) {
            searcher = new GenericFastImageSearcher(numResults, ScalableColor.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 2) {
            searcher = new GenericFastImageSearcher(numResults, EdgeHistogram.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 3) {
            searcher = new GenericFastImageSearcher(numResults, AutoColorCorrelogram.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 4) { // CEDD
            searcher = new GenericFastImageSearcher(numResults, CEDD.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 5) { // FCTH
            searcher = new GenericFastImageSearcher(numResults, FCTH.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 6) { // JCD
            searcher = new GenericFastImageSearcher(numResults, JCD.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 7) { // SimpleColorHistogram
            searcher = new GenericFastImageSearcher(numResults, SimpleColorHistogram.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 8) {
            searcher = new GenericFastImageSearcher(numResults, Tamura.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 9) {
            searcher = new GenericFastImageSearcher(numResults, Gabor.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 10) {
            searcher = new GenericFastImageSearcher(numResults, JpegCoefficientHistogram.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 11) {
            //            searcher = new VisualWordsImageSearcher(numResults, DocumentBuilder.FIELD_NAME_SURF + DocumentBuilder.FIELD_NAME_BOVW);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 12) {
            searcher = new GenericFastImageSearcher(numResults, JointHistogram.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 13) {
            searcher = new GenericFastImageSearcher(numResults, OpponentHistogram.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() == 14) {
            searcher = new GenericFastImageSearcher(numResults, LuminanceLayout.class);
        } else if (selectboxDocumentBuilder.getSelectedIndex() >= 15) {
            searcher = new GenericFastImageSearcher(numResults, PHOG.class);
        }
        return searcher;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new LireDemoFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem accSearch;
    private javax.swing.JMenu bovwMenu;
    private javax.swing.JPanel browseImageContainerPanel;
    private liredemo.ImagePanel browseImagePanel;
    private javax.swing.JPanel browsePanel;
    private javax.swing.JButton buttonBackToOptions;
    private javax.swing.JButton buttonBackToSearch;
    private javax.swing.JButton buttonMosaicSave;
    private javax.swing.JButton buttonOpenDir;
    private javax.swing.JButton buttonOpenImage;
    private javax.swing.JButton buttonOpenMosaicImage;
    private javax.swing.JButton buttonSearchFromBrowse;
    public javax.swing.JButton buttonStartIndexing;
    private javax.swing.JButton buttonStartMosaicing;
    private javax.swing.JButton buttonStartSearch;
    private javax.swing.JButton buttonSwitchAbout;
    private javax.swing.JButton buttonSwitchBrowse;
    private javax.swing.JButton buttonSwitchIndex;
    private javax.swing.JButton buttonSwitchMosaic;
    private javax.swing.JButton buttonSwitchOptions;
    private javax.swing.JButton buttonSwitchSearch;
    private javax.swing.JPanel cardPanel;
    private javax.swing.JMenuItem ceddSearch;
    public javax.swing.JCheckBox checkBoxAddToExisintgIndex;
    private javax.swing.JCheckBox checkboxAvoidDuplicates;
    private javax.swing.JCheckBox checkboxMosaicAdvanceOptions;
    private javax.swing.JMenuItem clSearch;
    private javax.swing.JMenuItem colorhistSearch;
    private javax.swing.JPanel controlPane;
    private javax.swing.JMenu devMenu;
    private javax.swing.JMenuItem ehSearch;
    private javax.swing.JMenuItem fcthSearch;
    private javax.swing.JMenu fileMenu;
    private javax.swing.JMenuItem fileMenuExit;
    private javax.swing.JMenuBar frameMenu;
    private javax.swing.JMenu helpMenu;
    private javax.swing.JMenuItem helpMenuAbout;
    private javax.swing.JMenuItem helpMenuDonate;
    private javax.swing.JMenuItem helpMenuHomepage;
    private javax.swing.JMenuItem helpMenuMailinglist;
    private javax.swing.JMenuItem helpMenuWiki;
    private javax.swing.JMenuItem indexAll;
    private javax.swing.JMenuItem indexMissing;
    private javax.swing.JPanel indexPanel;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel17;
    private javax.swing.JLabel jLabel2;
    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 jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JMenuItem jcdSearch;
    private javax.swing.JMenuItem jpegCoeffSearch;
    private javax.swing.JLabel labelDocCount;
    private javax.swing.JLabel labelMosaicSliderValue;
    private javax.swing.JLabel labelMosaicTitle;
    private javax.swing.JPanel mosaicAdvanceOptionsPanel;
    private javax.swing.ButtonGroup mosaicButtons;
    private javax.swing.JLabel mosaicImageLable;
    private javax.swing.JRadioButton mosaicOptionsAutocolorcorrelogram;
    private javax.swing.JRadioButton mosaicOptionsCedd;
    private javax.swing.JRadioButton mosaicOptionsColorLayout;
    private javax.swing.JPanel mosaicPanel;
    private javax.swing.JSlider mosaicTileCountSlider;
    private javax.swing.JPanel optionsPanel;
    private javax.swing.JPanel panelMosaicOptionsHidden;
    private javax.swing.JPanel panelMosaicOptionsShown;
    public javax.swing.JProgressBar progressBarIndexing;
    private javax.swing.JProgressBar progressMosaic;
    private javax.swing.JProgressBar progressSearch;
    private javax.swing.JMenuItem rerankFeature;
    private javax.swing.JMenuItem rerankLsa;
    private javax.swing.JMenu rerankMenu;
    private javax.swing.JMenu researchMenu;
    private javax.swing.JPanel resultsCardPane;
    private javax.swing.JScrollPane resultsPane;
    private javax.swing.JTable resultsTable;
    private javax.swing.JMenu sameSearchMenu;
    private javax.swing.JMenuItem scSearch;
    private javax.swing.JMenuItem searchAutoColorCorrelation;
    private javax.swing.JMenuItem searchColorLayout;
    private javax.swing.JMenuItem searchEdgeHistogram;
    private javax.swing.JMenuItem searchMpeg7Descriptors;
    private javax.swing.JPanel searchPanel;
    private javax.swing.JMenuItem searchScalableColor;
    public javax.swing.JComboBox selectboxDocumentBuilder;
    private javax.swing.JComboBox selectboxRerankFeature;
    private javax.swing.JSpinner spinnerCurrentDocNum;
    private javax.swing.JPanel switchButtonsPanel;
    private javax.swing.JTextField textFieldFlickrDownloadMax;
    public javax.swing.JTextField textfieldImageDirectoryToIndex;
    public javax.swing.JTextField textfieldIndexName;
    private javax.swing.JTextField textfieldMosaicImage;
    private javax.swing.JTextField textfieldNumSearchResults;
    private javax.swing.JTextField textfieldSearchImage;
    private javax.swing.JPanel topPane;
    private javax.swing.JMenuItem vieMenuStartPage;
    private javax.swing.JMenu viewMenu;
    private javax.swing.JMenuItem viewMenuOptions;
    private javax.swing.JMenuItem viewMenuResults;
    // End of variables declaration//GEN-END:variables
}