import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class MediaManager extends JFrame implements ComponentListener, FocusListener, WindowStateListener {
private static final long serialVersionUID = -8440221168382362270L;
private DialogFocuser dialogFocuser;
private JDialog dialogContent;
public MediaManager() {
dialogFocuser = new DialogFocuser();
dialogFocuser.start();
dialogContent = new JDialog();
dialogContent.setUndecorated(true);
dialogContent.setBackground(new Color(0, 0, 0, 0));
dialogContent.getRootPane().setOpaque(false);
dialogContent.setVisible(true);
setTitle("Media Manager");
setSize(800, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setLayout(new GridBagLayout());
addComponentListener(this);
addFocusListener(this);
addWindowStateListener(this);
}
@Override
public void setLocation(Point p) {
super.setLocation(p);
Insets insets = getInsets();
if(dialogContent != null) {
dialogContent.setLocation(p.x+insets.left, p.y+insets.top);
dialogContent.validate();
dialogContent.repaint();
dialogContent.requestFocus();
}
}
@Override
public void setLocation(int x, int y) {
super.setLocation(x, y);
Insets insets = getInsets();
if(dialogContent != null) {
dialogContent.setLocation(x+insets.left, y+insets.top);
dialogContent.validate();
dialogContent.repaint();
dialogContent.requestFocus();
}
}
@Override
public void setSize(Dimension size) {
super.setSize(size);
Insets insets = getInsets();
if(dialogContent != null) {
dialogContent.setSize(size.width-insets.left-insets.right, size.height-insets.top-insets.bottom);
dialogContent.validate();
dialogContent.repaint();
}
}
@Override
public void setSize(int width, int height) {
super.setSize(width, height);
Insets insets = getInsets();
if(dialogContent != null) {
dialogContent.setSize(width-insets.left-insets.right, height-insets.top-insets.bottom);
dialogContent.validate();
dialogContent.repaint();
}
}
@Override
public void setBounds(Rectangle bounds) {
super.setBounds(bounds);
Insets insets = getInsets();
Rectangle r = new Rectangle();
r.x = bounds.x+insets.left;
r.y = bounds.y+insets.top;
r.width = bounds.width-insets.left-insets.right;
r.height = bounds.height-insets.top-insets.bottom;
if(dialogContent != null) {
dialogContent.setBounds(r);
dialogContent.validate();
dialogContent.repaint();
}
}
@Override
public void setBounds(int x, int y, int width, int height) {
super.setBounds(x, y, width, height);
Insets insets = getInsets();
Rectangle r = new Rectangle();
r.x = x+insets.left;
r.y = y+insets.top;
r.width = width-insets.left-insets.right;
r.height = height-insets.top-insets.bottom;
if(dialogContent != null) {
dialogContent.setBounds(r.x, r.y, r.width, r.height);
dialogContent.validate();
dialogContent.repaint();
}
}
@Override
public Dimension getSize() {
Dimension size = super.getSize();
if(dialogContent != null) {
dialogContent.setSize(getContentPane().getSize());
dialogContent.validate();
dialogContent.repaint();
}
return size;
}
@Override
public Point getLocation() {
Point location = super.getLocation();
Insets insets = getInsets();
if(dialogContent != null) {
dialogContent.setLocation(location.x+insets.left, location.y+insets.top);
dialogContent.validate();
dialogContent.repaint();
}
return location;
}
@Override
public Rectangle getBounds() {
Rectangle bounds = super.getBounds();
Insets insets = getInsets();
if(dialogContent != null) {
dialogContent.setBounds(bounds.x+insets.left, bounds.y+insets.top, getContentPane().getSize().width, getContentPane().getSize().height);
dialogContent.validate();
dialogContent.repaint();
}
return bounds;
}
@Override
public int getX() {
return getLocation().x;
}
@Override
public int getY() {
return getLocation().y;
}
@Override
public int getWidth() {
return getSize().width;
}
@Override
public int getHeight() {
return getSize().height;
}
@Override
public void setExtendedState(int state) {
super.setExtendedState(state);
if(dialogContent != null) {
if(state == JFrame.ICONIFIED) {
dialogContent.setVisible(false);
} else {
if(!dialogContent.isVisible()) dialogContent.setVisible(true);
dialogContent.requestFocus();
}
}
}
@Override
public void setState(int state) {
super.setState(state);
if(dialogContent != null) {
if(state == JFrame.ICONIFIED) {
dialogContent.setVisible(false);
} else {
if(!dialogContent.isVisible()) dialogContent.setVisible(true);
dialogContent.requestFocus();
}
}
}
public Container getContent() {
return dialogContent.getContentPane();
}
public void setContent(Container content) {
dialogContent.setContentPane(content);
}
@Override
public void componentHidden(ComponentEvent evt) { }
@Override
public void componentMoved(ComponentEvent evt) {
if(dialogContent != null) {
getLocation();
}
}
@Override
public void componentResized(ComponentEvent evt) {
if(dialogContent != null) {
getSize();
}
}
@Override
public void componentShown(ComponentEvent evt) { }
@Override
public void focusGained(FocusEvent arg0) {
if(dialogContent != null) {
dialogContent.requestFocus();
}
}
@Override
public void focusLost(FocusEvent arg0) { }
@Override
public void windowStateChanged(WindowEvent evt) {
if(dialogContent != null) {
if(evt.getNewState() == JFrame.ICONIFIED) {
dialogContent.setVisible(false);
} else {
dialogFocuser.setStarted(true);
}
}
}
private class DialogFocuser extends Thread {
private boolean started = false;
public synchronized boolean isStarted() {
return started;
}
public synchronized void setStarted(boolean started) {
this.started = started;
if(started) notify();
}
public void run() {
while(true) {
if(isStarted()) {
for(int i=0; i<100; i++) {
if(isShowing() && isVisible() && isActive() && hasFocus() && isValid()) {
EventQueue.invokeLater(new Runnable() {
public void run() {
if(dialogContent != null) {
if(!dialogContent.isVisible()) dialogContent.setVisible(true);
dialogContent.requestFocus();
}
}
});
setStarted(false);
break;
}
try {
Thread.sleep(10);
} catch(InterruptedException ex) {
ex.printStackTrace();
}
}
} else {
synchronized(DialogFocuser.this) {
try {
wait();
} catch(InterruptedException ex) {
interrupt();
}
}
}
}
}
}
}