From b73dfaedecc96785a5d0f94d525c5fb7a8df0b77 Mon Sep 17 00:00:00 2001 From: gmungoc Date: Thu, 1 Sep 2016 16:09:00 +0100 Subject: [PATCH] JAL-2077 test harness for inspecting mouse events --- test/jalview/gui/MouseEventDemo.java | 263 ++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 test/jalview/gui/MouseEventDemo.java diff --git a/test/jalview/gui/MouseEventDemo.java b/test/jalview/gui/MouseEventDemo.java new file mode 100644 index 0000000..3a382ca --- /dev/null +++ b/test/jalview/gui/MouseEventDemo.java @@ -0,0 +1,263 @@ +package jalview.gui; + +/* + * Copyright (c) 1995, 2008, 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 or 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. + */ + +/* +* MouseEventDemo.java +*/ + +import jalview.util.Platform; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import javax.swing.AbstractAction; +import javax.swing.BorderFactory; +import javax.swing.InputMap; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTextArea; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +/** + * Sourced from Oracle and adapted + * + * @see https + * ://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html + */ +public class MouseEventDemo extends JPanel implements MouseListener +{ + private class BlankArea extends JLabel + { + Dimension minSize = new Dimension(200, 100); + + public BlankArea(Color color) + { + setBackground(color); + setOpaque(true); + setBorder(BorderFactory.createLineBorder(Color.black)); + } + + @Override + public Dimension getMinimumSize() + { + return minSize; + } + + @Override + public Dimension getPreferredSize() + { + return minSize; + } + } + + static int counter = 0; + + BlankArea blankArea; + + JTextArea textArea; + + static final String NEWLINE = System.getProperty("line.separator"); + + public static void main(String[] args) + { + /* Use an appropriate Look and Feel */ + try + { + // UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + // UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); + UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); + } catch (UnsupportedLookAndFeelException ex) + { + ex.printStackTrace(); + } catch (IllegalAccessException ex) + { + ex.printStackTrace(); + } catch (InstantiationException ex) + { + ex.printStackTrace(); + } catch (ClassNotFoundException ex) + { + ex.printStackTrace(); + } + /* Turn off metal's use of bold fonts */ + UIManager.put("swing.boldMetal", Boolean.FALSE); + // Schedule a job for the event dispatch thread: + // creating and showing this application's GUI. + javax.swing.SwingUtilities.invokeLater(new Runnable() + { + @Override + public void run() + { + createAndShowGUI(); + } + }); + } + + /** + * Create the GUI and show it. For thread safety, this method should be + * invoked from the event dispatch thread. + */ + private static void createAndShowGUI() + { + // Create and set up the window. + JFrame frame = new JFrame("MouseEventDemo (C to clear)"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + // Create and set up the content pane. + JComponent newContentPane = new MouseEventDemo(); + newContentPane.setOpaque(true); // content panes must be opaque + frame.setContentPane(newContentPane); + + // Display the window. + frame.pack(); + frame.setVisible(true); + } + + public MouseEventDemo() + { + super(new GridLayout(0, 1)); + + textArea = new JTextArea(); + textArea.setEditable(false); + JScrollPane scrollPane = new JScrollPane(textArea); + scrollPane + .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + scrollPane.setPreferredSize(new Dimension(400, 75)); + + blankArea = new BlankArea(Color.YELLOW); + JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, + blankArea, scrollPane); + splitPane.setVisible(true); + splitPane.setDividerLocation(0.2d); + splitPane.setResizeWeight(0.5d); + add(splitPane); + + addKeyBinding(); + + blankArea.addMouseListener(this); + addMouseListener(this); + setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + } + + private void addKeyBinding() + { + addKeyBinding(KeyStroke.getKeyStroke('C')); + addKeyBinding(KeyStroke.getKeyStroke('c')); + } + + /** + * @param ks + */ + void addKeyBinding(final KeyStroke ks) + { + InputMap inputMap = this.getInputMap(JComponent.WHEN_FOCUSED); + inputMap.put(ks, ks); + this.getActionMap().put(ks, new AbstractAction() + { + @Override + public void actionPerformed(ActionEvent e) + { + textArea.setText(""); + log(""); + } + }); + } + + void logEvent(String eventDescription, MouseEvent e) + { + // textArea.append(eventDescription + " detected on " + // + e.getComponent().getClass().getName() + "." + NEWLINE); + log("------- " + counter++ + ": " + eventDescription); + log("e.isPopupTrigger: " + e.isPopupTrigger()); + log("SwingUtilities.isRightMouseButton: " + + SwingUtilities.isRightMouseButton(e)); + log("SwingUtilities.isLeftMouseButton: " + + SwingUtilities.isLeftMouseButton(e)); + log("Platform.isControlDown: " + Platform.isControlDown(e)); + log("e.isControlDown: " + e.isControlDown()); + log("e.isAltDown: " + e.isAltDown()); + log("e.isMetaDown: " + e.isMetaDown()); + log("e.isShiftDown: " + e.isShiftDown()); + log("e.getClickCount: " + e.getClickCount()); + } + + /** + * @param msg + */ + void log(String msg) + { + textArea.append(msg + NEWLINE); + textArea.setCaretPosition(textArea.getDocument().getLength()); + } + + @Override + public void mousePressed(MouseEvent e) + { + logEvent("Mouse pressed", e); + } + + @Override + public void mouseReleased(MouseEvent e) + { + logEvent("Mouse released", e); + } + + @Override + public void mouseEntered(MouseEvent e) + { + // eventOutput("Mouse entered", e); + } + + @Override + public void mouseExited(MouseEvent e) + { + // eventOutput("Mouse exited", e); + } + + @Override + public void mouseClicked(MouseEvent e) + { + logEvent("Mouse clicked", e); + } +} \ No newline at end of file -- 1.7.10.2