OkCancelDialog.java
001 /*
002  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
003  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
004  *
005  *  This file is part of GATE (see http://gate.ac.uk/), and is free
006  *  software, licenced under the GNU Library General Public License,
007  *  Version 2, June 1991 (in the distribution as file licence.html,
008  *  and also available at http://gate.ac.uk/gate/licence.html).
009  *
010  *  Valentin Tablan 16/07/2001
011  *
012  *  $Id: OkCancelDialog.java 17606 2014-03-09 12:12:49Z markagreenwood $
013  *
014  */
015 
016 package gate.gui;
017 
018 import java.awt.BorderLayout;
019 import java.awt.Component;
020 import java.awt.Dialog;
021 import java.awt.Dimension;
022 import java.awt.Frame;
023 import java.awt.Toolkit;
024 import java.awt.Window;
025 import java.awt.event.ActionEvent;
026 
027 import javax.swing.AbstractAction;
028 import javax.swing.Action;
029 import javax.swing.ActionMap;
030 import javax.swing.Box;
031 import javax.swing.BoxLayout;
032 import javax.swing.InputMap;
033 import javax.swing.JButton;
034 import javax.swing.JComponent;
035 import javax.swing.JDialog;
036 import javax.swing.JPanel;
037 import javax.swing.KeyStroke;
038 import javax.swing.SwingUtilities;
039 
040 /**
041  * A simple modal dialog that displays a component provided by the user along
042  * with two buttons ("OK" and "Cancel").
043  */
044 @SuppressWarnings("serial")
045 public class OkCancelDialog extends JDialog {
046 
047   protected OkCancelDialog(Frame owner, String title, Component contents){
048     super(owner, title);
049     init(contents);
050   }
051 
052   protected OkCancelDialog(Dialog owner, String title, Component contents){
053     super(owner, title);
054     init(contents);
055   }
056 
057   protected OkCancelDialog(String title, Component contents){
058     super();
059     setTitle(title);
060     init(contents);
061   }
062 
063   protected void init(Component contents){
064     MainFrame.getGuiRoots().add(this);
065 
066     getContentPane().setLayout(new BorderLayout());
067 
068 //    //fill in the contents
069 //    JPanel vBox = new JPanel();
070 //    vBox.setLayout(new BoxLayout(vBox, BoxLayout.Y_AXIS));
071 //
072 //    JPanel contentsPanel = new JPanel();
073 //    contentsPanel.add(contents);
074 //    contentsPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
075 //
076 //    vBox.add(contentsPanel);
077 
078     getContentPane().add(contents, BorderLayout.CENTER);
079 
080     JPanel buttonsBox = new JPanel();
081     buttonsBox.setLayout(new BoxLayout(buttonsBox, BoxLayout.X_AXIS));
082     buttonsBox.setAlignmentX(Component.CENTER_ALIGNMENT);
083     okButton = new JButton("OK");
084     cancelButton = new JButton("Cancel");
085     buttonsBox.add(Box.createHorizontalGlue());
086     buttonsBox.add(okButton);
087     buttonsBox.add(Box.createHorizontalStrut(20));
088     buttonsBox.add(cancelButton);
089     buttonsBox.add(Box.createHorizontalGlue());
090 
091     Box vBox = Box.createVerticalBox();
092     vBox.add(Box.createVerticalStrut(10));
093     vBox.add(buttonsBox);
094     vBox.add(Box.createVerticalStrut(10));
095 
096     getContentPane().add(vBox, BorderLayout.SOUTH);
097 
098     Action applyAction = new AbstractAction() {
099       @Override
100       public void actionPerformed(ActionEvent e) {
101         userHasPressedOK = true;
102         setVisible(false);
103       }
104     };
105 
106     Action cancelAction = new AbstractAction() {
107       @Override
108       public void actionPerformed(ActionEvent e) {
109         userHasPressedCancel = true;
110         setVisible(false);
111       }
112     };
113 
114     // define keystrokes action bindings at the level of the main window
115     InputMap inputMap = ((JComponent)this.getContentPane()).
116       getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
117     ActionMap actionMap =
118       ((JComponent)this.getContentPane()).getActionMap();
119     inputMap.put(KeyStroke.getKeyStroke("ENTER")"Apply");
120     actionMap.put("Apply", applyAction);
121     inputMap.put(KeyStroke.getKeyStroke("ESCAPE")"Cancel");
122     actionMap.put("Cancel", cancelAction);
123 
124     okButton.addActionListener(applyAction);
125     getRootPane().setDefaultButton(okButton);
126     cancelButton.addActionListener(cancelAction);
127   }
128 
129   @Override
130   public void dispose(){
131     MainFrame.getGuiRoots().remove(this);
132     super.dispose();
133   }
134 
135   /**
136    @return true if the user has selected the "OK" button.
137    */
138   public static boolean showDialog(Component parentComponent,
139                                    Component contents,
140                                    String title){
141     //construct the dialog
142     Window parent = null;
143     if(parentComponent != null){
144       parent = SwingUtilities.getWindowAncestor(parentComponent);
145     }
146     OkCancelDialog dialog;
147     if(parent == nulldialog = new OkCancelDialog(title, contents);
148     else if(parent instanceof Frame){
149       dialog = new OkCancelDialog((Frame)parent, title, contents);
150     else{
151       dialog = new OkCancelDialog((Dialog)parent, title, contents);
152     }
153 
154     //position the dialog
155     dialog.pack();
156     dialog.setLocationRelativeTo(parentComponent);
157 
158     //kalina: make it fit the screen
159     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
160     Dimension dialogSize = dialog.getSize();
161     if (dialogSize.height > screenSize.height)
162       dialogSize.height = screenSize.height;
163     if (dialogSize.width > screenSize.width)
164       dialogSize.width = screenSize.width;
165     dialog.setSize(dialogSize);
166     //end kalina
167 
168     //show the dialog
169     dialog.setModal(true);
170     dialog.userHasPressedOK = false;
171     dialog.userHasPressedCancel = false;
172     dialog.setVisible(true);
173 //    
174 //    dialog.show();
175     return dialog.userHasPressedOK;
176   }
177 
178   protected JButton okButton;
179   protected JButton cancelButton;
180   protected boolean userHasPressedOK;
181   protected boolean userHasPressedCancel;
182 }