blob: 6b452efc8073a1b0d3edb9f4fbe54328c22e9f97 [file] [log] [blame]
// Copyright (c) 2013, 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.
library json_view_element;
import 'dart:async';
import 'dart:html';
import 'package:observatory/models.dart' as M;
import 'package:observatory/src/elements/helpers/nav_bar.dart';
import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory/src/elements/helpers/tag.dart';
import 'package:observatory/src/elements/nav/notify.dart';
import 'package:observatory/src/elements/nav/top_menu.dart';
import 'package:observatory/src/elements/view_footer.dart';
class JSONViewElement extends HtmlElement implements Renderable {
static const tag = const Tag<JSONViewElement>('json-view',
dependencies: const [
NavTopMenuElement.tag,
NavNotifyElement.tag,
ViewFooterElement.tag
]);
RenderingScheduler<JSONViewElement> _r;
Stream<RenderedEvent<JSONViewElement>> get onRendered => _r.onRendered;
M.NotificationRepository _notifications;
Map _map;
M.NotificationRepository get notifications => _notifications;
Map get map => _map;
factory JSONViewElement(Map map, M.NotificationRepository notifications,
{RenderingQueue queue}) {
assert(notifications != null);
assert(map != null);
JSONViewElement e = document.createElement(tag.name);
e._r = new RenderingScheduler<JSONViewElement>(e, queue: queue);
e._notifications = notifications;
e._map = map;
return e;
}
JSONViewElement.created() : super.created();
@override
attached() {
super.attached();
_r.enable();
}
@override
detached() {
super.detached();
_r.disable(notify: true);
children = <Element>[];
}
void render() {
children = <Element>[
navBar(<Element>[
new NavTopMenuElement(queue: _r.queue),
new NavNotifyElement(_notifications, queue: _r.queue)
]),
new DivElement()
..classes = ['content-centered-big']
..children = <Element>[
new HeadingElement.h2()..text = 'Object',
new HRElement(),
new PreElement()..text = JSONPretty.stringify(_map),
new HRElement(),
new ViewFooterElement(queue: _r.queue)
]
];
}
}
class JSONPretty {
JSONPretty._();
static String stringify(Map map) => new JSONPretty._()._stringify(map);
String _stringify(Map map) {
_buffer.clear();
_buffer.write('{\n');
_printMap(map, 0);
_buffer.write('}\n');
return _buffer.toString();
}
void _printMap(Map map, int depth) {
if (_seen.contains(map)) {
return;
}
_seen.add(map);
for (var k in map.keys) {
var v = map[k];
if (v is Map) {
_writeIndent(depth);
_buffer.write('"$k": {\n');
_printMap(v, depth + 1);
_writeIndent(depth);
_buffer.write('}\n');
} else if (v is List) {
_writeIndent(depth);
_buffer.write('"$k": [\n');
_printList(v, depth + 1);
_writeIndent(depth);
_buffer.write(']\n');
} else {
_writeIndent(depth);
_buffer.write('"$k": $v');
_buffer.write('\n');
}
}
_seen.remove(map);
}
void _printList(List list, int depth) {
if (_seen.contains(list)) {
return;
}
_seen.add(list);
for (var v in list) {
if (v is Map) {
_writeIndent(depth);
_buffer.write('{\n');
_printMap(v, depth + 1);
_writeIndent(depth);
_buffer.write('}\n');
} else if (v is List) {
_writeIndent(depth);
_buffer.write('[\n');
_printList(v, depth + 1);
_writeIndent(depth);
_buffer.write(']\n');
} else {
_writeIndent(depth);
_buffer.write(v);
_buffer.write('\n');
}
}
_seen.remove(list);
}
void _writeIndent(int depth) {
const tab = ' '; // 2 spaces.
_buffer.write(tab * depth);
}
final _buffer = new StringBuffer();
final _seen = new Set();
}