001 /** ===================================================================== 002 * 003 * File Name : $Id: NewFaultForm.java,v 1.17 2008/01/15 11:08:15 cb Exp $ 004 * 005 * Description 006 * ----------- 007 * 008 * See javadoc comment 009 * 010 * ===================================================================== 011 * 012 * @Author : Craige Bevil 013 * Control Software Group 014 * Isaac Newton Group of Telescopes 015 * 016 * ===================================================================== 017 * 018 * Modification Log 019 * 020 * Vers Date Author Reason 021 * ---- ---- ------ ------ 022 * 1 6 Jun 2007 C.Bevil First Release 023 * 024 * Commissioning Notes 025 * ------------------- 026 * 027 * None 028 * 029 * ===================================================================== 030 * 031 * @Version : $Id: NewFaultForm.java,v 1.17 2008/01/15 11:08:15 cb Exp $ 032 * 033 * @Author : $Author: cb $ 034 * 035 * Header : $Header: /opt/INGsrc/src/CVS/softproj/FaultDatabase/src/FaultDatabase/FaultDatabase/src/GWTApplication/client/NewFaultForm.java,v 1.17 2008/01/15 11:08:15 cb Exp $ 036 * 037 * Log : $Log: NewFaultForm.java,v $ 038 * Log : Revision 1.17 2008/01/15 11:08:15 cb 039 * Log : Ran through PMD and sorted out the javadoc so that we could export the 040 * Log : javadoc to the javadoc repository. 041 * Log : 042 * Log : Revision 1.16 2008/01/14 16:59:45 cb 043 * Log : Modified so that the text field will resize when the main window is 044 * Log : resized. 045 * Log : 046 * Log : Revision 1.15 2007/12/14 08:27:37 cb 047 * Log : Fixed a subtle timing issue associated with DR 17940 048 * Log : 049 * Log : "When multiple faults are submitted with the new fault DB a minor error 050 * Log : occurs when trying to submit additional faults. When the user clicks 051 * Log : `create fault` having proviously submitted a fault the fault 052 * Log : submission page does not load properly. None of the boxes / pull down 053 * Log : menus (with the exception of time occurred, date occurred, time lost 054 * Log : and observer) are displayed. Clicking the reset form button clears the 055 * Log : problem. 056 * Log : 057 * Log : I`m currently running internet explorer 7 on a windows XP laptop." 058 * Log : 059 * Log : Revision 1.14 2007/10/22 11:39:44 cb 060 * Log : Changed some of the dimensions of some of the widgets to try and line 061 * Log : them up 062 * Log : 063 * Log : Revision 1.13 2007/10/19 13:41:09 cb 064 * Log : Converted to use the gwtext widgets for the dialogs which are quite nice 065 * Log : 066 * Log : Revision 1.12 2007/10/18 08:43:50 cb 067 * Log : Support for decommissioned instruments has been added to the system 068 * Log : 069 * Log : Revision 1.11 2007/10/08 09:32:50 cb 070 * Log : Modified to allow and review the user to change the faults which he is 071 * Log : subscribed to. 072 * Log : 073 * Log : Revision 1.10 2007/09/26 08:39:51 cb 074 * Log : Now double warning when the reset button is pressed 075 * Log : 076 * Log : Revision 1.9 2007/09/03 10:51:09 cb 077 * Log : Modified to check that the user enters something into the description 078 * Log : field 079 * Log : 080 * Log : Revision 1.8 2007/08/23 15:29:17 cb 081 * Log : Display the results of the exception if the fault could not be 082 * Log : created. 083 * Log : 084 * Log : Revision 1.7 2007/08/20 11:52:52 cb 085 * Log : Modified to check to see if the date which is entered is in the 086 * Log : future. 087 * Log : 088 * Log : Revision 1.6 2007/08/14 14:32:25 cb 089 * Log : Sorted out the reset of the form so that it asks for 090 * Log : confirmation. Selects the quick view tab once the user has entered a 091 * Log : fault. 092 * Log : 093 * Log : Revision 1.5 2007/08/13 09:47:48 cb 094 * Log : Reset the form correctly as we were not resetting the names of the 095 * Log : people when the reset form button was being pressed. 096 * Log : 097 * Log : Revision 1.4 2007/08/01 13:00:05 cb 098 * Log : First prototype after import 099 * Log : 100 * Log : Revision 1.3 2007/07/13 10:54:05 cb 101 * Log : Complete interface prototype 102 * Log : 103 * Log : Revision 1.2 2007/06/06 09:10:07 cb 104 * Log : Before moving the menu and changing the options into buttons 105 * Log : 106 * Log : Revision 1.1.1.1 2007/06/01 08:33:26 cb 107 * Log : Imported using TkCVS 108 * Log : 109 * 110 * =====================================================================*/ 111 112 package GWTApplication.client; 113 114 import com.google.gwt.user.client.*; 115 import com.google.gwt.user.client.rpc.*; 116 import com.google.gwt.user.client.ui.*; 117 import com.google.gwt.user.client.ui.FlexTable.*; 118 import java.util.*; 119 120 import com.gwtext.client.core.EventObject; 121 import com.gwtext.client.util.Format; 122 import com.gwtext.client.widgets.MessageBox; 123 import com.gwtext.client.widgets.MessageBoxConfig; 124 125 // Import the rich text widget 126 127 import com.jpavel.gwt.wysiwyg.client.*; 128 129 /** 130 * This class represents a form into which the user can enter the 131 * details of a new fault which may subsequently be entered into the 132 * system. This class makes extensive use of the google web 133 * toolkit. 134 * @author Craige Bevil 135 * @version $Id: NewFaultForm.java,v 1.17 2008/01/15 11:08:15 cb Exp $ 136 */ 137 138 class NewFaultForm extends FaultDBForm implements ClickListener, WindowResizeListener { 139 140 /** 141 * This is the main tab panel 142 */ 143 144 TabPanel mainTabPanel; 145 146 /** 147 * Button which is used for submitting the fault for insertion 148 */ 149 150 Button SubmitButton; 151 152 /** 153 * Button which will be used to reset the form to the default 154 * values 155 */ 156 157 Button ResetButton; 158 159 /** 160 * This is a checkbox which the user will be use to indicate 161 * whether or not he wants to be informed when there are 162 * modifications to the fault in any way 163 */ 164 165 private final CheckBox InterestedInFaultUpdatesCheckbox = new CheckBox(); 166 167 /** 168 * This field will be used to hold the title of the new fault 169 */ 170 171 private final TextBox Title = new TextBox(); 172 173 /** 174 * This field will be used to hold a free format text description 175 * of the fault 176 */ 177 178 private final Editor FaultDescription = new Editor(); 179 180 /** 181 * This widget will be used to hold the time That the fault 182 * occurred 183 */ 184 185 private final TextBox TimeOccurred = new TextBox(); 186 187 /** 188 * This widget will be used to hold the date that the fault 189 * occured. 190 */ 191 192 private final TextBox DateOccurred = new TextBox(); 193 194 /** 195 * This widget will be used to hold the amount of time which was 196 * lost as a result of this fault 197 */ 198 199 private final TextBox TimeLost = new TextBox(); 200 201 /** 202 * This widget will be used to hold the name of the observer who 203 * was using the system when the fault occurred. 204 */ 205 206 private final TextBox Observer = new TextBox(); 207 208 /** 209 * This widget will be used to hold the level of the severity of 210 * the fault 211 */ 212 private final ListBox Severity = new ListBox(); 213 214 /** 215 * This widget will be used to hold the name of the instrument 216 * which is associated with the fault 217 */ 218 219 private final ListBox Instrument = new ListBox(); 220 221 /** 222 * This widget will be used to hold the name of the site 223 * associated with the fault 224 */ 225 226 private final ListBox Site = new ListBox(); 227 228 /** 229 * This widget will be used to hold the name of the system which 230 * is associated with the fault 231 */ 232 233 private final ListBox System = new ListBox(); 234 235 /** 236 * This widget will be used to hold the name of the originator of 237 * the fault. 238 */ 239 240 private final ListBox Originator = new ListBox(); 241 242 /** 243 * This widget will be used to hold the name of the telescope 244 * operator who was on duty when the fault occurred. 245 */ 246 247 private final ListBox TelescopeOperator = new ListBox(); 248 249 /** 250 * This widget will be used to hold the name of the duty 251 * technician who was on duty when the fault occurred 252 */ 253 254 private final ListBox DutyEngineer = new ListBox(); 255 256 /** 257 * This widget will be usedto enter the name of the support 258 * astronomer 259 */ 260 261 private final ListBox SupportAstronomer = new ListBox(); 262 263 /** 264 * This is called when the user presses one of the buttons at the 265 * foot for the screen 266 * @param sender The widget which caused the event 267 */ 268 269 public void onClick (final Widget sender) { 270 271 if (sender.equals(SubmitButton)) { 272 273 // Verify the contents of the form to ensure that the user 274 // has filled in all of the fields which he was expected 275 // to fill in. 276 // 277 278 try { 279 verifyText(internationalizationConstants.description(), NOLENGTHCHECK, FaultDescription.getHTML()); 280 } catch (FieldInvalidException e) { 281 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.descriptionFieldNotCompleted()); 282 return; 283 } 284 285 if (Title.getText().length() == 0) { 286 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.titleFieldNotCompleted()); 287 return; 288 } 289 290 // Check the time occured field to ensure that it is not 291 // empty. 292 293 if (!verifyTimeFormat(TimeOccurred.getText())) { 294 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.timeFieldNotCompletedCorrectly(internationalizationConstants.timeOccured())); 295 return; 296 } 297 298 // Check the date occured field to ensure that it is not 299 // empty. 300 301 if (!verifyDateFormat(DateOccurred.getText())) { 302 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.dateFieldNotCompletedCorrectly(internationalizationConstants.dateOccured())); 303 return; 304 } 305 306 // Check that the date that the user specified for the 307 // time that the fault occured is not in the future. 308 309 if (!verifyDateNotInFuture(DateOccurred.getText())) { 310 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.dateInTheFuture(internationalizationConstants.dateOccured())); 311 return; 312 } 313 314 // Check the time lost field to make sure that the user has completed it correctly 315 316 if (!verifyTimeFormat(TimeLost.getText())) { 317 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.timeFieldNotCompletedCorrectly(internationalizationConstants.timeLost())); 318 return; 319 } 320 321 // Now we need to send the user entered data down to the 322 // fault database servlet in order to put the fault into 323 // the database 324 325 final Fault newFaultDetails = new Fault(); 326 327 newFaultDetails.description = FaultDescription.getHTML(); 328 newFaultDetails.title = Title.getText(); 329 newFaultDetails.timeOccured = TimeOccurred.getText(); 330 newFaultDetails.dateOccured = DateOccurred.getText(); 331 newFaultDetails.timeLost = TimeLost.getText(); 332 newFaultDetails.telescopeOperatorEmail = TelescopeOperator.getValue(TelescopeOperator.getSelectedIndex()); 333 newFaultDetails.site = Site.getValue(Site.getSelectedIndex()); 334 newFaultDetails.observer = Observer.getText(); 335 newFaultDetails.instrument = Instrument.getValue(Instrument.getSelectedIndex()); 336 newFaultDetails.dutyTechnicianEmail = DutyEngineer.getValue(DutyEngineer.getSelectedIndex()); 337 newFaultDetails.supportAstronomerEmail = SupportAstronomer.getValue(SupportAstronomer.getSelectedIndex()); 338 newFaultDetails.enteredByEmail = Originator.getValue(Originator.getSelectedIndex()); 339 newFaultDetails.severity = Severity.getValue(Severity.getSelectedIndex()); 340 newFaultDetails.instrument = Instrument.getValue(Instrument.getSelectedIndex()); 341 newFaultDetails.userWantsEmailUpdates = InterestedInFaultUpdatesCheckbox.isChecked(); 342 newFaultDetails.system = System.getValue(System.getSelectedIndex()); 343 344 // Now we need to send the data across to the servlet 345 // which will be responsible for storing the data in the 346 // database 347 348 svc.createFault (newFaultDetails,new AsyncCallback() { 349 350 /** 351 * On success we clear the form and inform the user of 352 * the number of the defect which was assigned 353 */ 354 355 public void onSuccess (final Object result) { 356 357 final Integer faultReport = (Integer)result; 358 359 // Reset the form back to the default values 360 361 resetForm(true); 362 363 // Now select the quick view tab. Depending on 364 // whether the user is logged on as an ING 365 // user or a casual user, the quick view panel 366 // is either on panel 0 or 1 367 368 if (UserAuthentication.hasPriviledgeLevel(FaultDatabaseConstants.INGUSERPRIVILEDGE)) { 369 mainTabPanel.selectTab(1); 370 } else { 371 mainTabPanel.selectTab(0); 372 } 373 374 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.reportFaultCreated(faultReport.intValue())); 375 } 376 377 public void onFailure (Throwable ex) 378 { 379 // If we were unable to create the fault then 380 // report the error that came back from the 381 // servlet 382 383 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.unableToCreateNewFault() + " : " + ex.getMessage()); 384 } 385 }); 386 387 } else if (sender.equals(ResetButton)) { 388 389 // Make sure that this is what the user wants to do 390 391 MessageBox.confirm(internationalizationConstants.confirm(),internationalizationConstants.areYouSureYouWantToResetTheForm(),new MessageBox.ConfirmCallback() { 392 393 public void execute(String btnID) { 394 395 if ("yes".equals(btnID)) { 396 resetForm(true); 397 } 398 } 399 }); 400 } 401 } 402 403 /** 404 * This method will be used to reset the form to it's initial 405 * values. 406 * @param resetWithoutWarning True if we are to ignore the fact 407 * that there are changes which may not have been saved in the form 408 */ 409 410 void resetForm (final boolean resetWithoutWarning) { 411 412 // If we have been requested to reset the form without warning 413 // then do so now. 414 415 if (!resetWithoutWarning) { 416 417 boolean changesDetected = false; 418 419 // Check to make to see if there are any changes in the 420 // form which will be lost if we reset the form 421 422 String descriptionText = FaultDescription.getHTML(); 423 424 descriptionText = descriptionText.replaceAll("<.*?>",""); 425 426 if (descriptionText.length() > 0 || Title.getText().length() > 0) { 427 changesDetected = true; 428 } 429 430 // Check to see if the user has changed the amount of time lost 431 432 if (!TimeLost.getText().equalsIgnoreCase("00:00")) { 433 changesDetected = true; 434 } 435 436 // If there are changes detected then ask the user if he 437 // does not mind losing them 438 439 if (changesDetected) { 440 441 if (!Window.confirm(internationalizationConstants.getUnsavedChangesConfirmation())) { 442 return; 443 } 444 } 445 } 446 447 // Ensure that the tick box which is associated with the fault 448 // updates is not checked. 449 450 InterestedInFaultUpdatesCheckbox.setChecked(false); 451 452 // Reset the amount of time which has been lost 453 454 TimeLost.setText("00:00"); 455 456 // Get the current date and drop it into the field which holds 457 // the date. 458 459 DateOccurred.setText(getCurrentDate()); 460 461 // Now set the instrument to None 462 463 if (!setSelectedItemInListbox(Instrument,"None")) { 464 MessageBox.alert(internationalizationConstants.information(),"Unable to set instrument field to none"); 465 } 466 467 // Set the system field to unknown 468 469 if (!setSelectedItemInListbox(System,"Unknown")) { 470 MessageBox.alert(internationalizationConstants.information(),"Unable to set system field to unknown"); 471 } 472 473 // Set the site field to WHT 474 475 if (!setSelectedItemInListbox(Site,"WHT")) { 476 MessageBox.alert(internationalizationConstants.information(),"Unable to set site field to unknown"); 477 } 478 479 // Now set the time occurred field to the current time 480 481 TimeOccurred.setText(getCurrentTime()); 482 483 FaultDescription.setHTML(""); 484 Title.setText(""); 485 486 // Now we need to reset the names of the people in the various 487 // lists back to the default values. 488 489 setSelectedItemInListbox(Originator,UserAuthentication.UserEmailAddress); 490 setSelectedItemInListbox(DutyEngineer,UserAuthentication.UserEmailAddress); 491 setSelectedItemInListbox(TelescopeOperator,UserAuthentication.UserEmailAddress); 492 setSelectedItemInListbox(SupportAstronomer,UserAuthentication.UserEmailAddress); 493 } 494 495 /** 496 * This is used to create the form which will be used to enter the 497 * details of a new fault. 498 * @param MainTabPanel This is the parent tab panel into which we 499 * will build the new fault form. 500 * @param svc This is a object which can be used to access the 501 * servlet 502 * @param UserAuthentication The user credentials which were used 503 * when the user logged on. 504 */ 505 506 NewFaultForm (final TabPanel MainTabPanel,final FaultServiceAsync svc, final AuthenticationDetails UserAuthentication) { 507 508 HorizontalPanel mainPanel; 509 510 final FlexTable MainTable = new FlexTable(); 511 final FlexCellFormatter CellFormatter = MainTable.getFlexCellFormatter(); 512 513 this.svc = svc; 514 this.UserAuthentication = UserAuthentication; 515 516 mainPanel = new HorizontalPanel(); 517 518 MainTable.setWidth("98%"); 519 520 // The title of the fault 521 522 Label tempLabel; 523 524 tempLabel = new Label(internationalizationConstants.title()); 525 MainTable.setWidget(1,0,tempLabel); 526 527 Title.setMaxLength(100); 528 Title.setWidth("99%"); 529 Title.setStyleName("gwt-Label"); 530 531 MainTable.setWidget(2,0,Title); 532 CellFormatter.setColSpan(2,0,4); 533 534 // This is the field into which the user will enter the 535 // details of a fault 536 537 FaultDescription.setHeight(Math.max(Window.getClientHeight()-360, 300) + "px"); 538 539 FaultDescription.setWidth("99%"); 540 MainTable.setWidget(3,0,FaultDescription); 541 CellFormatter.setColSpan(3,0,4); 542 543 // Time Occurred Field 544 545 tempLabel = new Label(internationalizationConstants.timeOccured()); 546 MainTable.setWidget(5,0,tempLabel); 547 548 TimeOccurred.setMaxLength(5); 549 TimeOccurred.setStyleName("gwt-Label"); 550 TimeOccurred.setWidth("98%"); 551 MainTable.setWidget(5,1,TimeOccurred); 552 553 // Date Occurred Field 554 555 tempLabel = new Label(internationalizationConstants.dateOccured()); 556 MainTable.setWidget(5,2,tempLabel); 557 558 DateOccurred.setMaxLength(11); 559 DateOccurred.setStyleName("gwt-Label"); 560 DateOccurred.setWidth("98%"); 561 MainTable.setWidget(5,3,DateOccurred); 562 563 // Time Lost Field 564 565 tempLabel = new Label(internationalizationConstants.timeLost()); 566 MainTable.setWidget(6,0,tempLabel); 567 568 TimeLost.setMaxLength(5); 569 TimeLost.setStyleName("gwt-Label"); 570 TimeLost.setWidth("98%"); 571 MainTable.setWidget(6,1,TimeLost); 572 573 // Observer Field 574 575 tempLabel = new Label(internationalizationConstants.observer()); 576 MainTable.setWidget(6,2,tempLabel); 577 578 Observer.setMaxLength(20); 579 Observer.setStyleName("gwt-Label"); 580 Observer.setWidth("98%"); 581 MainTable.setWidget(6,3,Observer); 582 583 // Severity 584 585 tempLabel = new Label(internationalizationConstants.severity()); 586 MainTable.setWidget(7,0,tempLabel); 587 588 Severity.setWidth("98%"); 589 Severity.setStyleName("gwt-Label"); 590 MainTable.setWidget(7,1,Severity); 591 592 fillListBoxWithSeverity(Severity,internationalizationConstants.locale()); 593 594 // Instrument 595 596 tempLabel = new Label(internationalizationConstants.instrument()); 597 MainTable.setWidget(7,2,tempLabel); 598 599 Instrument.setStyleName("gwt-Label"); 600 Instrument.setWidth("98%"); 601 MainTable.setWidget(7,3,Instrument); 602 603 fillListBoxWithCurrentInstruments(Instrument,internationalizationConstants.locale()); 604 605 // Site 606 607 tempLabel = new Label(internationalizationConstants.site()); 608 MainTable.setWidget(8,0,tempLabel); 609 610 Site.setWidth("98%"); 611 Site.setStyleName("gwt-Label"); 612 MainTable.setWidget(8,1,Site); 613 614 fillListBoxWithSites(Site,internationalizationConstants.locale()); 615 616 // System 617 618 tempLabel = new Label(internationalizationConstants.system()); 619 MainTable.setWidget(8,2,tempLabel); 620 621 System.setStyleName("gwt-Label"); 622 System.setWidth("98%"); 623 MainTable.setWidget(8,3,System); 624 625 fillListBoxWithSystems(System,internationalizationConstants.locale()); 626 627 // Telescope Operator 628 629 tempLabel = new Label(internationalizationConstants.telescopeOperator()); 630 MainTable.setWidget(9,0,tempLabel); 631 632 TelescopeOperator.setWidth("98%"); 633 TelescopeOperator.setStyleName("gwt-Label"); 634 MainTable.setWidget(9,1,TelescopeOperator); 635 636 // Now get the list of the telescope operators from the 637 // database and enter them into the drop down menu which will 638 // be used to select the telescope operator. 639 640 fillListBoxWithTelescopeOperators(TelescopeOperator,UserAuthentication.UserEmailAddress,false); 641 642 // Duty Engineer 643 644 tempLabel = new Label(internationalizationConstants.dutyTechnician()); 645 MainTable.setWidget(9,2,tempLabel); 646 647 DutyEngineer.setStyleName("gwt-Label"); 648 DutyEngineer.setWidth("98%"); 649 MainTable.setWidget(9,3,DutyEngineer); 650 651 fillListBoxWithDutyTechnicians(DutyEngineer,UserAuthentication.UserEmailAddress,false); 652 653 // Support Astronomer 654 655 tempLabel = new Label(internationalizationConstants.supportAstronomer()); 656 MainTable.setWidget(10,0,tempLabel); 657 658 SupportAstronomer.setWidth("98%"); 659 SupportAstronomer.setStyleName("gwt-Label"); 660 MainTable.setWidget(10,1,SupportAstronomer); 661 662 fillListBoxWithSupportAstronomers(SupportAstronomer,UserAuthentication.UserEmailAddress,false); 663 664 // Entered by field 665 666 tempLabel = new Label(internationalizationConstants.enteredBy()); 667 MainTable.setWidget(10,2,tempLabel); 668 669 Originator.setStyleName("gwt-Label"); 670 Originator.setWidth("98%"); 671 MainTable.setWidget(10,3,Originator); 672 673 fillListBoxWithStaffMembers(Originator,UserAuthentication.UserEmailAddress,false); 674 675 // If the user only has default access then do not give him 676 // the option of registering for email updates. 677 678 if (UserAuthentication.hasPriviledgeLevel(FaultDatabaseConstants.INGUSERPRIVILEDGE)) { 679 680 // Now the check box which will beused to indicate whether the 681 // person which entered the fault wants to be informed when 682 // the fault is updated in anyway 683 684 tempLabel = new Label(internationalizationConstants.sendEmailFeedback()); 685 MainTable.setWidget(11,0,tempLabel); 686 687 InterestedInFaultUpdatesCheckbox.setStyleName("gwt-Label"); 688 InterestedInFaultUpdatesCheckbox.setWidth("98%"); 689 690 MainTable.setWidget(11,1,InterestedInFaultUpdatesCheckbox); 691 } 692 693 // Now we need to add the submit and reset form buttons to the 694 // button of the interface 695 696 SubmitButton = new Button(internationalizationConstants.submitFault(),this); 697 ResetButton = new Button(internationalizationConstants.resetForm(),this); 698 699 // Add the buttons to the button of the interface 700 701 MainTable.setWidget(12,0,SubmitButton); 702 MainTable.setWidget(12,1,ResetButton); 703 704 // Now reset the fields in the form to their default values. 705 706 resetForm(true); 707 708 // Now add the main panel to the tab 709 710 mainPanel.add(MainTable); 711 712 MainTabPanel.add(mainPanel,internationalizationConstants.createFault()); 713 714 // Remember the main tab panel 715 716 this.mainTabPanel = MainTabPanel; 717 718 Window.addWindowResizeListener(this); 719 720 } 721 722 /** 723 * Called when the main window is resized and we resize the size 724 * of the text field so that it takes advantage of the size of the 725 * screen. 726 */ 727 728 public void onWindowResized (int width, int height) { 729 FaultDescription.setHeight(Math.max(height-360, 300) + "px"); 730 } 731 } 732 733