/*
* This file is part of VLCJ.
*
* VLCJ is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* VLCJ is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with VLCJ. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2009-2016 Caprica Software Limited.
*/
package uk.co.caprica.vlcj.test.inputlistener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.test.VlcjTest;
/**
* Test showing how to add mouse and key listeners to the video surface.
* <p>
* Normal Java mouse and key listeners just work on Linux.
* <p>
* On Windows, some extra steps are needed - note that these extra steps may become the default in
* a future version of vlcj.
* <p>
* Windows used to require the use of the WindowsCanvas, incorporating a native mouse hook and a
* global AWT event listener.
* <p>
* This test does <strong>not</strong> use a WindowsCanvas, does <strong>not</strong> use a native
* mouse hook and does <strong>not</strong> use a global AWT event listener. Nevertheless, this test
* shows fully working mouse and keyboard listeners on Windows.
*/
public class InputListenerTest extends VlcjTest {
/**
* Main frame.
*/
private final JFrame mainFrame;
/**
* Media player component.
*/
private final EmbeddedMediaPlayerComponent mediaPlayerComponent;
/**
* Application entry-point.
*
* @param args command-line arguments
*/
public static void main(String[] args) {
System.setProperty("vlcj.log", "DEBUG");
if(args.length != 1) {
System.err.println("Must specify an MRL");
System.exit(1);
}
// Specify an MRL on the command-line
final String mrl = args[0];
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new InputListenerTest().start(mrl);
}
});
}
/**
* Create the user interface.
*/
public InputListenerTest() {
mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
// You *must* do this...
mediaPlayerComponent.getMediaPlayer().setEnableKeyInputHandling(false);
mediaPlayerComponent.getMediaPlayer().setEnableMouseInputHandling(false);
// Add regular Java listeners, no native hook or global event listener shenanigans...
MouseHandler mouseHandler = new MouseHandler();
KeyHandler keyHandler = new KeyHandler();
mediaPlayerComponent.getVideoSurface().addMouseListener(mouseHandler);
mediaPlayerComponent.getVideoSurface().addMouseMotionListener(mouseHandler);
mediaPlayerComponent.getVideoSurface().addMouseWheelListener(mouseHandler);
mediaPlayerComponent.getVideoSurface().addKeyListener(keyHandler);
mainFrame = new JFrame("vlcj input listener test");
mainFrame.setBounds(50, 50, 800, 500);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setContentPane(mediaPlayerComponent);
mainFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event) {
mediaPlayerComponent.release(true);
}
});
mainFrame.setVisible(true);
// You must explicitly request focus to the video surface, this is one way to do it...
// Clicking in the Canvas will *not* by default set focus (you could request focus in
// response to a mouse-clicked event)
mediaPlayerComponent.getVideoSurface().requestFocusInWindow();
}
private void start(String mrl) {
mediaPlayerComponent.getMediaPlayer().playMedia(mrl);
}
private class MouseHandler extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent event) {
System.out.println(event);
}
@Override
public void mouseDragged(MouseEvent event) {
System.out.println(event);
}
@Override
public void mouseEntered(MouseEvent event) {
System.out.println(event);
}
@Override
public void mouseExited(MouseEvent event) {
System.out.println(event);
}
@Override
public void mouseMoved(MouseEvent event) {
System.out.println(event);
}
@Override
public void mousePressed(MouseEvent event) {
System.out.println(event);
}
@Override
public void mouseReleased(MouseEvent event) {
System.out.println(event);
}
@Override
public void mouseWheelMoved(MouseWheelEvent event) {
System.out.println(event);
}
}
private class KeyHandler extends KeyAdapter {
@Override
public void keyTyped(KeyEvent event) {
System.out.println(event);
}
@Override
public void keyPressed(KeyEvent event) {
System.out.println(event);
}
@Override
public void keyReleased(KeyEvent event) {
System.out.println(event);
}
}
}