/**
*
*/
package org.korsakow.ide.controller;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultFocusManager;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
import org.korsakow.domain.interf.IResource;
import org.korsakow.ide.Application;
import org.korsakow.ide.ui.ResourceEditor;
import org.korsakow.ide.util.UIUtil;
public abstract class AbstractResourceEditAction implements ResourceEditAction
{
private static class ResourceEditorCancelAction extends AbstractAction
{
ResourceEditor editor;
public ResourceEditorCancelAction(ResourceEditor editor) {
this.editor = editor;
}
public void actionPerformed(ActionEvent event) {
if (DefaultFocusManager.getCurrentManager().getActiveWindow() != editor)
return;
editor.dispose();
}
}
public ResourceEditor run(IResource resource) throws Exception
{
Application app = Application.getInstance();
ResourceEditor editor = app.getOpenEditor(resource);
if (editor == null) {
editor = app.createResourceEditor(resource);
try {
initViewHelper(editor, resource);
} catch (Exception e) {
editor.dispose();
throw e;
}
editor.pack();
UIUtil.constrainSizeToScreen(editor);
UIUtil.centerOnScreen(editor);
}
editor.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "escape");
editor.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "escape");
editor.getRootPane().getActionMap().put("escape", new ResourceEditorCancelAction(editor));
editor.addCancelActionListener( new ResourceEditorCancelAction(editor) );
editor.getRootPane().setDefaultButton(editor.getOKButton());
adjustEditorAfterPack(editor, resource);
editor.setVisible(true);
return editor;
}
protected void adjustEditorAfterPack(ResourceEditor editor, IResource resource) {}
protected abstract void initViewHelper(ResourceEditor editor, IResource resource) throws Exception;
}