001package org.gwtbootstrap3.client.ui.gwt; 002 003/* 004 * #%L 005 * GwtBootstrap3 006 * %% 007 * Copyright (C) 2013 - 2014 GwtBootstrap3 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 org.gwtbootstrap3.client.ui.base.HasResponsiveness; 024import org.gwtbootstrap3.client.ui.base.helper.StyleHelper; 025import org.gwtbootstrap3.client.ui.constants.DeviceSize; 026import org.gwtbootstrap3.client.ui.constants.TableType; 027 028import com.google.gwt.core.client.GWT; 029import com.google.gwt.resources.client.ImageResource; 030import com.google.gwt.user.client.ui.Widget; 031import com.google.gwt.view.client.ProvidesKey; 032 033/** 034 * @author Joshua Godi 035 */ 036public class DataGrid<T> extends com.google.gwt.user.cellview.client.DataGrid<T> implements HasResponsiveness { 037 private static final int DEFAULT_PAGESIZE = 50; 038 private static Resources DEFAULT_RESOURCES; 039 040 /** 041 * Constructs a table with a default page size of 50. 042 */ 043 public DataGrid() { 044 this(DEFAULT_PAGESIZE); 045 } 046 047 /** 048 * Constructs a table with the given page size. 049 * 050 * @param pageSize the page size 051 */ 052 public DataGrid(final int pageSize) { 053 this(pageSize, getDefaultResources()); 054 } 055 056 /** 057 * Constructs a table with the given page size and the given 058 * {@link ProvidesKey key provider}. 059 * 060 * @param pageSize the page size 061 * @param keyProvider an instance of ProvidesKey, or null if the record 062 * object should act as its own key 063 */ 064 public DataGrid(final int pageSize, final ProvidesKey<T> keyProvider) { 065 super(pageSize, getDefaultResources(), keyProvider); 066 getTableBodyElement().getParentElement().addClassName(TableType.DEFAULT.getCssName()); 067 } 068 069 /** 070 * Constructs a table with the given page size with the specified 071 * {@link Resources}. 072 * 073 * @param pageSize the page size 074 * @param resources the resources to use for this widget 075 */ 076 public DataGrid(final int pageSize, final DataGrid.Resources resources) { 077 super(pageSize, resources, null); 078 getTableBodyElement().getParentElement().addClassName(TableType.DEFAULT.getCssName()); 079 } 080 081 /** 082 * Constructs a table with the given page size, the specified 083 * {@link Resources}, and the given key provider. 084 * 085 * @param pageSize the page size 086 * @param resources the resources to use for this widget 087 * @param keyProvider an instance of ProvidesKey, or null if the record 088 * object should act as its own key 089 * @param loadingIndicator the widget to use as a loading indicator, or null 090 * to disable 091 */ 092 public DataGrid(final int pageSize, final Resources resources, final ProvidesKey<T> keyProvider, final Widget loadingIndicator) { 093 super(pageSize, resources, keyProvider, loadingIndicator); 094 getTableBodyElement().getParentElement().addClassName(TableType.DEFAULT.getCssName()); 095 } 096 097 /** 098 * Constructs a table with a default page size of 50, and the given 099 * {@link ProvidesKey key provider}. 100 * 101 * @param keyProvider an instance of ProvidesKey, or null if the record 102 * object should act as its own key 103 */ 104 public DataGrid(final ProvidesKey<T> keyProvider) { 105 this(DEFAULT_PAGESIZE, keyProvider); 106 } 107 108 private static DataGrid.Resources getDefaultResources() { 109 if (DEFAULT_RESOURCES == null) { 110 final DataGrid.Resources dataGridResources = GWT.create(Resources.class); 111 DEFAULT_RESOURCES = new ResourcesAdapter(dataGridResources); 112 } 113 return DEFAULT_RESOURCES; 114 } 115 116 @Override 117 public void setVisibleOn(final DeviceSize deviceSize) { 118 StyleHelper.setVisibleOn(this, deviceSize); 119 } 120 121 @Override 122 public void setHiddenOn(final DeviceSize deviceSize) { 123 StyleHelper.setHiddenOn(this, deviceSize); 124 } 125 126 public void setStriped(final boolean striped) { 127 if (striped) { 128 addToDataGrid(TableType.STRIPED); 129 } else { 130 removeFromDataGrid(TableType.STRIPED); 131 } 132 } 133 134 public void setBordered(final boolean bordered) { 135 if (bordered) { 136 addToDataGrid(TableType.BORDERED); 137 } else { 138 removeFromDataGrid(TableType.BORDERED); 139 } 140 } 141 142 public void setCondensed(final boolean condensed) { 143 if (condensed) { 144 addToDataGrid(TableType.CONDENSED); 145 } else { 146 removeFromDataGrid(TableType.CONDENSED); 147 } 148 } 149 150 public void setHover(final boolean hover) { 151 if (hover) { 152 addToDataGrid(TableType.HOVER); 153 } else { 154 removeFromDataGrid(TableType.HOVER); 155 } 156 } 157 158 private void addToDataGrid(final TableType tableType) { 159 getTableHeadElement().getParentElement().addClassName(tableType.getCssName()); 160 getTableBodyElement().getParentElement().addClassName(tableType.getCssName()); 161 getTableFootElement().getParentElement().addClassName(tableType.getCssName()); 162 } 163 164 private void removeFromDataGrid(final TableType tableType) { 165 getTableHeadElement().getParentElement().removeClassName(tableType.getCssName()); 166 getTableBodyElement().getParentElement().removeClassName(tableType.getCssName()); 167 getTableFootElement().getParentElement().removeClassName(tableType.getCssName()); 168 } 169 170 /** 171 * Resources/Styles to remove the GWT styling of the tables! 172 */ 173 private static class ResourcesAdapter implements DataGrid.Resources { 174 private final DataGrid.Resources resources; 175 private final StyleAdapter style; 176 177 public ResourcesAdapter(final DataGrid.Resources resources) { 178 this.resources = resources; 179 this.style = new StyleAdapter(); 180 } 181 182 @Override 183 public ImageResource dataGridLoading() { 184 return resources.dataGridLoading(); 185 } 186 187 @Override 188 public ImageResource dataGridSortAscending() { 189 return resources.dataGridSortAscending(); 190 } 191 192 @Override 193 public ImageResource dataGridSortDescending() { 194 return resources.dataGridSortDescending(); 195 } 196 197 @Override 198 public DataGrid.Style dataGridStyle() { 199 return style; 200 } 201 } 202 203 private static class StyleAdapter implements DataGrid.Style { 204 private static final String B = "gwtb3-"; 205 private static final String DUMMY = B + "d"; 206 207 @Override 208 public boolean ensureInjected() { 209 return true; 210 } 211 212 @Override 213 public String getText() { 214 return B; 215 } 216 217 @Override 218 public String getName() { 219 return B; 220 } 221 222 @Override 223 public String dataGridCell() { 224 return B + "cell"; 225 } 226 227 @Override 228 public String dataGridEvenRow() { 229 return "even"; 230 } 231 232 @Override 233 public String dataGridEvenRowCell() { 234 return DUMMY; 235 } 236 237 @Override 238 public String dataGridFirstColumn() { 239 return DUMMY; // Bootstrap3 uses "smart selectors" 240 } 241 242 @Override 243 public String dataGridFirstColumnFooter() { 244 return DUMMY; 245 } 246 247 @Override 248 public String dataGridFirstColumnHeader() { 249 return DUMMY; 250 } 251 252 @Override 253 public String dataGridFooter() { 254 return DUMMY; 255 } 256 257 @Override 258 public String dataGridHeader() { 259 return DUMMY; 260 } 261 262 @Override 263 public String dataGridHoveredRow() { 264 return "active"; 265 } 266 267 @Override 268 public String dataGridHoveredRowCell() { 269 return "active"; 270 } 271 272 @Override 273 public String dataGridKeyboardSelectedCell() { 274 return DUMMY; 275 } 276 277 @Override 278 public String dataGridKeyboardSelectedRow() { 279 return DUMMY; 280 } 281 282 @Override 283 public String dataGridKeyboardSelectedRowCell() { 284 return DUMMY; 285 } 286 287 @Override 288 public String dataGridLastColumn() { 289 return DUMMY; 290 } 291 292 @Override 293 public String dataGridLastColumnFooter() { 294 return DUMMY; 295 } 296 297 @Override 298 public String dataGridLastColumnHeader() { 299 return DUMMY; 300 } 301 302 @Override 303 public String dataGridOddRow() { 304 return "odd"; 305 } 306 307 @Override 308 public String dataGridOddRowCell() { 309 return DUMMY; 310 } 311 312 @Override 313 public String dataGridSelectedRow() { 314 return "info"; 315 } 316 317 @Override 318 public String dataGridSelectedRowCell() { 319 return DUMMY; 320 } 321 322 @Override 323 public String dataGridSortableHeader() { 324 return DUMMY; 325 } 326 327 @Override 328 public String dataGridSortedHeaderAscending() { 329 return DUMMY; 330 } 331 332 @Override 333 public String dataGridSortedHeaderDescending() { 334 return DUMMY; 335 } 336 337 @Override 338 public String dataGridWidget() { 339 return "table"; 340 } 341 } 342}