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    /* A simple Dialog box that contains 3 buttons and an input field. 
016    
017     */
018    
019    
020    
021    
022    
023    
024    package lapisx.swing;
025    
026    import javax.swing.JOptionPane;
027    import javax.swing.JDialog;
028    import javax.swing.JTextField;
029    import java.beans.*; //Property change stuff
030    import java.awt.*;
031    import java.awt.event.*;
032    
033    
034    
035    public class InputThreeButtonDialog extends JDialog {
036        private String typedText = null;
037    
038    
039        private JOptionPane optionPane;
040    
041        private int selection;
042    
043        public String getText() {
044            return typedText;
045        }
046    
047        public int getSelection (){
048            return selection;
049        }
050        public InputThreeButtonDialog(Frame aFrame, String title, String message, String initialText, Object[] option) {
051            super(aFrame, true);
052            setTitle(title);
053    
054            final String msgString = message;
055            final Object[] options = option;
056                                      
057            final JTextField textField = new JTextField(initialText);
058            Object[] array = {msgString, textField};
059    
060            optionPane = new JOptionPane(array, 
061                                        JOptionPane.QUESTION_MESSAGE,
062                                        JOptionPane.YES_NO_CANCEL_OPTION,
063                                        null,
064                                        options,
065                                        null);
066            setContentPane(optionPane);
067            setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
068            addWindowListener(new WindowAdapter() {
069                    public void windowClosing(WindowEvent we) {
070                    /*
071                     * Instead of directly closing the window,
072                     * we're going to change the JOptionPane's
073                     * value property.
074                     */
075                        optionPane.setValue(new Integer(
076                                            JOptionPane.CLOSED_OPTION));
077                }
078            });
079    
080            textField.addActionListener(new ActionListener() {
081                    public void actionPerformed(ActionEvent e) {
082                        optionPane.setValue(options[0]);
083                    }
084                });
085            
086            optionPane.addPropertyChangeListener(new PropertyChangeListener() {
087                    public void propertyChange(PropertyChangeEvent e) {
088                        String prop = e.getPropertyName();
089                        
090                        if (isVisible() 
091                            && (e.getSource() == optionPane)
092                            && (prop.equals(JOptionPane.VALUE_PROPERTY) ||
093                                prop.equals(JOptionPane.INPUT_VALUE_PROPERTY))) {
094                            Object value = optionPane.getValue();
095                            if (value == JOptionPane.UNINITIALIZED_VALUE) {
096                                //ignore reset
097                                return;
098                            }
099                            
100                            // Reset the JOptionPane's value.
101                            // If you don't do this, then if the user
102                            // presses the same button next time, no
103                            // property change event will be fired.
104                            optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE);
105                            //user has chosed typed field
106                            if (value.equals(options[0])) { 
107                                typedText = textField.getText();
108                                if (typedText.trim().equals("")) 
109                                    typedText = null;
110                                selection = JOptionPane.YES_OPTION;
111                                setVisible(false);
112                                
113                            }
114                            //user has chosen pre-set field 
115                            else  if (value.equals(options[1])){ 
116                                selection = JOptionPane.NO_OPTION;
117                                setVisible(false);
118                            }
119                            else {
120                                selection = JOptionPane.CANCEL_OPTION;
121                                setVisible(false);
122                            }
123                        }
124                    }
125                });
126    
127    
128    
129    
130    
131        }
132    
133        protected void setInitialPosition () {
134            Component parent = getParent ();
135            Dimension size = getSize();
136            Dimension parentSize = (parent != null) ? parent.getSize() : Toolkit.getDefaultToolkit().getScreenSize();
137            Point origin = (parent != null) ? parent.getLocationOnScreen () : new Point (0, 0);
138            
139            if (parentSize != null) {
140                int x = Math.max (0, origin.x + (parentSize.width - size.width) / 2);
141                int y = Math.max (0, origin.y + (parentSize.height - size.height) / 2);
142                setLocation (x, y);
143            }
144        }
145        public void show () {
146            setInitialPosition ();
147            super.show ();
148        }
149    
150    
151    }