blob: cba90253baa025a4d759f2267a472d938d7c217d [file] [log] [blame]
// Copyright (c) 2015, 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.
part of html;
/**
* 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));
}
Set<String> readClasses() {
var s = new LinkedHashSet<String>();
_elementCssClassSetIterable.forEach(
(_ElementCssClassSet e) => s.addAll(e.readClasses()));
return s;
}
void writeClasses(Set<String> s) {
var classes = s.join(' ');
for (Element e in _elementIterable) {
e.className = classes;
}
}
/**
* 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)) {
_elementCssClassSetIterable.forEach((_ElementCssClassSet e) => e.modify(f));
}
/**
* Adds the class [value] to the element if it is not on it, removes it if it
* is.
*/
bool toggle(String value, [bool shouldAdd]) =>
_elementCssClassSetIterable.fold(false,
(bool changed, _ElementCssClassSet e) =>
e.toggle(value, shouldAdd) || changed);
/**
* 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) => _elementCssClassSetIterable.fold(false,
(bool changed, _ElementCssClassSet e) => e.remove(value) || changed);
}
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(' ');
}
}