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     */
016    package com.github.gwtbootstrap.client.ui;
017    
018    import com.github.gwtbootstrap.client.ui.CellTable.TableType;
019    import com.github.gwtbootstrap.client.ui.base.HasStyle;
020    import com.github.gwtbootstrap.client.ui.base.IsResponsive;
021    import com.github.gwtbootstrap.client.ui.base.ResponsiveHelper;
022    import com.github.gwtbootstrap.client.ui.base.StyleHelper;
023    import com.github.gwtbootstrap.client.ui.constants.Device;
024    import com.google.gwt.core.client.GWT;
025    import com.google.gwt.dom.client.Style.Unit;
026    import com.google.gwt.resources.client.CssResource.ImportedWithPrefix;
027    import com.google.gwt.resources.client.ImageResource;
028    import com.google.gwt.user.client.ui.Image;
029    import com.google.gwt.user.client.ui.Widget;
030    import com.google.gwt.view.client.ProvidesKey;
031    
032    /**
033     * The Bootstrap style DataGrid
034     * @since 2.0.4.0
035     * @author ohashi keisuke
036     * @param <T>  the data type of each row
037     */
038    public class DataGrid<T> extends
039            com.google.gwt.user.cellview.client.DataGrid<T> implements HasStyle, IsResponsive {
040        
041        
042        /**
043         * Basic GWT-Bootstrap style Table Resource.
044         * @author ohashi keisuke
045         */
046        public interface Resources extends com.google.gwt.user.cellview.client.DataGrid.Resources {
047    
048            @Override
049            @Source(Style.DEFAULT_CSS)
050            Style dataGridStyle();
051        }
052        
053        /**
054         * Selectable GWT-Bootstrap style Table Resource.
055         * <p>
056         * If select row,apply style.
057         * It focus to Basic TwBootstrap style.
058         * If you use custom style,you should override {@ Resources} like this.
059         * </p>
060         * @author ohashi keisuke
061         *
062         */
063        public interface SelectableResources extends Resources {
064            
065            @Override
066            @Source(SelectableStyle.DEFAULT_CSS)
067            Style dataGridStyle();
068        }
069        
070        @ImportedWithPrefix("gwt-bootstrap-dataGrid")
071        public interface Style extends com.google.gwt.user.cellview.client.DataGrid.Style {
072    
073            String DEFAULT_CSS = "com/github/gwtbootstrap/client/ui/GwtBootstrapDataGrid.css";
074        }
075        
076        @ImportedWithPrefix("gwt-bootstrap-dataGrid")
077        public interface SelectableStyle extends com.google.gwt.user.cellview.client.DataGrid.Style {
078    
079            String DEFAULT_CSS = "com/github/gwtbootstrap/client/ui/GwtBootstrapDataGridSelectable.css";
080        }
081        
082        private static final int DEFAULT_PAGESIZE = 50;
083        private static Resources DEFAULT_RESOURCES;
084    
085        /**
086         * Create the default loading indicator using the loading image in the
087         * specified {@link Resources}.
088         * 
089         * @param resources the resources containing the loading image
090         * @return a widget loading indicator
091         */
092        private static Widget createDefaultLoadingIndicator(Resources resources) {
093          ImageResource loadingImg = resources.dataGridLoading();
094          if (loadingImg == null) {
095            return null;
096          }
097          Image image = new Image(loadingImg);
098          image.getElement().getStyle().setMarginTop(30.0, Unit.PX);
099          return image;
100        }
101        private static Resources getDefaultResources() {
102            if (DEFAULT_RESOURCES == null) {
103              DEFAULT_RESOURCES = GWT.create(Resources.class);
104            }
105            return DEFAULT_RESOURCES;
106          }
107        /**
108         * Constructs a table with a default page size of 50.
109         */
110        public DataGrid() {
111          this(DEFAULT_PAGESIZE);
112        }
113    
114        /**
115         * Constructs a table with the given page size.
116         * 
117         * @param pageSize the page size
118         */
119        public DataGrid(final int pageSize) {
120          this(pageSize, getDefaultResources());
121        }
122    
123        /**
124         * Constructs a table with the given page size and the given
125         * {@link ProvidesKey key provider}.
126         * 
127         * @param pageSize the page size
128         * @param keyProvider an instance of ProvidesKey<T>, or null if the record
129         *          object should act as its own key
130         */
131        public DataGrid(int pageSize, ProvidesKey<T> keyProvider) {
132          this(pageSize, getDefaultResources(), keyProvider);
133        }
134    
135        /**
136         * Constructs a table with the given page size with the specified
137         * {@link Resources}.
138         * 
139         * @param pageSize the page size
140         * @param resources the resources to use for this widget
141         */
142        public DataGrid(int pageSize, Resources resources) {
143          this(pageSize, resources, null);
144        }
145    
146        /**
147         * Constructs a table with the given page size, the specified
148         * {@link Resources}, and the given key provider.
149         * 
150         * @param pageSize the page size
151         * @param resources the resources to use for this widget
152         * @param keyProvider an instance of ProvidesKey<T>, or null if the record
153         *          object should act as its own key
154         */
155        public DataGrid(int pageSize, Resources resources, ProvidesKey<T> keyProvider) {
156          this(pageSize, resources, keyProvider, createDefaultLoadingIndicator(resources));
157        }
158    
159        /**
160         * Constructs a table with the given page size, the specified
161         * {@link Resources}, and the given key provider.
162         * 
163         * @param pageSize the page size
164         * @param resources the resources to use for this widget
165         * @param keyProvider an instance of ProvidesKey<T>, or null if the record
166         *          object should act as its own key
167         * @param loadingIndicator the widget to use as a loading indicator, or null
168         *          to disable
169         */
170        public DataGrid(int pageSize, Resources resources, ProvidesKey<T> keyProvider,
171            Widget loadingIndicator) {
172            super(pageSize, resources, keyProvider, loadingIndicator);
173        }
174        
175        /**
176         * set Striped style
177         * @param striped true:set false:remove
178         */
179        public void setStriped(boolean striped) {
180            applyTableStyle(striped, TableType.STRIPED);
181        }
182        
183        /**
184         * set Bordered style
185         * @param bordered true:set false:remove
186         */
187        public void setBordered(boolean bordered) {
188            applyTableStyle(bordered, TableType.BORDERED);
189        }
190    
191        /**
192         * set Condensed style
193         * @param condensed true:set false:remove
194         */
195        public void setCondensed(boolean condensed) {
196            applyTableStyle(condensed, TableType.CONDENSED);
197        }
198    
199        private void applyTableStyle(boolean striped, TableType type) {
200            if(striped) {
201                getTableHeadElement().getParentElement().addClassName(type.get());
202                getTableBodyElement().getParentElement().addClassName(type.get());
203                getTableFootElement().getParentElement().addClassName(type.get());
204            } else {
205                getTableHeadElement().getParentElement().removeClassName(type.get());
206                getTableBodyElement().getParentElement().removeClassName(type.get());
207                getTableFootElement().getParentElement().removeClassName(type.get());
208            }
209        }
210        
211        /**
212         * {@inheritDoc}
213         */
214        @Override
215        public void setShowOn(Device device) {
216            ResponsiveHelper.setShowOn(this, device);
217        }
218    
219        /**
220         * {@inheritDoc}
221         */
222        @Override
223        public void setHideOn(Device device) {
224            ResponsiveHelper.setHideOn(this, device);
225            
226        }
227    
228        /**
229         * {@inheritDoc}
230         */
231        @Override
232        public void setStyle(com.github.gwtbootstrap.client.ui.base.Style style) {
233            StyleHelper.setStyle(this, style);
234            
235        }
236    
237        /**
238         * {@inheritDoc}
239         */
240        @Override
241        public void addStyle(com.github.gwtbootstrap.client.ui.base.Style style) {
242            StyleHelper.addStyle(this, style);
243            
244        }
245    
246        /**
247         * {@inheritDoc}
248         */
249        @Override
250        public void removeStyle(com.github.gwtbootstrap.client.ui.base.Style style) {
251            StyleHelper.removeStyle(this, style);
252            
253        }
254    }