001 /* 002 * LAPIS lightweight structured text processing system 003 * 004 * Copyright (C) 1998-2002 Carnegie Mellon University, 005 * Copyright (C) 2003 Massachusetts Institute of Technology. 006 * All rights reserved. 007 * 008 * This library is free software; you can redistribute it 009 * and/or modify it under the terms of the GNU General 010 * Public License as published by the Free Software 011 * Foundation, version 2. 012 * 013 * LAPIS homepage: http://graphics.lcs.mit.edu/lapis/ 014 */ 015 016 package lapisx.swing; 017 018 import java.awt.*; 019 import java.awt.event.*; 020 import javax.swing.*; 021 022 public class OkCancelDialog extends JDialog { 023 024 JPanel controlsPane; 025 JButton okButton; 026 JButton cancelButton; 027 028 public OkCancelDialog (Frame owner, String title) { 029 this (owner, title, true); 030 } 031 032 public OkCancelDialog (Frame owner, String title, boolean modal) { 033 super (owner, title, modal); 034 035 Container me = getContentPane (); 036 me.setLayout (new BorderLayout ()); 037 038 me.add (controlsPane = new JPanel (), BorderLayout.CENTER); 039 040 JPanel panel; 041 me.add (panel = new JPanel (), BorderLayout.SOUTH); 042 panel.setLayout (new FlowLayout ()); 043 044 JPanel subpanel; 045 panel.add (subpanel = new JPanel ()); 046 subpanel.setLayout (new GridLayout (1, 0, 4, 0)); 047 048 subpanel.add (okButton = new JButton ("OK")); 049 okButton.addActionListener (new ActionListener () { 050 public void actionPerformed (ActionEvent event) { 051 ok (); 052 } 053 }); 054 getRootPane ().setDefaultButton (okButton); 055 056 subpanel.add (cancelButton = new JButton ("Cancel")); 057 cancelButton.addActionListener (new ActionListener () { 058 public void actionPerformed (ActionEvent event) { 059 cancel (); 060 } 061 }); 062 063 addWindowListener (new WindowAdapter () { 064 public void windowClosing (WindowEvent event) { 065 cancel (); 066 } 067 }); 068 } 069 070 protected void setInitialPosition () { 071 Component parent = getParent (); 072 Dimension size = getSize(); 073 Dimension parentSize = (parent != null) ? parent.getSize() : Toolkit.getDefaultToolkit().getScreenSize(); 074 Point origin = (parent != null) ? parent.getLocationOnScreen () : new Point (0, 0); 075 076 if (parentSize != null) { 077 int x = Math.max (0, origin.x + (parentSize.width - size.width) / 2); 078 int y = Math.max (0, origin.y + (parentSize.height - size.height) / 2); 079 setLocation (x, y); 080 } 081 } 082 083 public void show () { 084 setInitialPosition (); 085 registerKeystrokes (); 086 super.show (); 087 } 088 089 public JPanel getControlsPane () { 090 return controlsPane; 091 } 092 093 public JButton getOKButton () { 094 return okButton; 095 } 096 097 public JButton getCancelButton () { 098 return cancelButton; 099 } 100 101 void registerKeystrokes () { 102 JRootPane root = getRootPane (); 103 root.registerKeyboardAction(new ButtonPressAction (root, cancelButton, true), 104 KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false), 105 JComponent.WHEN_IN_FOCUSED_WINDOW); 106 root.registerKeyboardAction(new ButtonPressAction (root, cancelButton, false), 107 KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true), 108 JComponent.WHEN_IN_FOCUSED_WINDOW); 109 110 JButton defaultButton = root.getDefaultButton (); 111 if (defaultButton != null) 112 registerActionInAllTextFields (root, 113 new ButtonPressAction (root, defaultButton)); 114 } 115 116 void registerActionInAllTextFields (Container container, Action action) { 117 for (int i = 0, n = container.getComponentCount (); 118 i < n; 119 ++i) { 120 Component comp = container.getComponent (i); 121 122 if (comp instanceof TextField) 123 ((TextField)comp).addActionListener (action); 124 else if (comp instanceof JTextField) 125 ((JTextField)comp).addActionListener (action); 126 else if (comp instanceof Container) 127 registerActionInAllTextFields ((Container)comp, action); 128 } 129 } 130 131 static class ButtonPressAction extends AbstractAction { 132 JButton owner; 133 JRootPane root; 134 boolean press; 135 boolean pressAndRelease; 136 ButtonPressAction(JRootPane root, JButton owner) { 137 super("pressAndReleaseAction"); 138 this.root = root; 139 this.owner = owner; 140 this.press = true; 141 this.pressAndRelease = true; 142 } 143 144 ButtonPressAction(JRootPane root, JButton owner, boolean press) { 145 super(press? "pressedAction" : "releasedAction"); 146 this.root = root; 147 this.owner = owner; 148 this.press = press; 149 this.pressAndRelease = false; 150 } 151 public void actionPerformed(ActionEvent e) { 152 if (owner != null && SwingUtilities.getRootPane(owner) == root) { 153 ButtonModel model = owner.getModel(); 154 if (pressAndRelease) { 155 model.setArmed(true); 156 model.setPressed(true); 157 model.setPressed(false); 158 } else if (press) { 159 model.setArmed(true); 160 model.setPressed(true); 161 } else { 162 model.setPressed(false); 163 } 164 } 165 } 166 public boolean isEnabled() { 167 return owner.getModel().isEnabled(); 168 } 169 } 170 171 public void ok () { 172 dispose (); 173 } 174 175 public void cancel () { 176 dispose (); 177 } 178 }