| /* | |
| * | |
| * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions | |
| * are met: | |
| * | |
| * - Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | |
| * | |
| * - Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * | |
| * - Neither the name of Oracle nor the names of its | |
| * contributors may be used to endorse or promote products derived | |
| * from this software without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | |
| * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| */ | |
| package java2d; | |
| import static java.awt.Color.BLACK; | |
| import static java.awt.Color.GREEN; | |
| import static java.awt.Color.RED; | |
| import java.awt.Component; | |
| import java.awt.Dimension; | |
| import java.awt.Font; | |
| import java.awt.GridBagLayout; | |
| import java.awt.GridLayout; | |
| import java.awt.event.ActionEvent; | |
| import java.awt.event.ActionListener; | |
| import java.util.Date; | |
| import java.util.logging.Level; | |
| import java.util.logging.Logger; | |
| import javax.swing.JButton; | |
| import javax.swing.JCheckBox; | |
| import javax.swing.JLabel; | |
| import javax.swing.JPanel; | |
| import javax.swing.JProgressBar; | |
| import javax.swing.JTextField; | |
| import javax.swing.SwingConstants; | |
| import javax.swing.SwingUtilities; | |
| import javax.swing.border.BevelBorder; | |
| import javax.swing.border.CompoundBorder; | |
| import javax.swing.border.EmptyBorder; | |
| /** | |
| * A separate window for running the J2Ddemo. Go from tab to tab or demo to | |
| * demo. | |
| */ | |
| @SuppressWarnings("serial") | |
| public class RunWindow extends JPanel implements Runnable, ActionListener { | |
| private final DemoInstVarsAccessor demoInstVars; | |
| private final JButton runB; | |
| private int delay = 10; | |
| private int numRuns = 20; | |
| private boolean exit; | |
| private final JCheckBox zoomCB = new JCheckBox("Zoom"); | |
| private final JCheckBox printCB = new JCheckBox("Print"); | |
| private boolean buffersFlag; | |
| private int bufBeg, bufEnd; | |
| private JTextField delayTextField, runsTextField; | |
| private Thread thread; | |
| private JProgressBar pb; | |
| @SuppressWarnings("LeakingThisInConstructor") | |
| public RunWindow(DemoInstVarsAccessor demoInstVars, RunWindowSettings runWndSetts) { | |
| this.demoInstVars = demoInstVars; | |
| delay = runWndSetts.getDelay(); | |
| numRuns = runWndSetts.getNumRuns(); | |
| exit = runWndSetts.getExit(); | |
| zoomCB.setSelected(runWndSetts.isZoomCBSelected()); | |
| printCB.setSelected(runWndSetts.isPrintCBSelected()); | |
| buffersFlag = runWndSetts.getBuffersFlag(); | |
| bufBeg = runWndSetts.getBufBeg(); | |
| bufEnd = runWndSetts.getBufEnd(); | |
| setLayout(new GridBagLayout()); | |
| EmptyBorder eb = new EmptyBorder(5, 5, 5, 5); | |
| setBorder(new CompoundBorder(eb, new BevelBorder(BevelBorder.LOWERED))); | |
| Font font = new Font(Font.SERIF, Font.PLAIN, 10); | |
| runB = new JButton("Run"); | |
| runB.setBackground(GREEN); | |
| runB.addActionListener(this); | |
| runB.setMinimumSize(new Dimension(70, 30)); | |
| J2Ddemo.addToGridBag(this, runB, 0, 0, 1, 1, 0.0, 0.0); | |
| pb = new JProgressBar(); | |
| pb.setPreferredSize(new Dimension(100, 30)); | |
| pb.setMinimum(0); | |
| J2Ddemo.addToGridBag(this, pb, 1, 0, 2, 1, 1.0, 0.0); | |
| JPanel p1 = new JPanel(new GridLayout(2, 2)); | |
| JPanel p2 = new JPanel(); | |
| JLabel l = new JLabel("Runs:"); | |
| l.setFont(font); | |
| l.setForeground(BLACK); | |
| p2.add(l); | |
| p2.add(runsTextField = new JTextField(String.valueOf(numRuns))); | |
| runsTextField.setPreferredSize(new Dimension(30, 20)); | |
| runsTextField.addActionListener(this); | |
| p1.add(p2); | |
| p2 = new JPanel(); | |
| l = new JLabel("Delay:"); | |
| l.setFont(font); | |
| l.setForeground(BLACK); | |
| p2.add(l); | |
| p2.add(delayTextField = new JTextField(String.valueOf(delay))); | |
| delayTextField.setPreferredSize(new Dimension(30, 20)); | |
| delayTextField.addActionListener(this); | |
| p1.add(p2); | |
| zoomCB.setHorizontalAlignment(SwingConstants.CENTER); | |
| zoomCB.setFont(font); | |
| printCB.setFont(font); | |
| p1.add(zoomCB); | |
| p1.add(printCB); | |
| printCB.addActionListener(this); | |
| J2Ddemo.addToGridBag(this, p1, 0, 1, 3, 1, 1.0, 1.0); | |
| } | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| if (e.getSource().equals(printCB)) { | |
| demoInstVars.getPrintCB().setSelected(printCB.isSelected()); | |
| } else if (e.getSource().equals(delayTextField)) { | |
| delay = Integer.parseInt(delayTextField.getText().trim()); | |
| } else if (e.getSource().equals(runsTextField)) { | |
| numRuns = Integer.parseInt(runsTextField.getText().trim()); | |
| } else if ("Run".equals(e.getActionCommand())) { | |
| doRunAction(); | |
| } else if ("Stop".equals(e.getActionCommand())) { | |
| stop(); | |
| } | |
| } | |
| public void doRunAction() { | |
| runB.setText("Stop"); | |
| runB.setBackground(RED); | |
| start(); | |
| } | |
| public void start() { | |
| thread = new Thread(this); | |
| thread.setPriority(Thread.NORM_PRIORITY + 1); | |
| thread.setName("RunWindow"); | |
| thread.start(); | |
| } | |
| public synchronized void stop() { | |
| if (thread != null) { | |
| thread.interrupt(); | |
| } | |
| thread = null; | |
| notifyAll(); | |
| } | |
| @SuppressWarnings("SleepWhileHoldingLock") | |
| public void sleepPerTab() { | |
| for (int j = 0; j < delay + 1 && thread != null; j++) { | |
| for (int k = 0; k < 10 && thread != null; k++) { | |
| try { | |
| Thread.sleep(100); | |
| } catch (Exception e) { | |
| } | |
| } | |
| Runnable pbUpdateRunnable = new Runnable() { | |
| @Override | |
| public void run() { | |
| pb.setValue(pb.getValue() + 1); | |
| } | |
| }; | |
| SwingUtilities.invokeLater(pbUpdateRunnable); | |
| } | |
| } | |
| private void printDemo(final DemoGroup dg) { | |
| Runnable printDemoRunnable = new Runnable() { | |
| @Override | |
| public void run() { | |
| if (!demoInstVars.getControls().toolBarCB.isSelected()) { | |
| demoInstVars.getControls().toolBarCB.setSelected(true); | |
| dg.invalidate(); | |
| } | |
| for (Component comp : dg.getPanel().getComponents()) { | |
| DemoPanel dp = (DemoPanel) comp; | |
| if (dp.tools != null) { | |
| if (dp.surface.animating != null) { | |
| if (dp.surface.animating.running()) { | |
| dp.tools.startStopB.doClick(); | |
| } | |
| } | |
| dp.tools.printB.doClick(); | |
| } | |
| } | |
| } | |
| }; | |
| invokeAndWait(printDemoRunnable); | |
| } | |
| private DemoGroup dg = null; | |
| private DemoPanel dp = null; | |
| @Override | |
| public void run() { | |
| System.out.println("\nJ2D Demo RunWindow : " + numRuns + " Runs, " | |
| + delay + " second delay between tabs\n" + "java version: " + System. | |
| getProperty("java.version") + "\n" + System.getProperty( | |
| "os.name") + " " + System.getProperty("os.version") + "\n"); | |
| Runtime r = Runtime.getRuntime(); | |
| for (int runNum = 0; runNum < numRuns && thread != null; runNum++) { | |
| Date d = new Date(); | |
| System.out.print("#" + runNum + " " + d.toString() + ", "); | |
| r.gc(); | |
| float freeMemory = r.freeMemory(); | |
| float totalMemory = r.totalMemory(); | |
| System.out.println(((totalMemory - freeMemory) / 1024) + "K used"); | |
| for (int i = 0; i < demoInstVars.getTabbedPane().getTabCount() && thread | |
| != null; i++) { | |
| final int mainTabIndex = i; | |
| Runnable initDemoRunnable = new Runnable() { | |
| @Override | |
| public void run() { | |
| pb.setValue(0); | |
| pb.setMaximum(delay); | |
| if (mainTabIndex != 0) { | |
| dg = demoInstVars.getGroup()[mainTabIndex - 1]; | |
| dg.invalidate(); | |
| } | |
| demoInstVars.getTabbedPane().setSelectedIndex(mainTabIndex); | |
| } | |
| }; | |
| invokeAndWait(initDemoRunnable); | |
| if (i != 0 && (zoomCB.isSelected() || buffersFlag)) { | |
| dp = (DemoPanel) dg.getPanel().getComponent(0); | |
| if (dg.tabbedPane == null && dp.surface != null) { | |
| Runnable mouseClickedRunnable = new Runnable() { | |
| @Override | |
| public void run() { | |
| dg.mouseClicked(dp.surface); | |
| } | |
| }; | |
| invokeAndWait(mouseClickedRunnable); | |
| } | |
| for (int j = 1; j < dg.tabbedPane.getTabCount() && thread | |
| != null; j++) { | |
| final int subTabIndex = j; | |
| Runnable initPanelRunnable = new Runnable() { | |
| @Override | |
| public void run() { | |
| pb.setValue(0); | |
| pb.setMaximum(delay); | |
| dg.tabbedPane.setSelectedIndex(subTabIndex); | |
| } | |
| }; | |
| invokeAndWait(initPanelRunnable); | |
| final JPanel p = dg.getPanel(); | |
| if (buffersFlag && p.getComponentCount() == 1) { | |
| dp = (DemoPanel) p.getComponent(0); | |
| if (dp.surface.animating != null) { | |
| dp.surface.animating.stop(); | |
| } | |
| for (int k = bufBeg; k <= bufEnd && thread != null; | |
| k++) { | |
| final int cloneIndex = k; | |
| Runnable cloneRunnable = new Runnable() { | |
| @Override | |
| public void run() { | |
| dp.tools.cloneB.doClick(); | |
| int n = p.getComponentCount(); | |
| DemoPanel clone = (DemoPanel) p. | |
| getComponent(n - 1); | |
| if (clone.surface.animating != null) { | |
| clone.surface.animating.stop(); | |
| } | |
| clone.tools.issueRepaint = true; | |
| clone.tools.screenCombo.setSelectedIndex( | |
| cloneIndex); | |
| clone.tools.issueRepaint = false; | |
| } | |
| }; | |
| invokeAndWait(cloneRunnable); | |
| } | |
| } | |
| if (printCB.isSelected()) { | |
| printDemo(dg); | |
| } | |
| sleepPerTab(); | |
| } | |
| } else if (i != 0 && printCB.isSelected()) { | |
| printDemo(dg); | |
| sleepPerTab(); | |
| } else { | |
| sleepPerTab(); | |
| } | |
| } | |
| if (runNum + 1 == numRuns) { | |
| System.out.println("Finished."); | |
| if (exit && thread != null) { | |
| System.out.println("System.exit(0)."); | |
| System.exit(0); | |
| } | |
| } | |
| } | |
| Runnable resetRunnable = new Runnable() { | |
| @Override | |
| public void run() { | |
| runB.setText("Run"); | |
| runB.setBackground(GREEN); | |
| pb.setValue(0); | |
| } | |
| }; | |
| invokeAndWait(resetRunnable); | |
| thread = null; | |
| dg = null; | |
| dp = null; | |
| } | |
| private static void invokeAndWait(Runnable run) { | |
| try { | |
| SwingUtilities.invokeAndWait(run); | |
| } catch (Exception e) { | |
| Logger.getLogger(RunWindow.class.getName()).log(Level.SEVERE, | |
| "ERROR in invokeAndWait", e); | |
| } | |
| } | |
| /** | |
| * This class contains initial values for instance variables of 'RunWindow' class, | |
| * and its instance is used in creation of 'RunWindow' object. Values parsed from | |
| * certain command line options of the demo or from the demo applet parameters are | |
| * set to the fields of this class instance. It is a part of the fix which changed | |
| * static variables for instance variables in certain demo classes. | |
| * | |
| * This class is not thread safe, its instances must be accessed only from EDT. | |
| */ | |
| public static class RunWindowSettings { | |
| private int delay = 10; | |
| private int numRuns = 20; | |
| private boolean exit; | |
| private boolean zoomCBIsSelected; | |
| private boolean printCBIsSelected; | |
| private boolean buffersFlag; | |
| private int bufBeg, bufEnd; | |
| public int getDelay() { | |
| return delay; | |
| } | |
| public void setDelay(int delay) { | |
| this.delay = delay; | |
| } | |
| public int getNumRuns() { | |
| return numRuns; | |
| } | |
| public void setNumRuns(int numRuns) { | |
| this.numRuns = numRuns; | |
| } | |
| public boolean getExit() { | |
| return exit; | |
| } | |
| public void setExit(boolean exit) { | |
| this.exit = exit; | |
| } | |
| public boolean isZoomCBSelected() { | |
| return zoomCBIsSelected; | |
| } | |
| public void setZoomCBSelected(boolean b) { | |
| zoomCBIsSelected = b; | |
| } | |
| public boolean isPrintCBSelected() { | |
| return printCBIsSelected; | |
| } | |
| public void setPrintCBIsSelected(boolean b) { | |
| printCBIsSelected = b; | |
| } | |
| public boolean getBuffersFlag() { | |
| return buffersFlag; | |
| } | |
| public void setBuffersFlag(boolean buffersFlag) { | |
| this.buffersFlag = buffersFlag; | |
| } | |
| public int getBufBeg() { | |
| return bufBeg; | |
| } | |
| public void setBufBeg(int bufBeg) { | |
| this.bufBeg = bufBeg; | |
| } | |
| public int getBufEnd() { | |
| return bufEnd; | |
| } | |
| public void setBufEnd(int bufEnd) { | |
| this.bufEnd = bufEnd; | |
| } | |
| } | |
| } |