1   /*
2    * Copyright (c) 2003 Sun Microsystems, Inc. All  Rights Reserved.
3    * 
4    * Redistribution and use in source and binary forms, with or without
5    * modification, are permitted provided that the following conditions
6    * are met:
7    * 
8    * -Redistributions of source code must retain the above copyright
9    *  notice, this list of conditions and the following disclaimer.
10   * 
11   * -Redistribution in binary form must reproduct the above copyright
12   *  notice, this list of conditions and the following disclaimer in
13   *  the documentation and/or other materials provided with the distribution.
14   * 
15   * Neither the name of Sun Microsystems, Inc. or the names of contributors
16   * may be used to endorse or promote products derived from this software
17   * without specific prior written permission.
18   * 
19   * This software is provided "AS IS," without a warranty of any kind. ALL
20   * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
21   * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
22   * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT
23   * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
24   * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS
25   * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
26   * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
27   * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
28   * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN
29   * IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
30   * 
31   * You acknowledge that Software is not designed, licensed or intended for
32   * use in the design, construction, operation or maintenance of any nuclear
33   * facility.
34   */
35  
36  /*
37   * @(#)TabbedPaneDemo.java  1.8 03/01/23
38   */
39  
40  
41  import javax.swing.*;
42  import javax.swing.event.*;
43  import javax.swing.text.*;
44  import javax.swing.border.*;
45  import javax.swing.colorchooser.*;
46  import javax.swing.filechooser.*;
47  import javax.accessibility.*;
48  
49  import java.awt.*;
50  import java.awt.event.*;
51  import java.beans.*;
52  import java.util.*;
53  import java.io.*;
54  import java.applet.*;
55  import java.net.*;
56  
57  /**
58   * JTabbedPane Demo
59   *
60   * @version 1.8 01/23/03
61   * @author Jeff Dinkins
62   */
63  public class TabbedPaneDemo extends DemoModule implements ActionListener {
64      HeadSpin spin;
65  
66      JTabbedPane tabbedpane;
67  
68      ButtonGroup group;
69  
70      JRadioButton top;
71      JRadioButton bottom;
72      JRadioButton left;
73      JRadioButton right;
74  
75      /**
76       * main method allows us to run as a standalone demo.
77       */
78      public static void main(String[] args) {
79      TabbedPaneDemo demo = new TabbedPaneDemo(null);
80      demo.mainImpl();
81      }
82  
83      /**
84       * TabbedPaneDemo Constructor
85       */
86      public TabbedPaneDemo(SwingSet2 swingset) {
87      // Set the title for this demo, and an icon used to represent this
88      // demo inside the SwingSet2 app.
89      super(swingset, "TabbedPaneDemo", "toolbar/JTabbedPane.gif");
90  
91      // create tab position controls
92      JPanel tabControls = new JPanel();
93      tabControls.add(new JLabel(getString("TabbedPaneDemo.label")));
94      top    = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.top")));
95      left   = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.left")));
96      bottom = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.bottom")));
97      right  = (JRadioButton) tabControls.add(new JRadioButton(getString("TabbedPaneDemo.right")));
98      getDemoPanel().add(tabControls, BorderLayout.NORTH);
99  
100     group = new ButtonGroup();
101     group.add(top);
102     group.add(bottom);
103     group.add(left);
104     group.add(right);
105 
106     top.setSelected(true);
107 
108     top.addActionListener(this);
109     bottom.addActionListener(this);
110     left.addActionListener(this);
111     right.addActionListener(this);
112 
113     // create tab 
114     tabbedpane = new JTabbedPane();
115     getDemoPanel().add(tabbedpane, BorderLayout.CENTER);
116 
117     String name = getString("TabbedPaneDemo.laine");
118     JLabel pix = new JLabel(createImageIcon("tabbedpane/laine.jpg", name));
119     tabbedpane.add(name, pix);
120 
121     name = getString("TabbedPaneDemo.ewan");
122     pix = new JLabel(createImageIcon("tabbedpane/ewan.jpg", name));
123     tabbedpane.add(name, pix);
124 
125     name = getString("TabbedPaneDemo.hania");
126     pix = new JLabel(createImageIcon("tabbedpane/hania.jpg", name));
127     tabbedpane.add(name, pix);
128 
129     name = getString("TabbedPaneDemo.bounce");
130     spin = new HeadSpin();
131     tabbedpane.add(name, spin);
132     
133     tabbedpane.getModel().addChangeListener(
134        new ChangeListener() {
135           public void stateChanged(ChangeEvent e) {
136           SingleSelectionModel model = (SingleSelectionModel) e.getSource();
137           if(model.getSelectedIndex() == tabbedpane.getTabCount()-1) {
138               spin.go();
139           }
140           }
141        }
142     );
143     }
144 
145     public void actionPerformed(ActionEvent e) {
146     if(e.getSource() == top) {
147         tabbedpane.setTabPlacement(JTabbedPane.TOP);
148     } else if(e.getSource() == left) {
149         tabbedpane.setTabPlacement(JTabbedPane.LEFT);
150     } else if(e.getSource() == bottom) {
151         tabbedpane.setTabPlacement(JTabbedPane.BOTTOM);
152     } else if(e.getSource() == right) {
153         tabbedpane.setTabPlacement(JTabbedPane.RIGHT);
154     }
155     }
156 
157     class HeadSpin extends JComponent implements ActionListener {
158     javax.swing.Timer animator;
159     
160     ImageIcon icon[] = new ImageIcon[6];
161 
162     int tmpScale;
163 
164     final static int numImages = 6;
165 
166     double x[] = new double[numImages];
167     double y[] = new double[numImages];
168 
169     int xh[] = new int[numImages];
170     int yh[] = new int[numImages];
171 
172     double scale[] = new double[numImages];
173 
174     public HeadSpin() {
175         setBackground(Color.black);
176         icon[0] = createImageIcon("tabbedpane/ewan.gif", getString("TabbedPaneDemo.ewan"));
177         icon[1] = createImageIcon("tabbedpane/stephen.gif", getString("TabbedPaneDemo.stephen"));
178         icon[2] = createImageIcon("tabbedpane/david.gif", getString("TabbedPaneDemo.david"));
179         icon[3] = createImageIcon("tabbedpane/matthew.gif", getString("TabbedPaneDemo.matthew"));
180         icon[4] = createImageIcon("tabbedpane/blake.gif", getString("TabbedPaneDemo.blake"));
181         icon[5] = createImageIcon("tabbedpane/brooke.gif", getString("TabbedPaneDemo.brooke"));
182 
183         /*
184         for(int i = 0; i < 6; i++) {
185         x[i] = (double) rand.nextInt(500);
186         y[i] = (double) rand.nextInt(500);
187         }
188         */
189     }
190     
191     public void go() {
192         animator = new javax.swing.Timer(22 + 22 + 22, this);
193         animator.start();
194     }
195 
196     public void paint(Graphics g) {
197         g.setColor(getBackground());
198         g.fillRect(0, 0, getWidth(), getHeight());
199 
200         for(int i = 0; i < numImages; i++) {
201         if(x[i] > 3*i) {
202             nudge(i);
203             squish(g, icon[i], xh[i], yh[i], scale[i]);
204         } else {
205             x[i] += .05;
206             y[i] += .05;
207         }
208         }
209     }
210 
211     Random rand = new Random();
212 
213     public void nudge(int i) {
214         x[i] += (double) rand.nextInt(1000) / 8756;
215         y[i] += (double) rand.nextInt(1000) / 5432;
216         int tmpScale = (int) (Math.abs(Math.sin(x[i])) * 10);
217         scale[i] = (double) tmpScale / 10;
218         int nudgeX = (int) (((double) getWidth()/2) * .8);
219         int nudgeY = (int) (((double) getHeight()/2) * .60);
220         xh[i] = (int) (Math.sin(x[i]) * nudgeX) + nudgeX;
221         yh[i] = (int) (Math.sin(y[i]) * nudgeY) + nudgeY;
222     }
223 
224     public void squish(Graphics g, ImageIcon icon, int x, int y, double scale) {
225         if(isVisible()) {
226         g.drawImage(icon.getImage(), x, y,
227                 (int) (icon.getIconWidth()*scale),
228                 (int) (icon.getIconHeight()*scale),
229                 this);
230         } 
231     }
232     
233     public void actionPerformed(ActionEvent e) {
234         if(isVisible()) {
235         repaint();
236         } else {
237         animator.stop();
238         }
239     }
240     }
241 }
242 
243