// Copyright (c) 2006 - 2008, Markus Strauch.
// 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.
//
// 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 net.sf.sdedit.ui.components;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.util.LinkedList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import net.sf.sdedit.util.base64.Base64;
public class FullScreen extends JFrame implements KeyListener, ActionListener {
private final static long serialVersionUID = 0xAB343922;
private ZoomPane zoomPane;
private GraphicsDevice gd;
private ScalePanel scalePanel;
private List<FullScreenListener> listeners;
private boolean locked;
private JPanel closePanel;
private Timer hideClosePanelTimer;
private static final String imageString = "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUE"
+ "AAK/INwWK6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAASAAAAE"
+ "gARslrPgAAAvdJREFUOMutlF1rXGUQx39zztk9+5LtptuURi+ChhpBi"
+ "kWkXogIghd65Y39AOoXEPEDCEIvJAUv9UoQgqhfwFRBsMWbvnihFKok"
+ "GiSoqa2N2e55e2bGi7O72cQIIg4Mz8wDz4//DDOPnF3dbGM60CKLrAp"
+ "oGdAqMBtrVaGlYpP7ca5VQIuAViGYhdvSeyQk873W2wu95rPi81LmRl"
+ "ko9Wns50qRO2WulIVhuWIYKoZFinM3+Oin9/3yi2vJQj99/cxSP9YqI"
+ "sucUQZZBqPRrDujBBAIDh6gFAgxEAPlNrBTEsl60mvG8SCNKYDUhLZD"
+ "LpAJ5DHkDciakKWQtSDrwChz8h6YAQjabfNLTlqYd5PlY3D+UbCywCT"
+ "BJcaU2h3c6oe1O2qgCsHAyxJz4Y/dhDffibl5A5JOAx5oZujVj5DBEs"
+ "wtIg8+jLS6HGWO4Dvb2PAevnMV7y/w20NP02kJAJGbQxRjlVN8cIFi9"
+ "Q1878+/YdwdVSc4lD/cpHzrNapLH1N5ShUcc6+BuEHcJDq5gv/8O7a5"
+ "XXf/AAzcHTPHDTwI9v0GPorQ48uoAWNg4jYmL62QXlhDogYyf2IfNwO"
+ "rgQF77An8vXVMwNo97L5OeCQ+jmRwinhw6mChXqubwtwxNbw9h58+U9"
+ "+roru7+FThBH24a1OYTYFmhs2onfUJJsL838PGsTpYFKMSYw6qNquwh"
+ "uitG+jXX4CnxOdfwTtzRyoxBLY2iNY/RY61qZ55CWNuKiaaluyBsP4h"
+ "1dq72HBvOshHAX17k8YnqyTffYmJMNu1WmExRL/9jOjcU+B9XP65XHN"
+ "Duh2ql1+lEX6ltXUFFp+fAZpB2iF58gV4bhFvH8fiJuKG1Hsxnso6Rg"
+ "N2+ixh+XHCnQ0sbkLYn9vk9r2Cbzb2CLqC7iiqGRqGaDBUFVObxqpWj"
+ "42D47j3cXf27t9hVBggJJeu/Xjx86+u97SsIq0UDTr+YBWdeKhPqxSr"
+ "v5jD+x1lw7tbIKUACdA9tG//1Yr/gXHQ/gJla4L5jBzrYgAAACJ6VFh"
+ "0U29mdHdhcmUAAHjac0zJT0pV8MxNTE8NSk1MqQQAL5wF1K4MqU0AAA"
+ "AASUVORK5CYII=";
private static final ImageIcon noFullScreenIcon = new ImageIcon(Base64
.decodeBase64EncodedImage(imageString));
public void actionPerformed(ActionEvent e) {
if (e.getSource() == hideClosePanelTimer) {
if (!locked && closePanel.isVisible()) {
closePanel.setVisible(false);
getContentPane().repaint();
}
} else {
returnFromFullScreenMode();
}
}
private MouseMotionListener mml = new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
hideClosePanelTimer.restart();
closePanel.setVisible(true);
}
};
private MouseListener ml = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
locked = true;
}
@Override
public void mouseExited(MouseEvent e) {
locked = false;
}
};
public FullScreen() {
super();
listeners = new LinkedList<FullScreenListener>();
gd = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice();
zoomPane = new ZoomPane();
zoomPane.setRoot ((JComponent) getGlassPane());
getContentPane().setLayout(new BorderLayout());
JButton close = new JButton(noFullScreenIcon);
close.setMargin(new Insets(0, 0, 0, 0));
close.addActionListener(this);
getContentPane().add(zoomPane, BorderLayout.CENTER);
addKeyListener(this);
setUndecorated(true);
scalePanel = new ScalePanel(true);
scalePanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
scalePanel.getSlider().addMouseListener(ml);
scalePanel.setScalable(zoomPane);
closePanel = new JPanel();
closePanel.setLayout(new BorderLayout());
closePanel.add(close, BorderLayout.EAST);
closePanel.add(scalePanel, BorderLayout.CENTER);
JPanel glass = (JPanel) getGlassPane();
glass.setVisible(true);
glass.setLayout(new BorderLayout());
JPanel top = new JPanel();
top.setOpaque(false);
top.setLayout(new BorderLayout());
glass.add(top, BorderLayout.NORTH);
top.add(closePanel, BorderLayout.EAST);
hideClosePanelTimer = new Timer(1000, this);
hideClosePanelTimer.start();
}
public ZoomPane getZoomPane() {
return zoomPane;
}
public void addListener(FullScreenListener listener) {
listeners.add(listener);
}
public ScalePanel getScalePanel() {
return scalePanel;
}
/**
* Displays the component given in full screen mode.
*
* @param comp
* the component to be displayed in full screen mode
* @param originalWidth
* the original (unscaled) width of the component
* @param originalHeight
* the original (unscaled) height of the component
*/
public void display(Zoomable<? extends JComponent> comp) {
gd.setFullScreenWindow(this);
setVisible(true);
comp.asJComponent().removeMouseMotionListener(mml);
comp.asJComponent().addMouseMotionListener(mml);
zoomPane.setViewportView(comp);
closePanel.setVisible(false);
locked = false;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
requestFocus();
}
});
}
private void returnFromFullScreenMode() {
gd.setFullScreenWindow(null);
for (FullScreenListener listener : listeners) {
listener.fullScreenModeLeft();
}
setVisible(false);
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE
|| KeyEvent.getKeyText(e.getKeyCode()).equals("F9")) {
returnFromFullScreenMode();
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}