protected void customizeDemoPanel(
      final JTable table, final TableModel tableModel, final JPanel demoPanel) {
    final QuickTableFilterField field =
        new QuickTableFilterField(tableModel) {
          @Override
          public Filter getFilter() {
            String s = getSearchingText();
            if (s != null && s.length() > 0) {
              if (isWildcardEnabled()) {
                s = s.replace("*", "%");
                s = s.replace(".", "_");
              }
              StringBuffer pattern = new StringBuffer();
              if (isFromStart()) {
                pattern.append(s).append("%");
              } else {
                pattern.append("%").append(s).append("%");
              }
              LikeFilter likeFilter = new LikeFilter(pattern.toString());
              likeFilter.setCaseSensitive(isCaseSensitive());
              return likeFilter;
            } else {
              return null;
            }
          }

          @Override
          protected IFilterableTableModel createFilterableTableModel(TableModel tableModel) {
            if (tableModel instanceof IFilterableTableModel) {
              return (IFilterableTableModel) tableModel;
            } else {
              return super.createFilterableTableModel(tableModel);
            }
          }
        };

    final FilterableTableModel filterableTableModel =
        new FilterableTableModel(field.getDisplayTableModel());
    int floatColumnIndex = -1;
    for (int i = 0; i < filterableTableModel.getColumnCount(); i++) {
      if (filterableTableModel.getColumnClass(i) == Float.class) {
        floatColumnIndex = i;
        break;
      }
    }
    final int filterColumnIndex = floatColumnIndex == -1 ? 3 : floatColumnIndex;
    JCheckBox addFilterCheckBox1 = new JCheckBox("Using local filtering");
    final JLabel filterMessage1 = new JLabel();
    addFilterCheckBox1.addItemListener(
        new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
              //                        filterableTableModel.addFilter(1, new LikeFilter("%Meat%"));
              //                        filterableTableModel.addFilter(filterColumnIndex, new
              // GreaterThanFilter(1000f));
              //                        filterableTableModel.addFilter(filterColumnIndex, new
              // BetweenFilter(20f, 60f));
              filterableTableModel.addFilter(
                  filterColumnIndex, new InFilter(new Object[] {45f, 46f, 77f}));
            } else {
              filterableTableModel.clearFilters();
            }
            long start = System.nanoTime();
            filterableTableModel.setFiltersApplied(true);
            long end = System.nanoTime();
            filterMessage1.setText("Taking " + (end - start) / 1000000 + " ms");
          }
        });
    JCheckBox addFilterCheckBox2 = new JCheckBox("Using the database filtering feature");
    final JLabel filterMessage2 = new JLabel();
    addFilterCheckBox2.addItemListener(
        new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            if (tableModel instanceof IFilterableTableModel) {
              if (e.getStateChange() == ItemEvent.SELECTED) {
                //                        tableModel.addFilter(1, new LikeFilter("Meat"));
                //                        tableModel.addFilter(filterColumnIndex, new
                // GreaterThanFilter(1000f));
                //                        tableModel.addFilter(filterColumnIndex, new
                // BetweenFilter(20f, 60f));
                ((IFilterableTableModel) tableModel)
                    .addFilter(filterColumnIndex, new InFilter(new Object[] {45f, 46f, 77f}));
              } else {
                ((IFilterableTableModel) tableModel).clearFilters();
              }
              long start = System.nanoTime();
              ((IFilterableTableModel) tableModel).setFiltersApplied(true);
              long end = System.nanoTime();
              filterMessage2.setText("Taking " + (end - start) / 1000000 + " ms");
            }
          }
        });

    JPanel checkBoxPanel = new JPanel(new GridLayout(2, 2, 0, 0));
    checkBoxPanel.add(addFilterCheckBox1);
    checkBoxPanel.add(addFilterCheckBox2);
    checkBoxPanel.add(filterMessage1);
    checkBoxPanel.add(filterMessage2);

    demoPanel.add(checkBoxPanel, BorderLayout.BEFORE_FIRST_LINE);

    table.setModel(filterableTableModel);
    demoPanel.add(
        JideSwingUtilities.createLabeledComponent(
            new JLabel("QuickTableFilterField (use SQL LIKE):"),
            field,
            BorderLayout.BEFORE_LINE_BEGINS),
        BorderLayout.AFTER_LAST_LINE);
    demoPanel.setBorder(
        BorderFactory.createCompoundBorder(
            BorderFactory.createTitledBorder("Demo for DatabaseTableModel"),
            BorderFactory.createEmptyBorder(5, 10, 5, 10)));
  }
  @Override
  public Component getOptionsPanel() {
    JPanel panel = new JPanel(new GridLayout(0, 1, 4, 4));
    final JCheckBox hideOriginalTableHeader = new JCheckBox("Hide the original table header");
    hideOriginalTableHeader.addItemListener(
        new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            JTableHeader header = _table.getTableHeader();
            if (header instanceof NestedTableHeader) {
              ((NestedTableHeader) header)
                  .setOriginalTableHeaderVisible(!hideOriginalTableHeader.isSelected());
            }
          }
        });
    panel.add(hideOriginalTableHeader);

    final JCheckBox autoStartCellEditing = new JCheckBox("Auto-start editing when TAB or ENTER");
    autoStartCellEditing.addItemListener(
        new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            _table.setAutoStartCellEditing(autoStartCellEditing.isSelected());
          }
        });
    autoStartCellEditing.setSelected(_table.isAutoStartCellEditing());
    panel.add(autoStartCellEditing);

    final JCheckBox autoSelectTextWhenStartsEditing =
        new JCheckBox("Auto-select the cell text when editing");
    autoSelectTextWhenStartsEditing.addItemListener(
        new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            _table.setAutoSelectTextWhenStartsEditing(autoSelectTextWhenStartsEditing.isSelected());
          }
        });
    autoSelectTextWhenStartsEditing.setSelected(_table.isAutoSelectTextWhenStartsEditing());
    panel.add(autoSelectTextWhenStartsEditing);

    final JCheckBox enable = new JCheckBox("Enable Table");
    enable.addItemListener(
        new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            _table.setEnabled(enable.isSelected());
          }
        });
    enable.setSelected(_table.isEnabled());
    panel.add(enable);

    JCheckBox columnAutoResizable = new JCheckBox("Column Auto Resizable");
    columnAutoResizable.addItemListener(
        new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            boolean selected = e.getStateChange() == ItemEvent.SELECTED;
            _table.setColumnAutoResizable(selected);
            _table.setAutoResizeMode(
                selected ? JTable.AUTO_RESIZE_OFF : JTable.AUTO_RESIZE_ALL_COLUMNS);
          }
        });
    columnAutoResizable.setSelected(_table.isColumnAutoResizable());
    panel.add(columnAutoResizable);

    JComboBox autoCompletionModeComboBox =
        new JComboBox(
            new Object[] {
              "Disabled", "Cells in the same column", "Cells in the same row", "All cells"
            });
    autoCompletionModeComboBox.setSelectedIndex(_table.getEditorAutoCompletionMode());
    autoCompletionModeComboBox.addItemListener(
        new ItemListener() {
          public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
              _table.setEditorAutoCompletionMode(((JComboBox) e.getSource()).getSelectedIndex());
            }
          }
        });
    panel.add(
        JideSwingUtilities.createLabeledComponent(
            new JLabel("AutoCompletion Mode: "),
            autoCompletionModeComboBox,
            BorderLayout.BEFORE_LINE_BEGINS));

    return panel;
  }