/* * ColumnWidthTracker.java * * Created on 03 June 2005, 10:16 */ package org.owasp.webscarab.ui.swing; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; import java.util.List; import java.util.LinkedList; import java.util.Iterator; import javax.swing.JTable; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.event.TableColumnModelEvent; import javax.swing.event.TableColumnModelListener; import org.owasp.webscarab.model.Preferences; /** * * @author rogan */ public class ColumnWidthTracker implements PropertyChangeListener, TableColumnModelListener { private static HashMap<String, ColumnWidthTracker> _trackers = new HashMap<String, ColumnWidthTracker>(); private String _key; private List<TableColumnModel> _tracked = new LinkedList<TableColumnModel>(); public static ColumnWidthTracker getTracker(String key) { ColumnWidthTracker tracker = _trackers.get(key); if (tracker == null) { tracker = new ColumnWidthTracker(key); _trackers.put(key, tracker); } return tracker; } /** Creates a new instance of ColumnWidthTracker */ protected ColumnWidthTracker(String key) { _key = key; } public void addTable(JTable table) { TableColumnModel tcm = table.getColumnModel(); for (int i=0; i<tcm.getColumnCount(); i++) { TableColumn tc = tcm.getColumn(i); addColumn(tc); } tcm.addColumnModelListener(this); _tracked.add(tcm); } public void removeTable(JTable table) { TableColumnModel tcm = table.getColumnModel(); for (int i=0; i<tcm.getColumnCount(); i++) { TableColumn tc = tcm.getColumn(i); tc.removePropertyChangeListener(this); } tcm.removeColumnModelListener(this); _tracked.remove(tcm); } public void propertyChange(PropertyChangeEvent evt) { String property = evt.getPropertyName(); if (property == null || !"preferredWidth".equals(property)) return; if (! (evt.getSource() instanceof TableColumn)) return; TableColumn tc = (TableColumn) evt.getSource(); String name = String.valueOf(tc.getHeaderValue()); int width = tc.getPreferredWidth(); Preferences.setPreference(_key + "." + name + ".width", String.valueOf(width)); Iterator<TableColumnModel> it = _tracked.iterator(); while (it.hasNext()) { TableColumnModel tcm = it.next(); for (int i=0; i<tcm.getColumnCount(); i++) { TableColumn tc2 = tcm.getColumn(i); String name2 = String.valueOf(tc2.getHeaderValue()); if (name.equals(name2) && tc != tc2 && tc2.getPreferredWidth() != width) tc2.setPreferredWidth(width); } } } private void addColumn(TableColumn tc) { String name = String.valueOf(tc.getHeaderValue()); String preferredWidth = Preferences.getPreference(_key + "." + name + ".width"); if (preferredWidth != null) { try { int width = Integer.parseInt(preferredWidth); tc.setPreferredWidth(width); } catch (NumberFormatException nfe) {} } tc.addPropertyChangeListener(this); } public void columnAdded(TableColumnModelEvent e) { int index = e.getToIndex(); TableColumnModel tcm = (TableColumnModel) e.getSource(); TableColumn tc = tcm.getColumn(index); addColumn(tc); } public void columnMarginChanged(javax.swing.event.ChangeEvent e) {} public void columnMoved(TableColumnModelEvent e) {} public void columnRemoved(TableColumnModelEvent e) { int index = e.getToIndex(); TableColumnModel tcm = (TableColumnModel) e.getSource(); if (index >= tcm.getColumnCount()) return; TableColumn tc = tcm.getColumn(index); tc.removePropertyChangeListener(this); } public void columnSelectionChanged(javax.swing.event.ListSelectionEvent e) {} }