/*
* @(#)SortableTableDemo.java
*
* Copyright 2002 - 2003 JIDE Software Inc. All rights reserved.
*/
import com.jidesoft.converter.ConverterContext;
import com.jidesoft.converter.DoubleConverter;
import com.jidesoft.converter.ObjectConverterManager;
import com.jidesoft.grid.*;
import com.jidesoft.hssf.HssfTableUtils;
import com.jidesoft.icons.JideIconsFactory;
import com.jidesoft.plaf.LookAndFeelFactory;
import com.jidesoft.swing.JideBoxLayout;
import com.jidesoft.swing.JideTabbedPane;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
/**
* Demoed Component: {@link SortableTable}
Required jar files: jide-common.jar, jide-grids.jar
Required L&F:
* any L&F
*/
public class SortableTableDemo extends AbstractDemo {
protected SortableTable _sortableTable;
protected String _lastDirectory = ".";
private static final long serialVersionUID = -5373007282200581748L;
public SortableTableDemo() {
ObjectConverterManager.initDefaultConverter();
DecimalFormat format = new DecimalFormat();
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(10);
DoubleConverter converter = new DoubleConverter(format);
ObjectConverterManager.registerConverter(Double.class, converter);
}
public String getName() {
return "SortableTable Demo";
}
public String getProduct() {
return PRODUCT_NAME_GRIDS;
}
@Override
public String getDescription() {
return "This is a demo of SortableTable. \n" +
"\nClick once on the header to sort ascending, click twice to sort descending, a third time to unsort. Hold CTRL key (or Command key on Mac OS X) then click on several headers to see mulitple columns sorting.\n" +
"\n" +
"Demoed classes:\n" +
"com.jidesoft.grid.SortableTable";
}
@Override
public Component getOptionsPanel() {
JPanel panel = new JPanel();
panel.setLayout(new JideBoxLayout(panel, JideBoxLayout.Y_AXIS));
panel.add(new JLabel("Maximum sorted columns: "));
DefaultComboBoxModel model = new DefaultComboBoxModel();
model.addElement("No maximum (default)");
for (int i = 0; i < _sortableTable.getColumnCount(); i++) {
model.addElement(new Integer(i + 1));
}
panel.add(Box.createVerticalStrut(3));
final JComboBox maxComboBox = new JComboBox(model);
maxComboBox.addActionListener(new AbstractAction() {
private static final long serialVersionUID = -6480174819379988040L;
public void actionPerformed(ActionEvent e) {
int maxCount = maxComboBox.getSelectedIndex();
if (maxCount == 0) {
((ISortableTableModel) _sortableTable.getModel()).setMaximumSortColumns(-1);
}
else {
((ISortableTableModel) _sortableTable.getModel()).setMaximumSortColumns(maxCount);
}
}
});
panel.add(maxComboBox);
panel.add(Box.createVerticalStrut(6));
panel.add(new JLabel("Sort priority: "));
model = new DefaultComboBoxModel();
model.addElement("FILO (Default)");
model.addElement("FIFO");
panel.add(Box.createVerticalStrut(3));
final JComboBox priorityComboBox = new JComboBox(model);
priorityComboBox.addActionListener(new AbstractAction() {
private static final long serialVersionUID = 3712678830602409607L;
public void actionPerformed(ActionEvent e) {
int priority = priorityComboBox.getSelectedIndex();
((ISortableTableModel) _sortableTable.getModel()).setSortPriority(priority);
}
});
panel.add(priorityComboBox);
panel.add(Box.createVerticalStrut(12));
JCheckBox sortingEnabled = new JCheckBox("Allow user to sort table");
sortingEnabled.setSelected(_sortableTable.isSortingEnabled());
sortingEnabled.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
_sortableTable.setSortingEnabled(e.getStateChange() == ItemEvent.SELECTED);
}
});
panel.add(sortingEnabled);
JCheckBox showSortOrder = new JCheckBox("Always show sort order");
showSortOrder.setSelected(_sortableTable.isShowSortOrderNumber());
showSortOrder.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
_sortableTable.setShowSortOrderNumber(e.getStateChange() == ItemEvent.SELECTED);
}
});
panel.add(showSortOrder);
final JCheckBox sortIconCheckBox = new JCheckBox("Use Look&Feel Default Sort Icon");
sortIconCheckBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
_sortableTable.setUseLnfDefaultSortIcon(e.getStateChange() == ItemEvent.SELECTED);
}
});
sortIconCheckBox.setSelected(_sortableTable.isUseLnfDefaultSortIcon());
panel.add(sortIconCheckBox);
panel.add(Box.createVerticalStrut(12));
panel.add(new JButton(new AbstractAction("Export to Excel 2003 Format") {
private static final long serialVersionUID = -3816637828684822007L;
public void actionPerformed(ActionEvent e) {
_sortableTable.putClientProperty(HssfTableUtils.CLIENT_PROPERTY_EXCEL_OUTPUT_FORMAT, HssfTableUtils.EXCEL_OUTPUT_FORMAT_2003);
if (!HssfTableUtils.isHssfInstalled()) {
JOptionPane.showMessageDialog((Component) e.getSource(), "Export to Excel feature is disabled because POI-HSSF jar is missing in the classpath.");
return;
}
outputToExcel(e);
}
}));
panel.add(new JButton(new AbstractAction("Export to Excel 2007 Format") {
private static final long serialVersionUID = -9178768956978016068L;
public void actionPerformed(ActionEvent e) {
_sortableTable.putClientProperty(HssfTableUtils.CLIENT_PROPERTY_EXCEL_OUTPUT_FORMAT, HssfTableUtils.EXCEL_OUTPUT_FORMAT_2007);
if (!HssfTableUtils.isXssfInstalled()) {
JOptionPane.showMessageDialog((Component) e.getSource(), "Export to Excel 2007 feature is disabled because one or several POI-XSSF dependency jars are missing in the classpath. Please include all the jars from poi release in the classpath and try to run again.");
return;
}
outputToExcel(e);
}
}));
panel.add(new JButton(new AbstractAction("Export to CSV Format") {
private static final long serialVersionUID = -3816637828684822007L;
public void actionPerformed(ActionEvent e) {
outputToCsv(e);
}
}));
return panel;
}
public Component getDemoPanel() {
TableModel model = new SampleTableModel();
_sortableTable = new SortableTable(model);
_sortableTable.setAutoResizeMode(JideTable.AUTO_RESIZE_FILL);
_sortableTable.sortColumn("double column");
TableUtils.autoResizeAllColumns(_sortableTable);
JTable normalTable = new JTable(model);
JideTabbedPane tabbedPane = new JideTabbedPane();
tabbedPane.setTabShape(JideTabbedPane.SHAPE_BOX);
tabbedPane.addTab("SortableTable", new JScrollPane(_sortableTable));
tabbedPane.addTab("JTable (for comparison)", new JScrollPane(normalTable));
tabbedPane.setPreferredSize(new Dimension(550, 400));
return tabbedPane;
}
@Override
public int getAttributes() {
return ATTRIBUTE_UPDATED;
}
static class SampleTableModel extends AbstractTableModel implements ContextSensitiveTableModel, ToolTipSupport, ColumnDraggableSupport {
private static final long serialVersionUID = 8798261997256893224L;
public int getColumnCount() {
return 7;
}
public int getRowCount() {
return 8;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public ConverterContext getConverterContextAt(int row, int column) {
return null;
}
public EditorContext getEditorContextAt(int row, int column) {
return null;
}
public Class> getCellClassAt(int row, int column) {
return getColumnClass(column);
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "freeze int column";
case 1:
return "double column";
case 2:
return "boolean column";
case 3:
return "string column";
case 4:
return "icon column";
case 5:
return "date column";
case 6:
return "long column";
}
return "";
}
@Override
public Class> getColumnClass(int column) {
switch (column) {
case 0:
return Integer.class;
case 1:
return Double.class;
case 2:
return Boolean.class;
case 3:
return String.class;
case 4:
return Icon.class;
case 5:
return Date.class;
case 6:
return Long.class;
}
return Object.class;
}
@Override
public boolean isColumnDraggable(int columnIndex) {
return columnIndex != 0;
}
public Object getValueAt(int row, int column) {
switch (column) {
case 0:
if (row > 4) {
return 2;
}
else {
return row;
}
case 1:
return row * 2.333333;
case 2:
if (row % 2 == 0)
return Boolean.TRUE;
return Boolean.FALSE;
case 3:
return "row " + (getRowCount() - row);
case 4:
if (row % 2 == 0)
return JideIconsFactory.getImageIcon(JideIconsFactory.FileType.HTML);
else
return JideIconsFactory.getImageIcon(JideIconsFactory.FileType.JAVA);
case 5:
Calendar calendar = Calendar.getInstance();
calendar.roll(Calendar.DAY_OF_YEAR, row);
return calendar.getTime();
case 6:
return row * 10 + 900000000000000000L;
}
return null;
}
public String getToolTipText(int columnIndex) {
return "Click to sort this " + getColumnName(columnIndex);
}
}
@Override
public String getDemoFolder() {
return "G2.SortableTable";
}
static public void main(String[] s) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
LookAndFeelFactory.installDefaultLookAndFeelAndExtension();
showAsFrame(new SortableTableDemo());
}
});
}
private void outputToCsv(ActionEvent e) {
JFileChooser chooser = new JFileChooser() {
@Override
protected JDialog createDialog(Component parent) throws HeadlessException {
JDialog dialog = super.createDialog(parent);
dialog.setTitle("Export the content to a CSV file");
return dialog;
}
};
chooser.setCurrentDirectory(new File(_lastDirectory));
int result = chooser.showDialog(((JButton) e.getSource()).getTopLevelAncestor(), "Export");
if (result == JFileChooser.APPROVE_OPTION) {
_lastDirectory = chooser.getCurrentDirectory().getAbsolutePath();
try {
System.out.println("Exporting to " + chooser.getSelectedFile().getAbsolutePath());
CsvTableUtils.export(_sortableTable, chooser.getSelectedFile().getAbsolutePath(), true, new HssfTableUtils.DefaultCellValueConverter() {
@Override
public int getDataFormat(JTable table, Object value, int rowIndex, int columnIndex) {
if (value instanceof Double) {
return 2; // use 0.00 format
}
else if (value instanceof Date) {
return 0xe; // use "m/d/yy" format
}
return super.getDataFormat(table, value, rowIndex, columnIndex);
}
});
System.out.println("Exported");
}
catch (IOException e1) {
e1.printStackTrace();
}
}
}
private void outputToExcel(ActionEvent e) {
JFileChooser chooser = new JFileChooser() {
@Override
protected JDialog createDialog(Component parent) throws HeadlessException {
JDialog dialog = super.createDialog(parent);
dialog.setTitle("Export the content to an Excel file");
return dialog;
}
};
chooser.setCurrentDirectory(new File(_lastDirectory));
int result = chooser.showDialog(((JButton) e.getSource()).getTopLevelAncestor(), "Export");
if (result == JFileChooser.APPROVE_OPTION) {
_lastDirectory = chooser.getCurrentDirectory().getAbsolutePath();
try {
System.out.println("Exporting to " + chooser.getSelectedFile().getAbsolutePath());
HssfTableUtils.export(_sortableTable, chooser.getSelectedFile().getAbsolutePath(), "SortableTable", false, true, new HssfTableUtils.DefaultCellValueConverter() {
@Override
public int getDataFormat(JTable table, Object value, int rowIndex, int columnIndex) {
if (value instanceof Double) {
return 2; // use 0.00 format
}
else if (value instanceof Date) {
return 0xe; // use "m/d/yy" format
}
return super.getDataFormat(table, value, rowIndex, columnIndex);
}
});
System.out.println("Exported");
}
catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void dispose() {
}
}