| Index: sdk/lib/html/src/CssClassSet.dart
|
| diff --git a/sdk/lib/html/src/CssClassSet.dart b/sdk/lib/html/src/CssClassSet.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0add4f733498d28c65a7a38d6720ef53052fe639
|
| --- /dev/null
|
| +++ b/sdk/lib/html/src/CssClassSet.dart
|
| @@ -0,0 +1,123 @@
|
| +// 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.
|
| +
|
| +abstract class CssClassSet implements Set<String> {
|
| +
|
| + String toString() {
|
| + return Strings.join(new List.from(readClasses()), ' ');
|
| + }
|
| +
|
| + /**
|
| + * Adds the class [token] 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;
|
| + }
|
| +
|
| + /**
|
| + * Returns [:true:] if classes cannot be added or removed from this
|
| + * [:CssClassSet:].
|
| + */
|
| + bool get frozen => false;
|
| +
|
| + // interface Iterable - BEGIN
|
| + Iterator<String> iterator() => readClasses().iterator();
|
| + // interface Iterable - END
|
| +
|
| + // interface Collection - BEGIN
|
| + void forEach(void f(String element)) {
|
| + readClasses().forEach(f);
|
| + }
|
| +
|
| + Collection map(f(String element)) => readClasses().map(f);
|
| +
|
| + Collection<String> filter(bool f(String element)) => readClasses().filter(f);
|
| +
|
| + bool every(bool f(String element)) => readClasses().every(f);
|
| +
|
| + bool some(bool f(String element)) => readClasses().some(f);
|
| +
|
| + bool get isEmpty => readClasses().isEmpty;
|
| +
|
| + int get length =>readClasses().length;
|
| + // interface Collection - END
|
| +
|
| + // interface Set - BEGIN
|
| + bool contains(String value) => readClasses().contains(value);
|
| +
|
| + 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));
|
| + }
|
| +
|
| + bool remove(String value) {
|
| + Set<String> s = readClasses();
|
| + bool result = s.remove(value);
|
| + writeClasses(s);
|
| + return result;
|
| + }
|
| +
|
| + void addAll(Collection<String> collection) {
|
| + // TODO - see comment above about validation
|
| + _modify((s) => s.addAll(collection));
|
| + }
|
| +
|
| + void removeAll(Collection<String> collection) {
|
| + _modify((s) => s.removeAll(collection));
|
| + }
|
| +
|
| + bool isSubsetOf(Collection<String> collection) =>
|
| + readClasses().isSubsetOf(collection);
|
| +
|
| + bool containsAll(Collection<String> collection) =>
|
| + readClasses().containsAll(collection);
|
| +
|
| + Set<String> intersection(Collection<String> other) =>
|
| + readClasses().intersection(other);
|
| +
|
| + 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.
|
| + */
|
| + void _modify( f(Set<String> s)) {
|
| + Set<String> s = readClasses();
|
| + f(s);
|
| + writeClasses(s);
|
| + }
|
| +
|
| + /**
|
| + * 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);
|
| +}
|
|
|