--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/J2Ddemo/java2d/Tools.java Mon May 14 08:58:32 2018 -0700
@@ -0,0 +1,496 @@
+/*
+ *
+ * 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.LIGHT_GRAY;
+import static java.awt.Color.WHITE;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Insets;
+import java.awt.RenderingHints;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.print.PrinterJob;
+import java.text.DecimalFormat;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+import javax.swing.SwingConstants;
+import javax.swing.border.EtchedBorder;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+
+/**
+ * Tools to control individual demo graphic attributes. Also, control for
+ * start & stop on animated demos; control for cloning the demo; control for
+ * printing the demo. Expand and collapse the Tools panel with ToggleIcon.
+ */
+@SuppressWarnings("serial")
+public final class Tools extends JPanel implements ActionListener,
+ ChangeListener, Runnable {
+ private final DemoInstVarsAccessor demoInstVars;
+ private ImageIcon stopIcon, startIcon;
+ private Font font = new Font(Font.SERIF, Font.PLAIN, 10);
+ private Color roColor = new Color(187, 213, 238);
+ private Surface surface;
+ private Thread thread;
+ private JPanel toolbarPanel;
+ private JPanel sliderPanel;
+ private JLabel label;
+ private ToggleIcon bumpyIcon, rolloverIcon;
+ private DecimalFormat decimalFormat = new DecimalFormat("000");
+ protected boolean focus;
+ public JToggleButton toggleB;
+ public JButton printB;
+ public JComboBox screenCombo;
+ public JToggleButton renderB, aliasB;
+ public JToggleButton textureB, compositeB;
+ public JButton startStopB;
+ public JButton cloneB;
+ public boolean issueRepaint = true;
+ public JToolBar toolbar;
+ public JSlider slider;
+ public boolean doSlider;
+ public boolean isExpanded;
+
+ @SuppressWarnings("LeakingThisInConstructor")
+ public Tools(Surface surface, DemoInstVarsAccessor demoInstVars) {
+ this.surface = surface;
+ this.demoInstVars = demoInstVars;
+
+ setLayout(new BorderLayout());
+
+ stopIcon = new ImageIcon(DemoImages.getImage("stop.gif", this));
+ startIcon = new ImageIcon(DemoImages.getImage("start.gif", this));
+ bumpyIcon = new ToggleIcon(this, LIGHT_GRAY);
+ rolloverIcon = new ToggleIcon(this, roColor);
+ toggleB = new JToggleButton(bumpyIcon);
+ toggleB.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ focus = true;
+ bumpyIcon.start();
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ focus = false;
+ bumpyIcon.stop();
+ }
+ });
+ isExpanded = false;
+ toggleB.addActionListener(this);
+ toggleB.setMargin(new Insets(0, 0, -4, 0));
+ toggleB.setBorderPainted(false);
+ toggleB.setFocusPainted(false);
+ toggleB.setContentAreaFilled(false);
+ toggleB.setRolloverIcon(rolloverIcon);
+ add("North", toggleB);
+
+ toolbar = new JToolBar();
+ toolbar.setPreferredSize(new Dimension(5*25, 26));
+ toolbar.setFloatable(false);
+
+ String s = surface.AntiAlias == RenderingHints.VALUE_ANTIALIAS_ON
+ ? "On" : "Off";
+ aliasB = addTool("A", "Antialiasing " + s, this);
+
+ s = surface.Rendering == RenderingHints.VALUE_RENDER_SPEED
+ ? "Speed" : "Quality";
+ renderB = addTool("R", "Rendering " + s, this);
+
+ s = surface.texture != null ? "On" : "Off";
+ textureB = addTool("T", "Texture " + s, this);
+
+ s = surface.composite != null ? "On" : "Off";
+ compositeB = addTool("C", "Composite " + s, this);
+
+ Image printBImg = DemoImages.getImage("print.gif", this);
+ printB = addTool(printBImg, "Print the Surface", this);
+
+ if (surface instanceof AnimatingSurface) {
+ Image stopImg = DemoImages.getImage("stop.gif", this);
+ startStopB = addTool(stopImg, "Stop Animation", this);
+ toolbar.setPreferredSize(new Dimension(6*25, 26));
+ }
+
+ screenCombo = new JComboBox();
+ screenCombo.setPreferredSize(new Dimension(100, 18));
+ screenCombo.setFont(font);
+ for (String name : GlobalControls.screenNames) {
+ screenCombo.addItem(name);
+ }
+ screenCombo.addActionListener(this);
+ toolbarPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
+ toolbarPanel.setLocation(0, 6);
+ toolbarPanel.setVisible(false);
+ toolbarPanel.add(toolbar);
+ toolbarPanel.add(screenCombo);
+ toolbarPanel.setBorder(new EtchedBorder());
+ add(toolbarPanel);
+
+ setPreferredSize(new Dimension(200, 8));
+
+ if (surface instanceof AnimatingSurface) {
+ sliderPanel = new JPanel(new BorderLayout());
+ label = new JLabel(" Sleep = 030 ms");
+ label.setForeground(BLACK);
+ sliderPanel.add(label, BorderLayout.WEST);
+ slider = new JSlider(SwingConstants.HORIZONTAL, 0, 200, 30);
+ slider.addChangeListener(this);
+ sliderPanel.setBorder(new EtchedBorder());
+ sliderPanel.add(slider);
+
+ addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (toolbarPanel.isVisible()) {
+ invalidate();
+ if ((doSlider = !doSlider)) {
+ remove(toolbarPanel);
+ add(sliderPanel);
+ } else {
+ remove(sliderPanel);
+ add(toolbarPanel);
+ }
+ validate();
+ repaint();
+ }
+ }
+ });
+ }
+ }
+
+ public JButton addTool(Image img,
+ String toolTip,
+ ActionListener al) {
+ JButton b = new JButton(new ImageIcon(img)) {
+
+ Dimension prefSize = new Dimension(25, 22);
+
+ @Override
+ public Dimension getPreferredSize() {
+ return prefSize;
+ }
+
+ @Override
+ public Dimension getMaximumSize() {
+ return prefSize;
+ }
+
+ @Override
+ public Dimension getMinimumSize() {
+ return prefSize;
+ }
+ };
+ toolbar.add(b);
+ b.setFocusPainted(false);
+ b.setSelected(true);
+ b.setToolTipText(toolTip);
+ b.addActionListener(al);
+ return b;
+ }
+
+ public JToggleButton addTool(String name,
+ String toolTip,
+ ActionListener al) {
+ JToggleButton b = new JToggleButton(name) {
+
+ Dimension prefSize = new Dimension(25, 22);
+
+ @Override
+ public Dimension getPreferredSize() {
+ return prefSize;
+ }
+
+ @Override
+ public Dimension getMaximumSize() {
+ return prefSize;
+ }
+
+ @Override
+ public Dimension getMinimumSize() {
+ return prefSize;
+ }
+ };
+ toolbar.add(b);
+ b.setFocusPainted(false);
+ if (toolTip.equals("Rendering Quality") || toolTip.equals(
+ "Antialiasing On") || toolTip.equals("Texture On") || toolTip.
+ equals("Composite On")) {
+ b.setSelected(true);
+ } else {
+ b.setSelected(false);
+ }
+ b.setToolTipText(toolTip);
+ b.addActionListener(al);
+ return b;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Object obj = e.getSource();
+ if (obj instanceof JButton) {
+ JButton b = (JButton) obj;
+ b.setSelected(!b.isSelected());
+ if (b.getIcon() == null) {
+ b.setBackground(b.isSelected() ? GREEN : LIGHT_GRAY);
+ }
+ }
+ if (obj.equals(toggleB)) {
+ isExpanded = !isExpanded;
+ if (isExpanded) {
+ setPreferredSize(new Dimension(200, 38));
+ } else {
+ setPreferredSize(new Dimension(200, 6));
+ }
+ toolbarPanel.setVisible(isExpanded);
+ if (sliderPanel != null) {
+ sliderPanel.setVisible(isExpanded);
+ }
+ getParent().validate();
+ toggleB.getModel().setRollover(false);
+ return;
+ }
+ if (obj.equals(printB)) {
+ start();
+ return;
+ }
+
+ if (obj.equals(startStopB)) {
+ if (startStopB.getToolTipText().equals("Stop Animation")) {
+ startStopB.setIcon(startIcon);
+ startStopB.setToolTipText("Start Animation");
+ surface.animating.stop();
+ } else {
+ startStopB.setIcon(stopIcon);
+ startStopB.setToolTipText("Stop Animation");
+ surface.animating.start();
+ }
+ } else if (obj.equals(aliasB)) {
+ if (aliasB.getToolTipText().equals("Antialiasing On")) {
+ aliasB.setToolTipText("Antialiasing Off");
+ } else {
+ aliasB.setToolTipText("Antialiasing On");
+ }
+ surface.setAntiAlias(aliasB.isSelected());
+ } else if (obj.equals(renderB)) {
+ if (renderB.getToolTipText().equals("Rendering Quality")) {
+ renderB.setToolTipText("Rendering Speed");
+ } else {
+ renderB.setToolTipText("Rendering Quality");
+ }
+ surface.setRendering(renderB.isSelected());
+ } else if (obj.equals(textureB)) {
+ if (textureB.getToolTipText().equals("Texture On")) {
+ textureB.setToolTipText("Texture Off");
+ surface.setTexture(null);
+ surface.clearSurface = true;
+ } else {
+ textureB.setToolTipText("Texture On");
+ surface.setTexture(demoInstVars.getControls().texturechooser.texture);
+ }
+ } else if (obj.equals(compositeB)) {
+ if (compositeB.getToolTipText().equals("Composite On")) {
+ compositeB.setToolTipText("Composite Off");
+ } else {
+ compositeB.setToolTipText("Composite On");
+ }
+ surface.setComposite(compositeB.isSelected());
+ } else if (obj.equals(screenCombo)) {
+ surface.setImageType(screenCombo.getSelectedIndex());
+ }
+
+ if (issueRepaint && surface.animating != null) {
+ if (surface.getSleepAmount() != 0) {
+ if (surface.animating.running()) {
+ surface.animating.doRepaint();
+ }
+ }
+ } else if (issueRepaint) {
+ surface.repaint();
+ }
+ }
+
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ int value = slider.getValue();
+ label.setText(" Sleep = " + decimalFormat.format(value) + " ms");
+ label.repaint();
+ surface.setSleepAmount(value);
+ }
+
+ public void start() {
+ thread = new Thread(this);
+ thread.setPriority(Thread.MAX_PRIORITY);
+ thread.setName("Printing " + surface.name);
+ thread.start();
+ }
+
+ public synchronized void stop() {
+ thread = null;
+ notifyAll();
+ }
+
+ @Override
+ public void run() {
+ boolean stopped = false;
+ if (surface.animating != null && surface.animating.running()) {
+ stopped = true;
+ startStopB.doClick();
+ }
+
+ try {
+ PrinterJob printJob = PrinterJob.getPrinterJob();
+ printJob.setPrintable(surface);
+ boolean pDialogState = true;
+ PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
+
+ if (!demoInstVars.getPrintCB().isSelected()) {
+ pDialogState = printJob.printDialog(aset);
+ }
+ if (pDialogState) {
+ printJob.print(aset);
+ }
+ } catch (java.security.AccessControlException ace) {
+ String errmsg = "Applet access control exception; to allow "
+ + "access to printer, set\n"
+ + "permission for \"queuePrintJob\" in "
+ + "RuntimePermission.";
+ JOptionPane.showMessageDialog(this, errmsg, "Printer Access Error",
+ JOptionPane.ERROR_MESSAGE);
+ } catch (Exception ex) {
+ Logger.getLogger(Tools.class.getName()).log(Level.SEVERE,
+ null, ex);
+ }
+
+ if (stopped) {
+ startStopB.doClick();
+ }
+ thread = null;
+ }
+
+
+ /**
+ * Expand and Collapse the Tools Panel with this bumpy button.
+ */
+ static class ToggleIcon implements Icon, Runnable {
+
+ private Color shadowColor = new Color(102, 102, 153);
+ private Color fillColor;
+ private Tools tools;
+ private Thread thread;
+
+ public ToggleIcon(Tools tools, Color fillColor) {
+ this.tools = tools;
+ this.fillColor = fillColor;
+ }
+
+ @Override
+ public void paintIcon(Component c, Graphics g, int x, int y) {
+ int w = getIconWidth();
+ int h = getIconHeight();
+ g.setColor(fillColor);
+ g.fillRect(0, 0, w, h);
+ for (; x < w - 2; x += 4) {
+ g.setColor(WHITE);
+ g.fillRect(x, 1, 1, 1);
+ g.fillRect(x + 2, 3, 1, 1);
+ g.setColor(shadowColor);
+ g.fillRect(x + 1, 2, 1, 1);
+ g.fillRect(x + 3, 4, 1, 1);
+ }
+ }
+
+ @Override
+ public int getIconWidth() {
+ return tools.getSize().width;
+ }
+
+ @Override
+ public int getIconHeight() {
+ return 6;
+ }
+
+ public void start() {
+ thread = new Thread(this);
+ thread.setPriority(Thread.MIN_PRIORITY);
+ thread.setName("ToggleIcon");
+ thread.start();
+ }
+
+ public synchronized void stop() {
+ if (thread != null) {
+ thread.interrupt();
+ }
+ thread = null;
+ }
+
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(400);
+ } catch (InterruptedException e) {
+ }
+ if (tools.focus && thread != null) {
+ tools.toggleB.doClick();
+ }
+ thread = null;
+ }
+ }
+} // End Tools class
+