DataModelToTableModelAdapter.java
上传用户:zhengdagz
上传日期:2014-03-06
资源大小:1956k
文件大小:7k
源码类别:

xml/soap/webservice

开发平台:

Java

  1. /*
  2.  * $Id: DataModelToTableModelAdapter.java,v 1.3 2005/10/10 17:01:11 rbair Exp $
  3.  *
  4.  * Copyright 2005 Sun Microsystems, Inc., 4150 Network Circle,
  5.  * Santa Clara, California 95054, U.S.A. All rights reserved.
  6.  *
  7.  * This library is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  * 
  12.  * This library is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  * 
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with this library; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  20.  */
  21. package org.jdesktop.binding.swingx.adapter;
  22. import javax.swing.table.AbstractTableModel;
  23. import org.jdesktop.binding.TabularDataModel;
  24. import org.jdesktop.binding.TabularValueChangeEvent;
  25. import org.jdesktop.binding.TabularValueChangeListener;
  26. import org.jdesktop.binding.metadata.DefaultMetaDataProvider;
  27. import org.jdesktop.binding.metadata.MetaData;
  28. import org.jdesktop.binding.metadata.MetaDataProvider;
  29. /**
  30.  * Extracted from TableBinding and changed to register
  31.  * as TabularValueChangeListener.
  32.  * 
  33.  * @author Richard Bair
  34.  * @author Jeanette Winzenburg
  35.  * 
  36.  */
  37. public class DataModelToTableModelAdapter extends AbstractTableModel 
  38.     implements MetaDataProvider {
  39.     protected TabularDataModel dm;
  40. //    private String[] fieldNames;
  41.     private DefaultMetaDataProvider metaDataProvider;
  42.     
  43.     public DataModelToTableModelAdapter(TabularDataModel dm) {
  44.         this(dm, null);
  45.     }
  46.     public DataModelToTableModelAdapter(TabularDataModel dm, String[] visibleFieldNames) {
  47.         this.dm = dm;
  48.         initMetaDataProvider(visibleFieldNames);
  49. //        fieldNames = visibleFieldNames == null ? dm.getFieldNames() : visibleFieldNames;
  50.         installDataModelListener();
  51.     }
  52.     
  53.     private void initMetaDataProvider(String[] visibleFieldNames) {
  54.         if (visibleFieldNames == null) {
  55.             metaDataProvider = new DefaultMetaDataProvider(dm);
  56.         } else {
  57.             MetaData[] metas = new MetaData[visibleFieldNames.length];
  58.             for (int i = 0; i < metas.length; i++) {
  59.                 metas[i] = dm.getMetaData(visibleFieldNames[i]);
  60.             }
  61.             metaDataProvider = new DefaultMetaDataProvider(metas);
  62.         }
  63.         
  64.     }
  65.     public Class getColumnClass(int columnIndex) {
  66.         MetaData metaData = getMetaData(columnIndex);
  67.         return metaData.getElementClass();
  68.     }
  69.     
  70.     public String getColumnName(int column) {
  71.         //its possible that the meta data hasn't shown up yet. In this
  72.         //case, use the field name until the meta data arrives
  73.         // JW: when would that be the case?
  74. //        MetaData md = dm.getMetaData(fieldNames[column]);
  75. //        return md == null ? fieldNames[column] : md.getLabel();
  76.         MetaData md = getMetaData(column);
  77.         return md.getLabel();
  78.     }
  79.     
  80.     public boolean isCellEditable(int rowIndex, int columnIndex) {
  81.         MetaData md = getMetaData(columnIndex);
  82.         return !md.isReadOnly();
  83.     }
  84.     
  85.     public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
  86.         dm.setValueAt(getFieldName(columnIndex), rowIndex, aValue);
  87.     }
  88.     
  89.     /* (non-Javadoc)
  90.      * @see javax.swing.table.TableModel#getRowCount()
  91.      */
  92.     public int getRowCount() {
  93.         return dm.getRecordCount();
  94.     }
  95.     /* (non-Javadoc)
  96.      * @see javax.swing.table.TableModel#getColumnCount()
  97.      */
  98.     public int getColumnCount() {
  99.         return getFieldCount();
  100.     }
  101.     /* (non-Javadoc)
  102.      * @see javax.swing.table.TableModel#getValueAt(int, int)
  103.      */
  104.     public Object getValueAt(int rowIndex, int columnIndex) {
  105.         return dm.getValueAt(getFieldName(columnIndex), rowIndex);
  106.     }
  107.     private String getFieldName(int columnIndex) {
  108.         return getDefaultMetaDataProvider().getFieldName(columnIndex);
  109.     }
  110.     private MetaData getMetaData(int columnIndex) {
  111.         String fieldName = getFieldName(columnIndex);
  112.         return getMetaData(fieldName);
  113.     }
  114. //  ------------------------ MetaDataProvider
  115.     public String[] getFieldNames() {
  116.         // TODO Auto-generated method stub
  117.         return getDefaultMetaDataProvider().getFieldNames();
  118.     }
  119.     
  120.     public int getFieldCount() {
  121.         // TODO Auto-generated method stub
  122.         return getDefaultMetaDataProvider().getFieldCount();
  123.     }
  124.     public MetaData getMetaData(String dataID) {
  125.         return getDefaultMetaDataProvider().getMetaData(dataID);
  126.     }
  127.     public MetaData[] getMetaData() {
  128.         return getDefaultMetaDataProvider().getMetaData();
  129.     }
  130.     
  131.     private DefaultMetaDataProvider getDefaultMetaDataProvider() {
  132.         if (metaDataProvider == null) {
  133.             metaDataProvider = new DefaultMetaDataProvider();
  134.         }
  135.         return metaDataProvider;
  136.     }
  137.     // --------------------------- init listener
  138.     private void installDataModelListener() {
  139.         // register with the data model
  140.         // ValueChangeListener l = new ValueChangeListener() {
  141.         // public void valueChanged(ValueChangeEvent e) {
  142.         // fireTableStructureChanged();
  143.         // }
  144.         // };
  145.         // dm.addValueChangeListener(l);
  146.         TabularValueChangeListener l = new TabularValueChangeListener() {
  147.             public void tabularValueChanged(TabularValueChangeEvent e) {
  148.                 int rowIndex = e.getRowIndex();
  149.                 int columnIndex = findColumnIndex(e.getFieldName());
  150.                 if (rowIndex < 0) {
  151.                     if (columnIndex < 0) {
  152.                         //JW: we are firing too many structure changed...
  153.                         // leads to forgetting all column settings...
  154.                         // check: does TabularDataModelAdapter clear the
  155.                         // the metaData on selection change?
  156.                         //fireTableDataChanged();
  157.                        fireTableStructureChanged();
  158.                     } else {
  159.                         fireTableDataChanged();
  160.                     }
  161.                 } else {
  162.                     if (columnIndex < 0) {
  163.                         fireTableRowsUpdated(rowIndex, rowIndex);
  164.                     } else {
  165.                         fireTableCellUpdated(rowIndex, columnIndex);
  166.                     }
  167.                 }
  168.                 // PENDING: do better than this!
  169.                 //fireTableStructureChanged();
  170.             }
  171.         };
  172.         dm.addTabularValueChangeListener(l);
  173.     }
  174.     protected int findColumnIndex(String fieldName) {
  175.         if (fieldName == null) {
  176.             return -1;
  177.         }
  178.         return getDefaultMetaDataProvider().getFieldIndex(fieldName);
  179. //        for (int i = 0; i < fieldNames.length; i++) {
  180. //            if (fieldName.equals(fieldNames[i])) {
  181. //                return i;
  182. //            }
  183. //        }
  184. //        return -1;
  185.     }
  186. }