001    package data.stdforms;
002    
003    import sale.*;
004    import data.*;
005    import data.stdforms.singletableformsheet.*;
006    import data.swing.*;
007    import util.swing.*;
008    
009    import java.util.Comparator;
010    import javax.swing.*;
011    import javax.swing.table.TableModel; //for Javadoc
012    
013    /**
014     * A FormSheet displaying the contents of a {@link Catalog}, {@link Stock} or {@link DataBasket}.
015     *
016     * <p>The FormSheet will comprise one table that renders the contents of the container to be displayed.
017     * Additionally, there can be to extra buttons in the FormSheet's button bar that can be used to add or
018     * remove records to/from the container. The actions linked to these buttons will be represented as
019     * sub-processes to the process which displayed the FormSheet. The actual sub-process will be created by a
020     * {@link EditButtonStrategy strategy object}.</p>
021     *
022     * <p>SingleTableFormSheets assume to be displayed at a {@link UIGate user interface gate}. However, if you
023     * do not want to add editing capabilities, you may set this parameter to <code>null</code> and use the
024             * FormSheet as you would any other FormSheet. If you need editing capabilities, you must set the FormSheet at
025     * a UIGate.</p>
026     *
027     * <p>Various <code>create()</code> methods are offered that cover the entire spectrum of possible
028             * SingleTableFormSheets. All you need to do is select the <code>create()</code> method that fits your purpose
029     * and use it in your application.</p>
030     *
031     * @author Steffen Zschaler
032     * @version 2.0 20/08/1999
033     * @since v2.0
034     */
035    public class SingleTableFormSheet extends FormSheet {
036    
037        /**
038         * The button id that is used for the "Add" button.
039         */
040        public static final int BTNID_ADD = -100;
041    
042        /**
043         * The button id that is used for the "Remove" button.
044         */
045        public static final int BTNID_REMOVE = -101;
046    
047        /**
048         * Reference to the currently selected index.
049         *
050         * @serial
051         */
052        private int[] m_anSelection = new int[] {
053                 -1};
054    
055        /**
056         * The displayed table.
057         */
058        private JTable m_table;
059    
060        /**
061         * The source of the displayed table, can be Catalog, CountingStock, StoringStock, Databasket...
062         */
063        private Object m_source;
064    
065        /**
066         * The DataBasket assigned to the table.
067         */
068        private DataBasket m_db;
069    
070        /**
071         * The {@link TableModel} of the table displayed.
072         */
073        private transient util.swing.AbstractTableModel m_atmModel;
074    
075        /**
076         * The {@link Gate} at which the FormSheet is being displayed.
077         *
078         * @serial
079         */
080        private UIGate m_uigGate;
081    
082        /**
083         * Create a new SingleTableFormSheet. The "{@link FormSheet#waitResponse}" property will default
084         * to true.
085         *
086         * <p>Instead of calling this method, call one of the <code>create()</code> methods provided.
087         *
088         * @param sCaption the FormSheet's caption.
089         * @param uigGate the Gate at which the FormSheet is displayed.
090         * @param fscc the content creator to be used to create the FormSheet's contents.
091         */
092        protected SingleTableFormSheet(String sCaption, UIGate uigGate, FormSheetContentCreator fscc) {
093            super(sCaption, (JComponent)null, true);
094    
095            setGate(uigGate);
096    
097            // we call addContentCreator here to allow for m_anSelection to be initialized before.
098            // We cannot give fscc as a parameter to the superclass constructor, as m_anSelection would then not
099            // be initialized when the content creator is called to create the FormSheet's contents.
100            addContentCreator(fscc);
101        }
102    
103        /**
104         * Set the gate at which to display the FormSheet. This will also move the FormSheet to that gate, i.e. make
105         * the FormSheet the FormSheet of the given gate.
106         *
107         * @param uigGate the new Gate.
108         *
109         * @override Never
110         *
111         * @see UIGate#setFormSheet
112         */
113        public void setGate(UIGate uigGate) {
114            if (m_uigGate != null) {
115                m_uigGate.setFormSheet(null);
116            }
117    
118            m_uigGate = uigGate;
119    
120            if (m_uigGate != null) {
121                m_uigGate.setFormSheet(this);
122            }
123        }
124    
125        /**
126         * Get the Gate this FormSheet is currently being displayed at.
127         *
128         * @override Never
129         */
130        public UIGate getGate() {
131            return m_uigGate;
132        }
133    
134        /**
135         * Get the record currently selected.
136         *
137         * <p>The actual class of the record depends on the concrete type of
138         * TableModel used. See the TableModel's <code>getRecord()</code> method for
139         * details. To find out, which TableModel is used by your specific instance
140         * of <code>SingleTableFormSheet</code> refer to the documentation of the
141         * <code>create()</code> method you used to instantiate it.</p>
142         */
143        public Object getSelectedRecord() {
144            return m_atmModel.getRecord(m_anSelection[0]);
145        }
146    
147        /**
148         * Get the currently attached DataBasket.
149         *
150         * @override Never
151         */
152        public DataBasket getDataBasket() {
153            return m_db;
154        }
155    
156        /**
157         * Get the table's source.
158         *
159         * @override Never
160         */
161        public Object getTableSource() {
162            return m_source;
163        }
164    
165        /**
166         * Get the table.
167         *
168         * @override Never
169         */
170        public JTable getTable() {
171            return m_table;
172        }
173    
174        /**
175         * Changes the {@link TableModel} of a table.
176         * @param tm the new TableModel
177         */
178        public void setTableModel(AbstractTableModel tm) {
179            m_atmModel.fireTableDataChanged(); //unselect a possibly selected record
180            if (tm instanceof TableSorter) {
181                m_atmModel = tm;
182            } else {
183                m_atmModel = new TableSorter(tm);
184            }
185            m_table.setModel(m_atmModel);
186    
187            ((JAbstractTable)m_table).initialize();
188        }
189    
190        /**
191         * Convenience method. Equivalent to:
192         *
193         * <pre>
194         * {@link #addAddButton addAddButton} (ebsAdd);
195         * {@link #addRemoveButton addRemoveButton} (ebsRemove);
196         * </pre>
197         *
198         * <p>This method must be called from within a content creator if you need serializability.</p>
199         *
200         * @override Never
201         */
202        public void addEditingButtons(EditButtonStrategy ebsAdd, EditButtonStrategy ebsRemove) {
203            addAddButton(ebsAdd);
204            addRemoveButton(ebsRemove);
205        }
206    
207        /**
208         * Add to the FormSheet a button that will allow the user to add records to the container being displayed.
209         *
210         * <p>The button will by default have a caption of "Add" and a button id of {@link #BTNID_ADD}.
211         * The button's action will trigger the sub-process defined by <code>ebsAdd</code>.</p>
212         *
213         * <p>This method must be called from within a content creator if you need serializability.</p>
214         *
215         * @param ebsAdd a strategy defining the sub-process to be used for adding a record. For a
216         * SingleTableFormSheet displaying a Catalog, {@link AbstractAddCatalogItemStrategy} is already part of the
217         * Framework.
218         *
219         * @override Never
220         */
221        public void addAddButton(final EditButtonStrategy ebsAdd) {
222            removeButton(BTNID_ADD);
223    
224            addButton("Add", BTNID_ADD, new sale.Action() {
225                public void doAction(SaleProcess p, SalesPoint sp) {
226                    getGate().setNextTransition(ebsAdd.getEditProcess(SingleTableFormSheet.this, p, sp));
227                }
228            });
229        }
230    
231        /**
232         * Add to the FormSheet a button that will allow the user to remove the currently selected record from the
233         * container being displayed.
234         *
235         * <p>The button will by default have a caption of "Remove" and a button id of
236         * {@link #BTNID_REMOVE}. The button's action will trigger the sub-process defined by
237         * <code>ebsRemove</code>.</p>
238         *
239         * <p>This method must be called from within a content creator if you need serializability.</p>
240         *
241         * @param ebsRemove a strategy defining the sub-process to be used for removing a record. For a
242         * SingleTableFormSheet displaying a Catalog, {@link DefaultRemoveCatalogItemStrategy} is already part of
243         * the Framework.
244         *
245         * @override Never
246         */
247        public void addRemoveButton(final EditButtonStrategy ebsRemove) {
248            removeButton(BTNID_REMOVE);
249    
250            addButton("Remove", BTNID_REMOVE, new sale.Action() {
251                public void doAction(SaleProcess p, SalesPoint sp) {
252                    getGate().setNextTransition(ebsRemove.getEditProcess(SingleTableFormSheet.this, p, sp));
253                }
254            });
255        }
256    
257        /**
258         * Convenience method for removing the "Add" and the "Remove" button.
259         *
260         * @override Never
261         */
262        public void removeEditButtons() {
263            removeButton(BTNID_REMOVE);
264            removeButton(BTNID_ADD);
265        }
266    
267        /**
268         * Helper class forming the foundation of all SingleTableFormSheet content creators.
269         *
270         * @author Steffen Zschaler
271         * @version 2.0 20/08/1999
272         * @since v2.0
273         */
274        private static abstract class STFSContentCreator extends FormSheetContentCreator {
275    
276            /**
277             * Set the given table to be the component of the given FormSheet. Also, link the FormSheet's selection
278             * observer accordingly.
279             *
280             * @override Never
281             */
282            protected void setFormSheetComponent(SingleTableFormSheet stfs, JAbstractTable jat) {
283                stfs.setComponent(new JScrollPane(jat));
284    
285                stfs.m_atmModel = (util.swing.AbstractTableModel)jat.getModel();
286                stfs.m_table = jat;
287    
288                jat.setSelectionObserver(stfs.m_anSelection);
289            }
290        }
291    
292        // JCatalogTable FormSheet creators
293    
294        /**
295         * Create and return a new SingleTableFormSheet that will display the contents of a Catalog.
296         *
297         * <p>The FormSheet will contain a {@link JCatalogTable}, the individual records are
298         * {@link CatalogItem CatalogItems}.</p>
299         *
300         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>, the sorting
301         * order defaults to the natural ordering of the CatalogItems. If <code>c</code> is a {@link Currency},
302         * the {@link TableEntryDescriptor} defaults to a {@link DefaultCurrencyItemTED} using <code>c</code> to
303         * format values. Otherwise, it defaults to a {@link DefaultCatalogItemTED}.</p>
304         *
305         * @param sCaption the caption of the new FormSheet.
306         * @param c the Catalog whose contents are to be displayed.
307         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
308         * performed through the FormSheet.
309         */
310        public static SingleTableFormSheet create(String sCaption, Catalog c, UIGate uigGate) {
311            return create(sCaption, c, uigGate, null, null,
312                    ((c instanceof data.Currency) ? (new DefaultCurrencyItemTED((data.Currency)c)) :
313                    (new DefaultCatalogItemTED())));
314        }
315    
316        /**
317         * Create and return a new SingleTableFormSheet that will display the contents of a Catalog.
318         *
319         * <p>The FormSheet will contain a {@link JCatalogTable}, the individual records are
320         * {@link CatalogItem CatalogItems}.</p>
321         *
322         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>, the sorting
323         * order defaults to the natural ordering of the CatalogItems.</p>
324         *
325         * @param sCaption the caption of the new FormSheet.
326         * @param c the Catalog whose contents are to be displayed.
327         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
328         * performed through the FormSheet.
329         * @param ted a TableEntryDescriptor that can split individual CatalogItems into a table's cells. Must not
330         * be <code>null</code>.
331         */
332        public static SingleTableFormSheet create(String sCaption, Catalog c, UIGate uigGate,
333                TableEntryDescriptor ted) {
334            return create(sCaption, c, uigGate, null, null, ted);
335        }
336    
337        /**
338         * Create and return a new SingleTableFormSheet that will display the contents of a Catalog.
339         *
340         * <p>The FormSheet will contain a {@link JCatalogTable}, the individual records are
341         * {@link CatalogItem CatalogItems}.</p>
342         *
343         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>. If
344         * <code>c</code> is a {@link Currency}, the {@link TableEntryDescriptor} defaults to a
345         * {@link DefaultCurrencyItemTED} using <code>c</code> to format values. Otherwise, it defaults to a
346         * {@link DefaultCatalogItemTED}.</p>
347         *
348         * @param sCaption the caption of the new FormSheet.
349         * @param c the Catalog whose contents are to be displayed.
350         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
351         * performed through the FormSheet.
352         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
353         * the natural ordering of the CatalogItems will be followed.
354         */
355        public static SingleTableFormSheet create(String sCaption, Catalog c, UIGate uigGate, Comparator cmp) {
356            return create(sCaption, c, uigGate, null, cmp,
357                    ((c instanceof data.Currency) ? (new DefaultCurrencyItemTED((data.Currency)c)) :
358                    (new DefaultCatalogItemTED())));
359        }
360    
361        /**
362         * Create and return a new SingleTableFormSheet that will display the contents of a Catalog.
363         *
364         * <p>The FormSheet will contain a {@link JCatalogTable}, the individual records are
365         * {@link CatalogItem CatalogItems}.</p>
366         *
367         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>.</p>
368         *
369         * @param sCaption the caption of the new FormSheet.
370         * @param c the Catalog whose contents are to be displayed.
371         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
372         * performed through the FormSheet.
373         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
374         * the natural ordering of the CatalogItems will be followed.
375         * @param ted a TableEntryDescriptor that can split individual CatalogItems into a table's cells. Must not
376         * be <code>null</code>.
377         */
378        public static SingleTableFormSheet create(String sCaption, Catalog c, UIGate uigGate, Comparator cmp,
379                TableEntryDescriptor ted) {
380            return create(sCaption, c, uigGate, null, cmp, ted);
381        }
382    
383        /**
384         * Create and return a new SingleTableFormSheet that will display the contents of a Catalog.
385         *
386         * <p>The FormSheet will contain a {@link JCatalogTable}, the individual records are
387         * {@link CatalogItem CatalogItems}.</p>
388         *
389         * <p>The sorting order defaults to the natural ordering of the CatalogItems. If <code>c</code> is a
390         * {@link Currency}, the {@link TableEntryDescriptor} defaults to a {@link DefaultCurrencyItemTED} using
391         * <code>c</code> to format values. Otherwise, it defaults to a {@link DefaultCatalogItemTED}.</p>
392         *
393         * @param sCaption the caption of the new FormSheet.
394         * @param c the Catalog whose contents are to be displayed.
395         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
396         * performed through the FormSheet.
397         * @param db the DataBasket that is used to determine visibility of items.
398         */
399        public static SingleTableFormSheet create(String sCaption, Catalog c, UIGate uigGate, DataBasket db) {
400            return create(sCaption, c, uigGate, db, null,
401                    ((c instanceof data.Currency) ? (new DefaultCurrencyItemTED((data.Currency)c)) :
402                    (new DefaultCatalogItemTED())));
403        }
404    
405        /**
406         * Create and return a new SingleTableFormSheet that will display the contents of a Catalog.
407         *
408         * <p>The FormSheet will contain a {@link JCatalogTable}, the individual records are
409         * {@link CatalogItem CatalogItems}.</p>
410         *
411         * <p>The sorting order defaults to the natural ordering of the CatalogItems.</p>
412         *
413         * @param sCaption the caption of the new FormSheet.
414         * @param c the Catalog whose contents are to be displayed.
415         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
416         * performed through the FormSheet.
417         * @param db the DataBasket that is used to determine visibility of items.
418         * @param ted a TableEntryDescriptor that can split individual CatalogItems into a table's cells. Must not
419         * be <code>null</code>.
420         */
421        public static SingleTableFormSheet create(String sCaption, Catalog c, UIGate uigGate, DataBasket db,
422                TableEntryDescriptor ted) {
423            return create(sCaption, c, uigGate, db, null, ted);
424        }
425    
426        /**
427         * Create and return a new SingleTableFormSheet that will display the contents of a Catalog.
428         *
429         * <p>The FormSheet will contain a {@link JCatalogTable}, the individual records are
430         * {@link CatalogItem CatalogItems}.</p>
431         *
432         * <p>If <code>c</code> is a {@link Currency}, the {@link TableEntryDescriptor} defaults to a
433         * {@link DefaultCurrencyItemTED} using <code>c</code> to format values. Otherwise, it defaults to a
434         * {@link DefaultCatalogItemTED}.</p>
435         *
436         * @param sCaption the caption of the new FormSheet.
437         * @param c the Catalog whose contents are to be displayed.
438         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
439         * performed through the FormSheet.
440         * @param db the DataBasket that is used to determine visibility of items.
441         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
442         * the natural ordering of the CatalogItems will be followed.
443         */
444        public static SingleTableFormSheet create(String sCaption, Catalog c, UIGate uigGate, DataBasket db,
445                Comparator cmp) {
446            return create(sCaption, c, uigGate, db, cmp,
447                    ((c instanceof data.Currency) ? (new DefaultCurrencyItemTED((data.Currency)c)) :
448                    (new DefaultCatalogItemTED())));
449        }
450    
451        /**
452         * Create and return a new SingleTableFormSheet that will display the contents of a Catalog.
453         *
454         * <p>The FormSheet will contain a {@link JCatalogTable}, the individual records are
455         * {@link CatalogItem CatalogItems}.</p>
456         *
457         * @param sCaption the caption of the new FormSheet.
458         * @param c the Catalog whose contents are to be displayed.
459         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
460         * performed through the FormSheet.
461         * @param db the DataBasket that is used to determine visibility of items.
462         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
463         * the natural ordering of the CatalogItems will be followed.
464         * @param ted a TableEntryDescriptor that can split individual CatalogItems into a table's cells. Must not
465         * be <code>null</code>.
466         */
467        public static SingleTableFormSheet create(String sCaption, final Catalog c, UIGate uigGate,
468                final DataBasket db, final Comparator cmp, final TableEntryDescriptor ted) {
469            return new SingleTableFormSheet(sCaption, uigGate, new STFSContentCreator() {
470                protected void createFormSheetContent(FormSheet fs) {
471                    final SingleTableFormSheet stfs = (SingleTableFormSheet)fs;
472                    JCatalogTable jct = new JCatalogTable(c, db, cmp, ted);
473    
474                    setFormSheetComponent((SingleTableFormSheet)fs, jct);
475                    stfs.m_source = c;
476                    stfs.m_db = db;
477                }
478            });
479        }
480    
481        // JCountingStockTable FormSheet creators
482    
483        /**
484         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
485         *
486         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
487         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
488         *
489         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>, the sorting
490         * order defaults to the natural ordering of the keys. Lines containing '0' in the "Count" column
491         * will by default be hidden. If <code>cs</code> is a {@link MoneyBag}, the {@link TableEntryDescriptor}
492         * defaults to a {@link DefaultMoneyBagItemTED} using <code>cs.getCatalog()</code> to format values.
493         * Otherwise, it defaults to a {@link DefaultCountingStockItemTED}.</p>
494         *
495         * @param sCaption the caption of the new FormSheet.
496         * @param cs the CountingStock whose contents are to be displayed.
497         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
498         * performed through the FormSheet.
499         */
500        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate) {
501            return create(sCaption, cs, uigGate, null, null, false,
502                    ((cs instanceof MoneyBag) ? (new DefaultMoneyBagItemTED((data.Currency)cs.getCatalog(null))) :
503                    (new DefaultCountingStockItemTED())));
504        }
505    
506        /**
507         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
508         *
509         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
510         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
511         *
512         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>, the sorting
513         * order defaults to the natural ordering of the keys. Lines containing '0' in the "Count" column
514         * will by default be hidden.</p>
515         *
516         * @param sCaption the caption of the new FormSheet.
517         * @param cs the CountingStock whose contents are to be displayed.
518         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
519         * performed through the FormSheet.
520         * @param ted a TableEntryDescriptor that can split individual
521         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records} into a table's cells. Must not be
522         * <code>null</code>.
523         */
524        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
525                TableEntryDescriptor ted) {
526            return create(sCaption, cs, uigGate, null, null, false, ted);
527        }
528    
529        /**
530         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
531         *
532         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
533         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
534         *
535         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>, the sorting
536         * order defaults to the natural ordering of the keys. If <code>cs</code> is a {@link MoneyBag}, the
537         * {@link TableEntryDescriptor} defaults to a {@link DefaultMoneyBagItemTED} using
538         * <code>cs.getCatalog()</code> to format values. Otherwise, it defaults to a
539         * {@link DefaultCountingStockItemTED}.</p>
540         *
541         * @param sCaption the caption of the new FormSheet.
542         * @param cs the CountingStock whose contents are to be displayed.
543         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
544         * performed through the FormSheet.
545         * @param fShowZeros if false, lines containing a '0' in the "Count" field will be hidden.
546         */
547        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
548                boolean fShowZeros) {
549            return create(sCaption, cs, uigGate, null, null, fShowZeros,
550                    ((cs instanceof MoneyBag) ? (new DefaultMoneyBagItemTED((data.Currency)cs.getCatalog(null))) :
551                    (new DefaultCountingStockItemTED())));
552        }
553    
554        /**
555         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
556         *
557         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
558         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
559         *
560         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>, the sorting
561         * order defaults to the natural ordering of the keys.</p>
562         *
563         * @param sCaption the caption of the new FormSheet.
564         * @param cs the CountingStock whose contents are to be displayed.
565         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
566         * performed through the FormSheet.
567         * @param fShowZeros if false, lines containing a '0' in the "Count" field will be hidden.
568         * @param ted a TableEntryDescriptor that can split individual
569         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records} into a table's cells. Must not be
570         * <code>null</code>.
571         */
572        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
573                boolean fShowZeros, TableEntryDescriptor ted) {
574            return create(sCaption, cs, uigGate, null, null, fShowZeros, ted);
575        }
576    
577        /**
578         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
579         *
580         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
581         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
582         *
583         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>. Lines
584         * containing '0' in the "Count" column will by default be hidden. If <code>cs</code> is a
585         * {@link MoneyBag}, the {@link TableEntryDescriptor} defaults to a {@link DefaultMoneyBagItemTED} using
586         * <code>cs.getCatalog()</code> to format values. Otherwise, it defaults to a
587         * {@link DefaultCountingStockItemTED}.</p>
588         *
589         * @param sCaption the caption of the new FormSheet.
590         * @param cs the CountingStock whose contents are to be displayed.
591         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
592         * performed through the FormSheet.
593         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
594         * the records will be ordered by their keys.
595         */
596        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
597                Comparator cmp) {
598            return create(sCaption, cs, uigGate, null, cmp, false,
599                    ((cs instanceof MoneyBag) ? (new DefaultMoneyBagItemTED((data.Currency)cs.getCatalog(null))) :
600                    (new DefaultCountingStockItemTED())));
601        }
602    
603        /**
604         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
605         *
606         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
607         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
608         *
609         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>. Lines
610         * containing '0' in the "Count" column will by default be hidden.</p>
611         *
612         * @param sCaption the caption of the new FormSheet.
613         * @param cs the CountingStock whose contents are to be displayed.
614         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
615         * performed through the FormSheet.
616         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
617         * the records will be ordered by their keys.
618         * @param ted a TableEntryDescriptor that can split individual
619         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records} into a table's cells. Must not be
620         * <code>null</code>.
621         */
622        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
623                Comparator cmp, TableEntryDescriptor ted) {
624            return create(sCaption, cs, uigGate, null, cmp, false, ted);
625        }
626    
627        /**
628         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
629         *
630         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
631         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
632         *
633         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>. If
634         * <code>cs</code> is a {@link MoneyBag}, the {@link TableEntryDescriptor} defaults to a
635         * {@link DefaultMoneyBagItemTED} using <code>cs.getCatalog()</code> to format values. Otherwise, it
636         * defaults to a {@link DefaultCountingStockItemTED}.</p>
637         *
638         * @param sCaption the caption of the new FormSheet.
639         * @param cs the CountingStock whose contents are to be displayed.
640         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
641         * performed through the FormSheet.
642         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
643         * the records will be ordered by their keys.
644         * @param fShowZeros if false, lines containing a '0' in the "Count" field will be hidden.
645         */
646        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
647                Comparator cmp, boolean fShowZeros) {
648            return create(sCaption, cs, uigGate, null, cmp, fShowZeros,
649                    ((cs instanceof MoneyBag) ? (new DefaultMoneyBagItemTED((data.Currency)cs.getCatalog(null))) :
650                    (new DefaultCountingStockItemTED())));
651        }
652    
653        /**
654         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
655         *
656         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
657         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
658         *
659         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>.</p>
660         *
661         * @param sCaption the caption of the new FormSheet.
662         * @param cs the CountingStock whose contents are to be displayed.
663         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
664         * performed through the FormSheet.
665         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
666         * the records will be ordered by their keys.
667         * @param fShowZeros if false, lines containing a '0' in the "Count" field will be hidden.
668         * @param ted a TableEntryDescriptor that can split individual
669         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records} into a table's cells. Must not be
670         * <code>null</code>.
671         */
672        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
673                Comparator cmp, boolean fShowZeros, TableEntryDescriptor ted) {
674            return create(sCaption, cs, uigGate, null, cmp, fShowZeros, ted);
675        }
676    
677        /**
678         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
679         *
680         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
681         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
682         *
683         * <p>The sorting order defaults to the natural ordering of the keys. Lines containing '0' in the
684         * "Count" column will by default be hidden. If <code>cs</code> is a {@link MoneyBag}, the
685         * {@link TableEntryDescriptor} defaults to a {@link DefaultMoneyBagItemTED} using
686         * <code>cs.getCatalog()</code> to format values. Otherwise, it defaults to a
687         * {@link DefaultCountingStockItemTED}.</p>
688         *
689         * @param sCaption the caption of the new FormSheet.
690         * @param cs the CountingStock whose contents are to be displayed.
691         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
692         * performed through the FormSheet.
693         * @param db the DataBasket that is used to determine visibility of items.
694         */
695        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
696                DataBasket db) {
697            return create(sCaption, cs, uigGate, db, null, false,
698                    ((cs instanceof MoneyBag) ? (new DefaultMoneyBagItemTED((data.Currency)cs.getCatalog(db))) :
699                    (new DefaultCountingStockItemTED())));
700        }
701    
702        /**
703         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
704         *
705         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
706         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
707         *
708         * <p>The sorting order defaults to the natural ordering of the keys. Lines containing '0' in the
709         * "Count" column will by default be hidden.</p>
710         *
711         * @param sCaption the caption of the new FormSheet.
712         * @param cs the CountingStock whose contents are to be displayed.
713         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
714         * performed through the FormSheet.
715         * @param db the DataBasket that is used to determine visibility of items.
716         * @param ted a TableEntryDescriptor that can split individual
717         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records} into a table's cells. Must not be
718         * <code>null</code>.
719         */
720        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
721                DataBasket db, TableEntryDescriptor ted) {
722            return create(sCaption, cs, uigGate, db, null, false, ted);
723        }
724    
725        /**
726         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
727         *
728         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
729         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
730         *
731         * <p>The sorting order defaults to the natural ordering of the keys. If <code>cs</code> is a
732         * {@link MoneyBag}, the {@link TableEntryDescriptor} defaults to a {@link DefaultMoneyBagItemTED} using
733         * <code>cs.getCatalog()</code> to format values. Otherwise, it defaults to a
734         * {@link DefaultCountingStockItemTED}.</p>
735         *
736         * @param sCaption the caption of the new FormSheet.
737         * @param cs the CountingStock whose contents are to be displayed.
738         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
739         * performed through the FormSheet.
740         * @param db the DataBasket that is used to determine visibility of items.
741         * @param fShowZeros if false, lines containing a '0' in the "Count" field will be hidden.
742         */
743        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
744                DataBasket db, boolean fShowZeros) {
745            return create(sCaption, cs, uigGate, db, null, fShowZeros,
746                    ((cs instanceof MoneyBag) ? (new DefaultMoneyBagItemTED((data.Currency)cs.getCatalog(db))) :
747                    (new DefaultCountingStockItemTED())));
748        }
749    
750        /**
751         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
752         *
753         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
754         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
755         *
756         * <p>The sorting order defaults to the natural ordering of the keys.</p>
757         *
758         * @param sCaption the caption of the new FormSheet.
759         * @param cs the CountingStock whose contents are to be displayed.
760         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
761         * performed through the FormSheet.
762         * @param db the DataBasket that is used to determine visibility of items.
763         * @param fShowZeros if false, lines containing a '0' in the "Count" field will be hidden.
764         * @param ted a TableEntryDescriptor that can split individual
765         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records} into a table's cells. Must not be
766         * <code>null</code>.
767         */
768        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
769                DataBasket db, boolean fShowZeros, TableEntryDescriptor ted) {
770            return create(sCaption, cs, uigGate, db, null, fShowZeros, ted);
771        }
772    
773        /**
774         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
775         *
776         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
777         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
778         *
779         * <p>Lines containing '0' in the "Count" column will by default be hidden. If <code>cs</code> is
780         * a {@link MoneyBag}, the {@link TableEntryDescriptor} defaults to a {@link DefaultMoneyBagItemTED} using
781         * <code>cs.getCatalog()</code> to format values. Otherwise, it defaults to a
782         * {@link DefaultCountingStockItemTED}.</p>
783         *
784         * @param sCaption the caption of the new FormSheet.
785         * @param cs the CountingStock whose contents are to be displayed.
786         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
787         * performed through the FormSheet.
788         * @param db the DataBasket that is used to determine visibility of items.
789         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
790         * the records will be ordered by their keys.
791         */
792        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
793                DataBasket db, Comparator cmp) {
794            return create(sCaption, cs, uigGate, db, cmp, false,
795                    ((cs instanceof MoneyBag) ? (new DefaultMoneyBagItemTED((data.Currency)cs.getCatalog(db))) :
796                    (new DefaultCountingStockItemTED())));
797        }
798    
799        /**
800         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
801         *
802         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
803         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
804         *
805         * <p>Lines containing '0' in the "Count" column will by default be hidden.</p>
806         *
807         * @param sCaption the caption of the new FormSheet.
808         * @param cs the CountingStock whose contents are to be displayed.
809         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
810         * performed through the FormSheet.
811         * @param db the DataBasket that is used to determine visibility of items.
812         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
813         * the records will be ordered by their keys.
814         * @param ted a TableEntryDescriptor that can split individual
815         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records} into a table's cells. Must not be
816         * <code>null</code>.
817         */
818        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
819                DataBasket db, Comparator cmp, TableEntryDescriptor ted) {
820            return create(sCaption, cs, uigGate, db, cmp, false, ted);
821        }
822    
823        /**
824         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
825         *
826         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
827         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
828         *
829         * <p>If <code>cs</code> is a {@link MoneyBag}, the {@link TableEntryDescriptor} defaults to a
830         * {@link DefaultMoneyBagItemTED} using <code>cs.getCatalog()</code> to format values. Otherwise, it
831         * defaults to a {@link DefaultCountingStockItemTED}.</p>
832         *
833         * @param sCaption the caption of the new FormSheet.
834         * @param cs the CountingStock whose contents are to be displayed.
835         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
836         * performed through the FormSheet.
837         * @param db the DataBasket that is used to determine visibility of items.
838         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
839         * the records will be ordered by their keys.
840         * @param fShowZeros if false, lines containing a '0' in the "Count" field will be hidden.
841         */
842        public static SingleTableFormSheet create(String sCaption, CountingStock cs, UIGate uigGate,
843                DataBasket db, Comparator cmp, boolean fShowZeros) {
844            return create(sCaption, cs, uigGate, db, cmp, fShowZeros,
845                    ((cs instanceof MoneyBag) ? (new DefaultMoneyBagItemTED((data.Currency)cs.getCatalog(db))) :
846                    (new DefaultCountingStockItemTED())));
847        }
848    
849        /**
850         * Create and return a new SingleTableFormSheet that will display the contents of a CountingStock.
851         *
852         * <p>The FormSheet will contain a {@link JCountingStockTable}, the individual records are
853         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records}.</p>
854         *
855         * @param sCaption the caption of the new FormSheet.
856         * @param cs the CountingStock whose contents are to be displayed.
857         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
858         * performed through the FormSheet.
859         * @param db the DataBasket that is used to determine visibility of items.
860         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
861         * the records will be ordered by their keys.
862         * @param fShowZeros if false, lines containing a '0' in the "Count" field will be hidden.
863         * @param ted a TableEntryDescriptor that can split individual
864         * {@link data.swing.CountingStockTableModel.Record CountingStockTableModel records} into a table's cells. Must not be
865         * <code>null</code>.
866         */
867        public static SingleTableFormSheet create(String sCaption, final CountingStock cs, UIGate uigGate,
868                final DataBasket db, final Comparator cmp, final boolean fShowZeros,
869                final TableEntryDescriptor ted) {
870            return new SingleTableFormSheet(sCaption, uigGate, new STFSContentCreator() {
871                protected void createFormSheetContent(FormSheet fs) {
872                    final SingleTableFormSheet stfs = (SingleTableFormSheet)fs;
873                    JCountingStockTable jcst = new JCountingStockTable(cs, db, cmp, fShowZeros, ted);
874                    setFormSheetComponent((SingleTableFormSheet)fs, jcst);
875                    stfs.m_source = cs;
876                    stfs.m_db = db;
877                }
878            });
879        }
880    
881        // JStoringStockTable FormSheet creators
882    
883        /**
884         * Create and return a new SingleTableFormSheet that will display the contents of a StoringStock.
885         *
886         * <p>The FormSheet will contain a {@link JStoringStockTable}, the individual records are
887         * {@link StockItem StockItems}.</p>
888         *
889         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>, the sorting
890         * order defaults to the natural ordering of the StockItems. The {@link TableEntryDescriptor} defaults to a
891         * {@link DefaultStockItemTED}.</p>
892         *
893         * @param sCaption the caption of the new FormSheet.
894         * @param ss the StoringStock whose contents are to be displayed.
895         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
896         * performed through the FormSheet.
897         */
898        public static SingleTableFormSheet create(String sCaption, StoringStock ss, UIGate uigGate) {
899            return create(sCaption, ss, uigGate, null, null, new DefaultStockItemTED());
900        }
901    
902        /**
903         * Create and return a new SingleTableFormSheet that will display the contents of a StoringStock.
904         *
905         * <p>The FormSheet will contain a {@link JStoringStockTable}, the individual records are
906         * {@link StockItem StockItems}.</p>
907         *
908         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>, the sorting
909         * order defaults to the natural ordering of the StockItems.</p>
910         *
911         * @param sCaption the caption of the new FormSheet.
912         * @param ss the StoringStock whose contents are to be displayed.
913         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
914         * performed through the FormSheet.
915         * @param ted a TableEntryDescriptor that can split individual {@link StockItem StockItems} into a table's
916         * cells. Must not be <code>null</code>.
917         */
918        public static SingleTableFormSheet create(String sCaption, StoringStock ss, UIGate uigGate,
919                TableEntryDescriptor ted) {
920            return create(sCaption, ss, uigGate, null, null, ted);
921        }
922    
923        /**
924         * Create and return a new SingleTableFormSheet that will display the contents of a StoringStock.
925         *
926         * <p>The FormSheet will contain a {@link JStoringStockTable}, the individual records are
927         * {@link StockItem StockItems}.</p>
928         *
929         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>. The
930         * {@link TableEntryDescriptor} defaults to a {@link DefaultStockItemTED}.</p>
931         *
932         * @param sCaption the caption of the new FormSheet.
933         * @param ss the StoringStock whose contents are to be displayed.
934         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
935         * performed through the FormSheet.
936         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
937         * the natural order of the StockItems will be applied.
938         */
939        public static SingleTableFormSheet create(String sCaption, StoringStock ss, UIGate uigGate,
940                Comparator cmp) {
941            return create(sCaption, ss, uigGate, null, cmp, new DefaultStockItemTED());
942        }
943    
944        /**
945         * Create and return a new SingleTableFormSheet that will display the contents of a StoringStock.
946         *
947         * <p>The FormSheet will contain a {@link JStoringStockTable}, the individual records are
948         * {@link StockItem StockItems}.</p>
949         *
950         * <p>The {@link DataBasket} used to determine visibility will default to <code>null</code>.</p>
951         *
952         * @param sCaption the caption of the new FormSheet.
953         * @param ss the StoringStock whose contents are to be displayed.
954         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
955         * performed through the FormSheet.
956         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
957         * the natural order of the StockItems will be applied.
958         * @param ted a TableEntryDescriptor that can split individual {@link StockItem StockItems} into a table's
959         * cells. Must not be <code>null</code>.
960         */
961        public static SingleTableFormSheet create(String sCaption, StoringStock ss, UIGate uigGate,
962                Comparator cmp, TableEntryDescriptor ted) {
963            return create(sCaption, ss, uigGate, null, cmp, ted);
964        }
965    
966        /**
967         * Create and return a new SingleTableFormSheet that will display the contents of a StoringStock.
968         *
969         * <p>The FormSheet will contain a {@link JStoringStockTable}, the individual records are
970         * {@link StockItem StockItems}.</p>
971         *
972         * <p>The sorting order defaults to the natural ordering of the StockItems. The {@link TableEntryDescriptor}
973         * defaults to a {@link DefaultStockItemTED}.</p>
974         *
975         * @param sCaption the caption of the new FormSheet.
976         * @param ss the StoringStock whose contents are to be displayed.
977         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
978         * performed through the FormSheet.
979         * @param db the DataBasket that is used to determine visibility of items.
980         */
981        public static SingleTableFormSheet create(String sCaption, StoringStock ss, UIGate uigGate, DataBasket db) {
982            return create(sCaption, ss, uigGate, db, null, new DefaultStockItemTED());
983        }
984    
985        /**
986         * Create and return a new SingleTableFormSheet that will display the contents of a StoringStock.
987         *
988         * <p>The FormSheet will contain a {@link JStoringStockTable}, the individual records are
989         * {@link StockItem StockItems}.</p>
990         *
991         * <p>The sorting order defaults to the natural ordering of the StockItems.</p>
992         *
993         * @param sCaption the caption of the new FormSheet.
994         * @param ss the StoringStock whose contents are to be displayed.
995         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
996         * performed through the FormSheet.
997         * @param db the DataBasket that is used to determine visibility of items.
998         * @param ted a TableEntryDescriptor that can split individual {@link StockItem StockItems} into a table's
999         * cells. Must not be <code>null</code>.
1000         */
1001        public static SingleTableFormSheet create(String sCaption, StoringStock ss, UIGate uigGate, DataBasket db,
1002                TableEntryDescriptor ted) {
1003            return create(sCaption, ss, uigGate, db, null, ted);
1004        }
1005    
1006        /**
1007         * Create and return a new SingleTableFormSheet that will display the contents of a StoringStock.
1008         *
1009         * <p>The FormSheet will contain a {@link JStoringStockTable}, the individual records are
1010         * {@link StockItem StockItems}.</p>
1011         *
1012         * <p>The {@link TableEntryDescriptor} defaults to a {@link DefaultStockItemTED}.</p>
1013         *
1014         * @param sCaption the caption of the new FormSheet.
1015         * @param ss the StoringStock whose contents are to be displayed.
1016         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1017         * performed through the FormSheet.
1018         * @param db the DataBasket that is used to determine visibility of items.
1019         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
1020         * the natural order of the StockItems will be applied.
1021         */
1022        public static SingleTableFormSheet create(String sCaption, StoringStock ss, UIGate uigGate, DataBasket db,
1023                Comparator cmp) {
1024            return create(sCaption, ss, uigGate, db, cmp, new DefaultStockItemTED());
1025        }
1026    
1027        /**
1028         * Create and return a new SingleTableFormSheet that will display the contents of a StoringStock.
1029         *
1030         * <p>The FormSheet will contain a {@link JStoringStockTable}, the individual records are
1031         * {@link StockItem StockItems}.</p>
1032         *
1033         * @param sCaption the caption of the new FormSheet.
1034         * @param ss the StoringStock whose contents are to be displayed.
1035         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1036         * performed through the FormSheet.
1037         * @param db the DataBasket that is used to determine visibility of items.
1038         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
1039         * the natural order of the StockItems will be applied.
1040         * @param ted a TableEntryDescriptor that can split individual {@link StockItem StockItems} into a table's
1041         * cells. Must not be <code>null</code>.
1042         */
1043        public static SingleTableFormSheet create(String sCaption, final StoringStock ss, UIGate uigGate,
1044                final DataBasket db, final Comparator cmp, final TableEntryDescriptor ted) {
1045            return new SingleTableFormSheet(sCaption, uigGate, new STFSContentCreator() {
1046                protected void createFormSheetContent(FormSheet fs) {
1047                    final SingleTableFormSheet stfs = (SingleTableFormSheet)fs;
1048                    JStoringStockTable jsst = new JStoringStockTable(ss, db, cmp, ted);
1049                    setFormSheetComponent((SingleTableFormSheet)fs, jsst);
1050                    stfs.m_source = ss;
1051                    stfs.m_db = db;
1052                }
1053            });
1054        }
1055    
1056        // JDataBasketTable FormSheet creators
1057    
1058        /**
1059         * Create and return a new SingleTableFormSheet that will display the contents of a DataBasket.
1060         *
1061         * <p>The FormSheet will contain a {@link JDataBasketTable}, the individual records are
1062         * {@link DataBasketEntry DataBasketEntries}.</p>
1063         *
1064         * <p>The default is to show all entries and apply no grouping. The default sorting order sorts entries by
1065         * their main keys and then by their secondary keys.</p>
1066         *
1067         * @param sCaption the caption of the new FormSheet.
1068         * @param db the DataBasket whose contents are to be displayed.
1069         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1070         * performed through the FormSheet.
1071         * @param ted a TableEntryDescriptor that can split individual {@link DataBasketEntry DataBasketEntries}
1072         * into a table's cells. Must not be <code>null</code>.
1073         */
1074        public static SingleTableFormSheet create(String sCaption, DataBasket db, UIGate uigGate,
1075                TableEntryDescriptor ted) {
1076            return create(sCaption, db, uigGate, DataBasketConditionImpl.ALL_ENTRIES, null, null, ted);
1077        }
1078    
1079        /**
1080         * Create and return a new SingleTableFormSheet that will display the contents of a DataBasket.
1081         *
1082         * <p>The FormSheet will contain a {@link JDataBasketTable}, the individual records are
1083         * {@link DataBasketEntry DataBasketEntries}.</p>
1084         *
1085         * <p>The default is to show all entries and apply no grouping.</p>
1086         *
1087         * @param sCaption the caption of the new FormSheet.
1088         * @param db the DataBasket whose contents are to be displayed.
1089         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1090         * performed through the FormSheet.
1091         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
1092         * entries will be sorted first by their main and then by their secondary keys.
1093         * @param ted a TableEntryDescriptor that can split individual {@link DataBasketEntry DataBasketEntries}
1094         * into a table's cells. Must not be <code>null</code>.
1095         */
1096        public static SingleTableFormSheet create(String sCaption, DataBasket db, UIGate uigGate, Comparator cmp,
1097                TableEntryDescriptor ted) {
1098            return create(sCaption, db, uigGate, DataBasketConditionImpl.ALL_ENTRIES, null, cmp, ted);
1099        }
1100    
1101        /**
1102         * Create and return a new SingleTableFormSheet that will display the contents of a DataBasket.
1103         *
1104         * <p>The FormSheet will contain a {@link JDataBasketTable}, the individual records are
1105         * {@link DataBasketEntry DataBasketEntries}.</p>
1106         *
1107         * <p>The default is to show all entries. The default sorting order sorts entries by their main keys and
1108         * then by their secondary keys.</p>
1109         *
1110         * @param sCaption the caption of the new FormSheet.
1111         * @param db the DataBasket whose contents are to be displayed.
1112         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1113         * performed through the FormSheet.
1114         * @param dbeg a grouper that can be used to combine several entries into one for display.
1115         * @param ted a TableEntryDescriptor that can split individual {@link DataBasketEntry DataBasketEntries}
1116         * into a table's cells. Must not be <code>null</code>.
1117         */
1118        public static SingleTableFormSheet create(String sCaption, DataBasket db, UIGate uigGate,
1119                DataBasketEntryGrouper dbeg, TableEntryDescriptor ted) {
1120            return create(sCaption, db, uigGate, DataBasketConditionImpl.ALL_ENTRIES, dbeg, null, ted);
1121        }
1122    
1123        /**
1124         * Create and return a new SingleTableFormSheet that will display the contents of a DataBasket.
1125         *
1126         * <p>The FormSheet will contain a {@link JDataBasketTable}, the individual records are
1127         * {@link DataBasketEntry DataBasketEntries}.</p>
1128         *
1129         * <p>The default is to show all entries.</p>
1130         *
1131         * @param sCaption the caption of the new FormSheet.
1132         * @param db the DataBasket whose contents are to be displayed.
1133         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1134         * performed through the FormSheet.
1135         * @param dbeg a grouper that can be used to combine several entries into one for display.
1136         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
1137         * entries will be sorted first by their main and then by their secondary keys.
1138         * @param ted a TableEntryDescriptor that can split individual {@link DataBasketEntry DataBasketEntries}
1139         * into a table's cells. Must not be <code>null</code>.
1140         */
1141        public static SingleTableFormSheet create(String sCaption, DataBasket db, UIGate uigGate,
1142                DataBasketEntryGrouper dbeg, Comparator cmp, TableEntryDescriptor ted) {
1143            return create(sCaption, db, uigGate, DataBasketConditionImpl.ALL_ENTRIES, dbeg, cmp, ted);
1144        }
1145    
1146        /**
1147         * Create and return a new SingleTableFormSheet that will display the contents of a DataBasket.
1148         *
1149         * <p>The FormSheet will contain a {@link JDataBasketTable}, the individual records are
1150         * {@link DataBasketEntry DataBasketEntries}.</p>
1151         *
1152         * <p>The default is to apply no grouping. The default sorting order sorts entries by
1153         * their main keys and then by their secondary keys.</p>
1154         *
1155         * @param sCaption the caption of the new FormSheet.
1156         * @param db the DataBasket whose contents are to be displayed.
1157         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1158         * performed through the FormSheet.
1159         * @param dbc a condition specifying the entries to be displayed.
1160         * @param ted a TableEntryDescriptor that can split individual {@link DataBasketEntry DataBasketEntries}
1161         * into a table's cells. Must not be <code>null</code>.
1162         */
1163        public static SingleTableFormSheet create(String sCaption, DataBasket db, UIGate uigGate,
1164                DataBasketCondition dbc, TableEntryDescriptor ted) {
1165            return create(sCaption, db, uigGate, dbc, null, null, ted);
1166        }
1167    
1168        /**
1169         * Create and return a new SingleTableFormSheet that will display the contents of a DataBasket.
1170         *
1171         * <p>The FormSheet will contain a {@link JDataBasketTable}, the individual records are
1172         * {@link DataBasketEntry DataBasketEntries}.</p>
1173         *
1174         * <p>The default is to apply no grouping.</p>
1175         *
1176         * @param sCaption the caption of the new FormSheet.
1177         * @param db the DataBasket whose contents are to be displayed.
1178         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1179         * performed through the FormSheet.
1180         * @param dbc a condition specifying the entries to be displayed.
1181         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
1182         * entries will be sorted first by their main and then by their secondary keys.
1183         * @param ted a TableEntryDescriptor that can split individual {@link DataBasketEntry DataBasketEntries}
1184         * into a table's cells. Must not be <code>null</code>.
1185         */
1186        public static SingleTableFormSheet create(String sCaption, DataBasket db, UIGate uigGate,
1187                DataBasketCondition dbc, Comparator cmp, TableEntryDescriptor ted) {
1188            return create(sCaption, db, uigGate, dbc, null, cmp, ted);
1189        }
1190    
1191        /**
1192         * Create and return a new SingleTableFormSheet that will display the contents of a DataBasket.
1193         *
1194         * <p>The FormSheet will contain a {@link JDataBasketTable}, the individual records are
1195         * {@link DataBasketEntry DataBasketEntries}.</p>
1196         *
1197         * <p>The default sorting order sorts entries by their main keys and then by their secondary keys.</p>
1198         *
1199         * @param sCaption the caption of the new FormSheet.
1200         * @param db the DataBasket whose contents are to be displayed.
1201         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1202         * performed through the FormSheet.
1203         * @param dbc a condition specifying the entries to be displayed.
1204         * @param dbeg a grouper that can be used to combine several entries into one for display.
1205         * @param ted a TableEntryDescriptor that can split individual {@link DataBasketEntry DataBasketEntries}
1206         * into a table's cells. Must not be <code>null</code>.
1207         */
1208        public static SingleTableFormSheet create(String sCaption, DataBasket db, UIGate uigGate,
1209                DataBasketCondition dbc, DataBasketEntryGrouper dbeg, TableEntryDescriptor ted) {
1210            return create(sCaption, db, uigGate, dbc, dbeg, null, ted);
1211        }
1212    
1213        /**
1214         * Create and return a new SingleTableFormSheet that will display the contents of a DataBasket.
1215         *
1216         * <p>The FormSheet will contain a {@link JDataBasketTable}, the individual records are
1217         * {@link DataBasketEntry DataBasketEntries}.</p>
1218         *
1219         * @param sCaption the caption of the new FormSheet.
1220         * @param db the DataBasket whose contents are to be displayed.
1221         * @param uigGate the gate at which to display the FormSheet. May be <code>null</code> only if no editing is
1222         * performed through the FormSheet.
1223         * @param dbc a condition specifying the entries to be displayed.
1224         * @param dbeg a grouper that can be used to combine several entries into one for display.
1225         * @param cmp a comparator defining the order in which to display the individual items. If <code>null</code>
1226         * entries will be sorted first by their main and then by their secondary keys.
1227         * @param ted a TableEntryDescriptor that can split individual {@link DataBasketEntry DataBasketEntries}
1228         * into a table's cells. Must not be <code>null</code>.
1229         */
1230        public static SingleTableFormSheet create(String sCaption, final DataBasket db, UIGate uigGate,
1231                final DataBasketCondition dbc, final DataBasketEntryGrouper dbeg, final Comparator cmp,
1232                final TableEntryDescriptor ted) {
1233            return new SingleTableFormSheet(sCaption, uigGate, new STFSContentCreator() {
1234                protected void createFormSheetContent(FormSheet fs) {
1235                    final SingleTableFormSheet stfs = (SingleTableFormSheet)fs;
1236                    JDataBasketTable jdbt = new JDataBasketTable(db, dbc, dbeg, cmp, ted);
1237                    setFormSheetComponent((SingleTableFormSheet)fs, jdbt);
1238                    stfs.m_source = db;
1239                    stfs.m_db = db;
1240                }
1241            });
1242        }
1243    
1244    }