001package gwt.material.design.client.ui;
002
003/*
004 * #%L
005 * GwtMaterial
006 * %%
007 * Copyright (C) 2015 GwtMaterialDesign
008 * %%
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 * 
013 *      http://www.apache.org/licenses/LICENSE-2.0
014 * 
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 * #L%
021 */
022
023import gwt.material.design.client.base.MaterialWidget;
024import gwt.material.design.client.base.helper.UiHelper;
025import gwt.material.design.client.constants.HeadingSize;
026import gwt.material.design.client.ui.html.Heading;
027
028import com.google.gwt.dom.client.Document;
029import com.google.gwt.user.client.ui.Widget;
030import gwt.material.design.client.ui.html.ListItem;
031
032//@formatter:off
033/**
034* Collections allow you to group list objects together.
035* 
036*<p>
037*<h3>UiBinder Usage:</h3>
038*<pre>
039*{@code 
040*Simple
041<m:MaterialCollection >
042    <m:MaterialCollectionItem><m:MaterialLabel text="Collecton 1"/></m:MaterialCollectionItem>
043    <m:MaterialCollectionItem><m:MaterialLabel text="Collecton 2"/></m:MaterialCollectionItem>
044    <m:MaterialCollectionItem><m:MaterialLabel text="Collecton 3"/></m:MaterialCollectionItem>
045    <m:MaterialCollectionItem><m:MaterialLabel text="Collecton 4"/></m:MaterialCollectionItem>
046</m:MaterialCollection>
047
048Links
049<m:MaterialCollection >
050    <m:MaterialCollectionItem><m:MaterialLink text="Collecton 1"/></m:MaterialCollectionItem>
051    <m:MaterialCollectionItem><m:MaterialLink text="Collecton 2"/></m:MaterialCollectionItem>
052    <m:MaterialCollectionItem><m:MaterialLink text="Collecton 3"/></m:MaterialCollectionItem>
053    <m:MaterialCollectionItem><m:MaterialLink text="Collecton 4"/></m:MaterialCollectionItem>
054</m:MaterialCollection>
055
056Header
057<m:MaterialCollection header="Header Title">
058    <m:MaterialCollectionItem><m:MaterialLink text="Collecton 1"/></m:MaterialCollectionItem>
059    <m:MaterialCollectionItem><m:MaterialLink text="Collecton 2"/></m:MaterialCollectionItem>
060    <m:MaterialCollectionItem><m:MaterialLink text="Collecton 3"/></m:MaterialCollectionItem>
061    <m:MaterialCollectionItem><m:MaterialLink text="Collecton 4"/></m:MaterialCollectionItem>
062</m:MaterialCollection>
063
064Secondary Content
065<m:MaterialCollection header="Header Title">
066    <m:MaterialCollectionItem>
067        <m:MaterialLink text="Collecton 1"/>
068        <m:MaterialSecondaryContent><m:MaterialIcon iconType="POLYMER" iconPosition="RIGHT" waves="DEFAULT"/></m:MaterialSecondaryContent>
069    </m:MaterialCollectionItem>
070    <m:MaterialCollectionItem>
071        <m:MaterialLink text="Collecton 2"/>
072        <m:MaterialSecondaryContent><m:MaterialIcon iconType="POLYMER" iconPosition="RIGHT" waves="DEFAULT"/></m:MaterialSecondaryContent>
073    </m:MaterialCollectionItem>
074    <m:MaterialCollectionItem>
075        <m:MaterialLink text="Collecton 3"/>
076        <m:MaterialSecondaryContent><m:MaterialIcon iconType="POLYMER" iconPosition="RIGHT" waves="DEFAULT"/></m:MaterialSecondaryContent>
077    </m:MaterialCollectionItem>
078    <m:MaterialCollectionItem>
079        <m:MaterialLink text="Collecton 4"/>
080        <m:MaterialSecondaryContent><m:MaterialIcon iconType="POLYMER" iconPosition="RIGHT" waves="DEFAULT"/></m:MaterialSecondaryContent>
081    </m:MaterialCollectionItem>
082</m:MaterialCollection>
083*}
084*</pre>
085* </p>
086* @author kevzlou7979
087* @author Ben Dol
088* @see <a href="http://gwt-material-demo.herokuapp.com/#collections">Material Collections</a>
089*/
090//@formatter:on
091public class MaterialCollection extends MaterialWidget {
092
093    private Heading span = new Heading(HeadingSize.H4);
094    private int index;
095
096    /**
097     * Creates an empty collection component.
098     */
099    public MaterialCollection() {
100        super(Document.get().createULElement(), "collection");
101    }
102
103    /**
104     * Sets the header of the collection component.
105     */
106    public void setHeader(String header) {
107        span.getElement().setInnerHTML(header);
108        addStyleName("with-header");
109        ListItem item = new ListItem(span);
110        UiHelper.addMousePressedHandlers(item);
111        item.setStyleName("collection-header");
112        insert(item, 0);
113    }
114
115    public void setActive(int index) {
116        this.index = index;
117        Widget activeWidget = getActive();
118        if(activeWidget != null) {
119            activeWidget.removeStyleName("active");
120            activeWidget.addStyleName("active");
121        }
122    }
123
124    public Widget getActive() {
125        try {
126            return getWidget(index);
127        } catch (IndexOutOfBoundsException ex) {
128            return null;
129        }
130    }
131}