001         package com.croftsoft.core.gui;
002    
003         import java.awt.*;
004         import java.awt.event.*;
005         import javax.swing.*;
006         import javax.swing.event.*;
007    
008         import com.croftsoft.core.gui.LabeledFieldsPanel2;
009         import com.croftsoft.core.lang.NullArgumentException;
010         import com.croftsoft.core.lang.Pair;
011    
012         /*********************************************************************
013         * A JPanel for entering and editing name-value pairs.
014         *
015         * <p>
016         * Includes "Restore" and "Update" buttons and an optional panel
017         * for displaying help in HTML.
018         * </p>
019         *
020         * <p>
021         * Useful for manipulating user configuration properties.
022         * </p>
023         *
024         * @version
025         *   2002-01-29
026         * @since
027         *   2001-07-25
028         * @author
029         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
030         *********************************************************************/
031    
032         public final class  PairsPanel
033           extends JPanel
034           implements ActionListener, KeyListener
035         //////////////////////////////////////////////////////////////////////
036         //////////////////////////////////////////////////////////////////////
037         {
038    
039         private       Pair [ ]             nameValuePairs;
040    
041         private final ChangeListener       changeListener;
042     
043         private final ChangeEvent          changeEvent;
044    
045         private final boolean              trimWhiteSpace;
046    
047         private final LabeledFieldsPanel2  labeledFieldsPanel2;
048    
049         private final JButton              restoreButton;
050    
051         private final JButton              updateButton;
052    
053         //////////////////////////////////////////////////////////////////////
054         //////////////////////////////////////////////////////////////////////
055    
056         public  PairsPanel (
057           Pair [ ]        nameValuePairs,
058           String          helpText,
059           ChangeListener  changeListener,
060           boolean         trimWhiteSpace,
061           Color           panelBackgroundColor,
062           Color           textFieldBackgroundColor )
063         //////////////////////////////////////////////////////////////////////
064         {
065           super ( new BorderLayout ( ), true ); // isDoubleBuffered
066    
067           NullArgumentException.check (
068             this.nameValuePairs = nameValuePairs );
069    
070           this.changeListener = changeListener;
071    
072           this.trimWhiteSpace = trimWhiteSpace;
073    
074           if ( panelBackgroundColor != null )
075           {
076             setBackground ( panelBackgroundColor );
077           }
078    
079           changeEvent = new ChangeEvent ( this );
080    
081           JPanel  centerPanel = new JPanel ( new BorderLayout ( ), true );
082    
083           labeledFieldsPanel2
084             = new LabeledFieldsPanel2 (
085             nameValuePairs,
086             panelBackgroundColor,
087             textFieldBackgroundColor );
088    
089           labeledFieldsPanel2.addKeyListener ( this );
090    
091           if ( helpText != null )
092           {
093             centerPanel.add (
094               new JScrollPane ( labeledFieldsPanel2 ), BorderLayout.WEST );
095    
096             centerPanel.add ( new JScrollPane ( GuiCreator.createHtmlPane (
097               helpText, null ) ), BorderLayout.CENTER );
098    
099             add ( centerPanel, BorderLayout.CENTER );
100           }
101           else
102           {
103             add (
104               new JScrollPane ( labeledFieldsPanel2 ), BorderLayout.CENTER );
105           }
106    
107           restoreButton = new JButton ( "Restore" );
108    
109           restoreButton.setEnabled ( false );
110    
111           restoreButton.addActionListener ( this );
112    
113           updateButton = new JButton ( "Update" );
114    
115           updateButton.setEnabled ( false );
116    
117           updateButton.addActionListener ( this );
118    
119           add ( new ButtonPanel2 (
120             new JButton [ ] { restoreButton, updateButton } ),
121             BorderLayout.SOUTH );
122         }
123    
124         public  PairsPanel (
125           Pair [ ]        nameValuePairs,
126           ChangeListener  changeListener )
127         //////////////////////////////////////////////////////////////////////
128         {
129           this ( nameValuePairs, null, changeListener, true, null, null );
130         }
131    
132         //////////////////////////////////////////////////////////////////////
133         //////////////////////////////////////////////////////////////////////
134    
135         public String  getText ( String  name )
136         //////////////////////////////////////////////////////////////////////
137         {
138           return labeledFieldsPanel2.getText ( name );
139         }
140    
141         //////////////////////////////////////////////////////////////////////
142         //////////////////////////////////////////////////////////////////////
143    
144         public synchronized void  setText ( Pair  pair )
145         //////////////////////////////////////////////////////////////////////
146         {
147           labeledFieldsPanel2.setText ( pair );
148         }
149    
150         public synchronized void  setText ( Pair [ ]  nameValuePairs )
151         //////////////////////////////////////////////////////////////////////
152         {
153           labeledFieldsPanel2.setText ( nameValuePairs );
154         }
155    
156         //////////////////////////////////////////////////////////////////////
157         //////////////////////////////////////////////////////////////////////
158    
159         public void  keyPressed ( KeyEvent  keyEvent )
160         //////////////////////////////////////////////////////////////////////
161         {
162         }
163    
164         public void  keyReleased ( KeyEvent  keyEvent )
165         //////////////////////////////////////////////////////////////////////
166         {
167         }
168    
169         public synchronized void  keyTyped ( KeyEvent  keyEvent )
170         //////////////////////////////////////////////////////////////////////
171         {
172           updateButton.setEnabled ( true );
173    
174           restoreButton.setEnabled ( true );
175    
176           labeledFieldsPanel2.removeKeyListener ( this );  
177         }
178    
179         //////////////////////////////////////////////////////////////////////
180         //////////////////////////////////////////////////////////////////////
181    
182         public synchronized void  actionPerformed ( ActionEvent  actionEvent )
183         //////////////////////////////////////////////////////////////////////
184         {
185           Object  source = actionEvent.getSource ( );
186    
187           if ( source == restoreButton )
188           {
189             restoreButton.setEnabled ( false );
190    
191             updateButton.setEnabled ( false );
192    
193             for ( int  i = 0; i < nameValuePairs.length; i++ )
194             {
195               labeledFieldsPanel2.setText ( nameValuePairs [ i ] );
196             }
197    
198             labeledFieldsPanel2.addKeyListener ( this );
199           }
200           else if ( source == updateButton )
201           {
202             restoreButton.setEnabled ( false );
203    
204             updateButton.setEnabled ( false );
205    
206             for ( int  i = 0; i < nameValuePairs.length; i++ )
207             {
208               Pair  pair = nameValuePairs [ i ];
209    
210               String  value = labeledFieldsPanel2.getText ( pair.name );
211    
212               if ( trimWhiteSpace )
213               {
214                 value = value.trim ( );
215               }
216    
217               if ( "".equals ( value ) )
218               {
219                 value = null;
220               }
221    
222               nameValuePairs [ i ] = new Pair ( pair.name, value );
223    
224               setText ( nameValuePairs [ i ] );
225             }
226    
227             labeledFieldsPanel2.addKeyListener ( this );
228    
229             if ( changeListener != null )
230             {
231               changeListener.stateChanged ( changeEvent );
232             }
233           }
234         }
235    
236         //////////////////////////////////////////////////////////////////////
237         //////////////////////////////////////////////////////////////////////
238         }