Der folgende Code ist der Text der Datei MortgageCalculatorHandler.egl nach Lerneinheit 5.
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