/* * $Id: JDataTableBean.java,v 1.17 2005/08/21 13:04:58 zfq Exp zfq $ * * Copyright (C) 2001-2003 Extreme Component, Inc. All rights reserved. * Use is subject to license terms. */ package com.zfqjava.swing; import java.util.*; import java.text.MessageFormat; import java.io.File; import java.security.AccessController; import java.security.PrivilegedAction; import java.sql.*; import java.awt.*; import java.awt.event.*; import java.awt.print.*; import java.beans.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; import javax.swing.text.AttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import com.zfqjava.swing.model.*; import com.zfqjava.swing.cell.Cell; import java.util.logging.Level; import java.util.logging.Logger; import javax.sql.*; import javax.swing.filechooser.FileFilter; /** * JDataTableBean * * @author $Author: zfq $ * @version $Revision: 1.17 $ $Date: 2005/08/21 13:04:58 $ */ public class JDataTableBean extends JBean { // class fields private static final String BUNDLE = "com.zfqjava.swing.resources.datatablebean"; private static final String NAME = "JDataTableBean"; private static final String VERSION = "2.5.0"; /** * Identifies the main menubar. */ public static final String MAIN_MENUBAR = "main-menubar"; /** * Identifies the main toolbar. */ public static final String MAIN_TOOLBAR = "main-toolbar"; /** * Identifies the style toolbar. */ public static final String STYLE_TOOLBAR = "style-toolbar"; // instance fields private static final Logger log = Logger.getLogger(JDataTableBean.class.getName()); // util.Logger private void setAppProperties() { try { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { System.setProperty("application.name", NAME); System.setProperty("application.version", VERSION); return null; } }); } catch(Exception e) { e.printStackTrace(); } } private JPanel centerPanel; private String url; private String username; private char[] password; private String command; private String driver; private String tableName = "usertesttable"; // private String tableName; private int[] keyColumns = { 0 }; private JMenuBar menuBar; private JToolBar toolBar; private JStyleBar styleBar; private JDataGrid dataGrid; private Handler handler; private Map uiMap = new HashMap(2); private boolean useRowset; private boolean useCached; private int pageSize = 20; private boolean sync; private boolean passResultSet; public JDataTableBean() { // setLogLevel(null, Level.FINER); verifyLicense(NAME, VERSION); initComponents(); } public void updateUI() { super.updateUI(); if(uiMap != null) { for(Iterator i=uiMap.values().iterator(); i.hasNext(); ) { Component c = (Component)i.next(); SwingUtilities.updateComponentTreeUI(c); } } } // overide private void initComponents() { getResourceManager().addBundle(BUNDLE); setAppProperties(); boolean hideSplash = Boolean.getBoolean(JDataTableBean.class.getName()+".hideSplash"); if(!hideSplash) { doSplash(); } setTitle(getString("title")); disableIndexActions(); centerPanel = createCenterPanel(); setDataGrid(createDataGrid()); add(centerPanel, BorderLayout.CENTER); add(createNorthPanel(), BorderLayout.NORTH); add(getStatusBar(), BorderLayout.SOUTH); // setupDerby(); // need to create directory. setupHsqldb(); if(!hideSplash) { doSplash(); } } private JPanel createCenterPanel() { JPanel panel = new JPanel(new BorderLayout()); return panel; } protected JFrame createFrame() { JFrame f = super.createFrame(); f.setSize(640, 480); return f; } protected JStatusBar createStatusBar() { JStatusBar statusBar = new JStatusBar(JStatusBar.EDITOR); return statusBar; } /** * Returns the menubar for the specified name. * * @param name the menubar name * @return the menubar * @since JDataGrid 1.5.1 */ public JMenuBar getMenuBar(String name) { if(MAIN_MENUBAR.equals(name)) { return menuBar; } return null; } /** * Returns the toolbar for the specified name. * * @param name the toolbar name * @return the toolbar * @since JDataGrid 1.5.1 */ public JToolBar getToolBar(String name) { if(MAIN_TOOLBAR.equals(name)) { return toolBar; } else if(STYLE_TOOLBAR.equals(name)) { return styleBar; } return null; } public static void main(String[] args) { final JDataTableBean bean = new JDataTableBean(); bean.setDefaultCloseOperation(JBean.EXIT_ON_CLOSE); SwingUtilities.invokeLater(new Runnable() { public void run() { bean.showFrame(); bean.queryTable(); } }); } private void registerDriver() { try { Class.forName(driver, true, JDataTableBean.class.getClassLoader()); } catch (Exception e) { error(e); } } private void setupDerby() { url="jdbc:derby:usertesttable;create=true"; username="user1"; password="user1".toCharArray(); driver="org.apache.derby.jdbc.EmbeddedDriver"; command = "select * from usertesttable"; } private void setupOdbc() { url = "jdbc:odbc:"; // username = System.getProperty("user.name"); username = "sa"; password = new char[0]; driver = "sun.jdbc.odbc.JdbcOdbcDriver"; // default command = "select * from usertesttable"; } private void setupHsqldb() { url = "jdbc:hsqldb:mem:test"; username = "sa"; password = new char[0]; driver = "org.hsqldb.jdbcDriver"; command = "select * from usertesttable"; } private void setupPostgres() { url = "jdbc:postgresql:postgres"; username = "postgres"; password = "postgres".toCharArray(); driver = "postgresql.Driver"; // driver = "org.postgresql.Driver"; command = "select * from usertesttable"; } private void setupMysql() { url = "jdbc:mysql://localhost/test"; username = "sa"; password = new char[0]; driver = "com.mysql.jdbc.Driver"; command = "select * from usertesttable"; } private void setupTable() { registerDriver(); try { Connection conn = DriverManager.getConnection(url, username, new String(password)); java.sql.Statement statement = conn.createStatement(); String sql = "create table usertesttable (username VARCHAR(12), age INTEGER, birth DATE)"; statement.executeUpdate(sql); statement.close(); String insertSql = "insert into usertesttable (username, age, birth) values ( ?, ?, ?)"; PreparedStatement prepareStatement = conn.prepareStatement(insertSql); for(int i=0; i<200; i++) { prepareStatement.setString(1, "user"+(i+1)); prepareStatement.setInt(2, i+1); prepareStatement.setDate(3, new java.sql.Date(2004-1900, i%12, (i+1)%32)); prepareStatement.addBatch(); } prepareStatement.executeBatch(); } catch (SQLException e) { error(e); } } private void setModel(ResultSetTableModel newModel) { ResultSetTableModel oldModel = getModel(); if(oldModel != null) { oldModel.removeTableModelListener(getHandler()); oldModel.removePropertyChangeListener(getHandler()); } newModel.addTableModelListener(getHandler()); newModel.addPropertyChangeListener(getHandler()); dataGrid.setModel(new DefaultColumnSorter(new ResultSetDataGridModelAdapter(newModel))); // dataGrid.setModel(newModel); } private void queryTable() { ResultSetTableModel newModel = createModel(); setModel(newModel); if(!sync) { newModel.reload(); } } private JPanel createNorthPanel() { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); toolBar = createToolBar("main-toolbar"); menuBar = createMenuBar("main-menubar"); styleBar = createStyleBar(); panel.add(menuBar, BorderLayout.NORTH); panel.add(toolBar, BorderLayout.CENTER); panel.add(styleBar, BorderLayout.SOUTH); return panel; } private JStyleBar createStyleBar() { JStyleBar styleBar = new JStyleBar(); styleBar.setFloatable(false); styleBar.addChangeListener(getHandler()); return styleBar; } /** * Sets the datagrid for this bean. * * @param dataGrid the datagrid * @since JDataGrid 1.5.1 */ public void setDataGrid(JDataGrid dataGrid) { JDataGrid oldValue = this.dataGrid; this.dataGrid = dataGrid; if(oldValue != dataGrid) { if(oldValue != null) { oldValue.removePropertyChangeListener(handler); oldValue.getSelectionModel().removeListSelectionListener(handler); if(centerPanel != null) { centerPanel.removeAll(); } } if(dataGrid != null) { Handler handler = getHandler(); dataGrid.addPropertyChangeListener(handler); dataGrid.getSelectionModel().addListSelectionListener(handler); if(centerPanel != null) { centerPanel.add(new JScrollPane(dataGrid), BorderLayout.CENTER); } } // find and speller cannot work? JTextFinder finder = getTextFinder(false); if(finder != null) { finder.setForComponent(dataGrid); } JTextSpeller speller = getTextSpeller(false); if(speller != null) { speller.setForComponent(dataGrid); } if(styleBar != null) { styleBar.setDefaultAttributes(createAttributes(dataGrid)); } } } private Font getDefaultFont() { // Font font = dataGrid.getFont(); Font font = new Font("Dialog", Font.PLAIN, 12); return font; } // move to JDataGrid? JDataGrid.createDefaultCellAttributes private AttributeSet createAttributes(JDataGrid dataGrid) { Font font = getDefaultFont(); dataGrid.setFont(font); SimpleAttributeSet a = new SimpleAttributeSet(); Color fgColor = dataGrid.getForeground(); Color bgColor = dataGrid.getBackground(); StyleConstants.setFontFamily(a, font.getFamily()); StyleConstants.setFontSize(a, font.getSize()); StyleConstants.setBold(a, font.isBold()); StyleConstants.setItalic(a, font.isItalic()); StyleConstants.setForeground(a, fgColor); StyleConstants.setBackground(a, bgColor); if(log.isLoggable(Level.FINE)) { log.fine("default attributes: " + a); } return a; } /** * Returns the datagrid for this bean. * * @return the datagrid for this bean * @since JDataGrid 1.5.1 */ public JDataGrid getDataGrid() { return dataGrid; } // TODO: // UNKNOWN_PAGE_COUNT... // focus for JStyleBar... // add PopupMenu to delete the current row... /** * Creates a datagrid for this bean. * * @return a new datagrid * @since JDataGrid 1.5.1 */ protected JDataGrid createDataGrid() { JDataGrid dataGrid = new JDataTable(); // disable press key to start editing dataGrid.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE); // change the start click count to 2 // dataGrid.putClientProperty("JDataGrid.clickCountToStartsEdit", new Integer(2)); dataGrid.putClientProperty("JDataGrid.columnSortingEnabled", Boolean.TRUE); dataGrid.putClientProperty("JDataGrid.switchUnsortedOrderEnabled", Boolean.TRUE); // set selectionBorderPainted property // dataGrid.setSelectionBorderPainted(true); dataGrid.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); dataGrid.getRowHeader().putClientProperty("JLineBar.showArrowIcon", Boolean.TRUE); dataGrid.setAlternatingRowBackground(new Color(224, 224, 224)); dataGrid.getCellSelectionModel().setSelectionMode(CellSelectionModel.SINGLE_INTERVAL_SELECTION); dataGrid.setCellSelectionEnabled(true); return dataGrid; } private ResultSet createResultSet() { ResultSet rs = null; try { Connection conn = DriverManager.getConnection(url, username, new String(password)); java.sql.Statement s = null; try { s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); } catch (SQLException e) { s = conn.createStatement(); if(log.isLoggable(Level.FINER)) { log.log(Level.FINER, "createStatement faied", e); } } rs = s.executeQuery(command); } catch (SQLException e) { if(log.isLoggable(Level.FINER)) { log.log(Level.FINER, "createResultSet failed", e); } } return rs; } private ResultSetTableModel createModel() { registerDriver(); setupTable(); ResultSetTableModel model = null; if(!useRowset) { if(passResultSet) { // create result set ResultSet rs = createResultSet(); model = new ResultSetTableModel(rs, sync, pageSize); if(log.isLoggable(Level.FINE)) { log.fine("Pass ResultSet directly"); } } else { model = new ResultSetTableModel(command, url, username, new String(password), sync, pageSize); if(log.isLoggable(Level.FINE)) { log.fine("Pass url directly"); } } model.setTableName(tableName); model.setKeyColumns(keyColumns); if(log.isLoggable(Level.FINE)) { log.fine("ResultSetTableModel used"); log.fine("rowCount="+model.getRowCount()+",columnCount="+model.getColumnCount()); } } else { RowSet rs = null; try { if(useCached) { rs = new com.sun.rowset.CachedRowSetImpl(); if(log.isLoggable(Level.FINE)) { log.fine("CachedRowSet"); } } else { rs = new com.sun.rowset.JdbcRowSetImpl(); if(log.isLoggable(Level.FINE)) { log.fine("JdbcRowSet"); } } rs.setUrl(url); rs.setUsername(username); rs.setPassword(new String(password)); rs.setCommand(command); } catch (SQLException e) { if(log.isLoggable(Level.FINER)) { log.log(Level.FINER, "create rowset failed", e); } } model = new RowSetTableModel(rs, sync, pageSize); model.setTableName(tableName); model.setKeyColumns(keyColumns); if(log.isLoggable(Level.FINE)) { log.fine("RowSetTableModel used"); } } return model; } /** * Note:This method is not common API, please do not rely * on this method even existing. */ public void doChangeOption() { Object[] options = { "HSQLDB", "ODBC", "Derby", "Postgres", "MySQL" }; JComboBox message = new JComboBox(options); int value = JOptionPane.showOptionDialog(this, message, getString("configDialog-title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null); if(value == JOptionPane.OK_OPTION) { String item = (String)message.getSelectedItem(); if(item.equals("Derby")) { setupDerby(); } else if(item.equals("ODBC")) { setupOdbc(); } else if(item.equals("HSQLDB")) { setupHsqldb(); } else if(item.equals("Postgres")) { setupPostgres(); } else if(item.equals("MySQL")) { setupMysql(); } } } public void doExport() { TableModel model = dataGrid.getModel(); JFileChooser fc = createFileChooserForExport(); int retValue = fc.showDialog(this, null); if(retValue == JFileChooser.APPROVE_OPTION) { try { File f = fc.getSelectedFile(); if(f != null) { String format = getExtension(f); // enable excel loose format Map map = new HashMap(1); map.put(ModelIO.ENABLE_LOOSE_FORMAT, Boolean.TRUE); System.out.println("format="+format); // end if(format == null) { FileFilter fileFilter = fc.getFileFilter(); if(fileFilter instanceof DefaultFileFilter) { format = ((DefaultFileFilter)fileFilter).getPreferredExtensionName(); String name = f.getName() + "." + format; f = new File(f.getParent(), name); if(f.exists()) { int option = JOptionPane.showConfirmDialog(this, getString("overideConfirmMessage") + " " + f.getName() + " ?", null, JOptionPane.YES_NO_OPTION); if(option != JOptionPane.YES_OPTION) { return; } } } } ModelIO.writeTableModel(model, format, map, f); } } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(this, ex); } } } public void doPageSetup() { getPrintPreview().pageSetup(); } public void doPrint() { getPrintPreview().print(createPrintable(dataGrid)); } public void doPrintPreview() { final JPrintPreview printPreview = getPrintPreview(); JFrame frame = getFrame(); JInternalFrame internalFrame = getInternalFrame(); java.applet.Applet applet = (java.applet.Applet)SwingUtilities.getAncestorOfClass(java.applet.Applet.class, this); if(frame != null) { printPreview.showFrame(frame); } else if(internalFrame != null) { printPreview.showInternalFrame(internalFrame); } else if(applet != null) { printPreview.showApplet(applet); } else { // show frame when it's not in frame, internalFrame, applet printPreview.showFrame(); } // pre.setColorType(JPrintPreview.COLOR); // should move to JPrintPreview, use flag to control asynchronized? SwingUtilities.invokeLater(new Runnable() { public void run() { printPreview.setPrintData(createPrintable(dataGrid)); } }); } public void doFind() { JTextFinder finder = getTextFinder(); finder.setDialogType(JTextFinder.FIND_DIALOG); finder.showDialog(this); } public void doFindNext() { JTextFinder finder = getTextFinder(); finder.findNext(); } public void doReplace() { JTextFinder finder = getTextFinder(); finder.setDialogType(JTextFinder.REPLACE_DIALOG); finder.showDialog(this); } public void doSpell() { JTextSpeller speller = getTextSpeller(); speller.showDialog(this); } public void doSelectAll() { dataGrid.selectAll(); } private boolean isButtonSelected(ActionEvent e) { return ((AbstractButton)e.getSource()).isSelected(); } public void doViewToolBar(ActionEvent e) { boolean b = isButtonSelected(e); toolBar.setVisible(b); } public void doViewStatusBar(ActionEvent e) { boolean b = isButtonSelected(e); getStatusBar().setVisible(b); } public void doViewRowHeader(ActionEvent e) { boolean b = isButtonSelected(e); Component header = dataGrid.getRowHeader(); if(header != null && header.getParent() instanceof JViewport) { header.getParent().setVisible(b); } } public void doViewColumnHeader(ActionEvent e) { boolean b = isButtonSelected(e); Component header = dataGrid.getTableHeader(); if(header != null && header.getParent() instanceof JViewport) { header.getParent().setVisible(b); } } private String getPkString() { if(keyColumns == null) { return null; } StringBuffer sb = new StringBuffer(4); for(int i=0; i 0 && sb.charAt(sb.length()-1) == ',') { sb.deleteCharAt(sb.length()-1); } return sb.toString(); } private int[] convertPkString(String pkString) { java.util.List l = new LinkedList(); StringTokenizer st = new StringTokenizer(pkString); while(st.hasMoreTokens()) { l.add(st.nextToken()); } for(ListIterator i=l.listIterator(); i.hasNext(); ) { String s = (String)i.next(); try { Integer n = Integer.valueOf(s); i.set(n); } catch (NumberFormatException e) { error(e); i.remove(); } } int[] a = new int[l.size()]; Iterator it = l.iterator(); for(int i=0; iNote:This method is not common API, please do not rely * on this method even existing. */ public void doQuery() { JLabel tableNameLabel = new JLabel(getString("tableNameText")); JLabel pkindexLabel = new JLabel(getString("primarykeyColumnIndexText")); JLabel querySqlLabel = new JLabel(getString("querySqlText")); JTextField tableNameField = new JTextField(tableName, 16); JTextField pkindexField = new JTextField(getPkString(), 4); JTextArea queryArea = new JTextArea(command, 4, 20); Object[] message = { tableNameLabel, tableNameField, pkindexLabel, pkindexField, querySqlLabel, new JScrollPane(queryArea) }; int retValue = JOptionPane.showOptionDialog(this, message, getString("queryDialog-title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null); if(retValue == JOptionPane.OK_OPTION) { String tableName = tableNameField.getText(); String pkindex = pkindexField.getText(); String command = queryArea.getText(); this.tableName = tableName; this.keyColumns = convertPkString(pkindex); if(command != null && !command.equals("")) { this.command = command; queryTable(); } } } /** * Note:This method is not common API, please do not rely * on this method even existing. */ public void doPreferences() { AbstractButton b1 = createButton("resultset"); AbstractButton b2 = createButton("rowset"); AbstractButton b3 = createButton("cached"); AbstractButton b4 = createButton("sync"); AbstractButton b5 = createButton("passResultSet"); JLabel label = new JLabel(getString("pageSizeText")); JTextField field = new JTextField(""+pageSize, 4); b1.setSelected(!useRowset); b2.setSelected(useRowset); b3.setSelected(useCached); b4.setSelected(sync); b5.setSelected(passResultSet); Object[] message = { b1, b4, b5, b2, b3, label, field }; int retValue = JOptionPane.showOptionDialog(this, message, getString("PreferencesDialog-title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null); if(retValue == JOptionPane.OK_OPTION) { useRowset = b2.isSelected(); useCached = b3.isSelected(); sync = b4.isSelected(); passResultSet = b5.isSelected(); String text = field.getText(); try { pageSize = Integer.parseInt(text); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, e); } } } /** * Note:This method is not common API, please do not rely * on this method even existing. */ public void doOption() { JTextField urlField = new JTextField(url, 20); JTextField usernameField = new JTextField(username, 9); JPasswordField passwordField = new JPasswordField(new String(password), 9); JTextField driverField = new JTextField(driver, 25); Object[] message = { new JLabel(getString("urlText")), urlField, new JLabel(getString("usernameText")), usernameField, new JLabel(getString("passwordText")), passwordField, new JLabel(getString("driverText")), driverField }; int retValue = JOptionPane.showOptionDialog(this, message, getString("optionDialog-title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null); if(retValue == JOptionPane.OK_OPTION) { String oldUrl = this.url; url = urlField.getText(); username = usernameField.getText(); password = passwordField.getPassword(); driver = driverField.getText(); } } public void doNextPage() { getModel().nextPage(); } public void doPreviousPage() { getModel().previousPage(); } public void doGoPage() { String s = JOptionPane.showInputDialog(this, "Please input the page number:"); if(s == null) { return; } int index = -1; try { index = Integer.parseInt(s); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, e); } if(index == -1 || index < 1) { return; } getModel().setPageIndex(index); } public void doLastRow() { getDataTable().lastRow(); } public void doFirstRow() { getDataTable().firstRow(); } public void doNextRow() { getDataTable().nextRow(); } public void doPreviousRow() { getDataTable().previousRow(); } public void doGoRow() { String s = JOptionPane.showInputDialog(this, "Please input the row number:"); if(s == null) { return; } int index = -1; try { index = Integer.parseInt(s); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, e); } if(index == -1 || index < 1) { return; } ResultSetTableModel model = getModel(); if(model != null) { int rowIndex = index-1; if(rowIndex >=0 && rowIndex <= getModel().getAllRowCount()-1) { getModel().setRowIndex(rowIndex); } } } public void doInsertRow() { getDataTable().insertRow(); } public void doDeleteRow() { getDataTable().deleteRow(); } public void doRefreshRow() { getDataTable().refreshRow(); } private JDataTable getDataTable() { return (JDataTable)dataGrid; } private void updateIndexActions() { ResultSetTableModel model = getModel(); if(model != null) { int pageIndex = model.getPageIndex(); int pageCount = model.getPageCount(); int rowCount = model.getRowCount(); int allRowCount = model.getAllRowCount(); // data to model row int row = model.dataToModelRow(model.getRowIndex()); // model to sorter row row = modelToSorterRow(row); boolean canNextPage = allRowCount == ResultSetTableModel.UNKNOWN_COUNT || pageIndex < pageCount - 1; boolean canPreviousPage = pageIndex > 0; boolean canNextRow = (canNextPage || row < rowCount-1); boolean canPreviousRow = (canPreviousPage || row > 0); getAction("firstRow").setEnabled(canPreviousRow); getAction("previousRow").setEnabled(canPreviousRow); getAction("lastRow").setEnabled(canNextRow); getAction("nextRow").setEnabled(canNextRow); getAction("previousPage").setEnabled(canPreviousPage); getAction("nextPage").setEnabled(canNextPage); } else { disableIndexActions(); } } // Todo: private void disableIndexActions() { getAction("firstRow").setEnabled(false); getAction("previousRow").setEnabled(false); getAction("lastRow").setEnabled(false); getAction("nextRow").setEnabled(false); getAction("previousPage").setEnabled(false); getAction("nextPage").setEnabled(false); } private void updateStatusBar() { String text = null; ResultSetTableModel model = getModel(); if(model != null) { MessageFormat format = new MessageFormat(getString("status-message")); int pageIndex = model.getPageIndex(); int pageCount = model.getPageCount(); int rowIndex = model.getRowIndex(); int rowCount = model.getAllRowCount(); text = format.format(new Object[] { new Integer(rowIndex+1), new Integer(rowCount), new Integer(pageIndex+1), new Integer(pageCount) }); } getStatusBar().setText(text); } private void error(Exception e) { if(log.isLoggable(Level.FINER)) { log.log(Level.FINER, e.getMessage(), e); } } /** * Returns the print preview component. * * @return the print preview component * @since JDataGrid 1.5.1 */ public JPrintPreview getPrintPreview() { return getPrintPreview(true); } private JPrintPreview getPrintPreview(boolean create) { JPrintPreview printPreview = null; if(uiMap != null) { printPreview = (JPrintPreview)uiMap.get("print-preview"); } if(printPreview == null && create) { printPreview = createPrintPreview(); uiMap.put("print-preview", printPreview); } return printPreview; } private JPrintPreview createPrintPreview() { JPrintPreview printPreview = new JPrintPreview(); return printPreview; } /** * Creates the printable for the specified data grid. * * @param dataGrid the dataGrid * @return the printable * @since JDataGrid 1.5.1 */ protected Printable createPrintable(JDataGrid dataGrid) { Map map = (printProperties != null ? printProperties : createPrintProperties()); return PrintFactory.createPrintable(dataGrid, map); } private Map printProperties; /** * Returns the print properties. * @return the print properties * @since JDataGrid 2.5.0 */ public Map getPrintProperties() { return printProperties; } /** * Sets the print properties. * @param printProperties the print properties * @since JDataGrid 2.5.0 */ public void setPrintProperties(Map printProperties) { Map oldValue = this.printProperties; this.printProperties = printProperties; firePropertyChange("printProperties", oldValue, printProperties); } /** * Creates the default print properties. * @return the print properties * @since JDataGrid 2.5.0 */ public Map createPrintProperties() { Map map = new HashMap(); map.put(PrintFactory.HORIZONTAL_ALIGNMENT, new Integer(SwingConstants.CENTER)); // map.put(PrintFactory.ORIENTATION, new Integer(SwingConstants.VERTICAL)); map.put(PrintFactory.CENTER_MARGIN, new Insets(6, 0, 6, 0)); map.put(PrintFactory.HEADER_FORMAT, new MessageFormat(getTitle())); map.put(PrintFactory.HEADER_MARGIN, new Insets(0, 0, 6, 0)); map.put(PrintFactory.HEADER_TEXT_ALIGNMENT, new Integer(SwingConstants.CENTER)); map.put(PrintFactory.HEADER_ICON, getIcon("logo-small-image")); map.put(PrintFactory.FOOTER_FORMAT, new MessageFormat("Page {0}")); map.put(PrintFactory.FOOTER_MARGIN, new Insets(6, 0, 0, 0)); map.put(PrintFactory.FOOTER_ALIGNMENT, new Integer(SwingConstants.RIGHT)); map.put(PrintFactory.SHOW_HEADER_LINE, Boolean.TRUE); map.put(PrintFactory.SHOW_FOOTER_LINE, Boolean.TRUE); // map.put(PrintFactory.TABLE_SHOW_ROW_HEADER, Boolean.FALSE); // map.put(PrintFactory.TABLE_SHOW_COLUMN_HEADER, Boolean.FALSE); // map.put(PrintFactory.TABLE_SHOW_GRID_LINE, Boolean.FALSE); // map.put(PrintFactory.TABLE_PRINT_AREA, dataTable.getSelectedCell()); return map; } private static String getExtension(File f) { String name = f.getName(); int index = name.lastIndexOf("."); if(index != -1) { name = name.substring(index+1); } return null; } private JFileChooser createFileChooserForExport() { // JFileChooser fc = new JFileChooser(new File(System.getProperty("user.dir"))); JFileChooser fc = new JFileChooser(); fc.setApproveButtonText(getString("exportButton.name")); Integer mnemonic = getResourceManager().getMnemonic("exportButton.mnemonic"); if(mnemonic != null) { fc.setApproveButtonMnemonic(mnemonic.intValue()); } fc.setApproveButtonToolTipText(getString("exportButton.desc")); fc.addChoosableFileFilter(new DefaultFileFilter("txt", getString("txt.desc"))); fc.addChoosableFileFilter(new DefaultFileFilter("csv", getString("csv.desc"))); fc.addChoosableFileFilter(new DefaultFileFilter(new String[] {"html","htm"}, getString("html.desc"))); fc.setAcceptAllFileFilterUsed(false); return fc; } private JTextFinder getTextFinder() { return getTextFinder(true); } private JTextFinder getTextFinder(boolean create) { JTextFinder finder = null; if(uiMap != null) { finder = (JTextFinder)uiMap.get("finder"); } if(finder == null && create) { finder = createTextFinder(); finder.setForComponent(dataGrid); uiMap.put("finder", finder); } return finder; } private JTextFinder createTextFinder() { JTextFinder finder = new JTextFinder(); return finder; } private JTextSpeller getTextSpeller() { return getTextSpeller(true); } private JTextSpeller getTextSpeller(boolean create) { JTextSpeller speller = null; if(uiMap != null) { speller = (JTextSpeller)uiMap.get("speller"); } if(speller == null && create) { speller = createTextSpeller(); speller.setForComponent(dataGrid); uiMap.put("speller", speller); } return speller; } private JTextSpeller createTextSpeller() { JTextSpeller speller = new JTextSpeller(); return speller; } private ResultSetTableModel getModel() { return getDataTable().getResultSetTableModel(); } private DefaultColumnSorter getSorter() { TableModel model = dataGrid.getModel(); if(model instanceof DefaultColumnSorter) { return (DefaultColumnSorter)model; } else { return null; } } private int sorterToModelRow(int row) { DefaultColumnSorter sorter = getSorter(); if(sorter != null) { return sorter.sorterToModelRow(row); } else { return row; } } private int modelToSorterRow(int row) { DefaultColumnSorter sorter = getSorter(); if(sorter != null) { return sorter.modelToSorterRow(row); } else { return row; } } private int modelToDataRow(int row) { ResultSetTableModel model = getModel(); if(model != null) { return model.modelToDataRow(row); } else { return row; } } private int dataToModelRow(int row) { ResultSetTableModel model = getModel(); if(model != null) { return model.dataToModelRow(row); } else { return row; } } private int sorterToDataRow(int row) { return modelToDataRow(sorterToModelRow(row)); } private int dataToSorterRow(int row) { return modelToSorterRow(dataToModelRow(row)); } // get handler private Handler getHandler() { if(handler == null) { handler = new Handler(); } return handler; } // event private void doPageIndexChanged(PropertyChangeEvent e) { dataGrid.getRowHeader().setFirstLineIndex(getModel().getFirstRowIndex()); updateIndexActions(); updateStatusBar(); dataGrid.putClientProperty("JDataGrid.sortColumn", null); dataGrid.putClientProperty("JDataGrid.sortOrder", null); } private void doRowIndexChanged(PropertyChangeEvent e) { if(log.isLoggable(Level.FINE)) { log.log(Level.FINE, "rowCount="+dataGrid.getRowCount()+",model rowcount="+getModel().getRowCount()); } dataGrid.getRowHeader().setFirstLineIndex(getModel().getFirstRowIndex()); int rowIndex = ((Integer)e.getNewValue()).intValue(); int sorterRow = dataToSorterRow(rowIndex); int leadColumn = dataGrid.getColumnModel().getSelectionModel().getLeadSelectionIndex(); if(leadColumn <0 || leadColumn > dataGrid.getColumnCount()-1) { leadColumn = 0; } if(!dataGrid.isCellSelected(sorterRow, leadColumn)) { dataGrid.selectCell(sorterRow, leadColumn); dataGrid.changeSelection(sorterRow, leadColumn, false, false); } if(log.isLoggable(Level.FINE)) { log.fine("sorterRow="+sorterRow+",leadColumn="+leadColumn); } updateIndexActions(); updateStatusBar(); } private void doPageCountChanged(PropertyChangeEvent e) { updateIndexActions(); updateStatusBar(); } private void doAllRowCountChanged(PropertyChangeEvent e) { updateIndexActions(); updateStatusBar(); } private void doModelChanged(PropertyChangeEvent e) { updateIndexActions(); updateStatusBar(); } private void doTableChanged(TableModelEvent e) { updateIndexActions(); updateStatusBar(); } // handler class Handler implements PropertyChangeListener, TableModelListener, ListSelectionListener, ChangeListener { // PropertyChangeListener public void propertyChange(PropertyChangeEvent e) { String property = e.getPropertyName(); if(property == "pageIndex") { doPageIndexChanged(e); } else if(property == "rowIndex") { doRowIndexChanged(e); } else if(property == "pageCount") { doPageCountChanged(e); } else if(property == "allRowCount") { doAllRowCountChanged(e); } else if(property == "model") { doModelChanged(e); } } public void tableChanged(TableModelEvent e) { doTableChanged(e); } public void valueChanged(ListSelectionEvent e) { if(!e.getValueIsAdjusting()) { int sorterRow = dataGrid.getSelectionModel().getLeadSelectionIndex(); boolean selected = dataGrid.getSelectionModel().isSelectedIndex(sorterRow); if(sorterRow >= 0 && selected) { int dataRow = sorterToDataRow(sorterRow); getModel().setRowIndex(dataRow); } } changeStyleBar(e); } private void changeStyleBar(ListSelectionEvent e) { if(!e.getValueIsAdjusting()) { int row = dataGrid.getSelectionModel().getLeadSelectionIndex(); int column = dataGrid.getColumnModel().getSelectionModel().getLeadSelectionIndex(); if(row != -1 && column != -1) { if(dataGrid.getSelectionModel().isSelectedIndex(row) && dataGrid.getColumnModel().getSelectionModel().isSelectedIndex(column)) { styleBar.setAttributes(dataGrid.getCellAttributes(row, column)); } } } } public void stateChanged(ChangeEvent e) { AttributeSet a = styleBar.getChangedAttributes(); if(a == null) { // should not handle it return; } dataGrid.setCellAttributes(a); } } }