001/*
002 *  Copyright 2012 GWT-Bootstrap
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package com.github.gwtbootstrap.client.ui;
017
018import com.github.gwtbootstrap.client.ui.base.HasStyle;
019import com.github.gwtbootstrap.client.ui.base.IsResponsive;
020import com.github.gwtbootstrap.client.ui.base.ResponsiveHelper;
021import com.github.gwtbootstrap.client.ui.base.StyleHelper;
022import com.github.gwtbootstrap.client.ui.constants.Device;
023import com.google.gwt.core.client.GWT;
024import com.google.gwt.resources.client.CssResource.ImportedWithPrefix;
025import com.google.gwt.resources.client.ImageResource;
026import com.google.gwt.user.client.ui.Image;
027import com.google.gwt.user.client.ui.Widget;
028import com.google.gwt.view.client.ProvidesKey;
029
030/**
031 * 
032 * CellTable for Bootstrap style.
033 * 
034 * @since 2.0.4.0
035 * @author ohashi keisuke
036 * 
037 * @param <T>
038 *            Data Set
039 */
040public class CellTable<T> extends
041        com.google.gwt.user.cellview.client.CellTable<T> implements HasStyle,
042        IsResponsive {
043
044    public static enum TableType implements
045            com.github.gwtbootstrap.client.ui.base.Style {
046        BORDERED("table-bordered"), STRIPED("table-striped"), CONDENSED(
047                "table-condensed");
048
049        private final String styleName;
050
051        private TableType(String styleName) {
052            this.styleName = styleName;
053        }
054
055        @Override
056        public String get() {
057            return styleName;
058        }
059    }
060
061    /**
062     * The default page size.
063     */
064    private static final int DEFAULT_PAGESIZE = 15;
065
066    private static Resources DEFAULT_RESOURCES = null;
067
068    private static Resources getDefaultResources() {
069        if (DEFAULT_RESOURCES == null) {
070            DEFAULT_RESOURCES = GWT.create(Resources.class);
071        }
072        return DEFAULT_RESOURCES;
073    }
074
075    public interface Resources extends
076            com.google.gwt.user.cellview.client.CellTable.Resources {
077
078        @Override
079        @Source(Style.DEFAULT_CSS)
080        public Style cellTableStyle();
081    }
082
083    public interface SelectableResources extends Resources {
084
085        @Override
086        @Source(SelectableStyle.DEFAULT_CSS)
087        public Style cellTableStyle();
088    }
089
090    @ImportedWithPrefix("gwt-bootstrap-cellTable")
091    public interface Style extends
092            com.google.gwt.user.cellview.client.CellTable.Style {
093
094        String DEFAULT_CSS = "com/github/gwtbootstrap/client/ui/GwtBootstrapCellTable.css";
095    }
096
097    @ImportedWithPrefix("gwt-bootstrap-cellTable")
098    public interface SelectableStyle extends
099            com.google.gwt.user.cellview.client.CellTable.Style {
100
101        String DEFAULT_CSS = "com/github/gwtbootstrap/client/ui/GwtBootstrapCellTableSelectable.css";
102    }
103
104    public CellTable() {
105        this(DEFAULT_PAGESIZE);
106    }
107
108    public CellTable(int pageSize, Resources resources,
109            ProvidesKey<T> keyProvider, Widget loadingIndicator) {
110        super(pageSize, resources, keyProvider, loadingIndicator);
111        setStyleName("table");
112    }
113
114    public CellTable(int pageSize,
115            Resources resources,
116            ProvidesKey<T> keyProvider) {
117        this(pageSize, resources, keyProvider, createDefaultLoadingIndicator(getDefaultResources()));
118    }
119
120    public CellTable(int pageSize, Resources resources) {
121        this(pageSize, resources , null);
122    }
123
124    public CellTable(int pageSize, ProvidesKey<T> keyProvider) {
125        this(pageSize, keyProvider, createDefaultLoadingIndicator(getDefaultResources()));
126    }
127
128    public CellTable(int pageSize, ProvidesKey<T> keyProvider, Widget loadingIndicator) {
129        this(pageSize, getDefaultResources(), keyProvider, loadingIndicator);
130    }
131
132    public CellTable(int pageSize) {
133        this(pageSize, getDefaultResources());
134    }
135
136    public CellTable(ProvidesKey<T> keyProvider) {
137        this(DEFAULT_PAGESIZE, keyProvider);
138    }
139
140    public void setStriped(boolean striped) {
141        if (striped) {
142            StyleHelper.addStyle(this, TableType.STRIPED);
143        } else {
144            StyleHelper.removeStyle(this, TableType.STRIPED);
145        }
146    }
147
148    public void setBordered(boolean bordered) {
149        if (bordered) {
150            StyleHelper.addStyle(this, TableType.BORDERED);
151        } else {
152            StyleHelper.removeStyle(this, TableType.BORDERED);
153        }
154    }
155
156    public void setCondensed(boolean condensed) {
157        if (condensed) {
158            StyleHelper.addStyle(this, TableType.CONDENSED);
159        } else {
160            StyleHelper.removeStyle(this, TableType.CONDENSED);
161        }
162    }
163
164    /**
165     * Create the default loading indicator using the loading image in the
166     * specified {@link Resources}.
167     * 
168     * @param resources
169     *            the resources
170     * @return a widget loading indicator
171     */
172    private static Widget createDefaultLoadingIndicator(Resources resources) {
173        ImageResource loadingImg = resources.cellTableLoading();
174        return (loadingImg == null) ? null : new Image(loadingImg);
175    }
176
177    /**
178     * {@inheritDoc}
179     */
180    @Override
181    public void setShowOn(Device device) {
182        ResponsiveHelper.setShowOn(this, device);
183    }
184
185    /**
186     * {@inheritDoc}
187     */
188    @Override
189    public void setHideOn(Device device) {
190        ResponsiveHelper.setHideOn(this, device);
191
192    }
193
194    /**
195     * {@inheritDoc}
196     */
197    @Override
198    public void setStyle(com.github.gwtbootstrap.client.ui.base.Style style) {
199        StyleHelper.setStyle(this, style);
200
201    }
202
203    /**
204     * {@inheritDoc}
205     */
206    @Override
207    public void addStyle(com.github.gwtbootstrap.client.ui.base.Style style) {
208        StyleHelper.addStyle(this, style);
209
210    }
211
212    /**
213     * {@inheritDoc}
214     */
215    @Override
216    public void removeStyle(com.github.gwtbootstrap.client.ui.base.Style style) {
217        StyleHelper.removeStyle(this, style);
218
219    }
220}