/*
* EnhancedDialog.java - Handles OK/Cancel for you
* Copyright (C) 1998, 1999, 2001 Slava Pestov
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit.gui;
import javax.swing.*;
import org.gjt.sp.jedit.GUIUtilities;
import org.gjt.sp.jedit.gui.KeyEventTranslator;
import java.awt.event.*;
import java.awt.*;
/** Dialog that handles OK/Cancel for you
*
* A dialog box that handles window closing, the ENTER key and the ESCAPE
* key for you. All you have to do is implement ok() (called when
* Enter is pressed) and cancel() (called when Escape is pressed, or window
* is closed).
* @author Slava Pestov
* @version $Id: EnhancedDialog.java 23676 2014-09-18 00:12:57Z vampire0 $
*/
public abstract class EnhancedDialog extends JDialog
{
public EnhancedDialog(Frame parent, String title, boolean modal)
{
super(parent,title,modal);
_init();
}
public EnhancedDialog(Dialog parent, String title, boolean modal)
{
super(parent,title,modal);
_init();
}
public boolean getEnterEnabled()
{
return enterEnabled;
}
public void setEnterEnabled(boolean enterEnabled)
{
this.enterEnabled = enterEnabled;
}
public abstract void ok();
public abstract void cancel();
//{{{ Private members
private void _init()
{
((Container)getLayeredPane()).addContainerListener(
new ContainerHandler());
getContentPane().addContainerListener(new ContainerHandler());
keyHandler = new KeyHandler();
addKeyListener(keyHandler);
addWindowListener(new WindowHandler());
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
enterEnabled = true;
}
//}}}
// protected members
protected KeyHandler keyHandler;
protected boolean enterEnabled;
// Recursively adds our key listener to sub-components
class ContainerHandler extends ContainerAdapter
{
public void componentAdded(ContainerEvent evt)
{
componentAdded(evt.getChild());
}
public void componentRemoved(ContainerEvent evt)
{
componentRemoved(evt.getChild());
}
private void componentAdded(Component comp)
{
comp.addKeyListener(keyHandler);
if(comp instanceof Container)
{
Container cont = (Container)comp;
cont.addContainerListener(this);
Component[] comps = cont.getComponents();
for (Component comp1 : comps)
componentAdded(comp1);
}
}
private void componentRemoved(Component comp)
{
comp.removeKeyListener(keyHandler);
if(comp instanceof Container)
{
Container cont = (Container)comp;
cont.removeContainerListener(this);
Component[] comps = cont.getComponents();
for (Component comp1 : comps)
componentRemoved(comp1);
}
}
}
class KeyHandler extends KeyAdapter
{
public void keyPressed(KeyEvent evt)
{
if(evt.isConsumed()) return;
Component comp = getFocusOwner();
if(evt.getKeyCode() == KeyEvent.VK_ENTER && enterEnabled)
{
while(comp != null)
{
if(comp instanceof JComboBox)
{
JComboBox combo = (JComboBox)comp;
if(combo.isEditable())
{
Object selected = combo.getEditor().getItem();
if(selected != null)
combo.setSelectedItem(selected);
}
if(combo.isPopupVisible())
{
evt.consume();
combo.setPopupVisible(false);
}
return;
}
// TODO: add other classes that need custom key handling here.
comp = comp.getParent();
}
evt.consume();
ok();
}
else if(evt.getKeyCode() == KeyEvent.VK_ESCAPE
||
isCloseBufferShortcut(evt)
)
{
evt.consume();
if(comp instanceof JComboBox)
{
JComboBox combo = (JComboBox)comp;
if (combo.isPopupVisible())
{
combo.setPopupVisible(false);
}
else cancel();
}
else cancel();
}
}
private boolean isCloseBufferShortcut(KeyEvent evt) {
String[] s = GUIUtilities.getShortcutLabel("close-buffer", false).split(" or ");
if(s.length == 1){ // w/o alternative shortcut
if(s[0].contains(" ")) //primary shortcut is a multiple-key shortcut
return false;
else{
return KeyEventTranslator.parseKey(s[0]).equals(KeyEventTranslator.translateKeyEvent(evt));
}
}
else{ // w/ alternative shortcut
boolean primarymatch,altmatch;
primarymatch=altmatch=false;
if(!s[0].contains(" "))
primarymatch=KeyEventTranslator.parseKey(s[0]).equals(KeyEventTranslator.translateKeyEvent(
evt));
if(!primarymatch && !s[1].contains(" "))
altmatch=KeyEventTranslator.parseKey(s[1]).equals(KeyEventTranslator.translateKeyEvent(evt));
if(primarymatch || altmatch)
return true;
}
return false;
}
}
class WindowHandler extends WindowAdapter
{
public void windowClosing(WindowEvent evt)
{
cancel();
}
}
}