package com.revolsys.swing;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Window;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import com.revolsys.swing.action.RunnableAction;
public class WindowManager implements WindowFocusListener {
private static Window currentWindow;
private static final WindowManager INSTANCE = new WindowManager();
private static final JMenu menu = new JMenu("Window");
private static final Map<Window, JCheckBoxMenuItem> windowMenuItemMap = new HashMap<>();
private static final List<Window> windows = new ArrayList<>();
public static void addMenu(final JMenuBar menuBar) {
menuBar.add(menu);
}
public synchronized static void addWindow(final Window window) {
if (!windows.contains(window)) {
windows.add(window);
final String title = getTitle(window);
final JCheckBoxMenuItem menuItem = RunnableAction.newCheckBoxMenuItem(title,
() -> requestFocus(window));
menuItem.setSelected(true);
menu.add(menuItem);
windowMenuItemMap.put(window, menuItem);
window.addWindowFocusListener(INSTANCE);
window.requestFocus();
}
}
protected static String getTitle(final Window window) {
String title = window.getName();
if (window instanceof Frame) {
final Frame frame = (Frame)window;
title = frame.getTitle();
} else if (window instanceof Dialog) {
final Dialog dialog = (Dialog)window;
title = dialog.getTitle();
} else {
title = window.getName();
}
return title;
}
public synchronized static void removeWindow(final Window window) {
if (window != null) {
final JCheckBoxMenuItem menuItem = windowMenuItemMap.remove(window);
if (menuItem != null) {
menuItem.setAction(null);
menu.remove(menuItem);
}
windows.remove(window);
window.removeWindowFocusListener(INSTANCE);
if (window == currentWindow) {
currentWindow = null;
}
}
}
public static void requestFocus(final Window window) {
if (window != null) {
window.requestFocus();
final JCheckBoxMenuItem menuItem = windowMenuItemMap.get(window);
if (menuItem != null) {
menuItem.setSelected(true);
}
}
}
public synchronized static void updateWindowTitle(final Window window) {
if (window != null) {
final JCheckBoxMenuItem menuItem = windowMenuItemMap.get(window);
if (menuItem != null) {
final String title = getTitle(window);
menuItem.setText(title);
}
}
}
private WindowManager() {
}
@Override
public void windowGainedFocus(final WindowEvent e) {
final Window window = e.getWindow();
if (window instanceof JFrame) {
final JFrame frame = (JFrame)window;
JMenuBar menuBar = frame.getJMenuBar();
if (menuBar == null) {
menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
}
addMenu(menuBar);
}
final JCheckBoxMenuItem menuItem = windowMenuItemMap.get(window);
if (menuItem != null) {
menuItem.setSelected(true);
}
currentWindow = window;
}
@Override
public void windowLostFocus(final WindowEvent e) {
final Window window = e.getWindow();
final JCheckBoxMenuItem menuItem = windowMenuItemMap.get(window);
if (menuItem != null) {
menuItem.setSelected(false);
}
if (window == currentWindow) {
currentWindow = null;
}
}
}