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

Unified Diff: tools/dom/src/CssClassSet.dart

Issue 14941002: Aggregate CSS manipulation functions in html lib. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 8 months 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
« no previous file with comments | « tests/html/element_classes_test.dart ('k') | tools/dom/templates/html/impl/impl_Document.darttemplate » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/dom/src/CssClassSet.dart
diff --git a/tools/dom/src/CssClassSet.dart b/tools/dom/src/CssClassSet.dart
index acae69c9743377cc71300c1e4ce0b8f54e550a5e..4ee943da14ef94c36589104946db5aa83374629e 100644
--- a/tools/dom/src/CssClassSet.dart
+++ b/tools/dom/src/CssClassSet.dart
@@ -4,78 +4,28 @@
part of html;
+/** A Set that stores the CSS class names for an element. */
abstract class CssClassSet implements Set<String> {
- String toString() {
- return readClasses().join(' ');
- }
-
/**
* Adds the class [value] to the element if it is not on it, removes it if it
* is.
*/
- bool toggle(String value) {
- Set<String> s = readClasses();
- bool result = false;
- if (s.contains(value)) {
- s.remove(value);
- } else {
- s.add(value);
- result = true;
- }
- writeClasses(s);
- return result;
- }
+ bool toggle(String value);
/**
* Returns [:true:] if classes cannot be added or removed from this
* [:CssClassSet:].
*/
- bool get frozen => false;
-
- // interface Iterable - BEGIN
- Iterator<String> get iterator => readClasses().iterator;
- // interface Iterable - END
-
- // interface Collection - BEGIN
- void forEach(void f(String element)) {
- readClasses().forEach(f);
- }
-
- String join([String separator = ""]) => readClasses().join(separator);
-
- Iterable map(f(String element)) => readClasses().map(f);
-
- Iterable<String> where(bool f(String element)) => readClasses().where(f);
-
- Iterable expand(Iterable f(String element)) => readClasses().expand(f);
-
- bool every(bool f(String element)) => readClasses().every(f);
+ bool get frozen;
- bool any(bool f(String element)) => readClasses().any(f);
-
- bool get isEmpty => readClasses().isEmpty;
-
- int get length => readClasses().length;
-
- String reduce(String combine(String value, String element)) {
- return readClasses().reduce(combine);
- }
-
- dynamic fold(dynamic initialValue,
- dynamic combine(dynamic previousValue, String element)) {
- return readClasses().fold(initialValue, combine);
- }
- // interface Collection - END
-
- // interface Set - BEGIN
/**
* Determine if this element contains the class [value].
*
* This is the Dart equivalent of jQuery's
* [hasClass](http://api.jquery.com/hasClass/).
*/
- bool contains(String value) => readClasses().contains(value);
+ bool contains(String value);
/**
* Add the class [value] to element.
@@ -83,11 +33,7 @@ abstract class CssClassSet implements Set<String> {
* This is the Dart equivalent of jQuery's
* [addClass](http://api.jquery.com/addClass/).
*/
- void add(String value) {
- // TODO - figure out if we need to do any validation here
- // or if the browser natively does enough.
- _modify((s) => s.add(value));
- }
+ void add(String value);
/**
* Remove the class [value] from element, and return true on successful
@@ -96,13 +42,7 @@ abstract class CssClassSet implements Set<String> {
* This is the Dart equivalent of jQuery's
* [removeClass](http://api.jquery.com/removeClass/).
*/
- bool remove(Object value) {
- if (value is! String) return false;
- Set<String> s = readClasses();
- bool result = s.remove(value);
- writeClasses(s);
- return result;
- }
+ bool remove(Object value);
/**
* Add all classes specified in [iterable] to element.
@@ -110,10 +50,7 @@ abstract class CssClassSet implements Set<String> {
* This is the Dart equivalent of jQuery's
* [addClass](http://api.jquery.com/addClass/).
*/
- void addAll(Iterable<String> iterable) {
- // TODO - see comment above about validation.
- _modify((s) => s.addAll(iterable));
- }
+ void addAll(Iterable<String> iterable);
/**
* Remove all classes specified in [iterable] from element.
@@ -121,9 +58,7 @@ abstract class CssClassSet implements Set<String> {
* This is the Dart equivalent of jQuery's
* [removeClass](http://api.jquery.com/removeClass/).
*/
- void removeAll(Iterable<String> iterable) {
- _modify((s) => s.removeAll(iterable));
- }
+ void removeAll(Iterable<String> iterable);
/**
* Toggles all classes specified in [iterable] on element.
@@ -132,58 +67,34 @@ abstract class CssClassSet implements Set<String> {
* remove it if it is. This is the Dart equivalent of jQuery's
* [toggleClass](http://api.jquery.com/toggleClass/).
*/
- void toggleAll(Iterable<String> iterable) {
- iterable.forEach(toggle);
- }
-
- void retainAll(Iterable<String> iterable) {
- _modify((s) => s.retainAll(iterable));
- }
+ void toggleAll(Iterable<String> iterable);
+}
- void removeWhere(bool test(String name)) {
- _modify((s) => s.removeWhere(test));
+/**
+ * A set (union) of the CSS classes that are present in a set of elements.
+ * Implemented separately from _ElementCssClassSet for performance.
+ */
+class _MultiElementCssClassSet extends CssClassSetImpl {
+ final Iterable<Element> _elementIterable;
+ Iterable<_ElementCssClassSet> _elementCssClassSetIterable;
+
+ _MultiElementCssClassSet(this._elementIterable) {
+ _elementCssClassSetIterable = new List.from(_elementIterable).map(
+ (e) => new _ElementCssClassSet(e));
}
- void retainWhere(bool test(String name)) {
- _modify((s) => s.retainWhere(test));
+ Set<String> readClasses() {
+ var s = new LinkedHashSet<String>();
+ _elementCssClassSetIterable.forEach((e) => s.addAll(e.readClasses()));
+ return s;
}
- bool containsAll(Iterable<String> collection) =>
- readClasses().containsAll(collection);
-
- Set<String> intersection(Set<String> other) =>
- readClasses().intersection(other);
-
- Set<String> union(Set<String> other) =>
- readClasses().union(other);
-
- Set<String> difference(Set<String> other) =>
- readClasses().difference(other);
-
- String get first => readClasses().first;
- String get last => readClasses().last;
- String get single => readClasses().single;
- List<String> toList({ bool growable: true }) =>
- readClasses().toList(growable: growable);
- Set<String> toSet() => readClasses().toSet();
- Iterable<String> take(int n) => readClasses().take(n);
- Iterable<String> takeWhile(bool test(String value)) =>
- readClasses().takeWhile(test);
- Iterable<String> skip(int n) => readClasses().skip(n);
- Iterable<String> skipWhile(bool test(String value)) =>
- readClasses().skipWhile(test);
- String firstWhere(bool test(String value), { String orElse() }) =>
- readClasses().firstWhere(test, orElse: orElse);
- String lastWhere(bool test(String value), {String orElse()}) =>
- readClasses().lastWhere(test, orElse: orElse);
- String singleWhere(bool test(String value)) =>
- readClasses().singleWhere(test);
- String elementAt(int index) => readClasses().elementAt(index);
-
- void clear() {
- _modify((s) => s.clear());
+ void writeClasses(Set<String> s) {
+ var classes = new List.from(s).join(' ');
+ for (Element e in _elementIterable) {
+ e.$dom_className = classes;
+ }
}
- // interface Set - END
/**
* Helper method used to modify the set of css classes on this element.
@@ -194,23 +105,51 @@ abstract class CssClassSet implements Set<String> {
* After f returns, the modified set is written to the
* className property of this element.
*/
- void _modify( f(Set<String> s)) {
- Set<String> s = readClasses();
- f(s);
- writeClasses(s);
+ void modify( f(Set<String> s)) {
+ _elementCssClassSetIterable.forEach((e) => e.modify(f));
}
/**
- * Read the class names from the Element class property,
- * and put them into a set (duplicates are discarded).
- * This is intended to be overridden by specific implementations.
+ * Adds the class [value] to the element if it is not on it, removes it if it
+ * is.
*/
- Set<String> readClasses();
+ bool toggle(String value) =>
+ _modifyWithReturnValue((e) => e.toggle(value));
/**
- * Join all the elements of a set into one string and write
- * back to the element.
- * This is intended to be overridden by specific implementations.
+ * Remove the class [value] from element, and return true on successful
+ * removal.
+ *
+ * This is the Dart equivalent of jQuery's
+ * [removeClass](http://api.jquery.com/removeClass/).
*/
- void writeClasses(Set<String> s);
+ bool remove(Object value) => _modifyWithReturnValue((e) => e.remove(value));
+
+ bool _modifyWithReturnValue(f) => _elementCssClassSetIterable.fold(
+ false, (prevValue, element) => f(element) || prevValue);
+}
+
+class _ElementCssClassSet extends CssClassSetImpl {
+
+ final Element _element;
+
+ _ElementCssClassSet(this._element);
+
+ Set<String> readClasses() {
+ var s = new LinkedHashSet<String>();
+ var classname = _element.$dom_className;
+
+ for (String name in classname.split(' ')) {
+ String trimmed = name.trim();
+ if (!trimmed.isEmpty) {
+ s.add(trimmed);
+ }
+ }
+ return s;
+ }
+
+ void writeClasses(Set<String> s) {
+ List list = new List.from(s);
+ _element.$dom_className = s.join(' ');
+ }
}
« no previous file with comments | « tests/html/element_classes_test.dart ('k') | tools/dom/templates/html/impl/impl_Document.darttemplate » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698