Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(46)

Unified Diff: client/web/model.dart

Issue 11636011: Web components based app to view dart docs. Still has rough edges. (Closed) Base URL: https://github.com/dart-lang/dart-api-app.git@master
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: client/web/model.dart
diff --git a/client/web/model.dart b/client/web/model.dart
index 87401a2c5ee5fde847759ed6704c5ddca817ba38..f54d04f3a7fb1d9d8ec433ca0bd440a5c7f4ce27 100644
--- a/client/web/model.dart
+++ b/client/web/model.dart
@@ -7,47 +7,83 @@ import 'dart:html' as html;
import 'dart:json';
import 'ast.dart';
+// TODO(jacobr): specify the version # in the JSON file.
Siggi Cherem (dart-lang) 2012/12/19 19:47:33 +1 :)
Jacob 2013/01/02 19:54:58 acknowledged :)
String svnRevisionNumber = "15605";
-String _activeReferenceId;
+/**
+ * Reference id of [currentElement].
+ * *
Siggi Cherem (dart-lang) 2012/12/19 19:47:33 remove extra *
Jacob 2013/01/02 19:54:58 rm * :)
+ * Stored in addition to [currentElement] as [currentElement] may
+ * not yet be available if the data model for the library it is part of has
+ * not yet been loaded.
+ */
+String _currentReferenceId;
-/// Current state of the application.
+/**
+ * Current library the user is browsing if any.
+ */
LibraryElement currentLibrary;
+
+/**
+ * Current type the user is viewing if any.
+ * Should be either a [ClassElement] or a [TypedefElement].
+ */
Element currentType;
+/**
+ * Current member of either [currentLibrary] or [currentType] that the user is
+ * viewing.
+ */
Element currentMember;
+
+/**
+ * Element corresponding to [_currentReferenceId].
+ * The most specific element of [currentLibrary]. [currentType], and
+ * [currentMember].
+ */
Element currentElement;
+/**
+ * Recomputes the Elements part of the current active state from the data model.
+ *
+ * This method should be invoked after additional libraries are loaded from the
+ * server or after the user navigates to a different element in the UI.
+ */
void _recomputeActiveState() {
currentLibrary = null;
currentType = null;
currentMember = null;
currentElement = null;
- if (_activeReferenceId != null) {
- var path = lookupReferenceId(_activeReferenceId).path;
-
- if (path.length > 0) {
- currentLibrary = path[0];
- }
- if (path.length > 1) {
- if (path[1] is ClassElement || path[1] is TypedefElement) {
- currentType = path[1];
- if (path.length > 2) {
- currentMember = path[2];
+ if (_currentReferenceId != null) {
+ var referenceElement = lookupReferenceId(_currentReferenceId);
+ if (referenceElement != null) {
+ var path = referenceElement.path;
+ if (path.length > 0) {
+ currentLibrary = path[0];
+ }
+ if (path.length > 1) {
+ if (path[1] is ClassElement || path[1] is TypedefElement) {
+ currentType = path[1];
+ if (path.length > 2) {
+ currentMember = path[2];
+ }
+ } else {
+ currentMember = path[1];
}
+ }
+ if (currentMember != null) {
+ currentElement = currentMember;
+ } else if (currentType != null) {
+ currentElement = currentType;
} else {
- currentMember = path[1];
+ currentElement = currentLibrary;
}
}
- if (currentMember != null) {
- currentElement = currentMember;
- } else if (currentType != null) {
- currentElement = currentType;
- } else {
- currentElement = currentLibrary;
- }
}
}
+/**
+ * Scrolls the [currentElement] into view.
+ */
void scrollIntoView() {
// TODO(jacobr): there should be a cleaner way to run code that executes
// after the UI updates.
Siggi Cherem (dart-lang) 2012/12/19 19:47:33 let's add an issue for this in web-ui.
Jacob 2013/01/02 19:54:58 Referenced https://github.com/dart-lang/web-ui/iss
Siggi Cherem (dart-lang) 2013/01/02 21:40:55 Thanks! Sorry that I asked you to filed it and the
@@ -60,7 +96,10 @@ void scrollIntoView() {
}, 0);
}
-onDataModelChanged() {
+/**
+ * Invoke every time the data model changes.
+ */
+void _onDataModelChanged() {
_recomputeActiveState();
scrollIntoView();
}
@@ -70,7 +109,7 @@ onDataModelChanged() {
* etc.
*/
String kindCssClass(Element element) {
- String classes = 'kind kind-${normalizedKind(element)}';
+ String classes = 'kind kind-${_normalizedKind(element)}';
if (element.isPrivate == true) {
classes = '$classes private';
} else if (element is MethodElementBase && element.isStatic) {
@@ -89,12 +128,7 @@ String kindCssClass(Element element) {
return classes;
}
-String normalizedKind(obj) {
- if (obj is Element) return normalizedKindFromElement(obj);
- return obj;
-}
-
-String normalizedKindFromElement(Element element) {
+String _normalizedKind(Element element) {
var kind = element.kind;
var name = element.name;
if (kind == 'method' && element.isOperator) {
@@ -108,7 +142,7 @@ String normalizedKindFromElement(Element element) {
}
String toUserVisibleKind(Element element) {
- return KIND_TITLES[normalizedKind(element)];
+ return KIND_TITLES[_normalizedKind(element)];
}
/**
@@ -116,6 +150,8 @@ String toUserVisibleKind(Element element) {
*/
String permalink(var obj) {
var data = {'id': obj.refId};
+ // TODO(jacobr): evaluate whether the persistent UI state will stay just a
+ // single reference ID in which case this is overkill.
return "#!${JSON.stringify(data)}";
}
@@ -131,7 +167,7 @@ void loadStateFromUrl() {
// TODO(jacobr): redirect to default page or better yet attempt to fixup.
}
}
- _activeReferenceId = data['id'];
+ _currentReferenceId = data['id'];
_recomputeActiveState();
scrollIntoView();
}
@@ -150,37 +186,20 @@ Future loadModel() {
md.setImplicitLinkResolver(_resolveNameReference);
var completer = new Completer();
// TODO(jacobr): shouldn't have to get this from the parent directory.
- new html.HttpRequest.get('../static/apidoc.json', onSuccess(html.HttpRequest req) {
+ new html.HttpRequest.get('../static/apidoc.json', (req) {
for (var libraryJson in JSON.parse(req.responseText)) {
var library = new LibraryElement(libraryJson, null);
libraries[library.id] = library;
}
- onDataModelChanged();
+ _onDataModelChanged();
completer.complete(true);
});
return completer.future;
}
-/** XXX NOT USED TODO(jacobr) remove.
-class DocComment {
- final String text;
-
- /**
- * Non-null if the comment is inherited from another declaration.
- */
- final inheritedFrom; // InterfaceMirror?
-
- DocComment(this.text, [this.inheritedFrom = null]) {
- assert(text != null && !text.trim().isEmpty);
- }
-
- SafeHtml get html => new SafeHtml.unsafe(md.markdownToHtml(text));
-
- String toString() => text;
-}
-
-*/
-
+// TODO(jacobr): remove this method and resolve refences to types in the json
+// generation. That way the existing correct logic in Dart2Js can be used rather
+// than this rather busted logic.
/**
* This will be called whenever a doc comment hits a `[name]` in square
* brackets. It will try to figure out what the name refers to and link or
@@ -209,7 +228,8 @@ md.Node _resolveNameReference(String name) {
}
// See if it's another member of the current type.
- // TODO(jacobr): fixme. this is wrong... members are by id now not simple string name...
+ // TODO(jacobr): fixme. this is wrong... members are by id now not simple
+ // string name...
if (currentType != null) {
final foundMember = currentType.members[name];
if (foundMember != null) {

Powered by Google App Engine
This is Rietveld 408576698