home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / inprise / JSAMPLES.Z / Applet1.java < prev    next >
Text File  |  1998-05-08  |  13KB  |  329 lines

  1. /*
  2.  * Copyright (c) 1997-1998 Borland International, Inc. All Rights Reserved.
  3.  * 
  4.  * This SOURCE CODE FILE, which has been provided by Borland as part
  5.  * of a Borland product for use ONLY by licensed users of the product,
  6.  * includes CONFIDENTIAL and PROPRIETARY information of Borland.  
  7.  *
  8.  * USE OF THIS SOFTWARE IS GOVERNED BY THE TERMS AND CONDITIONS 
  9.  * OF THE LICENSE STATEMENT AND LIMITED WARRANTY FURNISHED WITH
  10.  * THE PRODUCT.
  11.  *
  12.  * IN PARTICULAR, YOU WILL INDEMNIFY AND HOLD BORLAND, ITS RELATED
  13.  * COMPANIES AND ITS SUPPLIERS, HARMLESS FROM AND AGAINST ANY CLAIMS
  14.  * OR LIABILITIES ARISING OUT OF THE USE, REPRODUCTION, OR DISTRIBUTION
  15.  * OF YOUR PROGRAMS, INCLUDING ANY CLAIMS OR LIABILITIES ARISING OUT OF
  16.  * OR RESULTING FROM THE USE, MODIFICATION, OR DISTRIBUTION OF PROGRAMS
  17.  * OR FILES CREATED FROM, BASED ON, AND/OR DERIVED FROM THIS SOURCE
  18.  * CODE FILE.
  19.  */
  20.  
  21. //Title:       Prime Number List
  22. //Version:     
  23. //Copyright:   Copyright (c) 1998
  24. //Author:      Greg Hamer
  25. //Company:     Borland International
  26. //Description: A Separate thread supplies the model with the prime numbers.
  27. //Displays the model in a List View. Uses a CustomItemListener
  28. //to display the Mersenne primes in red
  29. //Also useful for seeing the effects of setBatchMode and setUniformWidth on performance
  30. package borland.samples.jbcl.listview;
  31.  
  32. import java.awt.*;
  33. import java.awt.event.*;
  34. import java.applet.*;
  35. import borland.jbcl.layout.*;
  36. import borland.jbcl.control.*;
  37. import borland.jbcl.view.*;
  38. import borland.jbcl.model.*;
  39. import com.sun.java.swing.*;
  40.  
  41. public class Applet1 extends JApplet implements Runnable,  VectorModelListener, CustomItemListener{
  42.   boolean isStandalone = false;
  43.   ListView listView = new ListControl();
  44.   BevelPanel bevelPanel1 = new BevelPanel();
  45.   ButtonControl restartButton = new ButtonControl();
  46.   ButtonControl cancelButton = new ButtonControl();
  47.   GridBagLayout gridBagLayout1 = new GridBagLayout();
  48.   GridBagLayout gridBagLayout2 = new GridBagLayout();
  49.   LabelControl testNumberText  = new LabelControl();
  50.   LabelControl primeNumberText = new LabelControl();
  51.   GridLayout gridLayout1 = new GridLayout();
  52.   GridLayout gridLayout2 = new GridLayout();
  53.   JLabel testNumberLabel = new JLabel();
  54.   JLabel primeNumberLabel = new JLabel();
  55.   PrimeFactory primeFactory = new PrimeFactory();
  56.   Thread uiThread;
  57.   Color defaultColor;
  58.   JPanel panel1 = new JPanel();
  59.   XYLayout xYLayout2 = new XYLayout();
  60.   JLabel jLabel1 = new JLabel();
  61.   JTextField jTextField1 = new JTextField();
  62.   BorderLayout borderLayout1 = new BorderLayout();
  63.   Checkbox checkbox1 = new Checkbox();
  64.   boolean restart = true;
  65.   boolean started = false;
  66.   LabelControl timeText = new LabelControl();
  67.   JLabel timeLabel = new JLabel();
  68.   Checkbox checkBox1 = new Checkbox();
  69.   Checkbox checkbox2 = new Checkbox();
  70.  
  71.   //Construct the applet
  72.   public Applet1() {
  73.   }
  74.   //Initialize the applet
  75.   public void init() {
  76.     try { jbInit(); } catch (Exception e) { e.printStackTrace(); }
  77.     primeFactory.setPriority(Thread.MIN_PRIORITY);
  78.     //primeFactory.start();
  79.     updateUI(0);
  80.     uiThread = new Thread(this);
  81.     uiThread.setPriority(Thread.NORM_PRIORITY - 1);
  82.  
  83.   }
  84.   //Component initialization
  85.   private void jbInit() throws Exception {
  86.     primeFactory.addModelListener(this);
  87.     bevelPanel1.setBevelInner(BevelPanel.FLAT);
  88.     bevelPanel1.setLayout(gridLayout1);
  89.     restartButton.setLabel("Start");
  90.     restartButton.addActionListener(new java.awt.event.ActionListener() {
  91.       public void actionPerformed(ActionEvent e) {
  92.         restartButton_actionPerformed(e);
  93.       }
  94.     });
  95.     cancelButton.setLabel("Cancel");
  96.     cancelButton.addActionListener(new java.awt.event.ActionListener() {
  97.       public void actionPerformed(ActionEvent e) {
  98.         cancelButton_actionPerformed(e);
  99.       }
  100.     });
  101.     testNumberText.setAlignment(Label.RIGHT);
  102.     testNumberText.setFont(new Font("Dialog", 0, 30));
  103.     testNumberText.setForeground(testNumberLabel.getForeground());
  104.     testNumberText.setText("testing");
  105.     primeNumberText.setAlignment(Label.RIGHT);
  106.     primeNumberText.setFont(new Font("Dialog", 0, 30));
  107.     primeNumberText.setForeground(testNumberLabel.getForeground());
  108.     primeNumberText.setText("3");
  109.     gridLayout1.setHgap(8);
  110.     testNumberLabel.setHorizontalAlignment(SwingConstants.RIGHT);
  111.     testNumberLabel.setText("Largest so far:");
  112.     primeNumberLabel.setHorizontalAlignment(SwingConstants.RIGHT);
  113.     primeNumberLabel.setText("Prime:");
  114.     jLabel1.setText("Go To:");
  115.     timeLabel.setHorizontalAlignment(SwingConstants.RIGHT);
  116.     checkbox2.setLabel("UniformWidth");
  117.     checkbox2.setState(true);
  118.     checkbox2.addItemListener(new java.awt.event.ItemListener() {
  119.       public void itemStateChanged(ItemEvent e) {
  120.         checkbox2_itemStateChanged(e);
  121.       }
  122.     });
  123.     checkbox2.setForeground(testNumberLabel.getForeground());
  124.     checkbox1.setLabel("BatchMode");
  125.     checkbox1.setState(true);
  126.     checkbox1.setForeground(testNumberLabel.getForeground());
  127.     timeText.setText("");
  128.     timeText.setAlignment(Label.RIGHT);
  129.     timeText.setForeground(testNumberLabel.getForeground());
  130.     timeLabel.setText("Primes found:");
  131.     jTextField1.addActionListener(new java.awt.event.ActionListener() {
  132.       public void actionPerformed(ActionEvent e) {
  133.         jTextField1_actionPerformed(e);
  134.       }
  135.     });
  136.     panel1.setLayout(borderLayout1);
  137.     this.setSize(new Dimension(420, 300));
  138.     listView.setSelection(new NullVectorSelection ());
  139.     listView.setModel(primeFactory);
  140.     listView.setSubfocus(-1);
  141.     listView.setShowFocus(false);
  142.     listView.setBatchMode(true);
  143.     listView.addCustomItemListener(this);
  144.     //When either uniformWidth or uniformHeight are false, ListView looks through the entire model to
  145.     //calculate preferredSize
  146.     listView.setUniformWidth(true); //practically required for large models
  147.     this.getContentPane().setLayout(gridBagLayout1);
  148.     this.getContentPane().add(bevelPanel1, new GridBagConstraints2(2, 7, 2, 1, 0.0, 0.0
  149.             ,GridBagConstraints.SOUTHEAST, GridBagConstraints.NONE, new Insets(0, 30, 10, 12), 50, 0));
  150.     bevelPanel1.add(restartButton, null);
  151.     bevelPanel1.add(cancelButton, null);
  152.     this.getContentPane().add(testNumberText, new GridBagConstraints2(2, 0, 2, 1, 0.0, 0.0
  153.             ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 12), 0, 0));
  154.     this.getContentPane().add(primeNumberText, new GridBagConstraints2(2, 1, 2, 1, 0.0, 0.0
  155.             ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 12), 0, 0));
  156.     this.getContentPane().add(testNumberLabel, new GridBagConstraints2(1, 0, 1, 1, 0.0, 0.0
  157.             ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0));
  158.     this.getContentPane().add(primeNumberLabel, new GridBagConstraints2(1, 1, 1, 1, 0.0, 0.0
  159.             ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0));
  160.     this.getContentPane().add(panel1, new GridBagConstraints2(0, 0, 1, 8, 1.0, 1.0
  161.             ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 12, 10, 21), 0, 0));
  162.     panel1.add(listView, BorderLayout.CENTER);
  163.     this.getContentPane().add(jLabel1, new GridBagConstraints2(1, 3, 1, 2, 0.0, 0.0
  164.             ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0));
  165.     this.getContentPane().add(jTextField1, new GridBagConstraints2(2, 3, 2, 1, 0.0, 0.0
  166.             ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 12), 23, 0));
  167.     this.getContentPane().add(timeText, new GridBagConstraints2(2, 2, 2, 1, 0.0, 0.0
  168.             ,GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 12), 0, 0));
  169.     this.getContentPane().add(timeLabel, new GridBagConstraints2(1, 2, 1, 1, 0.0, 0.0
  170.             ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0));
  171.     this.getContentPane().add(checkbox1, new GridBagConstraints2(2, 5, 1, 1, 0.0, 0.0
  172.             ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
  173.     this.getContentPane().add(checkbox2, new GridBagConstraints2(2, 6, 1, 1, 0.0, 0.0
  174.             ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
  175.  
  176.     // add listView scrollbar listener
  177.       listView.getVerticalScrollBar().addAdjustmentListener(
  178.        new AdjustmentListener() {
  179.          public void adjustmentValueChanged(AdjustmentEvent e) {
  180.            listViewHorizontalScrollBar_adjustmentValueChanged(e);
  181.          }
  182.       }
  183.     );
  184.   }
  185.   //Get Applet information
  186.   public String getAppletInfo() {
  187.     return "Applet Information";
  188.   }
  189.   //Get parameter info
  190.   public String[][] getParameterInfo() {
  191.     return null;
  192.   }
  193.   //Main method
  194.   public static void main(String[] args) {
  195.     Applet1 applet = new Applet1();
  196.     applet.isStandalone = true;
  197.     DecoratedFrame frame = new DecoratedFrame();
  198.     frame.setTitle("Prime Numbers");
  199.     frame.add(applet, BorderLayout.CENTER);
  200.     applet.init();
  201.     applet.start();
  202.  
  203.     frame.pack();
  204.     Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
  205.     frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2);
  206.     frame.setVisible(true);
  207.   }
  208.  
  209.   void updateUI(int location) {
  210.     //System.err.println("updateUI");
  211.     listView.setBatchMode(false);  //let the list update itself occasionally even when setBatchMode is on
  212.     int count = primeFactory.getCount();
  213.     Object largest = primeFactory.get(location);
  214.     long prime = ((Long)largest).longValue();
  215.     if ((prime | (prime + 1)) == prime + prime + 1) {
  216.       defaultColor = primeNumberText.getForeground();
  217.       primeNumberText.setForeground(Color.red);
  218.     }
  219.     else  {
  220.       if (defaultColor != null) {
  221.         primeNumberText.setForeground(defaultColor);
  222.         defaultColor = null;
  223.       }
  224.     }
  225.     primeNumberText.setText(" " + largest.toString());
  226.     testNumberText.setText(" " + primeFactory.getCheckNumber());
  227.     timeText.setText(" " + count );
  228.     //validate();
  229.   }
  230.  
  231.   public void run() {
  232.     //update the ui on this thread every so often
  233.     int count = 0;
  234.     while (count < primeFactory.getCount()){
  235.       updateUI(count++);
  236.       synchronized (uiThread) {
  237.         try  {
  238.           uiThread.wait(200);
  239.         }
  240.         catch (Exception e) {}
  241.       }
  242.     }
  243.   }
  244.  
  245.   public void customizeItem(Object parm1, Object data, int parm3, CustomPaintSite paintSite) {
  246.     //method for interface borland.jbcl.view.CustomViewManagerListener
  247.     try {
  248.       long value = ((Long)data).longValue();
  249.       if ((value | (value+1)) == value + value + 1)
  250.         paintSite.setForeground(Color.red);
  251.       else
  252.         paintSite.setForeground(Color.black);
  253.         }
  254.       catch(Exception e) {
  255.         System.err.println("painterRequested() - " + e);
  256.       }
  257.   }
  258.  
  259.   public void editorRequested(Object parm1, Object parm2, int parm3, CustomPaintSite parm4) {
  260.     //method for interface borland.jbcl.view.CustomViewManagerListener
  261.   }
  262.  
  263.   public void modelStructureChanged(VectorModelEvent parm1) {
  264.     //UpdateUI will setBatchMode to false after it finishes waiting;
  265.     listView.setBatchMode(checkbox1.getState());   //nothing much happens when the state stays the same
  266.   }
  267.  
  268.   public void modelContentChanged(VectorModelEvent parm1) {
  269.     listView.setBatchMode(checkbox1.getState());
  270.   }
  271.  
  272.   void cancelButton_actionPerformed(ActionEvent e) {
  273.     primeFactory.stop();
  274.     uiThread.stop();
  275.     if (isStandalone)
  276.       System.exit(0);
  277.   }
  278.  
  279.   void restartButton_actionPerformed(ActionEvent e) {
  280.     restart = !restart;
  281.     if (restart) {
  282.       primeFactory.suspend();
  283.       restartButton.setLabel("Resume");
  284.  
  285.     }
  286.     else {
  287.       restartButton.setLabel("Pause");
  288.       if (started)
  289.         primeFactory.resume();
  290.       else {
  291.         started = true;
  292.         primeFactory.start();
  293.         uiThread.start();
  294.       }  
  295.     }
  296.   }
  297.  
  298.   void jTextField1_actionPerformed(ActionEvent e) {
  299.     //System.err.println("action performed");
  300.     try {
  301.       int subscript = primeFactory.find(new Long(jTextField1.getText()));
  302.       listView.setTopIndex(subscript);
  303.     }
  304.     catch (Exception exp) {}
  305.   }
  306.  
  307.   // Without this callback, the items that are shown are always the same
  308.   // even after you scroll. This is because when a new item is
  309.   // added to the list, ListView will make sure that the the item which
  310.   // has the subfocus is visible. During scrolling, however, the subfocus
  311.   // stays the same, only the topIndex is changed. So, we set the subfocus
  312.   // value to the topIndex value.
  313.   int max = 0;
  314.   int oldmax;
  315.   void listViewHorizontalScrollBar_adjustmentValueChanged(AdjustmentEvent e) {
  316.     max = e.getAdjustable().getMaximum();
  317.     if (max == oldmax)
  318.       listView.setSubfocus(listView.getTopIndex());
  319.     else
  320.       oldmax = max;
  321.   }
  322.  
  323.   void checkbox2_itemStateChanged(ItemEvent e) {
  324.     listView.setUniformWidth(checkbox2.getState());
  325.   }
  326. }
  327.  
  328.  
  329.