| /*
 The Design Patterns Java Companion
 
 Copyright (C) 1998, by James W. Cooper
 
 IBM Thomas J. Watson Research Center
 
 */
 
 
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.GridLayout;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.util.Vector;
 
 import javax.swing.AbstractListModel;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.UIManager;
 import javax.swing.UnsupportedLookAndFeelException;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.event.TableModelListener;
 import javax.swing.table.TableModel;
 
 public class productDisplay extends JFrame {
 public productDisplay() {
 super("The Java Factory-- Products");
 setLF(); //set look and feel
 setCloseClick(); //set close on window close click
 InputFile f = new InputFile("products.txt");
 Vector prod = new Vector();
 //read in product list
 String s = f.readLine();
 while (s != null) {
 prod.addElement(s);
 s = f.readLine();
 }
 JPanel p = new JPanel();
 getContentPane().add(p);
 p.setLayout(new GridLayout(1, 2));
 
 JPanel pleft = new JPanel();
 JPanel pright = new JPanel();
 p.add(pleft);
 p.add(pright);
 pleft.setLayout(new BorderLayout());
 pright.setLayout(new BorderLayout());
 
 //add in customer view as list box
 pleft.add("North", new JLabel("Customer view"));
 pleft.add("Center", new productList(prod));
 
 //add in execute view as table
 pright.add("North", new JLabel("Executive view"));
 pright.add("Center", new productTable(prod));
 
 setSize(new Dimension(400, 300));
 setVisible(true);
 }
 
 //-----------------------------------------
 private void setCloseClick() {
 //create window listener to respond to window close click
 addWindowListener(new WindowAdapter() {
 public void windowClosing(WindowEvent e) {
 System.exit(0);
 }
 });
 }
 
 //------------------------------------------
 private void setLF() {
 // Force SwingApp to come up in the System L&F
 String laf = UIManager.getSystemLookAndFeelClassName();
 try {
 UIManager.setLookAndFeel(laf);
 } catch (UnsupportedLookAndFeelException exc) {
 System.err.println("Warning: UnsupportedLookAndFeel: " + laf);
 } catch (Exception exc) {
 System.err.println("Error loading " + laf + ": " + exc);
 }
 }
 
 //---------------------------------------------
 
 static public void main(String argv[]) {
 new productDisplay();
 }
 }
 
 class InputFile {
 RandomAccessFile f = null;
 
 boolean errflag;
 
 String s = null;
 
 public InputFile(String fname) {
 errflag = false;
 try {
 //open file
 f = new RandomAccessFile(fname, "r");
 } catch (IOException e) {
 //print error if not found
 System.out.println("no file found");
 errflag = true; //and set flag
 }
 }
 
 //-----------------------------------------
 public boolean checkErr() {
 return errflag;
 }
 
 //-----------------------------------------
 public String read() {
 //read a single field up to a comma or end of line
 String ret = "";
 if (s == null) //if no data in string
 {
 s = readLine(); //read next line
 }
 if (s != null) //if there is data
 {
 s.trim(); //trim off blanks
 int i = s.indexOf(","); //find next comma
 if (i <= 0) {
 ret = s.trim(); //if no commas go to end of line
 s = null; //and null out stored string
 } else {
 ret = s.substring(0, i).trim(); //return left of comma
 s = s.substring(i + 1); //save right of comma
 }
 } else
 ret = null;
 return ret; //return string
 }
 
 //-----------------------------------------
 public String readLine() {
 //read in a line from the file
 s = null;
 try {
 s = f.readLine(); //could throw error
 } catch (IOException e) {
 errflag = true;
 System.out.println("File read error");
 }
 return s;
 }
 
 //-----------------------------------------
 public void close() {
 try {
 f.close(); //close file
 } catch (IOException e) {
 System.out.println("File close error");
 errflag = true;
 }
 }
 //-----------------------------------------
 }
 
 class productList extends JawtList {
 public productList(Vector products) {
 super(products.size()); //for compatibility
 for (int i = 0; i < products.size(); i++) {
 //take each strig apart and keep only
 //the product names, discarding the quntities
 String s = (String) products.elementAt(i);
 int index = s.indexOf("--"); //separate qty from name
 if (index > 0)
 add(s.substring(0, index));
 else
 add(s);
 }
 }
 }
 
 class productTable extends JScrollPane {
 JTable table;
 
 public productTable(Vector list) {
 table = new JTable(new prodModel(list));
 getViewport().add(table);
 }
 }
 
 class prodModel implements TableModel {
 int rows, columns;
 
 Vector prodNames, quantities;
 
 public prodModel(Vector products) {
 rows = products.size();
 columns = 2;
 prodNames = new Vector();
 quantities = new Vector();
 for (int i = 0; i < products.size(); i++) {
 String s = (String) products.elementAt(i);
 int index = s.indexOf("--"); //separate qty from name
 if (index > 0) {
 prodNames.addElement(s.substring(0, index));
 quantities.addElement(s.substring(index + 2).trim());
 } else
 prodNames.addElement(s);
 
 }
 }
 
 public int getColumnCount() {
 return columns;
 }
 
 public int getRowCount() {
 return rows;
 }
 
 public Object getValueAt(int r, int c) {
 switch (c) {
 case 0:
 return prodNames.elementAt(r);
 
 case 1:
 return quantities.elementAt(r);
 
 default:
 return prodNames.elementAt(r);
 
 }
 
 }
 
 public Class getColumnClass(int c) {
 return (new String("")).getClass();
 }
 
 public boolean isCellEditable(int r, int c) {
 return false;
 }
 
 public String getColumnName(int c) {
 return "";
 }
 
 public void setValueAt(Object obj, int r, int c) {
 }
 
 public void addTableModelListener(TableModelListener tbm) {
 }
 
 public void removeTableModelListener(TableModelListener tbm) {
 }
 }
 
 //this is a simple adapter class to
 //convert List awt methods to Swing methods
 
 class JawtList extends JScrollPane implements ListSelectionListener, awtList {
 private JList listWindow;
 
 private JListData listContents;
 
 //-----------------------------------------
 public JawtList(int rows) {
 listContents = new JListData();
 listWindow = new JList(listContents);
 listWindow.setPrototypeCellValue("Abcdefg Hijkmnop");
 getViewport().add(listWindow);
 
 }
 
 //-----------------------------------------
 public void add(String s) {
 listContents.addElement(s);
 }
 
 //-----------------------------------------
 public void remove(String s) {
 listContents.removeElement(s);
 }
 
 //-----------------------------------------
 public String[] getSelectedItems() {
 Object[] obj = listWindow.getSelectedValues();
 String[] s = new String[obj.length];
 for (int i = 0; i < obj.length; i++)
 s[i] = obj[i].toString();
 return s;
 }
 
 //-----------------------------------------
 public void valueChanged(ListSelectionEvent e) {
 }
 
 }
 //  =========================================
 
 class JListData extends AbstractListModel {
 private Vector data;
 
 //-----------------------------------------
 public JListData() {
 data = new Vector();
 }
 
 //-----------------------------------------
 public int getSize() {
 return data.size();
 }
 
 //-----------------------------------------
 public Object getElementAt(int index) {
 return data.elementAt(index);
 }
 
 //-----------------------------------------
 public void addElement(String s) {
 data.addElement(s);
 fireIntervalAdded(this, data.size() - 1, data.size());
 }
 
 //-----------------------------------------
 public void removeElement(String s) {
 data.removeElement(s);
 fireIntervalRemoved(this, 0, data.size());
 }
 }
 
 interface awtList {
 public void add(String s);
 
 public void remove(String s);
 
 public String[] getSelectedItems();
 
 }
 
 //products.txt
 /*
 Brass plated widgets --1,000,076
 Furled frammis       --75,000
 Detailed rat brushes --700
 Zero-based hex dumps--80,000
 Anterior antelope collars --578
 Washable softwear --789,000
 Steel-toed wing-tips --456,666
 
 
 */
 
 
 
 |