/// Licensed to the Apache Software Foundation (ASF) under one /// or more contributor license agreements. See the NOTICE file /// distributed with this work for additional information /// regarding copyright ownership. The ASF licenses this file /// to you under the Apache License, Version 2.0 (the /// "License"); you may not use this file except in compliance /// with the License. You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, /// software distributed under the License is distributed on an /// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY /// KIND, either express or implied. See the License for the /// specific language governing permissions and limitations /// under the License. import 'dart:html'; import 'package:thrift/thrift.dart'; import 'package:thrift/thrift_browser.dart'; import 'package:shared/shared.dart'; import 'package:tutorial/tutorial.dart'; /// Adapted from the AS3 tutorial void main() { new CalculatorUI(querySelector('#output')).start(); } class CalculatorUI { final DivElement output; CalculatorUI(this.output); TTransport _transport; Calculator _calculatorClient; void start() { _buildInterface(); _initConnection(); } void _validate() { if (!_transport.isOpen) { window.alert("The transport is not open!"); } } void _initConnection() { _transport = new TAsyncClientSocketTransport( new TWebSocket(Uri.parse('ws://127.0.0.1:9090/ws')), new TMessageReader(new TBinaryProtocolFactory())); TProtocol protocol = new TBinaryProtocol(_transport); _transport.open(); _calculatorClient = new CalculatorClient(protocol); } void _buildInterface() { output.children.forEach((e) { e.remove(); }); _buildPingComponent(); _buildAddComponent(); _buildCalculatorComponent(); _buildGetStructComponent(); } void _buildPingComponent() { output.append(new HeadingElement.h3()..text = "Ping"); ButtonElement pingButton = new ButtonElement() ..text = "PING" ..onClick.listen(_onPingClick); output.append(pingButton); } void _onPingClick(MouseEvent e) { _validate(); _calculatorClient.ping(); } void _buildAddComponent() { output.append(new HeadingElement.h3()..text = "Add"); InputElement num1 = new InputElement() ..id = "add1" ..type = "number" ..style.fontSize = "14px" ..style.width = "50px"; output.append(num1); SpanElement op = new SpanElement() ..text = "+" ..style.fontSize = "14px" ..style.marginLeft = "10px"; output.append(op); InputElement num2 = new InputElement() ..id = "add2" ..type = "number" ..style.fontSize = "14px" ..style.width = "50px" ..style.marginLeft = "10px"; output.append(num2); ButtonElement addButton = new ButtonElement() ..text = "=" ..style.fontSize = "14px" ..style.marginLeft = "10px" ..onClick.listen(_onAddClick); output.append(addButton); SpanElement result = new SpanElement() ..id = "addResult" ..style.fontSize = "14px" ..style.marginLeft = "10px"; output.append(result); } void _onAddClick(MouseEvent e) { _validate(); InputElement num1 = querySelector("#add1"); InputElement num2 = querySelector("#add2"); SpanElement result = querySelector("#addResult"); _calculatorClient .add(int.parse(num1.value), int.parse(num2.value)) .then((int n) { result.text = "$n"; }); } void _buildCalculatorComponent() { output.append(new HeadingElement.h3()..text = "Calculator"); InputElement num1 = new InputElement() ..id = "calc1" ..type = "number" ..style.fontSize = "14px" ..style.width = "50px"; output.append(num1); SelectElement op = new SelectElement() ..id = "calcOp" ..multiple = false ..selectedIndex = 0 ..style.fontSize = "16px" ..style.marginLeft = "10px" ..style.width = "50px"; OptionElement addOp = new OptionElement() ..text = "+" ..value = Operation.ADD.toString(); op.add(addOp, 0); OptionElement subtractOp = new OptionElement() ..text = "-" ..value = Operation.SUBTRACT.toString(); op.add(subtractOp, 1); OptionElement multiplyOp = new OptionElement() ..text = "*" ..value = Operation.MULTIPLY.toString(); op.add(multiplyOp, 2); OptionElement divideOp = new OptionElement() ..text = "/" ..value = Operation.DIVIDE.toString(); op.add(divideOp, 3); output.append(op); InputElement num2 = new InputElement() ..id = "calc2" ..type = "number" ..style.fontSize = "14px" ..style.width = "50px" ..style.marginLeft = "10px"; output.append(num2); ButtonElement calcButton = new ButtonElement() ..text = "=" ..style.fontSize = "14px" ..style.marginLeft = "10px" ..onClick.listen(_onCalcClick); output.append(calcButton); SpanElement result = new SpanElement() ..id = "calcResult" ..style.fontSize = "14px" ..style.marginLeft = "10px"; output.append(result); output.append(new BRElement()); output.append(new BRElement()); LabelElement logIdLabel = new LabelElement() ..text = "Log ID:" ..style.fontSize = "14px"; output.append(logIdLabel); InputElement logId = new InputElement() ..id = "logId" ..type = "number" ..value = "1" ..style.fontSize = "14px" ..style.width = "50px" ..style.marginLeft = "10px"; output.append(logId); LabelElement commentLabel = new LabelElement() ..text = "Comment:" ..style.fontSize = "14px" ..style.marginLeft = "10px"; output.append(commentLabel); InputElement comment = new InputElement() ..id = "comment" ..style.fontSize = "14px" ..style.width = "100px" ..style.marginLeft = "10px"; output.append(comment); } void _onCalcClick(MouseEvent e) { _validate(); InputElement num1 = querySelector("#calc1"); InputElement num2 = querySelector("#calc2"); SelectElement op = querySelector("#calcOp"); SpanElement result = querySelector("#calcResult"); InputElement logId = querySelector("#logId"); InputElement comment = querySelector("#comment"); int logIdValue = int.parse(logId.value); logId.value = (logIdValue + 1).toString(); Work work = new Work(); work.num1 = int.parse(num1.value); work.num2 = int.parse(num2.value); work.op = int.parse(op.options[op.selectedIndex].value); work.comment = comment.value; _calculatorClient.calculate(logIdValue, work).then((int n) { result.text = "$n"; }); } void _buildGetStructComponent() { output.append(new HeadingElement.h3()..text = "Get Struct"); LabelElement logIdLabel = new LabelElement() ..text = "Struct Key:" ..style.fontSize = "14px"; output.append(logIdLabel); InputElement logId = new InputElement() ..id = "structKey" ..type = "number" ..value = "1" ..style.fontSize = "14px" ..style.width = "50px" ..style.marginLeft = "10px"; output.append(logId); ButtonElement getStructButton = new ButtonElement() ..text = "GET" ..style.fontSize = "14px" ..style.marginLeft = "10px" ..onClick.listen(_onGetStructClick); output.append(getStructButton); output.append(new BRElement()); output.append(new BRElement()); TextAreaElement result = new TextAreaElement() ..id = "getStructResult" ..style.fontSize = "14px" ..style.width = "300px" ..style.height = "50px" ..style.marginLeft = "10px"; output.append(result); } void _onGetStructClick(MouseEvent e) { _validate(); InputElement structKey = querySelector("#structKey"); TextAreaElement result = querySelector("#getStructResult"); _calculatorClient .getStruct(int.parse(structKey.value)) .then((SharedStruct s) { result.text = "${s.toString()}"; }); } }