package org.korsakow.ide.ui.laf;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JRootPane;
import javax.swing.KeyStroke;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicRootPaneUI;
import javax.swing.text.DefaultEditorKit;
import org.apache.log4j.Logger;
import org.korsakow.ide.util.Platform;
import org.korsakow.ide.util.Util;
public class KorsakowRootPaneUI extends BasicRootPaneUI
{
/**
* Simulates the WINDOW_CLOSING event.
* This is pertinant since it allows JFrame/JDialog defaultCloseOperation and the event hooks to operate as usual.
* @author d
*
*/
private static class CloseWindowAction extends AbstractAction
{
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source instanceof JRootPane) {
JRootPane rootPane = (JRootPane)source;
Object topLevel = rootPane.getTopLevelAncestor();
if (topLevel instanceof Window) {
Window window = (Window)topLevel;
WindowEvent event = new WindowEvent(window, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
}
}
}
}
private static Action closeWindowAction;
private static Action getDisposeWindowAction()
{
if (closeWindowAction == null)
closeWindowAction = new CloseWindowAction();
return closeWindowAction;
}
public static ComponentUI createUI(JComponent c) {
return new KorsakowRootPaneUI();
}
public void installUI(JComponent c) {
super.installUI(c);
switch (Platform.getOS())
{
case WIN:
// apparantly this is not needed as it is provided by the platform in this case
// c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F4, KeyEvent.ALT_MASK), "closeWindow");
break;
case MAC:
c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, KeyEvent.META_MASK), "closeWindow");
break;
default:
Logger.getLogger(KorsakowRootPaneUI.class).error("No window close binding", new Throwable());
break;
}
c.getActionMap().put("closeWindow", getDisposeWindowAction());
}
}