001 /** ===================================================================== 002 * 003 * File Name : $Id: ModifyFault.java,v 1.12 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 16 Apr 2007 C.Bevil First Release 023 * 024 * Commissioning Notes 025 * ------------------- 026 * 027 * None 028 * 029 * ===================================================================== 030 * 031 * @Version : $Id: ModifyFault.java,v 1.12 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/ModifyFault.java,v 1.12 2008/01/15 11:08:15 cb Exp $ 036 * 037 * Log : $Log: ModifyFault.java,v $ 038 * Log : Revision 1.12 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.11 2008/01/10 16:13:35 cb 043 * Log : Updated so we check that the assigned to and the fault type field has 044 * Log : been set to something other than unknown before it is saved when the 045 * Log : state of the fault is set to resolved. 046 * Log : 047 * Log : Revision 1.10 2007/12/12 15:26:13 cb 048 * Log : Added new javascript library which allows fancy message boxes to be 049 * Log : displayed. 050 * Log : 051 * Log : Revision 1.9 2007/10/08 15:37:20 cb 052 * Log : Tried to syncronise the sending of the email which informs the user 053 * Log : that a fault has changed with the updating of all of the details of 054 * Log : the fault in the database after the user has attempted to save it. 055 * Log : 056 * Log : Revision 1.8 2007/09/04 14:11:36 cb 057 * Log : Move back to the quick view display after fault updated. Only display 058 * Log : fault updated dialog after ALL entries in the update have been saved 059 * Log : 060 * Log : Revision 1.7 2007/08/17 14:26:41 cb 061 * Log : Updated for lastest prototype incorporating a lot of Nikos comments 062 * Log : 063 * Log : Revision 1.6 2007/08/17 08:18:14 cb 064 * Log : Updated error handling, removed staff who are no longer here from the lists 065 * Log : 066 * Log : Revision 1.5 2007/08/09 08:34:59 cb 067 * Log : Modified so that we select a different tab in the main menu when we do 068 * Log : not have any more faults to update. 069 * Log : 070 * Log : Revision 1.4 2007/08/01 13:00:05 cb 071 * Log : First prototype after import 072 * Log : 073 * Log : Revision 1.3 2007/07/26 14:12:28 cb 074 * Log : Updated to check that if the fault is updated from this interface that 075 * Log : we syncronise the time of the lastmodification so that we do not get a 076 * Log : warning when we updated the fault information. 077 * Log : 078 * Log : Revision 1.2 2007/07/13 10:54:05 cb 079 * Log : Complete interface prototype 080 * Log : 081 * Log : Revision 1.1.1.1 2007/06/01 08:33:26 cb 082 * Log : Imported using TkCVS 083 * Log : 084 * 085 * =====================================================================*/ 086 087 package GWTApplication.client; 088 089 import com.google.gwt.user.client.*; 090 import com.google.gwt.user.client.rpc.*; 091 import com.google.gwt.user.client.ui.*; 092 import com.google.gwt.user.client.ui.FlexTable.*; 093 094 import com.gwtext.client.core.EventObject; 095 import com.gwtext.client.util.Format; 096 import com.gwtext.client.widgets.MessageBox; 097 import com.gwtext.client.widgets.MessageBoxConfig; 098 099 // Import the rich text widget 100 101 import com.jpavel.gwt.wysiwyg.client.*; 102 103 import java.util.*; 104 105 /** 106 * This class will be used to generate a form from which the user may 107 * be able to modify and update existing faults within the 108 * fault management system. In order to perform such duties, the user 109 * must have authenticated himself against the system and have 110 * sufficient privileges to perform such actions. 111 *<P> 112 * In addition to being able to modify the details of a fault, the 113 * user will be able to associate with a fault, a comment, a 114 * workaround or a solution. 115 * @author Craige Bevil 116 * @version $Id: ModifyFault.java,v 1.12 2008/01/15 11:08:15 cb Exp $ 117 */ 118 119 class ModifyFault extends FaultDBForm implements ClickListener, FaultUpdatedListener { 120 121 /** 122 * This is the main tab panel 123 */ 124 125 final private TabPanel MainTabPanel; 126 127 /** 128 * Button which is used for submitting the changes which have been 129 * made to a fault to the servlet container 130 */ 131 132 Button SubmitFaultModificationsButton; 133 134 /** 135 * Button which will be used to reject any changes which have been 136 * made to the form and reset them to the default values in the 137 * database. 138 */ 139 140 Button ResetFaultModificationsButton; 141 142 /** 143 * This button will be used to cancel the form 144 */ 145 146 Button CancelFormButton; 147 148 /** 149 * This is the tab panel which contains the update fault form 150 */ 151 152 TabPanel FaultContainerPanel = null; 153 154 /** 155 * This is the fault number which is associated with the fault 156 * which is being edited 157 */ 158 159 int FaultNumber; 160 161 /** 162 * This is the details of the fault which is being edited as they 163 * came from the database 164 */ 165 166 Fault FaultBeingEdited = null; 167 168 /** 169 * This is a hash map which contains the details of all of the 170 * widgets which are contained within the form 171 */ 172 173 HashMap InputFieldWidgets = new HashMap(); 174 175 /** 176 * This table is used to hold all of the widgets within the form. 177 */ 178 179 FlexTable ModifyFaultTable = new FlexTable(); 180 181 /** 182 * This tab panel is located at the foot of the form and will 183 * allow the user to add a comment, a solution or a workarounds to 184 * the fault 185 */ 186 187 TabPanel FaultAdditionPanel = new TabPanel(); 188 189 /** 190 * This is an instance of the object which will allow the user to 191 * enter the details of the comments which will be associated with 192 * the fault 193 */ 194 195 final FaultComment FaultCommentPanel; 196 197 /** 198 * This is an instance of the object which will allow the user to 199 * associate with the fault, the details of the solution which has 200 * been performed 201 */ 202 203 final FaultSolution FaultSolutionPanel; 204 205 /** 206 * This is an instance of the object which will allow the user to 207 * associate with a fault, the details of a workaround which has 208 * been performed 209 */ 210 211 final FaultWorkAround FaultWorkAroundPanel; 212 213 /** 214 * A count of the number of asynchronous subtasks which are 215 * performed when the form is created. There are two subtasks 216 * which are involved, one of creating the form and the second is 217 * the retrieval of the fault data from the servlet. 218 */ 219 220 int noOfSubTasksCompleted = 0; 221 222 /** 223 * This is implements the obligation of the ClickListener 224 * interface and will be called when the user presses various 225 * buttons on the interface. It is a callback for the following 226 * buttons. 227 *<P> 228 * <OL> 229 * <li> The Submit button 230 * <LI> The Cancel form button 231 * <li> The Reset form button 232 * </ol> 233 * @param sender The widget which was responsible for firing the click event. 234 */ 235 236 public void onClick (final Widget sender) { 237 238 // If the user pressed the submit button on the form then 239 // validate and submit changes to the database 240 241 if (sender.equals(SubmitFaultModificationsButton)) { 242 243 // First verify that all of the fields are in the correct 244 // format before we attempt ot send the data down to the 245 // servlet for saving 246 247 try { 248 final Editor temp = (Editor)InputFieldWidgets.get("DESCRIPTION"); 249 verifyText(internationalizationConstants.description(), NOLENGTHCHECK, temp.getHTML()); 250 } catch (FieldInvalidException e) { 251 MessageBox.alert(internationalizationConstants.information(),e.getMessage()); 252 return; 253 } 254 255 try { 256 LabelTextBox temp = (LabelTextBox)InputFieldWidgets.get("TITLE"); 257 verifyText(internationalizationConstants.title(), 200 , temp.textBox.getText()); 258 } catch (FieldInvalidException e) { 259 MessageBox.alert(internationalizationConstants.information(),e.getMessage()); 260 return; 261 } 262 263 // Now verify that the time and date fields are in the correct format 264 265 if (!verifyTimeFormat(((LabelTextBox)InputFieldWidgets.get("TIMEOCCURED")).textBox.getText())) { 266 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.timeFieldNotCompletedCorrectly(internationalizationConstants.timeOccured())); 267 return; 268 } 269 270 if (!verifyDateFormat(((LabelTextBox)InputFieldWidgets.get("DATEOCCURED")).textBox.getText())) { 271 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.dateFieldNotCompletedCorrectly(internationalizationConstants.dateOccured())); 272 return; 273 } 274 275 // Now we can update the database with the modified values 276 277 final Fault faultUpdateDetails = new Fault(); 278 279 // Send down the time of last modification for the details 280 // of the fault that we were modifying so that we can 281 // check to ensure that we are not overwriting 282 // information which has since been updated in the 283 // database 284 285 faultUpdateDetails.lastModified = FaultBeingEdited.lastModified; 286 287 faultUpdateDetails.id = FaultNumber; 288 289 faultUpdateDetails.title = ((LabelTextBox)InputFieldWidgets.get("TITLE")).textBox.getText(); 290 291 faultUpdateDetails.description = ((Editor)InputFieldWidgets.get("DESCRIPTION")).getHTML(); 292 293 faultUpdateDetails.timeOccured = ((LabelTextBox)InputFieldWidgets.get("TIMEOCCURED")).textBox.getText(); 294 295 faultUpdateDetails.dateOccured = ((LabelTextBox)InputFieldWidgets.get("DATEOCCURED")).textBox.getText(); 296 297 faultUpdateDetails.timeLost = ((LabelTextBox)InputFieldWidgets.get("TIMELOST")).textBox.getText(); 298 299 faultUpdateDetails.observer = ((LabelTextBox)InputFieldWidgets.get("OBSERVER")).textBox.getText(); 300 301 ListBox tmp; 302 303 tmp = ((LabelListBox)InputFieldWidgets.get("PRIORITY")).listBox; 304 faultUpdateDetails.priority = Integer.parseInt(tmp.getValue(tmp.getSelectedIndex())); 305 306 tmp = ((LabelListBox)InputFieldWidgets.get("FAULTTYPE")).listBox; 307 faultUpdateDetails.faultType_id = tmp.getValue(tmp.getSelectedIndex()); 308 309 tmp = ((LabelListBox)InputFieldWidgets.get("ASSIGNED")).listBox; 310 faultUpdateDetails.assignedToEmail = tmp.getValue(tmp.getSelectedIndex()); 311 312 tmp = ((LabelListBox)InputFieldWidgets.get("TELESCOPEOPERATOR")).listBox; 313 faultUpdateDetails.telescopeOperatorEmail = tmp.getValue(tmp.getSelectedIndex()); 314 315 tmp = ((LabelListBox)InputFieldWidgets.get("SITE")).listBox; 316 faultUpdateDetails.site_id =tmp.getValue(tmp.getSelectedIndex()); 317 318 tmp = ((LabelListBox)InputFieldWidgets.get("SYSTEM")).listBox; 319 faultUpdateDetails.system_id =tmp.getValue(tmp.getSelectedIndex()); 320 321 tmp = ((LabelListBox)InputFieldWidgets.get("STATUS")).listBox; 322 faultUpdateDetails.state_id =tmp.getValue(tmp.getSelectedIndex()); 323 324 tmp = ((LabelListBox)InputFieldWidgets.get("INSTRUMENT")).listBox; 325 faultUpdateDetails.instrument_id =tmp.getValue(tmp.getSelectedIndex()); 326 327 tmp = ((LabelListBox)InputFieldWidgets.get("DUTYTECHNICIAN")).listBox; 328 faultUpdateDetails.dutyTechnicianEmail =tmp.getValue(tmp.getSelectedIndex()); 329 330 tmp = ((LabelListBox)InputFieldWidgets.get("SUPPORTASTRONOMER")).listBox; 331 faultUpdateDetails.supportAstronomerEmail =tmp.getValue(tmp.getSelectedIndex()); 332 333 tmp = ((LabelListBox)InputFieldWidgets.get("SEVERITY")).listBox; 334 faultUpdateDetails.severity_id = tmp.getValue(tmp.getSelectedIndex()); 335 336 // When the user attempts to update a fault, we need to 337 // make sure that the if the state of the fault is being 338 // set to resolved, that the fields assigned to and fault 339 // type are not set to unknown 340 341 if (faultUpdateDetails.state_id.equals("RESOLVED")) { 342 343 // Ensure that the assigned field is not set to unknown 344 345 if (faultUpdateDetails.assignedToEmail.equals("UNKNOWN")) { 346 Window.alert(internationalizationConstants.assignedToFieldIsNotAssigned()); 347 return; 348 } 349 350 // Ensure that the fault type is not set to unknown 351 352 if (faultUpdateDetails.faultType_id.equals("UNKNOWN")) { 353 Window.alert(internationalizationConstants.faultTypeFieldIsNotAssigned()); 354 return; 355 } 356 } 357 358 // Now update the fault in the database 359 360 svc.updateFault (faultUpdateDetails, internationalizationConstants.locale(),new AsyncCallback() { 361 362 /** 363 * Inform the user that the fault was updated in the database 364 * the number of the defect which was assigned 365 */ 366 367 public void onSuccess (final Object result) { 368 369 // Now we need to get the details of the fault back to 370 // update the details of the fault which is being edited 371 // otherwise the reset button will not work any longer 372 373 svc.getFaultDetails (new Integer(FaultNumber), internationalizationConstants.locale(),new AsyncCallback() { 374 375 public void onSuccess (final Object result) { 376 377 FaultBeingEdited = (Fault)result; 378 379 // Now save the data which is included in the other forms 380 // as well such as the solution, workaround and the 381 // comment form 382 383 FaultCommentPanel.saveFormContentsToDatabase(); 384 FaultSolutionPanel.saveFormContentsToDatabase(); 385 FaultWorkAroundPanel.saveFormContentsToDatabase(); 386 387 // After saving the fault we should return to the quick 388 // view panel after removing the update page. 389 390 removeUpdateTab(); 391 392 svc.informEmailListenersFaultHasChanged ("The details of this fault have been changed", FaultNumber,null); 393 } 394 395 public void onFailure (Throwable ex) { 396 } 397 }); 398 399 MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.faultUpdated(FaultNumber)); 400 } 401 402 public void onFailure (Throwable ex) 403 { 404 MessageBox.alert(internationalizationConstants.information(),ex.getMessage()); 405 } 406 }); 407 408 } else if (sender.equals(ResetFaultModificationsButton)) { 409 410 // Reset the form to the current value of the fault in the 411 // database and discard the changes 412 413 MessageBox.confirm(internationalizationConstants.confirm(),internationalizationConstants.areYouSureYouWantToResetTheForm(),new MessageBox.ConfirmCallback() { 414 415 public void execute(String btnID) { 416 417 if ("yes".equals(btnID)) { 418 419 // Now reset all of the forms which are used to input 420 // fault details such as the fault, solution, workaround 421 // and the comment form 422 423 resetFormToDefaultValues(); 424 425 // Record which tab has bee selected in the fault addition 426 // panel and remember it. 427 // 428 // I should point out that I have to select the tab BEFORE 429 // I reset the contents of the HTML WYSIWG editor as if 430 // the editor is NOT visible when the contents are 431 // refreshed, it creates havoc with firefox. I have 432 // reported the problem. 433 434 final int currentlySelectedTab = FaultAdditionPanel.getTabBar().getSelectedTab(); 435 436 FaultAdditionPanel.selectTab(FaultDatabaseConstants.COMMENTTAB); 437 FaultCommentPanel.resetFormToDefaultValues(); 438 439 FaultAdditionPanel.selectTab(FaultDatabaseConstants.SOLUTIONTAB); 440 FaultSolutionPanel.resetFormToDefaultValues(); 441 442 FaultAdditionPanel.selectTab(FaultDatabaseConstants.WORKAROUNDTAB); 443 FaultWorkAroundPanel.resetFormToDefaultValues(); 444 445 FaultAdditionPanel.selectTab(currentlySelectedTab); 446 447 } 448 } 449 }); 450 451 452 } else if (sender.equals(CancelFormButton)) { 453 454 // Cancel the form and remove it from the interface 455 456 if (Window.confirm(internationalizationConstants.confirmLoseFaultDetails())) { 457 458 FaultContainerPanel.remove(this); 459 460 // Now if there is another tab in the update tab 461 // panel we should select that, otherwise we should 462 // select a different tab in the main tab 463 464 if (FaultContainerPanel.getTabBar().getTabCount() != 0) { 465 FaultContainerPanel.selectTab(0); 466 } else { 467 468 // Select another tab in the main tab panel if 469 // there are no faults left for edit, the quick 470 // view panel. 471 472 MainTabPanel.selectTab(1); 473 } 474 } 475 } 476 } 477 478 /** 479 * Discard the exisiting changes that the user has made to the 480 * form and rest the contents to the values from the database. 481 */ 482 483 void resetFormToDefaultValues () { 484 485 // Make sure we have the details of the fault to be edited 486 487 if (FaultBeingEdited == null) { 488 MessageBox.alert(internationalizationConstants.information(),"Unable to find the details of the fault to be edited"); 489 return; 490 } 491 492 /* 493 * Now fill in all of the fields which are in the form 494 */ 495 496 // Description field 497 498 final Editor temp = (Editor)InputFieldWidgets.get("DESCRIPTION"); 499 temp.setHTML(FaultBeingEdited.description); 500 501 // Title field 502 503 LabelTextBox a = (LabelTextBox)InputFieldWidgets.get("TITLE"); 504 a.textBox.setText(FaultBeingEdited.title); 505 506 // Label at the top of the edit fault tab 507 508 Label tmpLabel = (Label)InputFieldWidgets.get("SUMMARY"); 509 510 tmpLabel.setText("By " + FaultBeingEdited.enteredByName + " " + FaultBeingEdited.enteredBySurname + " " + internationalizationConstants.at() + " " + 511 FaultBeingEdited.timeEntered + " " + internationalizationConstants.onThe() + " " + FaultBeingEdited.dateEntered); 512 513 tmpLabel.setStyleName("modifyFaultTitleLabel"); 514 515 // Now set the time and date occurred field 516 517 a = (LabelTextBox)InputFieldWidgets.get("DATEOCCURED"); 518 a.textBox.setText(FaultBeingEdited.dateOccured); 519 520 a = (LabelTextBox)InputFieldWidgets.get("TIMEOCCURED"); 521 a.textBox.setText(FaultBeingEdited.timeOccured); 522 523 // The amount of time list field due to the fault 524 525 a = (LabelTextBox)InputFieldWidgets.get("TIMELOST"); 526 a.textBox.setText(FaultBeingEdited.timeLost); 527 528 // The observer field 529 530 a = (LabelTextBox)InputFieldWidgets.get("OBSERVER"); 531 a.textBox.setText(FaultBeingEdited.observer); 532 533 // Now we need to select the options in the drop down menus 534 // which were chosen when the fault was originally entered 535 // into the system. 536 537 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("SYSTEM")).listBox,FaultBeingEdited.system_id)) { 538 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.system + " in the system drop down"); 539 } 540 541 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("FAULTTYPE")).listBox,FaultBeingEdited.faultType_id)) { 542 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.faultType + " in the fault type drop down"); 543 } 544 545 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("SUPPORTASTRONOMER")).listBox,FaultBeingEdited.supportAstronomerEmail)) { 546 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.supportAstronomerEmail + " in the support astronomer drop down"); 547 } 548 549 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("DUTYTECHNICIAN")).listBox,FaultBeingEdited.dutyTechnicianEmail)) { 550 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.dutyTechnicianEmail + " in the duty technician drop down"); 551 } 552 553 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("SEVERITY")).listBox,FaultBeingEdited.severity_id)) { 554 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.severity + " in the severity drop down"); 555 } 556 557 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("ASSIGNED")).listBox,FaultBeingEdited.assignedToEmail)) { 558 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.assignedToEmail + " in the assigned to drop down"); 559 } 560 561 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("SITE")).listBox,FaultBeingEdited.site_id)) { 562 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.site + " in the site drop down"); 563 } 564 565 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("PRIORITY")).listBox,Integer.toString(FaultBeingEdited.priority))) { 566 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.priority + " in the priority drop down"); 567 } 568 569 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("STATUS")).listBox,FaultBeingEdited.state_id)) { 570 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.state + " in the status drop down"); 571 } 572 573 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("TELESCOPEOPERATOR")).listBox,FaultBeingEdited.telescopeOperatorEmail)) { 574 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.telescopeOperatorEmail + " in the TO drop down"); 575 } 576 577 if (!setSelectedItemInListbox(((LabelListBox)InputFieldWidgets.get("INSTRUMENT")).listBox,FaultBeingEdited.instrument_id)) { 578 MessageBox.alert(internationalizationConstants.information(),"Unable to find the value " + FaultBeingEdited.instrument + " in the instrument drop down"); 579 } 580 581 } 582 583 /** 584 * This is used to create the form which will be used to enter the 585 * modify the details of the fault. It will get back from the 586 * servlet the details of the fault and then populate the form 587 * accordingly. 588 * @param FaultNumber This is the number of the defect fault which 589 * is to be edited. 590 * @param svc This is a service reference which will be used to access the servlet in the tomcat container 591 * @param internationalizationConstants Used for internationalization of the interface 592 * @param FaultContainerPanel This is the tab panel in which the form is to be packed. 593 * @param MainTabPanel This is the main tab panel, on occasion we 594 * need to be able to select tabs in this panel. 595 */ 596 597 ModifyFault (final int FaultNumber, 598 final FaultServiceAsync svc, 599 final InternationalizationConstants internationalizationConstants, 600 final TabPanel FaultContainerPanel, 601 final AuthenticationDetails UserAuthentication, 602 final TabPanel MainTabPanel) { 603 604 this.internationalizationConstants = internationalizationConstants; 605 this.svc = svc; 606 this.FaultNumber = FaultNumber; 607 this.FaultContainerPanel = FaultContainerPanel; 608 this.UserAuthentication = UserAuthentication; 609 this.MainTabPanel = MainTabPanel; 610 611 initWidget(ModifyFaultTable); 612 613 final FlexCellFormatter formatter = (FlexCellFormatter)ModifyFaultTable.getCellFormatter(); 614 615 // Get the details of the fault from the servlet Now we need 616 // to send the data across to the servlet which will be 617 // responsible for storing the data in the database 618 619 busyIndicator.showBusy(true); 620 621 // Create the fault comment, workarouna and solution panels 622 623 FaultCommentPanel = new FaultComment(FaultNumber,svc,internationalizationConstants,UserAuthentication,this); 624 FaultSolutionPanel = new FaultSolution(FaultNumber,svc,internationalizationConstants,UserAuthentication,this); 625 FaultWorkAroundPanel = new FaultWorkAround(FaultNumber,svc,internationalizationConstants,UserAuthentication,this); 626 627 svc.getFaultDetails (new Integer(FaultNumber), internationalizationConstants.locale(),new AsyncCallback() { 628 629 /** 630 * On success we clear the form and inform the user of 631 * the number of the defect which was assigned 632 */ 633 634 public void onSuccess (final Object result) { 635 FaultBeingEdited = (Fault)result; 636 noOfSubTasksCompleted++; 637 } 638 639 public void onFailure (Throwable ex) 640 { 641 MessageBox.alert(internationalizationConstants.information(),"Unable to get the fault data back for fault " + FaultNumber + " for editing"); 642 } 643 }); 644 645 // First row in the table is a summary of the read only 646 // aspects of the fault 647 648 Label temp = new Label(); 649 650 temp = new Label("Unknown"); 651 InputFieldWidgets.put("SUMMARY",temp); 652 temp.setStyleName("system-LabelHighlight"); 653 ModifyFaultTable.setWidget(0,0,temp); 654 formatter.setColSpan(0,0,4); 655 656 // Second row in the table is the title bar 657 658 LabelTextBox tempTextBox = new LabelTextBox(LabelTextBox.VERTICAL); 659 660 tempTextBox.label.setText(internationalizationConstants.title()); 661 tempTextBox.textBox.setVisibleLength(100); 662 tempTextBox.setWidth("100%"); 663 664 InputFieldWidgets.put("TITLE",tempTextBox); 665 666 ModifyFaultTable.setWidget(1,0,tempTextBox); 667 668 formatter.setColSpan(1,0,4); 669 670 // This is the field into which the user can change the text 671 // of the description 672 673 final Editor description = new Editor(); 674 675 //description.setVisibleLines(15); 676 description.setWidth("100%"); 677 description.setHeight("300px"); 678 679 ModifyFaultTable.setWidget(3,0,description); 680 681 formatter.setColSpan(3,0,4); 682 formatter.setRowSpan(3,0,3); 683 684 InputFieldWidgets.put("DESCRIPTION",description); 685 686 // The Fault Type 687 688 LabelListBox tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 689 690 tempListBox.label.setText(internationalizationConstants.faultType()); 691 tempListBox.setWidth("4cm","4cm"); 692 tempListBox.listBox.setVisibleItemCount(1); 693 694 InputFieldWidgets.put("FAULTTYPE",tempListBox); 695 ModifyFaultTable.setWidget(6,0,tempListBox); 696 697 fillListBoxWithFaultType(tempListBox.listBox,internationalizationConstants.locale()); 698 699 // The Severity Field 700 701 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 702 703 tempListBox.label.setText(internationalizationConstants.severity()); 704 tempListBox.setWidth("4cm","4cm"); 705 tempListBox.listBox.setVisibleItemCount(1); 706 707 InputFieldWidgets.put("SEVERITY",tempListBox); 708 ModifyFaultTable.setWidget(6,1,tempListBox); 709 710 fillListBoxWithSeverity(tempListBox.listBox,internationalizationConstants.locale()); 711 712 // The Site Field 713 714 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 715 716 tempListBox.label.setText(internationalizationConstants.site()); 717 tempListBox.setWidth("4cm","4cm"); 718 tempListBox.listBox.setVisibleItemCount(1); 719 720 InputFieldWidgets.put("SITE",tempListBox); 721 ModifyFaultTable.setWidget(6,2,tempListBox); 722 723 fillListBoxWithSites(tempListBox.listBox,internationalizationConstants.locale()); 724 725 // The Duty Technician 726 727 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 728 729 tempListBox.label.setText(internationalizationConstants.dutyTechnician()); 730 tempListBox.setWidth("4cm","4cm"); 731 tempListBox.listBox.setVisibleItemCount(1); 732 733 InputFieldWidgets.put("DUTYTECHNICIAN",tempListBox); 734 ModifyFaultTable.setWidget(7,0,tempListBox); 735 736 fillListBoxWithDutyTechnicians(tempListBox.listBox,null,false); 737 738 // 2nd row in the table 739 740 // Assigned To 741 742 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 743 744 tempListBox.label.setText(internationalizationConstants.assignedTo()); 745 tempListBox.listBox.setVisibleItemCount(1); 746 747 tempListBox.setWidth("4cm","4cm"); 748 InputFieldWidgets.put("ASSIGNED",tempListBox); 749 ModifyFaultTable.setWidget(7,1,tempListBox); 750 751 fillListBoxWithStaffMembers(tempListBox.listBox,null,false); 752 753 // The Priority 754 755 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 756 757 tempListBox.label.setText(internationalizationConstants.priority()); 758 tempListBox.listBox.setVisibleItemCount(1); 759 tempListBox.setWidth("4cm","4cm"); 760 761 InputFieldWidgets.put("PRIORITY",tempListBox); 762 ModifyFaultTable.setWidget(7,2,tempListBox); 763 764 tempListBox.listBox.addItem("1","1"); 765 tempListBox.listBox.addItem("2","2"); 766 tempListBox.listBox.addItem("3","3"); 767 tempListBox.listBox.addItem("4","4"); 768 tempListBox.listBox.addItem("5","5"); 769 770 // The Support Astronomer 771 772 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 773 774 tempListBox.label.setText(internationalizationConstants.supportAstronomer()); 775 tempListBox.setWidth("4cm","4cm"); 776 tempListBox.listBox.setVisibleItemCount(1); 777 778 InputFieldWidgets.put("SUPPORTASTRONOMER",tempListBox); 779 ModifyFaultTable.setWidget(8,0,tempListBox); 780 781 fillListBoxWithSupportAstronomers(tempListBox.listBox,null,false); 782 783 // The Telescope Operator 784 785 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 786 787 tempListBox.label.setText(internationalizationConstants.telescopeOperator()); 788 tempListBox.setWidth("4cm","4cm"); 789 tempListBox.listBox.setVisibleItemCount(1); 790 791 InputFieldWidgets.put("TELESCOPEOPERATOR",tempListBox); 792 793 ModifyFaultTable.setWidget(8,1,tempListBox); 794 795 fillListBoxWithTelescopeOperators(tempListBox.listBox,null,false); 796 797 // Now the text based fields which the user can enter data 798 // into 799 800 // The time that the fault occurred 801 802 tempTextBox = new LabelTextBox(LabelTextBox.HORIZONTAL); 803 804 tempTextBox.label.setText(internationalizationConstants.timeOccured()); 805 tempTextBox.setWidth("4cm","4cm"); 806 tempTextBox.label.setTitle("The time that the fault occured (HH:MM)"); 807 InputFieldWidgets.put("TIMEOCCURED",tempTextBox); 808 809 ModifyFaultTable.setWidget(8,2,tempTextBox); 810 811 812 // The time that the fault occurred 813 814 tempTextBox = new LabelTextBox(LabelTextBox.HORIZONTAL); 815 816 tempTextBox.label.setText(internationalizationConstants.timeLost()); 817 tempTextBox.setWidth("4cm","4cm"); 818 tempTextBox.label.setTitle("The time that was lost to the fault"); 819 InputFieldWidgets.put("TIMELOST",tempTextBox); 820 821 ModifyFaultTable.setWidget(10,0,tempTextBox); 822 823 // The instrument 824 825 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 826 827 tempListBox.label.setText(internationalizationConstants.instrument()); 828 tempListBox.setWidth("4cm","4cm"); 829 tempListBox.listBox.setVisibleItemCount(1); 830 831 InputFieldWidgets.put("INSTRUMENT",tempListBox); 832 ModifyFaultTable.setWidget(9,1,tempListBox); 833 834 fillListBoxWithInstruments(tempListBox.listBox,internationalizationConstants.locale()); 835 836 // The observer which is associated with the fault. 837 838 tempTextBox = new LabelTextBox(LabelTextBox.HORIZONTAL); 839 840 tempTextBox.label.setText(internationalizationConstants.observer()); 841 tempTextBox.setWidth("4cm","4cm"); 842 tempTextBox.label.setTitle("The name of the observer who was observing when the fault occured."); 843 InputFieldWidgets.put("OBSERVER",tempTextBox); 844 845 ModifyFaultTable.setWidget(10,2,tempTextBox); 846 847 // The System Field 848 849 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 850 851 tempListBox.label.setText(internationalizationConstants.system()); 852 tempListBox.setWidth("4cm","4cm"); 853 tempListBox.listBox.setVisibleItemCount(1); 854 855 InputFieldWidgets.put("SYSTEM",tempListBox); 856 ModifyFaultTable.setWidget(9,0,tempListBox); 857 858 fillListBoxWithSystems(tempListBox.listBox,internationalizationConstants.locale()); 859 860 // The Status 861 862 tempListBox = new LabelListBox(LabelListBox.HORIZONTAL_ALIGNMENT); 863 864 tempListBox.label.setText(internationalizationConstants.status()); 865 tempListBox.setWidth("4cm","4cm"); 866 tempListBox.listBox.setVisibleItemCount(1); 867 868 InputFieldWidgets.put("STATUS",tempListBox); 869 ModifyFaultTable.setWidget(10,1,tempListBox); 870 871 fillListBoxWithStates(tempListBox.listBox,internationalizationConstants.locale()); 872 873 // The date that the fault occurred 874 875 tempTextBox = new LabelTextBox(LabelTextBox.HORIZONTAL); 876 877 tempTextBox.label.setText(internationalizationConstants.dateOccured()); 878 tempTextBox.label.setTitle("The date that the fault occured (DD-MMM-YYYY)"); 879 tempTextBox.setWidth("4cm","4cm"); 880 InputFieldWidgets.put("DATEOCCURED",tempTextBox); 881 882 ModifyFaultTable.setWidget(9,2,tempTextBox); 883 884 // Now put a button which will allow the user to enter the modifications of the fault 885 886 ModifyFaultTable.setHTML(11,0,"<hr>"); 887 formatter.setColSpan(11,0,3); 888 889 // Create the buttons which will allow the user to submit the change, reset the form and cancel the form. 890 891 SubmitFaultModificationsButton = new Button(internationalizationConstants.updateFault(),this); 892 ResetFaultModificationsButton = new Button(internationalizationConstants.resetForm(),this); 893 CancelFormButton = new Button(internationalizationConstants.cancelUpdateFault(),this); 894 895 ModifyFaultTable.setWidget(12,0,SubmitFaultModificationsButton); 896 ModifyFaultTable.setWidget(12,1,ResetFaultModificationsButton); 897 898 ModifyFaultTable.setWidget(12,2,CancelFormButton); 899 900 ModifyFaultTable.setHTML(13,0,"<hr>"); 901 formatter.setColSpan(13,0,3); 902 903 // Now we need to make a tab panel at the foot of the form 904 // from which the user can create comments, solutions and work 905 // arounds. 906 907 FaultAdditionPanel.add(FaultCommentPanel,internationalizationConstants.comment()); 908 FaultAdditionPanel.add(FaultSolutionPanel,internationalizationConstants.solution()); 909 FaultAdditionPanel.add(FaultWorkAroundPanel,internationalizationConstants.workAround()); 910 911 // Now add the fault addition panel to the main fault 912 // modification form 913 914 ModifyFaultTable.setWidget(14,0,FaultAdditionPanel); 915 FaultAdditionPanel.setWidth("100%"); 916 FaultAdditionPanel.selectTab(1); 917 formatter.setColSpan(14,0,3); 918 919 // We have now completed one of the subtasks which is 920 // associated with editing the form 921 922 noOfSubTasksCompleted++; 923 924 // Now wait until the fault data has been retrieved from the 925 // servlet using a deferred command. This is basically a 926 // mechanism for syncronisation when a command is built into 927 // subtasks and we need to syncronise when all of the subtasks 928 // are completed. The javascript GWT engine will call this 929 // class intermittingly until all of the subtasks have been 930 // completed or it times out an complains to the user to that 931 // effect. 932 933 DeferredCommand.addCommand(new IncrementalCommand() { 934 935 public boolean execute() { 936 937 // If the information relating to the fault has 938 // arrived then display it now otherwise we wait 939 // for the next time that we are called and try 940 // again 941 942 final int NOOFSUBTASKSINVOLVEDINCREATINGFAULTUPDATE = 2; 943 944 if (noOfSubTasksCompleted == NOOFSUBTASKSINVOLVEDINCREATINGFAULTUPDATE) { 945 946 busyIndicator.showBusy(false); 947 948 resetFormToDefaultValues(); 949 950 // false indicates that we are not waiting for 951 // anything more to be done 952 953 return false; 954 } 955 956 // We are still waiting for things to be completed. 957 958 return true; 959 } 960 }); 961 } 962 963 /** 964 * This method will be used to remove the current update tab and 965 * return the user to the quick view panel if there is not another 966 * fault open for edit 967 */ 968 969 private void removeUpdateTab() { 970 971 FaultContainerPanel.remove(this); 972 973 // Now if there is another tab in the update tab panel we 974 // should select that, otherwise we should select a different 975 // tab in the main tab 976 977 if (FaultContainerPanel.getTabBar().getTabCount() != 0) { 978 FaultContainerPanel.selectTab(0); 979 } 980 981 // Now select the quick view panel 982 983 MainTabPanel.selectTab(1); 984 } 985 986 /** 987 * Return the fault number which is associated with this panel to 988 * the caller 989 */ 990 991 public int getFaultNumber () { 992 return FaultNumber; 993 } 994 995 /** 996 * The obligation of the fault update listener interface which is 997 * called when one of the components in this interface updates a 998 * fault. We need to know if the user updates the fault from this 999 * interface in any way as the if a solution/workaround/comment is 1000 * added to the fault in the database, the lastModified field will 1001 * be updated and so when we get around to saving the details of 1002 * the fault, the database will complain the fault is out of date. 1003 * <P> 1004 * @param faultNumber This is the fault which has been updated 1005 */ 1006 1007 public void faultUpdatedEvent (final int faultNumber) { 1008 1009 // Get the details of the updated last modified time for this 1010 // fault from the database. 1011 1012 svc.getFaultDetails (new Integer(faultNumber), internationalizationConstants.locale(),new AsyncCallback() { 1013 1014 public void onSuccess (final Object result) { 1015 1016 final Fault fault = (Fault)result; 1017 1018 FaultBeingEdited.lastModified = fault.lastModified; 1019 } 1020 1021 public void onFailure (Throwable ex) 1022 { 1023 MessageBox.alert(internationalizationConstants.information(),ex.getMessage()); 1024 } 1025 }); 1026 } 1027 } 1028 1029 1030