001 package data.stdforms; 002 003 import java.awt.BorderLayout; 004 import java.awt.Dimension; 005 006 import javax.swing.BorderFactory; 007 import javax.swing.JPanel; 008 import javax.swing.JTextArea; 009 import javax.swing.event.ListSelectionEvent; 010 import javax.swing.event.ListSelectionListener; 011 012 import sale.FormSheet; 013 import sale.FormSheetContentCreator; 014 import util.swing.AbstractTableModel; 015 import util.swing.JAbstractTable; 016 import data.stdforms.SingleTableFormSheet; 017 import data.stdforms.TwoTableFormSheet; 018 import data.stdforms.descriptiveformsheet.Descriptive; 019 020 /** 021 * A FormSheet that can extend Single- and TwoTableFormSheets by a description 022 * element. The element will be placed underneath the table(s) and have the 023 * given caption. 024 * 025 * <p>In order to display the actual description, the records of the data containers 026 * modelled by the table are considered to implement the {@link Descriptive} 027 * interface. If so, their {@link Descriptive#getDescription() getDescription()} 028 * method will be called to get the actual description. If they do not, nothing will 029 * be displayed. 030 * </p> 031 * 032 * @author Thomas Ryssel 033 * @version 3.3 034 * 035 * @see Descriptive 036 */ 037 public class DescriptiveFormSheet extends FormSheet { 038 039 /** 040 * ID for serialization. 041 */ 042 private static final long serialVersionUID = -3413917194160476340L; 043 044 /** 045 * Keep a reference to the SingleTableFormSheet (if given). 046 */ 047 private SingleTableFormSheet stfsReference = null; 048 049 /** 050 * Keep a reference to the TwoTableFormSheet (if given). 051 */ 052 private TwoTableFormSheet ttfsReference = null; 053 054 /** 055 * Construct a new DescriptiveFormSheet from the given SingleTableFormSheet. 056 * 057 * @param stfs The SingleTableFormSheet which to extend. 058 * @param caption Caption of the description box at the bottom. 059 */ 060 public DescriptiveFormSheet(SingleTableFormSheet stfs, final String caption) { 061 super(stfs.getCaption(), stfs.getComponent(), false); 062 stfsReference = stfs; 063 addContentCreator( 064 new FormSheetContentCreator() { 065 private static final long serialVersionUID = -3431604916051231570L; 066 protected void createFormSheetContent(FormSheet fs) { 067 JPanel container = new JPanel(new BorderLayout()); 068 069 final JTextArea description = new JTextArea(""); 070 description.setPreferredSize(new Dimension(-1, 100)); 071 description.setBorder(BorderFactory.createTitledBorder(caption)); 072 container.add(description, BorderLayout.SOUTH); 073 074 container.add(stfsReference.getComponent(), BorderLayout.CENTER); 075 stfsReference.getTable().getSelectionModel().addListSelectionListener( 076 new ListSelectionListener() { 077 public void valueChanged(ListSelectionEvent e) { 078 // we cannot rely on stfsReference.getSelectedRecord() since their is no 079 // guarantee on the order in which the selection listeners to the 080 // AbstractTableModel are called, therefore getSelectedRecord() could 081 // return an old reference. 082 JAbstractTable table = (JAbstractTable) stfsReference.getTable(); 083 AbstractTableModel model = table.getAbstractTableModel(); 084 Object record = model.getRecord(table.getSelectedRow()); 085 if (record != null && record instanceof Descriptive) { 086 description.setText(((Descriptive)record).getDescription()); 087 } else { 088 description.setText(""); 089 } 090 } 091 } 092 ); 093 fs.setComponent(container); 094 } 095 }); 096 } 097 098 /** 099 * Construct a new DescriptiveFormSheet from the given TwoTableFormSheet. 100 * 101 * @param ttfs The TwoTableFormSheet which to extend. 102 * @param caption Caption of the description box at the bottom. 103 */ 104 public DescriptiveFormSheet(TwoTableFormSheet ttfs, final String caption) { 105 super(ttfs.getCaption(), ttfs.getComponent(), false); 106 ttfsReference = ttfs; 107 addContentCreator( 108 new FormSheetContentCreator() { 109 private static final long serialVersionUID = -3431604916051231570L; 110 protected void createFormSheetContent(FormSheet fs) { 111 JPanel container = new JPanel(new BorderLayout()); 112 113 final JTextArea description = new JTextArea(""); 114 description.setPreferredSize(new Dimension(-1, 100)); 115 description.setBorder(BorderFactory.createTitledBorder(caption)); 116 container.add(description, BorderLayout.SOUTH); 117 118 container.add(ttfsReference.getComponent(), BorderLayout.CENTER); 119 ttfsReference.getLeftTable().getSelectionModel().addListSelectionListener( 120 new ListSelectionListener() { 121 public void valueChanged(ListSelectionEvent e) { 122 // we cannot rely on ttfsReference.getLeftSelectedRecord() since their is no 123 // guarantee on the order in which the selection listeners to the 124 // AbstractTableModel are called, therefore getLeftSelectedRecord() could 125 // return an old reference. 126 JAbstractTable table = (JAbstractTable) ttfsReference.getLeftTable(); 127 AbstractTableModel model = table.getAbstractTableModel(); 128 Object record = model.getRecord(table.getSelectedRow()); 129 if (record != null && record instanceof Descriptive) { 130 description.setText(((Descriptive)record).getDescription()); 131 } else { 132 description.setText(""); 133 } 134 } 135 } 136 ); 137 fs.setComponent(container); 138 } 139 }); 140 } 141 142 /** 143 * Get the SingleTableFormSheet this formsheet was constructed with (if so), 144 * or <code>null</code> in any other case. 145 * 146 * @return The original SingleTableFormSheet. 147 */ 148 public SingleTableFormSheet getSingleTableFormSheet() { 149 return stfsReference; 150 } 151 152 /** 153 * Get the TwoTableFormSheet this formsheet was constructed with (if so), 154 * or <code>null</code> in any other case. 155 * 156 * @return The original TwoTableFormSheet. 157 */ 158 public TwoTableFormSheet getTwoTableFormSheet() { 159 return ttfsReference; 160 } 161 162 }