001 /*
002 * Copyright (c) Holger Pfaff - http://pfaff.ws
003 *
004 * This software maybe used for any purpose provided the
005 * above copyright notice is retained. It is supplied as is.
006 * No warranty expressed or implied - Use at your own risk.
007 */
008
009 import java.awt.*;
010 import java.util.*;
011 import java.awt.event.*;
012
013 /**
014 * (#)Base.java
015 * @author Holger Pfaff
016 * @version 3.2 19-Mar-2004<br><br>
017 *
018 * Common class to create arbitrary GUI programs. Needs Main as initiator.
019 * Base offers:<br>
020 * - a BorderPanel with different borders<br>
021 * - GUI items creation with options from properties<br>
022 * - access property files<br>
023 * <br>
024 * <table width="1%" border="1" cellspacing="2" cellpadding="2">
025 * <tbody>
026 * <tr>
027 * <th valign="top"><prefix> +<br>
028 * </th>
029 * <th valign="top">Base<br>
030 * </th>
031 * <th valign="top">Caption<br>
032 * </th>
033 * <th valign="top">Knob<br>
034 * </th>
035 * <th valign="top">Triage<br>
036 * </th>
037 * <th valign="top">Xbox<br>
038 * </th>
039 * <th valign="top">MultiColumList<br>
040 * </th>
041 * <th valign="top">EditField<br>
042 * </th>
043 * <th valign="top">EditArea<br>
044 * </th>
045 * </tr>
046 * <tr>
047 * <td valign="top">""<br>
048 * </td>
049 * <td valign="top" align="center"><br>
050 * </td>
051 * <td valign="top" align="center">X<br>
052 * </td>
053 * <td valign="top" align="center">X<br>
054 * </td>
055 * <td valign="top" align="center">X<br>
056 * </td>
057 * <td valign="top" align="center">X<br>
058 * </td>
059 * <td valign="top" align="center"><br>
060 * </td>
061 * <td valign="top" align="center"><br>
062 * </td>
063 * <td valign="top" align="center"><br>
064 * </td>
065 * </tr>
066 * <tr>
067 * <td valign="top">label<br>
068 * </td>
069 * <td valign="top" align="center">X<br>
070 * </td>
071 * <td valign="top" align="center"><br>
072 * </td>
073 * <td valign="top" align="center"><br>
074 * </td>
075 * <td valign="top" align="center"><br>
076 * </td>
077 * <td valign="top" align="center"><br>
078 * </td>
079 * <td valign="top" align="center"><br>
080 * </td>
081 * <td valign="top" align="center"><br>
082 * </td>
083 * <td valign="top" align="center"><br>
084 * </td>
085 * </tr>
086 * <tr>
087 * <td valign="top">title<br>
088 * </td>
089 * <td valign="top" align="center">X<br>
090 * </td>
091 * <td valign="top" align="center"><br>
092 * </td>
093 * <td valign="top" align="center"><br>
094 * </td>
095 * <td valign="top" align="center"><br>
096 * </td>
097 * <td valign="top" align="center"><br>
098 * </td>
099 * <td valign="top" align="center"><br>
100 * </td>
101 * <td valign="top" align="center"><br>
102 * </td>
103 * <td valign="top" align="center"><br>
104 * </td>
105 * </tr>
106 * <tr>
107 * <td valign="top">tip<br>
108 * </td>
109 * <td valign="top" align="center">X<br>
110 * </td>
111 * <td valign="top" align="center">X<br>
112 * </td>
113 * <td valign="top" align="center"><br>
114 * </td>
115 * <td valign="top" align="center"><br>
116 * </td>
117 * <td valign="top" align="center"><br>
118 * </td>
119 * <td valign="top" align="center"><br>
120 * </td>
121 * <td valign="top" align="center">X<br>
122 * </td>
123 * <td valign="top" align="center">X<br>
124 * </td>
125 * </tr>
126 * <tr>
127 * <td valign="top">background<br>
128 * </td>
129 * <td valign="top" align="center">X<br>
130 * </td>
131 * <td valign="top" align="center">X<br>
132 * </td>
133 * <td valign="top" align="center">X<br>
134 * </td>
135 * <td valign="top" align="center">X<br>
136 * </td>
137 * <td valign="top" align="center">X<br>
138 * </td>
139 * <td valign="top" align="center">X<br>
140 * </td>
141 * <td valign="top" align="center">X<br>
142 * </td>
143 * <td valign="top" align="center">X<br>
144 * </td>
145 * </tr>
146 * <tr>
147 * <td valign="top">foreground<br>
148 * </td>
149 * <td valign="top" align="center">X<br>
150 * </td>
151 * <td valign="top" align="center">X<br>
152 * </td>
153 * <td valign="top" align="center">X<br>
154 * </td>
155 * <td valign="top" align="center">X<br>
156 * </td>
157 * <td valign="top" align="center">X<br>
158 * </td>
159 * <td valign="top" align="center">X<br>
160 * </td>
161 * <td valign="top" align="center">X<br>
162 * </td>
163 * <td valign="top" align="center">X<br>
164 * </td>
165 * </tr>
166 * <tr>
167 * <td valign="top">insets<br>
168 * </td>
169 * <td valign="top" align="center">X<br>
170 * </td>
171 * <td valign="top" align="center">X<br>
172 * </td>
173 * <td valign="top" align="center">X<br>
174 * </td>
175 * <td valign="top" align="center">X<br>
176 * </td>
177 * <td valign="top" align="center">X<br>
178 * </td>
179 * <td valign="top" align="center">X<br>
180 * </td>
181 * <td valign="top" align="center"><br>
182 * </td>
183 * <td valign="top" align="center"><br>
184 * </td>
185 * </tr>
186 * <tr>
187 * <td valign="top">innerinsets<br>
188 * </td>
189 * <td valign="top" align="center">X<br>
190 * </td>
191 * <td valign="top" align="center">X<br>
192 * </td>
193 * <td valign="top" align="center">X<br>
194 * </td>
195 * <td valign="top" align="center">X<br>
196 * </td>
197 * <td valign="top" align="center">X<br>
198 * </td>
199 * <td valign="top" align="center">X<br>
200 * </td>
201 * <td valign="top" align="center"><br>
202 * </td>
203 * <td valign="top" align="center"><br>
204 * </td>
205 * </tr>
206 * <tr>
207 * <td valign="top">bordertype<br>
208 * </td>
209 * <td valign="top" align="center">X<br>
210 * </td>
211 * <td valign="top" align="center">X<br>
212 * </td>
213 * <td valign="top" align="center">X<br>
214 * </td>
215 * <td valign="top" align="center">X<br>
216 * </td>
217 * <td valign="top" align="center">X<br>
218 * </td>
219 * <td valign="top" align="center">X<br>
220 * </td>
221 * <td valign="top" align="center"><br>
222 * </td>
223 * <td valign="top" align="center"><br>
224 * </td>
225 * </tr>
226 * <tr>
227 * <td valign="top">borderdepth<br>
228 * </td>
229 * <td valign="top" align="center">X<br>
230 * </td>
231 * <td valign="top" align="center">X<br>
232 * </td>
233 * <td valign="top" align="center">X<br>
234 * </td>
235 * <td valign="top" align="center">X<br>
236 * </td>
237 * <td valign="top" align="center">X<br>
238 * </td>
239 * <td valign="top" align="center">X<br>
240 * </td>
241 * <td valign="top" align="center"><br>
242 * </td>
243 * <td valign="top" align="center"><br>
244 * </td>
245 * </tr>
246 * <tr>
247 * <td valign="top">minimizable<br>
248 * </td>
249 * <td valign="top" align="center">X<br>
250 * </td>
251 * <td valign="top" align="center"><br>
252 * </td>
253 * <td valign="top" align="center"><br>
254 * </td>
255 * <td valign="top" align="center"><br>
256 * </td>
257 * <td valign="top" align="center"><br>
258 * </td>
259 * <td valign="top" align="center"><br>
260 * </td>
261 * <td valign="top" align="center"><br>
262 * </td>
263 * <td valign="top" align="center"><br>
264 * </td>
265 * </tr>
266 * <tr>
267 * <td valign="top">mini<br>
268 * </td>
269 * <td valign="top" align="center">X<br>
270 * </td>
271 * <td valign="top" align="center"><br>
272 * </td>
273 * <td valign="top" align="center"><br>
274 * </td>
275 * <td valign="top" align="center"><br>
276 * </td>
277 * <td valign="top" align="center"><br>
278 * </td>
279 * <td valign="top" align="center"><br>
280 * </td>
281 * <td valign="top" align="center"><br>
282 * </td>
283 * <td valign="top" align="center"><br>
284 * </td>
285 * </tr>
286 * <tr>
287 * <td valign="top">header<br>
288 * </td>
289 * <td valign="top" align="center"><br>
290 * </td>
291 * <td valign="top" align="center"><br>
292 * </td>
293 * <td valign="top" align="center"><br>
294 * </td>
295 * <td valign="top" align="center"><br>
296 * </td>
297 * <td valign="top" align="center"><br>
298 * </td>
299 * <td valign="top" align="center">X<br>
300 * </td>
301 * <td valign="top" align="center"><br>
302 * </td>
303 * <td valign="top" align="center"><br>
304 * </td>
305 * </tr>
306 * <tr>
307 * <td valign="top">visiblecols<br>
308 * </td>
309 * <td valign="top" align="center"><br>
310 * </td>
311 * <td valign="top" align="center"><br>
312 * </td>
313 * <td valign="top" align="center"><br>
314 * </td>
315 * <td valign="top" align="center"><br>
316 * </td>
317 * <td valign="top" align="center"><br>
318 * </td>
319 * <td valign="top" align="center">X<br>
320 * </td>
321 * <td valign="top" align="center"><br>
322 * </td>
323 * <td valign="top" align="center">X<br>
324 * </td>
325 * </tr>
326 * <tr>
327 * <td valign="top">minvisiblecols<br>
328 * </td>
329 * <td valign="top" align="center"><br>
330 * </td>
331 * <td valign="top" align="center"><br>
332 * </td>
333 * <td valign="top" align="center"><br>
334 * </td>
335 * <td valign="top" align="center"><br>
336 * </td>
337 * <td valign="top" align="center"><br>
338 * </td>
339 * <td valign="top" align="center">X<br>
340 * </td>
341 * <td valign="top" align="center"><br>
342 * </td>
343 * <td valign="top" align="center">X<br>
344 * </td>
345 * </tr>
346 * <tr>
347 * <td valign="top">visiblerows<br>
348 * </td>
349 * <td valign="top" align="center"><br>
350 * </td>
351 * <td valign="top" align="center"><br>
352 * </td>
353 * <td valign="top" align="center"><br>
354 * </td>
355 * <td valign="top" align="center"><br>
356 * </td>
357 * <td valign="top" align="center"><br>
358 * </td>
359 * <td valign="top" align="center">X<br>
360 * </td>
361 * <td valign="top" align="center"><br>
362 * </td>
363 * <td valign="top" align="center">X<br>
364 * </td>
365 * </tr>
366 * <tr>
367 * <td valign="top">len<br>
368 * </td>
369 * <td valign="top" align="center"><br>
370 * </td>
371 * <td valign="top" align="center"><br>
372 * </td>
373 * <td valign="top" align="center"><br>
374 * </td>
375 * <td valign="top" align="center"><br>
376 * </td>
377 * <td valign="top" align="center"><br>
378 * </td>
379 * <td valign="top" align="center"><br>
380 * </td>
381 * <td valign="top" align="center">X<br>
382 * </td>
383 * <td valign="top" align="center"><br>
384 * </td>
385 * </tr>
386 * <tr>
387 * <td valign="top">maxlen<br>
388 * </td>
389 * <td valign="top" align="center"><br>
390 * </td>
391 * <td valign="top" align="center"><br>
392 * </td>
393 * <td valign="top" align="center"><br>
394 * </td>
395 * <td valign="top" align="center"><br>
396 * </td>
397 * <td valign="top" align="center"><br>
398 * </td>
399 * <td valign="top" align="center"><br>
400 * </td>
401 * <td valign="top" align="center">X<br>
402 * </td>
403 * <td valign="top" align="center">X<br>
404 * </td>
405 * </tr>
406 * <tr>
407 * <td valign="top">minlen<br>
408 * </td>
409 * <td valign="top" align="center"><br>
410 * </td>
411 * <td valign="top" align="center"><br>
412 * </td>
413 * <td valign="top" align="center"><br>
414 * </td>
415 * <td valign="top" align="center"><br>
416 * </td>
417 * <td valign="top" align="center"><br>
418 * </td>
419 * <td valign="top" align="center"><br>
420 * </td>
421 * <td valign="top" align="center">X<br>
422 * </td>
423 * <td valign="top" align="center">X<br>
424 * </td>
425 * </tr>
426 * <tr>
427 * <td valign="top">init<br>
428 * </td>
429 * <td valign="top" align="center"><br>
430 * </td>
431 * <td valign="top" align="center"><br>
432 * </td>
433 * <td valign="top" align="center"><br>
434 * </td>
435 * <td valign="top" align="center"><br>
436 * </td>
437 * <td valign="top" align="center"><br>
438 * </td>
439 * <td valign="top" align="center"><br>
440 * </td>
441 * <td valign="top" align="center">X<br>
442 * </td>
443 * <td valign="top" align="center">X<br>
444 * </td>
445 * </tr>
446 * <tr>
447 * <td valign="top">allow<br>
448 * </td>
449 * <td valign="top" align="center"><br>
450 * </td>
451 * <td valign="top" align="center"><br>
452 * </td>
453 * <td valign="top" align="center"><br>
454 * </td>
455 * <td valign="top" align="center"><br>
456 * </td>
457 * <td valign="top" align="center"><br>
458 * </td>
459 * <td valign="top" align="center"><br>
460 * </td>
461 * <td valign="top" align="center">X<br>
462 * </td>
463 * <td valign="top" align="center">X<br>
464 * </td>
465 * </tr>
466 * <tr>
467 * <td valign="top">deny<br>
468 * </td>
469 * <td valign="top" align="center"><br>
470 * </td>
471 * <td valign="top" align="center"><br>
472 * </td>
473 * <td valign="top" align="center"><br>
474 * </td>
475 * <td valign="top" align="center"><br>
476 * </td>
477 * <td valign="top" align="center"><br>
478 * </td>
479 * <td valign="top" align="center"><br>
480 * </td>
481 * <td valign="top" align="center">X<br>
482 * </td>
483 * <td valign="top" align="center">X<br>
484 * </td>
485 * </tr>
486 * </tbody>
487 * </table>
488 * <br>
489 */
490
491 public abstract class Base extends BorderPanel {
492
493 /**
494 * handle for main object.
495 */
496 protected Main main = null;
497
498 /**
499 * handle for default font.
500 */
501 protected Font font = null;
502
503 /**
504 * prefix used to distinguish different base objects
505 */
506 protected String prefix = "";
507
508 /**
509 * The contructor called from Main
510 *
511 * @param m handle for main object.
512 */
513 public Base(Main m) {
514 this(m, "");
515 }
516
517 /**
518 * The contructor called from other base object
519 *
520 * @param m handle for main object.
521 * @param pf prefix used to distinguish different base objects
522 */
523 protected Base(Main m, String pf) {
524 main = m;
525 font = main.getFont();
526 prefix = pf;
527
528 // inherit Colors from Main
529 setBackground(m.getBackground());
530 setForeground(m.getForeground());
531
532 setTitle();
533 setHelptext(getStringP("tip", null));
534
535 setAttr(this, ""); // set name, color, border & insets
536
537 setMinimizable(getIntP("minimizable", 0) > 0);
538 if(getIntP("mini", 0) > 0) setMini(true);
539 }
540
541 /**
542 * Convenience routines to get a String Property.
543 * Returns "##ERR:<key>" on failure
544 *
545 * @param key key to use for lookup.
546 */
547 protected String getString(String key) {
548 return getString(key, "##ERR:" + key);
549 }
550
551 /**
552 * Convenience routines to get a String Property.
553 *
554 * @param key key to use for lookup.
555 * @param def value to return on failure.
556 */
557 protected String getString(String key, String def) {
558 main.setModule(getClass().getName());
559 String res = main.getString(key);
560 return res == null ? def : res;
561 }
562
563 /**
564 * Convenience routines to get a String Property. Short for getString(prefix);
565 */
566 protected String getStringP() {
567 return getString(prefix);
568 }
569
570 /**
571 * Convenience routines to get a String Property. Short for getString(prefix + <key>);
572 *
573 * @param key key to use for lookup. Will be prefixed
574 */
575 protected String getStringP(String key) {
576 return getString(prefix + key);
577 }
578
579 /**
580 * Convenience routines to get a String Property. Short for getString(prefix + <key>, <def>);
581 *
582 * @param key key to use for lookup. Will be prefixed
583 * @param def value to return on failure.
584 */
585 protected String getStringP(String key, String def) {
586 return getString(prefix + key, def);
587 }
588
589 /**
590 * Convenience routines to get a Object Property.
591 *
592 * @param key key to use for lookup
593 */
594 protected Object getObject(String key) {
595 return main.get(key);
596 }
597
598 /**
599 * Convenience routines to get a Object Property. Short for getObject(prefix);
600 */
601 protected Object getObjectP() {
602 return main.get(prefix);
603 }
604
605 /**
606 * Convenience routines to get a Object Property. Short for getObject(prefix + <key>);
607 *
608 * @param key key to use for lookup
609 */
610 protected Object getObjectP(String key) {
611 return main.get(prefix + key);
612 }
613
614 /**
615 * Convenience routines to get a int Property.
616 * Returns 0 on failure
617 *
618 * @param key key to use for lookup
619 */
620 protected int getInt(String key) {
621 return getInt(key, 0);
622 }
623
624 /**
625 * Convenience routines to get a int Property.
626 *
627 * @param key key to use for lookup
628 * @param def value to return on failure.
629 */
630 protected int getInt(String key, int def) {
631 try {
632 return Integer.parseInt(getString(key, "" + def));
633 } catch(Exception x) {
634 return def;
635 }
636 }
637
638 /**
639 * Convenience routines to get a int Property. Short for getInt(prefix);
640 */
641 protected int getIntP() {
642 return getInt(prefix);
643 }
644
645 /**
646 * Convenience routines to get a int Property. Short for getInt(prefix + <key>);
647 *
648 * @param key key to use for lookup. Will be prefixed
649 */
650 protected int getIntP(String key) {
651 return getInt(prefix + key);
652 }
653
654 /**
655 * Convenience routines to get a int Property. Short for getint(prefix + <key>, <def>);
656 *
657 * @param key key to use for lookup. Will be prefixed
658 * @param def value to return on failure.
659 */
660 protected int getIntP(String key, int def) {
661 return getInt(prefix + key, def);
662 }
663
664 /**
665 * Convenience routines to get a Stringarray Property.
666 * Returns empty array on failure
667 *
668 * @param key key to use for lookup. Will be prefixed
669 */
670 protected String[] getStringArray(String key) {
671 return new StringSplitter(getString(key, null), ",").toArray();
672 }
673
674 /**
675 * Convenience routines to get a Stringarray Property. Short for getStringArray(prefix)
676 */
677 protected String[] getStringArrayP() {
678 return getStringArray(prefix);
679 }
680
681 /**
682 * Convenience routines to get a Stringarray Property. Short for getStringArray(prefix + <key>)
683 *
684 * @param key key to use for lookup. Will be prefixed
685 */
686 protected String[] getStringArrayP(String key) {
687 return getStringArray(prefix + key);
688 }
689
690 /**
691 * Convenience routines to get an intarray Property.
692 * Returns empty array on failure
693 *
694 * @param key key to use for lookup. Will be prefixed
695 */
696 protected int[] getIntArray(String key) {
697 String S[] = getStringArray(key); int I[] = new int[S.length];
698 for(int i = 0; i < S.length; ++ i) {
699 try { I[i] = Integer.parseInt(S[i]); } catch(Exception x) { I[i] = 0; }
700 }
701 return I;
702 }
703
704 /**
705 * Convenience routines to get a intarray Property. Short for getIntArray(prefix)
706 */
707 protected int[] getIntArrayP() {
708 return getIntArray(prefix);
709 }
710
711 /**
712 * Convenience routines to get a intarray Property. Short for getIntArray(prefix + <key>)
713 *
714 * @param key key to use for lookup. Will be prefixed
715 */
716 protected int[] getIntArrayP(String key) {
717 return getIntArray(prefix + key);
718 }
719
720
721 /**
722 * Convenience routine to put a variable in the main var bucket
723 *
724 * @param key key to use
725 * @param val value to use
726 */
727 protected void putObject(String key, Object val) {
728 main.put(key, val);
729 }
730
731 /**
732 * Convenience routine to put a variable in the main var bucket
733 * Short for putObject(prefix, <val>);
734 *
735 * @param val value to use
736 */
737 protected void putObjectP(Object val) {
738 putObject(prefix, val);
739 }
740
741 /**
742 * Convenience routine to put a variable in the main var bucket
743 * Short for putObject(prefix + <key>, <val>);
744 *
745 * @param key key to use. Will be prefixed
746 * @param val value to use
747 */
748 protected void putObjectP(String key, Object val) {
749 putObject(prefix + key, val);
750 }
751
752 /**
753 * Sets the title for this Panel
754 * Overwrite if you need something special
755 */
756 protected void setTitle() {
757 setTitle(getStringP("label", null));
758 }
759
760 /**
761 * Sets the attributes for component
762 * Usually used only internally for new... routines
763 *
764 * @param c the component
765 * @param n String to use for proerty lookups
766 */
767 protected Component setAttr(Component c, String n) {
768 c.setName(n);
769 c.setBackground(getColor(getStringP(n + "background")));
770 c.setForeground(getColor(getStringP(n + "foreground")));
771 if(c instanceof Awt) {
772 Awt a = (Awt) c;
773 a.setInsets(Array2Insets(getIntArrayP(n + "insets")));
774 a.setInnerInsets(Array2Insets(getIntArrayP(n + "innerinsets")));
775 a.setBorderType(getStringP(n + "bordertype", null));
776 a.setBorderDepth(getIntP(n + "borderdepth", -1));
777 String BG = getStringP(n + "img", null);
778 if(BG != null) {
779 setBG(BG);
780 }
781 }
782 return c;
783 }
784
785 /**
786 * Sets the attributes for component. Like setAttr, but also adds
787 * a mouselistener for Tip popups
788 * Usually used only internally for new... routines
789 *
790 * @param c the component
791 * @param n String to use for property lookups
792 */
793 protected Component setAttrTip(Component c, String n) {
794 c.addMouseListener(new Tip(getStringP(n + "tip", null)));
795 return setAttr(c, n);
796 }
797
798 /**
799 * Adds Component to our container
800 * Usually used only internally for new... routines
801 *
802 * @param c the component to add
803 */
804 protected Component addComp(Component c) {
805 add(c); return c;
806 }
807
808 /**
809 * Creates a new Caption
810 *
811 * @param n String to use for property lookups
812 */
813 protected Caption newCaption(String n) {
814 return (Caption) setAttrTip(new Caption(getStringP(n)), n);
815 }
816
817 /**
818 * Adds a new Caption to our container
819 *
820 * @param n String to use for property lookups
821 */
822 protected Caption addNewCaption(String n) {
823 return (Caption) addComp(newCaption(n));
824 }
825
826 /**
827 * Creates a new Triage (Choice)
828 *
829 * @param n String to use for property lookups
830 */
831 protected Triage newTriage(String n) {
832 return (Triage) setAttr(new Triage(getStringArrayP(n)), n);
833 }
834
835 /**
836 * Adds a new Triage to our container
837 *
838 * @param n String to use for property lookups
839 */
840 protected Triage addNewTriage(String n) {
841 return (Triage) addComp(newTriage(n));
842 }
843
844 /**
845 * Creates a new Knob (Button)
846 *
847 * @param n String to use for property lookups
848 */
849 protected Knob newKnob(String n) {
850 return (Knob) setAttr(new Knob(getStringP(n)), n);
851 }
852
853 /**
854 * Adds a new Knob to our container
855 *
856 * @param n String to use for property lookups
857 */
858 protected Knob addNewKnob(String n) {
859 return (Knob) addComp(newKnob(n));
860 }
861
862 /**
863 * Creates a new Xbox (Checkbox)
864 *
865 * @param n String to use for property lookups
866 */
867 protected Xbox newXbox(String n) {
868 return (Xbox) setAttr(new Xbox(getStringP(n)), n);
869 }
870
871 /**
872 * Adds a new Xbox to our container
873 *
874 * @param n String to use for property lookups
875 */
876 protected Xbox addNewXbox(String n) {
877 return (Xbox) addComp(newXbox(n));
878 }
879
880 /**
881 * Creates a new MultiColumnList
882 *
883 * @param n String to use for property lookups
884 */
885 protected MultiColumnList newMultiColumnList(String n) {
886 return (MultiColumnList) setAttr(new MultiColumnList(getStringArrayP(n + "header"), getIntP(n +"visiblecols", 4), getIntP(n +"minvisiblecols", 1), getIntP(n +"visiblerows", 5)), n);
887 }
888
889 /**
890 * Adds a new MultiColumnList to our container
891 *
892 * @param n String to use for property lookups
893 */
894 protected MultiColumnList addNewMultiColumnList(String n) {
895 return (MultiColumnList) addComp(newMultiColumnList(n));
896 }
897
898 /**
899 * Creates a new EditField (single-line input)
900 *
901 * @param n String to use for property lookups
902 */
903 protected EditField newEditField(String n) {
904 return (EditField) initEditComponent(n, new EditField(getIntP(n + "len", 10)));
905 }
906
907 /**
908 * Adds a new EditField to our container
909 *
910 * @param n String to use for property lookups
911 */
912 protected EditField addNewEditField(String n) {
913 return (EditField) addComp(newEditField(n));
914 }
915
916 /**
917 * Creates a new EditArea (multi-line input)
918 *
919 * @param n String to use for property lookups
920 */
921 protected EditArea newEditArea(String n) {
922 return (EditArea) initEditComponent(n, new EditArea("", getIntP(n + "visiblerows", 10), getIntP(n + "visiblecols", 78), TextArea.SCROLLBARS_VERTICAL_ONLY));
923 }
924
925 /**
926 * Adds a new EditArea to our container
927 *
928 * @param n String to use for property lookups
929 */
930 protected EditArea addNewEditArea(String n) {
931 return (EditArea) addComp(newEditArea(n));
932 }
933
934 /**
935 * subroutine for newEditField/newEditArea to add attributes
936 * used only internally
937 *
938 * @param n String to use for property lookups
939 * @param tc the TextComponent to modify
940 */
941 private Component initEditComponent(String n, AwtText tc) {
942 tc.setText(getStringP(n + "init", ""));
943 tc.addTextListener(new TextFilter(getStringP(n + "allow", ""), getStringP(n + "deny", ""), getIntP(n + "maxlen", 0)));
944 return setAttrTip(tc, n);
945 }
946
947 /**
948 * returns true if MultiColumnList is empty
949 * pops up Dialog if msg != null
950 *
951 * @param l MultiColumnList to use
952 * @param msg msg to popup if list is empty
953 */
954 protected boolean checkEmpty(MultiColumnList l, String msg) {
955 return checkEmpty(l.getItem(0,0), msg, 1);
956 }
957
958 /**
959 * returns true if TextComponent is empty
960 * pops up Dialog if msg != null
961 *
962 * @param t TextComponent to use
963 * @param msg msg to popup if list is empty
964 */
965 protected boolean checkEmpty(TextComponent t, String msg) {
966 return checkEmpty(t.getText(), msg, getIntP(t.getName() + "minlen", 1));
967 }
968
969 /**
970 * returns true if String is shorter than minlen
971 * pops up Dialog if msg != null
972 *
973 * @param t TextComponent to use
974 * @param msg msg to popup if list is empty
975 * @param minlen how long this string should be
976 */
977 protected boolean checkEmpty(String s, String msg, int minlen) {
978 if(s.length() < minlen) {
979 if(msg != null) DialogBox.errorDialog(msg).show(this);
980 return true;
981 }
982 return false;
983 }
984
985 /**
986 * Interface to Main(). Used in Applet Mode to notify us of stop/start
987 * Overwrite to receive these events
988 */
989 public void stop() {
990 }
991
992 /**
993 * Interface to Main(). Used in Applet Mode to notify us of stop/start
994 * Overwrite to receive these events
995 */
996 public void start() {
997 }
998 }
999