91dd628bd8
Need unique name for library collision with template parser. Few more changes to work under VM. More changes for lang.dart seperation. Seperation from lang.dart (tokenizer can't access private fields of base class in another library). This was allowed in frog but not in the VM. VM is right so need to sever dependency. BUG= TEST= Review URL: https://chromiumcodereview.appspot.com//9695048 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@5544 260f80e4-7a28-3924-810f-c04153c831b5
244 lines
6.4 KiB
Dart
Executable File
244 lines
6.4 KiB
Dart
Executable File
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#import('dart:html');
|
|
|
|
// Utility functions:
|
|
String safeHTML(String value) {
|
|
// TODO(terry): TBD
|
|
return value;
|
|
}
|
|
|
|
/* Data Model */
|
|
class Friend {
|
|
String name;
|
|
String phone;
|
|
int age;
|
|
int friendsCircle, familyCircle, workCircle;
|
|
|
|
Friend(this.name, this.phone, this.age,
|
|
this.friendsCircle, this.familyCircle, this.workCircle);
|
|
}
|
|
|
|
/* Simple template:
|
|
================
|
|
|
|
template HTML FriendList(List<Friend> friends) {
|
|
<div>Friends:
|
|
<ul>
|
|
${#each friends} // Iterates over each friend
|
|
<li>${name}</li> // Scope of block is Friend type
|
|
${/each}
|
|
</ul>
|
|
</div>
|
|
}
|
|
*/
|
|
class FriendList /*extends Template*/ {
|
|
Element _fragment;
|
|
|
|
// ${#each friends}
|
|
each_0(List items, Element parent) {
|
|
for (var item in items) {
|
|
var e0 = new Element.html('<li></li>'); // Node before injection
|
|
e0.innerHTML = inject_0(item);
|
|
parent.elements.add(e0);
|
|
}
|
|
}
|
|
|
|
// ${name}
|
|
String inject_0(item) {
|
|
return safeHTML('''${item.name}''');
|
|
}
|
|
|
|
FriendList(List<Friend> friends) {
|
|
_fragment = new Element.tag('div');
|
|
Element e0 = new Element.html('<div>Friends:</div>');
|
|
_fragment.elements.add(e0);
|
|
Element e0_0 = new Element.html('<ul></ul>'); // Node before #each
|
|
e0.elements.add(e0_0);
|
|
each_0(friends, e0_0);
|
|
}
|
|
|
|
Element get root() => _fragment.nodes.first;
|
|
|
|
String toString(){
|
|
return _fragment.innerHTML;
|
|
}
|
|
}
|
|
|
|
|
|
/* More template control:
|
|
======================
|
|
|
|
template HTML FriendEntry(Friend friend) {
|
|
<li>
|
|
${#with friend}
|
|
<span>${name}</span>
|
|
${#if (age < 18)}
|
|
<span class=”left-space”>child</span>
|
|
${#else}
|
|
<span class=”left-space”>adult</span>
|
|
${/if}
|
|
<span class=”left-space”>circles = ${friendCircle + familyCircle + workCircle}</span>
|
|
${/friend}
|
|
</li>
|
|
}
|
|
*/
|
|
class FriendEntry /*extends Template*/ {
|
|
Element _fragment;
|
|
|
|
// ${#with friend}
|
|
with_0(Friend item, Element parent) {
|
|
var e0 = new Element.html('<span></span>'); // Node before injection
|
|
e0.innerHTML = inject_0(item);
|
|
parent.elements.add(e0);
|
|
|
|
// ${#if expression}
|
|
if (if_0(item)) {
|
|
var e1 = new Element.html('<span class="left-space">child</span>');
|
|
parent.elements.add(e1);
|
|
} else {
|
|
var e2 = new Element.html('<span class="left-space">adult</span>');
|
|
parent.elements.add(e2);
|
|
}
|
|
|
|
// Node before injection.
|
|
var e3 = new Element.html('<span class="left-space"></span>');
|
|
e3.innerHTML = inject_1(item);
|
|
parent.elements.add(e3);
|
|
}
|
|
|
|
// expression (age < 18)}
|
|
bool if_0(var item) {
|
|
return (item.age < 18);
|
|
}
|
|
|
|
// ${name}
|
|
String inject_0(item) {
|
|
return safeHTML('''${item.name}''');
|
|
}
|
|
|
|
// ${friendCircle + family.Circle + workCircle
|
|
String inject_1(item) {
|
|
return safeHTML('circles = ${item.friendsCircle + item.familyCircle + item.workCircle}');
|
|
}
|
|
|
|
FriendEntry(Friend friend) {
|
|
_fragment = new Element.tag('div');
|
|
Element e0 = new Element.html('<li></li>'); // Node before #with
|
|
_fragment.elements.add(e0);
|
|
with_0(friend, e0);
|
|
}
|
|
|
|
Element get root() => _fragment.nodes.first;
|
|
|
|
String toString(){
|
|
return _fragment.innerHTML;
|
|
}
|
|
}
|
|
|
|
|
|
/* Template with events:
|
|
=====================
|
|
|
|
template HTML FriendEntryEvents(Friend friend) {
|
|
<li>
|
|
${#with friend}
|
|
<span var=friendElem style="cursor: pointer;">${name}</span>
|
|
${#if (age < 18)}
|
|
<span class=”left-space”>child</span>
|
|
${#else}
|
|
<span class=”left-space”>adult</span>
|
|
${/if}
|
|
<span class=”left-space”>circles = ${friendCircle + familyCircle + workCircle}</span>
|
|
${/friend}
|
|
</li>
|
|
}
|
|
*/
|
|
class FriendEntryEvents /*extends Template*/ {
|
|
Element _fragment;
|
|
var _friendElem;
|
|
|
|
get friendElem() => _friendElem;
|
|
|
|
// ${#with friend}
|
|
with_0(Friend item, Element parent) {
|
|
_friendElem = new Element.html('<span style="cursor: pointer;"></span>'); // Node before injection
|
|
_friendElem.innerHTML = inject_0(item);
|
|
parent.elements.add(_friendElem);
|
|
|
|
// ${#if expression}
|
|
if (if_0(item)) {
|
|
var e1 = new Element.html('<span class="left-space">child</span>');
|
|
parent.elements.add(e1);
|
|
} else {
|
|
var e2 = new Element.html('<span class="left-space">adult</span>');
|
|
parent.elements.add(e2);
|
|
}
|
|
|
|
// Node before injection.
|
|
var e3 = new Element.html('<span class="left-space"></span>');
|
|
e3.innerHTML = inject_1(item);
|
|
parent.elements.add(e3);
|
|
}
|
|
|
|
// expression (age < 18)}
|
|
bool if_0(var item) {
|
|
return (item.age < 18);
|
|
}
|
|
|
|
// ${name}
|
|
String inject_0(item) {
|
|
return safeHTML('''${item.name}''');
|
|
}
|
|
|
|
// ${friendCircle + family.Circle + workCircle
|
|
String inject_1(item) {
|
|
return safeHTML('circles = ${item.friendsCircle + item.familyCircle + item.workCircle}');
|
|
}
|
|
|
|
FriendEntryEvents(Friend friend) {
|
|
_fragment = new Element.tag('div');
|
|
Element e0 = new Element.html('<li></li>'); // Node before #with
|
|
_fragment.elements.add(e0);
|
|
with_0(friend, e0);
|
|
}
|
|
|
|
Element get root() => _fragment.nodes.first;
|
|
|
|
String toString(){
|
|
return _fragment.innerHTML;
|
|
}
|
|
}
|
|
|
|
|
|
void main() {
|
|
// Setup style sheet for page.
|
|
document.head.elements.add(new Element.html('<style>.left-space { margin-left: 10px; }</style>'));
|
|
|
|
// Create data model.
|
|
List<Friend> friends = new List<Friend>();
|
|
friends.add(new Friend('Tom','425.123.4567', 35, 20, 10, 40));
|
|
friends.add(new Friend('Sue','802.987.6543', 23, 53, 25, 80));
|
|
friends.add(new Friend('Bill','617.123.4444', 50, 10, 5, 110));
|
|
|
|
// Simple template.
|
|
document.body.elements.add(new FriendList(friends).root);
|
|
|
|
// Use control template.
|
|
document.body.elements.add(new FriendEntry(friends[0]).root);
|
|
|
|
// Template with Events:
|
|
var clickableFriend = new FriendEntryEvents(friends[0]);
|
|
document.body.elements.add(clickableFriend.root);
|
|
clickableFriend.friendElem.on.click.add((e) {
|
|
var elemStyle = e.srcElement.style;
|
|
String toggleColor = elemStyle.getPropertyValue("background-color") == "red" ? "white" : "red";
|
|
elemStyle.setProperty("background-color", "${toggleColor}");
|
|
});
|
|
|
|
// Calling template inside of a template:
|
|
// document.body.elements.add(new Templates(friends).root);
|
|
}
|