001 /* 002 * cs101 QueryDialog 003 * $Id: QueryDialog.java,v 1.1.1.1 2002/06/05 21:56:32 root Exp $ 004 * 005 * Developed for "Rethinking CS101", a project of Lynn Andrea Stein's AP Group. 006 * For more information, see <a href="http://www.ai.mit.edu/projects/cs101/">the 007 * CS101 homepage</a> or email <las@ai.mit.edu>. 008 * 009 * Copyright (C) 1996 Massachusetts Institute of Technology. 010 * Please do not redistribute without obtaining permission. 011 */ 012 013 package cs101.awt; 014 015 import java.awt.*; 016 import java.awt.event.*; 017 018 019 /** 020 * A class to display a toplevel dialog box with a message, 021 * a list of "things" and associated textfields, and get answers. 022 * 023 * <P>Copyright (c) 1998 Massachusetts Institute of Technology 024 * 025 * @author Todd C. Parnell, tparnell@ai.mit.edu 026 * @author <nathanw@mit.edu> 027 * @version $Id: QueryDialog.java,v 1.1.1.1 2002/06/05 21:56:32 root Exp $ 028 */ 029 public class QueryDialog extends Frame { 030 031 private String message; 032 private String[] fields,values; 033 private TextComponent[] entries; 034 private Button ok; 035 036 037 /** Create a hidden QueryDialog with the appropriate text and defaults. */ 038 public QueryDialog(String message, String[] fields, String[] values) { 039 040 this.message=message; 041 this.fields=fields; 042 this.values=values; 043 } 044 045 /** Display the dialog box, and block until the OK button is checked. */ 046 public synchronized String[] ask() { 047 048 Label l; 049 int i; 050 051 this.removeAll(); 052 053 GridBagLayout gridbag = new GridBagLayout(); 054 this.setLayout(gridbag); 055 056 GridBagConstraints gbc,gblabel,gbarea; 057 058 gbc = new GridBagConstraints(); 059 gblabel = new GridBagConstraints(); 060 gbarea = new GridBagConstraints(); 061 062 063 gbc.gridwidth=1; 064 gbc.gridheight=1; 065 gbc.fill=GridBagConstraints.BOTH; 066 gbc.weightx=1; 067 gbc.weighty=1; 068 069 gblabel=(GridBagConstraints) gbc.clone(); 070 gbarea=(GridBagConstraints) gbc.clone(); 071 072 gbarea.gridwidth=GridBagConstraints.REMAINDER; 073 gblabel.gridwidth=GridBagConstraints.RELATIVE; 074 075 gbc.gridwidth=GridBagConstraints.REMAINDER; 076 077 String[] lines = getLines(message); 078 for(i=0;i<lines.length;i++) { 079 l = new Label(lines[i]); 080 gridbag.setConstraints(l,gbc); 081 add(l); 082 } 083 084 gbarea.gridwidth=GridBagConstraints.REMAINDER; 085 086 entries = new TextComponent[fields.length]; 087 088 for(i=0;i<fields.length;i++) { 089 l = new Label(fields[i]); 090 gridbag.setConstraints(l,gblabel); 091 add(l); 092 093 entries[i] = new TextField(values[i],40); 094 entries[i].setEditable(true); 095 gridbag.setConstraints(entries[i],gbarea); 096 add(entries[i]); 097 } 098 099 gbc.gridheight=1; 100 101 /* Close the window when OK is checked. */ 102 ok = new Button("OK"); 103 gridbag.setConstraints(ok,gbc); 104 105 ok.addActionListener(new ActionListener() { 106 public void actionPerformed(ActionEvent e) { 107 dispose(); 108 synchronized (QueryDialog.this) { 109 QueryDialog.this.notifyAll(); 110 } 111 } 112 }); 113 114 add(ok); 115 116 117 this.pack(); 118 this.show(); 119 try { 120 this.wait(); 121 } catch (InterruptedException e) { 122 } 123 return this.getValues(); 124 } 125 126 private String[] getLines(String s) { 127 int i,pos,prev; 128 int lines=countLines(s); 129 String[] ss=new String[lines]; 130 131 i=0; 132 prev=0; 133 pos=s.indexOf('\n'); 134 while(pos!=-1) { 135 ss[i]=s.substring(prev,pos); 136 prev=pos+1; // First character after the newline 137 pos=s.indexOf('\n',prev); 138 i++; 139 } 140 141 ss[i]=s.substring(prev); 142 143 return ss; 144 } 145 146 /** Count lines in a string */ 147 private int countLines(String s) { 148 char[] c = new char[s.length()]; 149 int i,lines=1; 150 151 s.getChars(0,s.length()-1,c,0); 152 for(i=0;i<c.length;i++) 153 if(c[i]=='\n') 154 lines++; 155 156 157 return lines; 158 } 159 160 /** Create a hidden QueryDialog with the appropriate text. */ 161 public QueryDialog(String message, String[] fields) { 162 this(message,fields,new String[fields.length]); 163 } 164 165 public void setValues(String[] newfields) { 166 int i,max; 167 168 if(fields.length < newfields.length) 169 max=fields.length; 170 else 171 max=newfields.length; 172 173 for(i=0;i<max;i++) { 174 fields[i]=newfields[i]; 175 } 176 177 } 178 179 /** Return the last entered values for the field. */ 180 public String[] getValues() { 181 String[] data=new String[entries.length]; 182 int i; 183 184 for(i=0;i<entries.length;i++) 185 data[i]=entries[i].getText(); 186 187 return data; 188 } 189 190 } 191 192 /* 193 * $Log: QueryDialog.java,v $ 194 * Revision 1.1.1.1 2002/06/05 21:56:32 root 195 * CS101 comes to Olin finally. 196 * 197 * Revision 1.4 1998/07/24 17:06:30 tparnell 198 * Placate new javadoc behavior 199 * 200 * Revision 1.3 1998/07/22 18:18:40 tparnell 201 * migration from cs101.util to cs101.* 202 * 203 * Revision 1.2 1998/06/03 21:29:02 tparnell 204 * migration from Java 1.0 to 1.1 205 * 206 */