package org.openflexo.swing;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Window;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;
public class WindowSynchronizer implements ComponentListener, WindowListener {
private List<Window> synchronizedWindows;
private List<Window> shownWindows;
private Window activeWindow;
private Dimension size;
private Point location;
public WindowSynchronizer() {
synchronizedWindows = new ArrayList<Window>();
shownWindows = new ArrayList<Window>();
}
public void addToSynchronizedWindows(Window window) {
if (!synchronizedWindows.contains(window)) {
synchronizedWindows.add(window);
if (window.isVisible()) {
shownWindows.add(window);
}
window.addWindowListener(this);
window.addComponentListener(this);
}
}
public void removeFromSynchronizedWindows(Window window) {
synchronizedWindows.remove(window);
shownWindows.remove(window);
window.removeWindowListener(this);
window.removeComponentListener(this);
if (activeWindow == window) {
activeWindow = null;
}
}
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
}
@Override
public void windowClosed(WindowEvent e) {
resetIfNeeded(e);
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
activeWindow = e.getWindow();
if (activeWindow != null) {
if (size != null) {
activeWindow.setSize(size);
} else {
size = activeWindow.getSize();
}
if (location != null) {
activeWindow.setLocation(location);
} else {
location = activeWindow.getLocation();
}
}
}
@Override
public void windowDeactivated(WindowEvent e) {
resetIfNeeded(e);
}
protected void resetIfNeeded(WindowEvent e) {
if (e.getWindow() == activeWindow) {
activeWindow = null;
}
}
@Override
public void componentResized(ComponentEvent e) {
if (e.getComponent() == activeWindow) {
size = activeWindow.getSize();
location = activeWindow.getLocation();
updateSizeForWindowsBut(activeWindow);
}
}
private void updateSizeForWindowsBut(Window activeWindow) {
for (Window w : shownWindows) {
if (w != activeWindow) {
w.setSize(size);
}
}
}
@Override
public void componentMoved(ComponentEvent e) {
if (e.getComponent() == activeWindow) {
size = activeWindow.getSize();
location = activeWindow.getLocation();
updateLocationForWindowsBut(activeWindow);
}
}
private void updateLocationForWindowsBut(Window activeWindow) {
for (Window w : shownWindows) {
if (w != activeWindow) {
w.setLocation(location);
}
}
}
@Override
public void componentShown(ComponentEvent e) {
shownWindows.add((Window) e.getComponent());
}
@Override
public void componentHidden(ComponentEvent e) {
shownWindows.remove(e.getComponent());
}
}