| // Copyright (c) 2011, 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. |
| |
| // @dart = 2.9 |
| |
| part of view; |
| |
| /** |
| * A View that is composed of child views. |
| */ |
| class CompositeView extends View { |
| List<View> childViews; |
| |
| // TODO(rnystrom): Allowing this to be public is gross. CompositeView should |
| // encapsulate its markup and provide accessors to do the limited amount of |
| // things that external users need to access this for. |
| Element container; |
| |
| Scroller scroller; |
| Scrollbar _scrollbar; |
| |
| final String _cssName; |
| final bool _scrollable; |
| final bool _vertical; |
| final bool _nestedContainer; |
| final bool _showScrollbar; |
| |
| CompositeView(String this._cssName, |
| [nestedContainer = false, |
| scrollable = false, |
| vertical = false, |
| showScrollbar = false]) |
| : _nestedContainer = nestedContainer, |
| _scrollable = scrollable, |
| _vertical = vertical, |
| _showScrollbar = showScrollbar, |
| childViews = new List<View>() {} |
| |
| Element render() { |
| Element node = new Element.html('<div class="$_cssName"></div>'); |
| |
| if (_nestedContainer) { |
| container = new Element.html('<div class="scroll-container"></div>'); |
| node.nodes.add(container); |
| } else { |
| container = node; |
| } |
| |
| if (_scrollable) { |
| scroller = new Scroller( |
| container, |
| _vertical /* verticalScrollEnabled */, |
| !_vertical /* horizontalScrollEnabled */, |
| true /* momementumEnabled */); |
| if (_showScrollbar) { |
| _scrollbar = new Scrollbar(scroller); |
| } |
| } |
| |
| for (View childView in childViews) { |
| container.nodes.add(childView.node); |
| } |
| |
| return node; |
| } |
| |
| void afterRender(Element node) { |
| if (_scrollbar != null) { |
| _scrollbar.initialize(); |
| } |
| } |
| |
| View addChild(View view) { |
| childViews.add(view); |
| // TODO(rnystrom): Container shouldn't be null. Remove this check. |
| if (container != null) { |
| container.nodes.add(view.node); |
| } |
| childViewAdded(view); |
| return view; |
| } |
| |
| void removeChild(View view) { |
| childViews = childViews.where((e) { |
| return view != e; |
| }).toList(); |
| // TODO(rnystrom): Container shouldn't be null. Remove this check. |
| if (container != null) { |
| view.node.remove(); |
| } |
| } |
| } |