001    package org.shiftone.jrat.desktop.util;
002    
003    import org.jdesktop.swingx.JXTable;
004    import org.jdesktop.swingx.table.TableColumnExt;
005    import org.shiftone.jrat.util.log.Logger;
006    
007    import java.beans.PropertyChangeEvent;
008    import java.beans.PropertyChangeListener;
009    import java.util.List;
010    import java.util.prefs.Preferences;
011    
012    /**
013     * @author jeff@shiftone.org (Jeff Drost)
014     */
015    public class JXTableWatcher {
016    
017        private static final Logger LOG = Logger.getLogger(JXTableWatcher.class);
018    
019        public static void initialize(JXTable table, Preferences preferences, List tableColumns) {
020    
021            List columns = table.getColumns(true);
022    
023            for (int i = 0; i < columns.size(); i++) {
024                TableColumnExt columnExt = (TableColumnExt) columns.get(i);
025                String key = "visible." + i;
026                String visible = preferences.get(key, null);
027                columnExt.addPropertyChangeListener(new VisibleListener(preferences, key)); // watch for changes
028    
029                if (visible != null) {
030    
031                    columnExt.setVisible(Boolean.parseBoolean(visible)); // set saved visible
032    
033                } else if (tableColumns.size() > i) {
034    
035                    Table.Column tableColumn = (Table.Column) tableColumns.get(i);
036                    columnExt.setVisible(tableColumn.isDefaultVisible());
037    
038                }
039    
040            }
041        }
042    
043    
044        /**
045         * when visibility changes.. record that to the map
046         */
047        private static class VisibleListener implements PropertyChangeListener {
048            private final Preferences preferences;
049            private final String key;
050    
051            public VisibleListener(Preferences preferences, String key) {
052                this.preferences = preferences;
053                this.key = key;
054            }
055    
056            public void propertyChange(PropertyChangeEvent evt) {
057                if ("visible".equals(evt.getPropertyName())) {
058                    //LOG.info("propertyChange " + key + " " + evt.getNewValue());
059                    preferences.put(key, evt.getNewValue().toString());
060                }
061            }
062        }
063    }