Index: pkg/dartdoc/dropdown.dart |
diff --git a/pkg/dartdoc/dropdown.dart b/pkg/dartdoc/dropdown.dart |
deleted file mode 100644 |
index ce5f2128ebd0eed1e2a3674a12fe4c225f55ddda..0000000000000000000000000000000000000000 |
--- a/pkg/dartdoc/dropdown.dart |
+++ /dev/null |
@@ -1,344 +0,0 @@ |
-// Copyright (c) 2012, 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. |
- |
-List libraryList; |
-InputElement searchInput; |
-DivElement dropdown; |
- |
-/** |
- * Update the search drop down based on the current search text. |
- */ |
-updateDropDown(Event event) { |
- if (libraryList == null) return; |
- if (searchInput == null) return; |
- if (dropdown == null) return; |
- |
- var results = <Result>[]; |
- String text = searchInput.value; |
- if (text == currentSearchText) { |
- return; |
- } |
- if (text.isEmpty()) { |
- updateResults(text, results); |
- hideDropDown(); |
- return; |
- } |
- if (text.contains('.')) { |
- // Search type members. |
- String typeText = text.substring(0, text.indexOf('.')); |
- String memberText = text.substring(text.indexOf('.') + 1); |
- |
- if (typeText.isEmpty() && memberText.isEmpty()) { |
- // Don't search on '.'. |
- } else if (typeText.isEmpty()) { |
- // Search text is of the form '.id' => Look up members. |
- matchAllMembers(results, memberText); |
- } else if (memberText.isEmpty()) { |
- // Search text is of the form 'Type.' => Look up members in 'Type'. |
- matchAllMembersInType(results, typeText, memberText); |
- } else { |
- // Search text is of the form 'Type.id' => Look up member 'id' in 'Type'. |
- matchMembersInType(results, text, typeText, memberText); |
- } |
- } else { |
- // Search all entities. |
- var searchText = new SearchText(text); |
- for (Map<String,Dynamic> library in libraryList) { |
- matchLibrary(results, searchText, library); |
- matchLibraryMembers(results, searchText, library); |
- matchTypes(results, searchText, library); |
- } |
- } |
- var elements = <Element>[]; |
- var table = new TableElement(); |
- table.classes.add('drop-down-table'); |
- elements.add(table); |
- |
- if (results.isEmpty()) { |
- var row = table.insertRow(0); |
- row.innerHTML = "<tr><td>No matches found for '$text'.</td></tr>"; |
- } else { |
- results.sort(resultComparator); |
- |
- var count = 0; |
- for (Result result in results) { |
- result.addRow(table); |
- if (++count >= 10) { |
- break; |
- } |
- } |
- if (results.length >= 10) { |
- var row = table.insertRow(table.rows.length); |
- row.innerHTML = '<tr><td>+ ${results.length-10} more.</td></tr>'; |
- results = results.getRange(0, 10); |
- } |
- } |
- dropdown.elements = elements; |
- updateResults(text, results); |
- showDropDown(); |
-} |
- |
-void matchAllMembers(List<Result> results, String memberText) { |
- var searchText = new SearchText(memberText); |
- for (Map<String,Dynamic> library in libraryList) { |
- String libraryName = library[NAME]; |
- if (library.containsKey(TYPES)) { |
- for (Map<String,Dynamic> type in library[TYPES]) { |
- String typeName = type[NAME]; |
- if (type.containsKey(MEMBERS)) { |
- for (Map<String,Dynamic> member in type[MEMBERS]) { |
- StringMatch memberMatch = obtainMatch(searchText, member[NAME]); |
- if (memberMatch != null) { |
- results.add(new Result(memberMatch, member[KIND], |
- getTypeMemberUrl(libraryName, typeName, member), |
- library: libraryName, type: typeName, args: type[ARGS])); |
- } |
- } |
- } |
- } |
- } |
- } |
-} |
- |
-void matchAllMembersInType(List<Result> results, |
- String typeText, String memberText) { |
- var searchText = new SearchText(typeText); |
- var emptyText = new SearchText(memberText); |
- for (Map<String,Dynamic> library in libraryList) { |
- String libraryName = library[NAME]; |
- if (library.containsKey(TYPES)) { |
- for (Map<String,Dynamic> type in library[TYPES]) { |
- String typeName = type[NAME]; |
- StringMatch typeMatch = obtainMatch(searchText, typeName); |
- if (typeMatch != null) { |
- if (type.containsKey(MEMBERS)) { |
- for (Map<String,Dynamic> member in type[MEMBERS]) { |
- StringMatch memberMatch = obtainMatch(emptyText, |
- member[NAME]); |
- results.add(new Result(memberMatch, member[KIND], |
- getTypeMemberUrl(libraryName, typeName, member), |
- library: libraryName, prefix: typeMatch)); |
- } |
- } |
- } |
- } |
- } |
- } |
-} |
- |
-void matchMembersInType(List<Result> results, |
- String text, String typeText, String memberText) { |
- var searchText = new SearchText(text); |
- var typeSearchText = new SearchText(typeText); |
- var memberSearchText = new SearchText(memberText); |
- for (Map<String,Dynamic> library in libraryList) { |
- String libraryName = library[NAME]; |
- if (library.containsKey(TYPES)) { |
- for (Map<String,Dynamic> type in library[TYPES]) { |
- String typeName = type[NAME]; |
- StringMatch typeMatch = obtainMatch(typeSearchText, typeName); |
- if (typeMatch != null) { |
- if (type.containsKey(MEMBERS)) { |
- for (Map<String,Dynamic> member in type[MEMBERS]) { |
- // Check for constructor match. |
- StringMatch constructorMatch = obtainMatch(searchText, |
- member[NAME]); |
- if (constructorMatch != null) { |
- results.add(new Result(constructorMatch, member[KIND], |
- getTypeMemberUrl(libraryName, typeName, member), |
- library: libraryName)); |
- } else { |
- // Try member match. |
- StringMatch memberMatch = obtainMatch(memberSearchText, |
- member[NAME]); |
- if (memberMatch != null) { |
- results.add(new Result(memberMatch, member[KIND], |
- getTypeMemberUrl(libraryName, typeName, member), |
- library: libraryName, prefix: typeMatch, |
- args: type[ARGS])); |
- } |
- } |
- } |
- } |
- } |
- } |
- } |
- } |
-} |
- |
-void matchLibrary(List<Result> results, SearchText searchText, Map library) { |
- String libraryName = library[NAME]; |
- StringMatch libraryMatch = obtainMatch(searchText, libraryName); |
- if (libraryMatch != null) { |
- results.add(new Result(libraryMatch, LIBRARY, |
- getLibraryUrl(libraryName))); |
- } |
-} |
- |
-void matchLibraryMembers(List<Result> results, SearchText searchText, |
- Map library) { |
- if (library.containsKey(MEMBERS)) { |
- String libraryName = library[NAME]; |
- for (Map<String,Dynamic> member in library[MEMBERS]) { |
- StringMatch memberMatch = obtainMatch(searchText, member[NAME]); |
- if (memberMatch != null) { |
- results.add(new Result(memberMatch, member[KIND], |
- getLibraryMemberUrl(libraryName, member), |
- library: libraryName)); |
- } |
- } |
- } |
-} |
- |
-void matchTypes(List<Result> results, SearchText searchText, |
- Map library) { |
- if (library.containsKey(TYPES)) { |
- String libraryName = library[NAME]; |
- for (Map<String,Dynamic> type in library[TYPES]) { |
- String typeName = type[NAME]; |
- matchType(results, searchText, libraryName, type); |
- matchTypeMembers(results, searchText, libraryName, type); |
- } |
- } |
-} |
- |
-void matchType(List<Result> results, SearchText searchText, |
- String libraryName, Map type) { |
- String typeName = type[NAME]; |
- StringMatch typeMatch = obtainMatch(searchText, typeName); |
- if (typeMatch != null) { |
- results.add(new Result(typeMatch, type[KIND], |
- getTypeUrl(libraryName, type), |
- library: libraryName, args: type[ARGS])); |
- } |
-} |
- |
-void matchTypeMembers(List<Result> results, SearchText searchText, |
- String libraryName, Map type) { |
- if (type.containsKey(MEMBERS)) { |
- String typeName = type[NAME]; |
- for (Map<String,Dynamic> member in type[MEMBERS]) { |
- StringMatch memberMatch = obtainMatch(searchText, member[NAME]); |
- if (memberMatch != null) { |
- results.add(new Result(memberMatch, member[KIND], |
- getTypeMemberUrl(libraryName, typeName, member), |
- library: libraryName, type: typeName, args: type[ARGS])); |
- } |
- } |
- } |
-} |
- |
-String currentSearchText; |
-Result _currentResult; |
-List<Result> currentResults = const <Result>[]; |
- |
-void updateResults(String searchText, List<Result> results) { |
- currentSearchText = searchText; |
- currentResults = results; |
- if (currentResults.isEmpty()) { |
- _currentResultIndex = -1; |
- currentResult = null; |
- } else { |
- _currentResultIndex = 0; |
- currentResult = currentResults[0]; |
- } |
-} |
- |
-int _currentResultIndex; |
- |
-void set currentResultIndex(int index) { |
- if (index < -1) { |
- return; |
- } |
- if (index >= currentResults.length) { |
- return; |
- } |
- if (index != _currentResultIndex) { |
- _currentResultIndex = index; |
- if (index >= 0) { |
- currentResult = currentResults[_currentResultIndex]; |
- } else { |
- currentResult = null; |
- } |
- } |
-} |
- |
-int get currentResultIndex => _currentResultIndex; |
- |
-void set currentResult(Result result) { |
- if (_currentResult != result) { |
- if (_currentResult != null) { |
- _currentResult.row.classes.remove('drop-down-link-select'); |
- } |
- _currentResult = result; |
- if (_currentResult != null) { |
- _currentResult.row.classes.add('drop-down-link-select'); |
- } |
- } |
-} |
- |
-Result get currentResult => _currentResult; |
- |
-/** |
- * Navigate the search drop down using up/down inside the search field. Follow |
- * the result link on enter. |
- */ |
-void handleUpDown(KeyboardEvent event) { |
- if (event.keyIdentifier == KeyName.UP) { |
- currentResultIndex--; |
- event.preventDefault(); |
- } else if (event.keyIdentifier == KeyName.DOWN) { |
- currentResultIndex++; |
- event.preventDefault(); |
- } else if (event.keyIdentifier == KeyName.ENTER) { |
- if (currentResult != null) { |
- window.location.href = currentResult.url; |
- event.preventDefault(); |
- hideDropDown(); |
- } |
- } |
-} |
- |
-/** Show the search drop down unless there are no current results. */ |
-void showDropDown() { |
- if (currentResults.isEmpty()) { |
- hideDropDown(); |
- } else { |
- dropdown.style.visibility = 'visible'; |
- } |
-} |
- |
-/** Used to prevent hiding the drop down when it is clicked. */ |
-bool hideDropDownSuspend = false; |
- |
-/** Hide the search drop down unless suspended. */ |
-void hideDropDown() { |
- if (hideDropDownSuspend) return; |
- |
- dropdown.style.visibility = 'hidden'; |
-} |
- |
-/** Activate search on Ctrl+F and F3. */ |
-void shortcutHandler(KeyboardEvent event) { |
- if (event.keyCode == 0x46/*F*/ && event.ctrlKey || |
- event.keyIdentifier == KeyName.F3) { |
- searchInput.focus(); |
- event.preventDefault(); |
- } |
-} |
- |
-/** Setup search hooks. */ |
-void setupSearch(var libraries) { |
- libraryList = libraries; |
- searchInput = query('#q'); |
- dropdown = query('#drop-down'); |
- |
- searchInput.on.keyDown.add(handleUpDown); |
- searchInput.on.keyUp.add(updateDropDown); |
- searchInput.on.change.add(updateDropDown); |
- searchInput.on.reset.add(updateDropDown); |
- searchInput.on.focus.add((event) => showDropDown()); |
- searchInput.on.blur.add((event) => hideDropDown()); |
- window.on.keyDown.add(shortcutHandler); |
-} |