| Index: mojo/public/dart/third_party/html/lib/src/css_class_set.dart
|
| diff --git a/mojo/public/dart/third_party/html/lib/src/css_class_set.dart b/mojo/public/dart/third_party/html/lib/src/css_class_set.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2e131a53810d390f0de777d125d7ac83f6d4c76f
|
| --- /dev/null
|
| +++ b/mojo/public/dart/third_party/html/lib/src/css_class_set.dart
|
| @@ -0,0 +1,330 @@
|
| +// Copyright (c) 2014, 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.
|
| +
|
| +// TODO(jmesserly): everything in this file is copied straight from "dart:html".
|
| +library html.dom.src;
|
| +
|
| +import 'dart:collection';
|
| +import 'package:html/dom.dart';
|
| +
|
| +class ElementCssClassSet extends CssClassSetImpl {
|
| + final Element _element;
|
| +
|
| + ElementCssClassSet(this._element);
|
| +
|
| + Set<String> readClasses() {
|
| + var s = new LinkedHashSet<String>();
|
| + var classname = _element.className;
|
| +
|
| + for (String name in classname.split(' ')) {
|
| + String trimmed = name.trim();
|
| + if (!trimmed.isEmpty) {
|
| + s.add(trimmed);
|
| + }
|
| + }
|
| + return s;
|
| + }
|
| +
|
| + void writeClasses(Set<String> s) {
|
| + _element.className = s.join(' ');
|
| + }
|
| +}
|
| +
|
| +/** A Set that stores the CSS class names for an element. */
|
| +abstract class CssClassSet implements Set<String> {
|
| +
|
| + /**
|
| + * Adds the class [value] to the element if it is not on it, removes it if it
|
| + * is.
|
| + *
|
| + * If [shouldAdd] is true, then we always add that [value] to the element. If
|
| + * [shouldAdd] is false then we always remove [value] from the element.
|
| + */
|
| + bool toggle(String value, [bool shouldAdd]);
|
| +
|
| + /**
|
| + * Returns [:true:] if classes cannot be added or removed from this
|
| + * [:CssClassSet:].
|
| + */
|
| + bool get frozen;
|
| +
|
| + /**
|
| + * 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);
|
| +
|
| + /**
|
| + * Add the class [value] to element.
|
| + *
|
| + * This is the Dart equivalent of jQuery's
|
| + * [addClass](http://api.jquery.com/addClass/).
|
| + *
|
| + * If this corresponds to one element. Returns true if [value] was added to
|
| + * the set, otherwise false.
|
| + *
|
| + * If this corresponds to many elements, null is always returned.
|
| + */
|
| + bool add(String value);
|
| +
|
| + /**
|
| + * 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/).
|
| + */
|
| + bool remove(Object value);
|
| +
|
| + /**
|
| + * Add all classes specified in [iterable] to element.
|
| + *
|
| + * This is the Dart equivalent of jQuery's
|
| + * [addClass](http://api.jquery.com/addClass/).
|
| + */
|
| + void addAll(Iterable<String> iterable);
|
| +
|
| + /**
|
| + * Remove all classes specified in [iterable] from element.
|
| + *
|
| + * This is the Dart equivalent of jQuery's
|
| + * [removeClass](http://api.jquery.com/removeClass/).
|
| + */
|
| + void removeAll(Iterable<String> iterable);
|
| +
|
| + /**
|
| + * Toggles all classes specified in [iterable] on element.
|
| + *
|
| + * Iterate through [iterable]'s items, and add it if it is not on it, or
|
| + * remove it if it is. This is the Dart equivalent of jQuery's
|
| + * [toggleClass](http://api.jquery.com/toggleClass/).
|
| + * If [shouldAdd] is true, then we always add all the classes in [iterable]
|
| + * element. If [shouldAdd] is false then we always remove all the classes in
|
| + * [iterable] from the element.
|
| + */
|
| + void toggleAll(Iterable<String> iterable, [bool shouldAdd]);
|
| +}
|
| +
|
| +abstract class CssClassSetImpl implements CssClassSet {
|
| + String toString() {
|
| + return readClasses().join(' ');
|
| + }
|
| +
|
| + /**
|
| + * Adds the class [value] to the element if it is not on it, removes it if it
|
| + * is.
|
| + *
|
| + * If [shouldAdd] is true, then we always add that [value] to the element. If
|
| + * [shouldAdd] is false then we always remove [value] from the element.
|
| + */
|
| + bool toggle(String value, [bool shouldAdd]) {
|
| + Set<String> s = readClasses();
|
| + bool result = false;
|
| + if (shouldAdd == null) shouldAdd = !s.contains(value);
|
| + if (shouldAdd) {
|
| + s.add(value);
|
| + result = true;
|
| + } else {
|
| + s.remove(value);
|
| + }
|
| + writeClasses(s);
|
| + return result;
|
| + }
|
| +
|
| + /**
|
| + * 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 any(bool f(String element)) => readClasses().any(f);
|
| +
|
| + bool get isEmpty => readClasses().isEmpty;
|
| +
|
| + bool get isNotEmpty => readClasses().isNotEmpty;
|
| +
|
| + 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);
|
| +
|
| + /** Lookup from the Set interface. Not interesting for a String set. */
|
| + String lookup(String value) => contains(value) ? value : null;
|
| +
|
| + /**
|
| + * Add the class [value] to element.
|
| + *
|
| + * This is the Dart equivalent of jQuery's
|
| + * [addClass](http://api.jquery.com/addClass/).
|
| + */
|
| + bool add(String value) {
|
| + // TODO - figure out if we need to do any validation here
|
| + // or if the browser natively does enough.
|
| + return modify((s) => s.add(value));
|
| + }
|
| +
|
| + /**
|
| + * 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/).
|
| + */
|
| + bool remove(Object value) {
|
| + if (value is! String) return false;
|
| + Set<String> s = readClasses();
|
| + bool result = s.remove(value);
|
| + writeClasses(s);
|
| + return result;
|
| + }
|
| +
|
| + /**
|
| + * Add all classes specified in [iterable] to element.
|
| + *
|
| + * 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));
|
| + }
|
| +
|
| + /**
|
| + * Remove all classes specified in [iterable] from element.
|
| + *
|
| + * This is the Dart equivalent of jQuery's
|
| + * [removeClass](http://api.jquery.com/removeClass/).
|
| + */
|
| + void removeAll(Iterable<String> iterable) {
|
| + modify((s) => s.removeAll(iterable));
|
| + }
|
| +
|
| + /**
|
| + * Toggles all classes specified in [iterable] on element.
|
| + *
|
| + * Iterate through [iterable]'s items, and add it if it is not on it, or
|
| + * remove it if it is. This is the Dart equivalent of jQuery's
|
| + * [toggleClass](http://api.jquery.com/toggleClass/).
|
| + * If [shouldAdd] is true, then we always add all the classes in [iterable]
|
| + * element. If [shouldAdd] is false then we always remove all the classes in
|
| + * [iterable] from the element.
|
| + */
|
| + void toggleAll(Iterable<String> iterable, [bool shouldAdd]) {
|
| + iterable.forEach((e) => toggle(e, shouldAdd));
|
| + }
|
| +
|
| + void retainAll(Iterable<String> iterable) {
|
| + modify((s) => s.retainAll(iterable));
|
| + }
|
| +
|
| + void removeWhere(bool test(String name)) {
|
| + modify((s) => s.removeWhere(test));
|
| + }
|
| +
|
| + void retainWhere(bool test(String name)) {
|
| + modify((s) => s.retainWhere(test));
|
| + }
|
| +
|
| + 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);
|
| + dynamic firstWhere(bool test(String value), {Object orElse()}) =>
|
| + readClasses().firstWhere(test, orElse: orElse);
|
| + dynamic lastWhere(bool test(String value), {Object 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());
|
| + }
|
| + // interface Set - END
|
| +
|
| + /**
|
| + * Helper method used to modify the set of css classes on this element.
|
| + *
|
| + * f - callback with:
|
| + * s - a Set of all the css class name currently on this element.
|
| + *
|
| + * After f returns, the modified set is written to the
|
| + * className property of this element.
|
| + */
|
| + modify(f(Set<String> s)) {
|
| + Set<String> s = readClasses();
|
| + var ret = f(s);
|
| + writeClasses(s);
|
| + return ret;
|
| + }
|
| +
|
| + /**
|
| + * 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.
|
| + */
|
| + Set<String> readClasses();
|
| +
|
| + /**
|
| + * 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.
|
| + */
|
| + void writeClasses(Set<String> s);
|
| +}
|
|
|