第 5 課結束之後所完成之 MortgageCalculatorHandler.egl 的程式碼

下列程式碼是第 5 課結束之後 MortgageCalculatorHandler.egl 檔的文字。
package handlers;

import com.ibm.egl.rui.widgets.GridLayout;
import services.MortgageCalculationResult;
import com.ibm.egl.rui.widgets.GridLayoutData;
import com.ibm.egl.rui.widgets.TextLabel;
import dojo.widgets.DojoCurrencyTextBox;
import com.ibm.egl.rui.mvc.Controller;
import com.ibm.egl.rui.mvc.MVC;
import com.ibm.egl.rui.mvc.FormField;
import dojo.widgets.DojoTextField;
import dojo.widgets.DojoComboBox;
import com.ibm.egl.rui.mvc.FormManager;
import com.ibm.egl.rui.widgets.GridLayoutLib;
import dojo.widgets.DojoButton;
import com.ibm.egl.rui.widgets.Image;
import services.MortgageCalculationService;
import libraries.MortgageLib;

handler MortgageCalculatorHandler type RUIhandler {
   initialUI = [ ui ], onConstructionFunction = start,
   cssFile="css/MortgageUIProject.css", title="MortgageCalculatorHandler"}

   mortService MortgageCalculationService{@dedicatedService};
   
   ui GridLayout{ columns = 1, rows = 1,
                  cellPadding = 4, children = [ inputRec_ui ] };

   inputRec MortgageCalculationResult{
                  term = 30, loanAmount=180000, interestRate = 5.2};

   inputRec_ui GridLayout{ 
      layoutData = new GridLayoutData{ row = 1, column = 1 },
      rows = 6, columns = 2, cellPadding = 4, 
      children = [ 
         errorLabel, paymentLabel, buttonLayout, inputRec_loanAmount_nameLabel,
         inputRec_loanAmount_textBox,inputRec_interestRate_nameLabel,
         inputRec_interestRate_field,inputRec_term_nameLabel,inputRec_term_comboBox ] };

   inputRec_loanAmount_nameLabel TextLabel {
      text="Loan amount:" , layoutData = new GridLayoutData { row = 1, column = 1} };

   inputRec_loanAmount_textBox DojoCurrencyTextBox { 
      currency = "USD", value = inputRec.loanAmount, width ="100", 
      errorMessage="Amount is not valid." , 
      layoutData = new GridLayoutData { row = 1, column = 2} };

   inputRec_loanAmount_controller Controller { 
      @MVC {model = inputRec.loanAmount,
            view = inputRec_loanAmount_textBox as Widget},
      validStateSetter = handleValidStateChange_inputRec};

   inputRec_loanAmount_formField FormField { 
      controller = inputRec_loanAmount_controller,
      nameLabel = inputRec_loanAmount_nameLabel};

   inputRec_interestRate_nameLabel TextLabel { 
      text="Interest rate:" , 
      layoutData = new GridLayoutData { row = 2, column = 1} };

   inputRec_interestRate_field DojoTextField {
      layoutData = new GridLayoutData { row = 2, column = 2}, width = "100" };

   inputRec_interestRate_controller Controller { 
      @MVC {model = inputRec.interestRate, 
            view = inputRec_interestRate_field as Widget}, 
      validStateSetter = handleValidStateChange_inputRec};

   inputRec_interestRate_formField FormField { 
      controller = inputRec_interestRate_controller, 
      nameLabel = inputRec_interestRate_nameLabel};

   inputRec_term_nameLabel TextLabel { 
      text="Term:" , layoutData = new GridLayoutData { row = 3, column = 1} };

   inputRec_term_comboBox DojoComboBox { 
      values = ["5","10","15","30"] , 
      layoutData = new GridLayoutData { row = 3, column = 2}, width = "100" };

   inputRec_term_controller Controller {
      @MVC {model = inputRec.term, 
            view = inputRec_term_comboBox as Widget}, 
      validStateSetter = handleValidStateChange_inputRec};

   inputRec_term_formField FormField { 
      controller = inputRec_term_controller, nameLabel = inputRec_term_nameLabel};

   inputRec_form FormManager {
      entries = [ inputRec_loanAmount_formField, 
                  inputRec_interestRate_formField,
                  inputRec_term_formField ] };

   buttonLayout GridLayout{ 
      layoutData = new GridLayoutData{ 
                      row = 4, column = 1,
                      horizontalAlignment = GridLayoutLib.ALIGN_CENTER,
                      horizontalSpan = 2 }, 
      cellPadding = 4, rows = 2, columns = 1,
		   children = [ processImage, calculationButton ] };

   calculationButton DojoButton{ 
      layoutData = new GridLayoutData{ row = 1, column = 1 },
      text = "Calculate", onClick ::= inputRec_form_Submit };

   processImage Image{
      layoutData = new GridLayoutData{ 
                      row = 2, column = 1,
		                   horizontalAlignment = GridLayoutLib.ALIGN_CENTER },
      src = "tools/spinner.gif",
      visible = false};

   paymentLabel TextLabel{ 
      layoutData = new GridLayoutData{ 
                      row = 5, column = 1,
		                   horizontalAlignment = GridLayoutLib.ALIGN_CENTER,
                      horizontalSpan = 2 }, 
      text = "$0.00", fontSize = "18" };

   errorLabel TextLabel{ layoutData = new GridLayoutData{ 
                         row = 6, column = 1,
                         horizontalSpan = 2 },
                         color = "Red", width = "250" };
	
   function start()
   end
	
   function inputRec_form_Submit(event Event in)
      if(inputRec_form.isValid())
         inputRec_form.commit();
         showProcessImage();
         calculateMortgage();
      else
         errorLabel.text = "Input form validation failed.";
      end
   end
	
   function inputRec_form_Publish(event Event in)
      inputRec_form.publish();
      inputRec_form_Validate();
   end
	
   function inputRec_form_Validate()
      inputRec_form.isValid();
   end

   function handleValidStateChange_inputRec(view Widget in, valid boolean in)
      for (n int from inputRec_form.entries.getSize() to 1 decrement by 1)
         entry FormField = inputRec_form.entries[n];
         if (entry.controller.view == view)

            if(valid)
				         // TODO: handle valid value
            else
               msg String? = entry.controller.getErrorMessage();
               // TODO: handle invalid value
            end
         end
      end
   end

   function showProcessImage()
      processImage.visible = yes;
   end

   function hideProcessImage()
      processImage.visible = no;
   end

   function calculateMortgage()
      errorLabel.text = "";
      call mortService.amortize(inputRec)
         returning to displayResults
         onException handleException;
   end	

   function displayResults(retResult MortgageCalculationResult in)
      paymentLabel.text = MortgageLib.formatMoney(retResult.monthlyPayment as STRING);
      inputRec_form.publish();
      hideProcessImage();
   end

   // catch-all exception handler
   private function handleException(ae AnyException in)
      errorLabel.text = "Error calling service: " + ae.message;
   end


end

意見