001    /** =====================================================================       
002    *
003    *  File Name : $Id: FaultSolution.java,v 1.7 2008/01/15 11:08:16 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           20 Apr 2007 C.Bevil      First Release
023    *
024    *     Commissioning Notes
025    *     -------------------
026    *
027    *     None
028    *     
029    *  =====================================================================
030    *
031    *     @Version   : $Id: FaultSolution.java,v 1.7 2008/01/15 11:08:16 cb Exp $
032    *
033    *     @Author    : $Author: cb $
034    *
035    *     Header     : $Header: /opt/INGsrc/src/CVS/softproj/FaultDatabase/src/FaultDatabase/FaultDatabase/src/GWTApplication/client/FaultSolution.java,v 1.7 2008/01/15 11:08:16 cb Exp $
036    *
037    *     Log        : $Log: FaultSolution.java,v $
038    *     Log        : Revision 1.7  2008/01/15 11:08:16  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.6  2007/12/12 15:26:15  cb
043    *     Log        : Added new javascript library which allows fancy message boxes to be
044    *     Log        : displayed.
045    *     Log        :
046    *     Log        : Revision 1.5  2007/08/17 14:24:30  cb
047    *     Log        : Removed the submit & reset buttons as these functions will now be
048    *     Log        : controlled through the submit and reset buttons on the main update
049    *     Log        : panel
050    *     Log        :
051    *     Log        : Revision 1.4  2007/08/17 07:26:46  cb
052    *     Log        : Added additional error reports.
053    *     Log        :
054    *     Log        : Revision 1.3  2007/08/01 13:00:07  cb
055    *     Log        : First prototype after import
056    *     Log        :
057    *     Log        : Revision 1.2  2007/07/13 10:54:08  cb
058    *     Log        : Complete interface prototype
059    *     Log        :
060    *     Log        : Revision 1.1.1.1  2007/06/01 08:33:26  cb
061    *     Log        : Imported using TkCVS
062    *     Log        :
063    *
064    * =====================================================================*/
065    
066    
067    package GWTApplication.client;
068    
069    import com.google.gwt.user.client.*;
070    import com.google.gwt.user.client.rpc.*;
071    import com.google.gwt.user.client.ui.*;
072    import com.google.gwt.user.client.ui.FlexTable.*;
073    
074    import com.gwtext.client.core.EventObject;
075    import com.gwtext.client.util.Format;
076    import com.gwtext.client.widgets.MessageBox;
077    import com.gwtext.client.widgets.MessageBoxConfig;
078    
079    import java.util.*;
080    
081    /**
082     * This class will be used to generate a tab at the bottom of the
083     * fault modification form which will allow the user to attached to
084     * the fault the details of a solution which he has entered. The
085     * class makes extensive use of the google web toolkit.
086     * @author Craige Bevil
087     * @version $Id: FaultSolution.java,v 1.7 2008/01/15 11:08:16 cb Exp $
088     */
089    
090    class FaultSolution extends FaultAddition  {
091        
092        /**
093         * This contains the details of the <b>current</b> solution if
094         * there is one entered into the database against the current
095         * fault
096         */
097        
098        private Solution CurrentSolutionDetails;
099        
100        /**
101         * Constructor for the fault solution tab in the modify fault form
102         * @param FaultNumber This is the number of the defect report
103         * which this solution is associated with.
104         * @param svc This is an object which can be used to invoke remote
105         * calls on the servlet. 
106         * @param internationalizationConstants Used for
107         * internationalization. 
108         * @param userAuthentication This contains the details of the
109         * authentication which was performed by the user. 
110         */
111        
112        FaultSolution (final int FaultNumber,
113                       final FaultServiceAsync svc,
114                       final InternationalizationConstants internationalizationConstants,
115                       final AuthenticationDetails userAuthentication,
116                       final FaultUpdatedListener faultUpdateListener) {
117            
118            super(FaultNumber,svc,internationalizationConstants,userAuthentication,faultUpdateListener);
119    
120            setFormDefaultValues(); 
121        }
122    
123        /**
124         * Save the contents of the fault solution to the database
125         */
126        
127        void saveFormContentsToDatabase () {
128    
129            final Solution solution = new Solution();
130                
131            // If the user has not entered anything into the solution 
132            // main text box then we do nothing here.
133            
134            if (!stringContainsText(FaultAdditionText.getHTML())) {
135                return;
136            }
137    
138            // Verify that the user has entered something for the
139            // solution field and if not then we throw it back at him
140            // to sort it out. 
141                
142            try {
143                verifyText(internationalizationConstants.solutionDetails(),NOLENGTHCHECK,FaultAdditionText.getHTML());
144            } catch (FieldInvalidException e) {
145                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.textFieldEmpty(internationalizationConstants.solutionDetails()));
146                return;
147            }
148    
149            // Verify that the user has entered the amount of time
150            // spent in the correct format      
151                
152            if (!verifyTimeFormat(TimeSpent.textBox.getText())) {
153                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.timeFieldNotCompletedCorrectly(internationalizationConstants.timeSpent()));
154                return;                             
155            }
156        
157            // If we get this far then everything is order to we can
158            // now go ahead and try and update the database with the
159            // details of the solution.
160    
161            solution.description    = FaultAdditionText.getHTML();
162            solution.id                 = FaultNumber;
163            solution.enteredByEmail = EnteredBy.listBox.getValue(EnteredBy.listBox.getSelectedIndex());
164            solution.timeSpent          = TimeSpent.textBox.getText();
165    
166            // Now send the details of the solution down to the
167            // servlet so that it can be inserted into the database
168    
169            svc.updateSolutionDetails (solution,new AsyncCallback() {
170                        
171                    /**
172                     * On success we clear the form and inform the user of
173                     * the number of the defect which was assigned
174                     */
175                        
176                    public void onSuccess (final Object result) {
177                                                    
178                        // Now update the default values for the
179                        // solution to be those which the user has
180                        // just entered
181    
182                        CurrentSolutionDetails = solution;
183                            
184                        // Inform any listener that we have updated
185                        // the fault 
186                            
187                        if (faultUpdateListener != null) {
188                            faultUpdateListener.faultUpdatedEvent(FaultNumber);
189                        }
190                            
191                    }
192                    
193                    public void onFailure (Throwable ex) {
194                        MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.unableToEnterSolution());
195                    }
196                });
197    
198        }
199            
200        /**
201         * This will be used to set the default values which are
202         * associated with the fault solution. It will attempt to get the
203         * fields back from the database and populate the fields in the
204         * solution form. If there is no solution found then the default
205         * values of the form will be entered.
206         */
207    
208        void setFormDefaultValues () {
209            
210            svc.getSolutionDetails (new Integer(FaultNumber),new AsyncCallback() {
211                    
212                    public void onSuccess (final Object result) {
213                        CurrentSolutionDetails = (Solution)result;
214                        resetFormToDefaultValues();
215                    }
216                    
217                    public void onFailure (Throwable ex) {
218                        MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.unableToSolutionDetailsFromDatabase());
219                    }
220                });
221        }
222    
223        /**
224         * Reset the solution form to the solution data which is currently in the
225         * database for this fault. The attribute
226         * <b>CurrentSolutionDetails</B> holds the details of the current
227         * solution if there is one. If no fault 
228         */
229        
230        void resetFormToDefaultValues() {
231    
232            // If there is a solution associated with the fault then we
233            // display the values associated with that solution.
234    
235            if (CurrentSolutionDetails == null) {
236    
237                // Set the solution fields to be the default values. 
238    
239                FaultAdditionText.setHTML("");
240                TimeSpent.textBox.setText("00:00");
241                setSelectedItemInListbox(EnteredBy.listBox,userAuthentication.UserEmailAddress);                
242                        
243            } else {
244    
245                FaultAdditionText.setHTML(CurrentSolutionDetails.description);
246                TimeSpent.textBox.setText(CurrentSolutionDetails.timeSpent);
247                setSelectedItemInListbox(EnteredBy.listBox,CurrentSolutionDetails.enteredByEmail);
248    
249            }
250        }
251        
252    }
253