// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.actions;
import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.util.GuiHelper;
import org.openstreetmap.josm.tools.Shortcut;
/**
* This class toggles the full-screen mode.
* @since 2533
*/
public class FullscreenToggleAction extends ToggleAction {
private final transient GraphicsDevice gd;
private Rectangle prevBounds;
/**
* Constructs a new {@code FullscreenToggleAction}.
*/
public FullscreenToggleAction() {
super(tr("Fullscreen view"),
null, /* no icon */
tr("Toggle fullscreen view"),
Shortcut.registerShortcut("menu:view:fullscreen", tr("Toggle fullscreen view"), KeyEvent.VK_F11, Shortcut.DIRECT),
false /* register */
);
putValue("help", ht("/Action/FullscreenView"));
putValue("toolbar", "fullscreen");
Main.toolbar.register(this);
gd = GraphicsEnvironment.isHeadless() ? null : GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
setSelected(Main.pref.getBoolean("draw.fullscreen", false));
notifySelectedState();
}
@Override
public void actionPerformed(ActionEvent e) {
toggleSelectedState(e);
Main.pref.put("draw.fullscreen", isSelected());
notifySelectedState();
setMode();
}
/**
* To call if this action must be initially run at JOSM startup.
*/
public void initial() {
if (isSelected()) {
setMode();
}
}
protected void setMode() {
JFrame frame = (JFrame) Main.parent;
List<Window> visibleWindows = new ArrayList<>();
visibleWindows.add(frame);
for (Window w : Frame.getWindows()) {
if (w.isVisible() && w != frame) {
visibleWindows.add(w);
}
}
boolean selected = isSelected();
if (frame != null) {
frame.dispose();
frame.setUndecorated(selected);
if (selected) {
prevBounds = frame.getBounds();
frame.setBounds(new Rectangle(GuiHelper.getScreenSize()));
}
}
// we cannot use hw-exclusive fullscreen mode in MS-Win, as long
// as josm throws out modal dialogs.
//
// the good thing is: fullscreen works without exclusive mode,
// since windows (or java?) draws the undecorated window full-
// screen by default (it's a simulated mode, but should be ok)
String exclusive = Main.pref.get("draw.fullscreen.exclusive-mode", "auto");
if (("true".equals(exclusive) || ("auto".equals(exclusive) && !Main.isPlatformWindows())) && gd != null) {
gd.setFullScreenWindow(selected ? frame : null);
}
if (!selected && prevBounds != null && frame != null) {
frame.setBounds(prevBounds);
}
for (Window wind : visibleWindows) {
if (wind != null) {
wind.setVisible(true);
}
}
// Free F10 key to allow it to be used by plugins, even after full screen (see #7502)
if (frame != null) {
frame.getJMenuBar().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "none");
}
}
}