/* * * 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; } } }