You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GridBasicFeatures.java 69KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685
  1. /*
  2. * Copyright 2000-2014 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.tests.components.grid.basicfeatures;
  17. import java.text.DecimalFormat;
  18. import java.text.DecimalFormatSymbols;
  19. import java.text.SimpleDateFormat;
  20. import java.util.ArrayList;
  21. import java.util.Date;
  22. import java.util.HashMap;
  23. import java.util.Iterator;
  24. import java.util.LinkedHashMap;
  25. import java.util.List;
  26. import java.util.Locale;
  27. import java.util.Map;
  28. import java.util.Random;
  29. import com.vaadin.data.Container.Filter;
  30. import com.vaadin.data.Item;
  31. import com.vaadin.data.Property;
  32. import com.vaadin.data.Property.ValueChangeEvent;
  33. import com.vaadin.data.Property.ValueChangeListener;
  34. import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
  35. import com.vaadin.data.sort.Sort;
  36. import com.vaadin.data.sort.SortOrder;
  37. import com.vaadin.data.util.IndexedContainer;
  38. import com.vaadin.event.ItemClickEvent;
  39. import com.vaadin.event.ItemClickEvent.ItemClickListener;
  40. import com.vaadin.event.SelectionEvent;
  41. import com.vaadin.event.SelectionEvent.SelectionListener;
  42. import com.vaadin.event.SortEvent;
  43. import com.vaadin.event.SortEvent.SortListener;
  44. import com.vaadin.shared.data.sort.SortDirection;
  45. import com.vaadin.shared.ui.grid.ColumnResizeMode;
  46. import com.vaadin.shared.ui.grid.GridStaticCellType;
  47. import com.vaadin.shared.ui.grid.HeightMode;
  48. import com.vaadin.shared.ui.label.ContentMode;
  49. import com.vaadin.tests.components.AbstractComponentTest;
  50. import com.vaadin.ui.Button;
  51. import com.vaadin.ui.Button.ClickEvent;
  52. import com.vaadin.ui.Button.ClickListener;
  53. import com.vaadin.ui.Component;
  54. import com.vaadin.ui.CssLayout;
  55. import com.vaadin.ui.Field;
  56. import com.vaadin.ui.Grid;
  57. import com.vaadin.ui.Grid.CellDescriptionGenerator;
  58. import com.vaadin.ui.Grid.CellReference;
  59. import com.vaadin.ui.Grid.CellStyleGenerator;
  60. import com.vaadin.ui.Grid.Column;
  61. import com.vaadin.ui.Grid.ColumnReorderEvent;
  62. import com.vaadin.ui.Grid.ColumnReorderListener;
  63. import com.vaadin.ui.Grid.ColumnResizeEvent;
  64. import com.vaadin.ui.Grid.ColumnResizeListener;
  65. import com.vaadin.ui.Grid.ColumnVisibilityChangeEvent;
  66. import com.vaadin.ui.Grid.ColumnVisibilityChangeListener;
  67. import com.vaadin.ui.Grid.DetailsGenerator;
  68. import com.vaadin.ui.Grid.FooterCell;
  69. import com.vaadin.ui.Grid.HeaderCell;
  70. import com.vaadin.ui.Grid.HeaderRow;
  71. import com.vaadin.ui.Grid.MultiSelectionModel;
  72. import com.vaadin.ui.Grid.RowDescriptionGenerator;
  73. import com.vaadin.ui.Grid.RowReference;
  74. import com.vaadin.ui.Grid.RowStyleGenerator;
  75. import com.vaadin.ui.Grid.SelectionMode;
  76. import com.vaadin.ui.Grid.SelectionModel;
  77. import com.vaadin.ui.Grid.SelectionModel.HasUserSelectionAllowed;
  78. import com.vaadin.ui.Label;
  79. import com.vaadin.ui.Notification;
  80. import com.vaadin.ui.Panel;
  81. import com.vaadin.ui.renderers.DateRenderer;
  82. import com.vaadin.ui.renderers.HtmlRenderer;
  83. import com.vaadin.ui.renderers.NumberRenderer;
  84. /**
  85. * Tests the basic features like columns, footers and headers
  86. *
  87. * @since
  88. * @author Vaadin Ltd
  89. */
  90. public class GridBasicFeatures extends AbstractComponentTest<Grid> {
  91. public static final String ROW_STYLE_GENERATOR_ROW_NUMBERS_FOR_3_OF_4 = "Row numbers for 3/4";
  92. public static final String ROW_STYLE_GENERATOR_NONE = "None";
  93. public static final String ROW_STYLE_GENERATOR_ROW_NUMBERS = "Row numbers";
  94. public static final String ROW_STYLE_GENERATOR_EMPTY = "Empty string";
  95. public static final String ROW_STYLE_GENERATOR_NULL = "Null";
  96. public static final String CELL_STYLE_GENERATOR_NONE = "None";
  97. public static final String CELL_STYLE_GENERATOR_PROPERTY_TO_STRING = "Property to string";
  98. public static final String CELL_STYLE_GENERATOR_SPECIAL = "Special for 1/4 Column 1";
  99. public static final String CELL_STYLE_GENERATOR_EMPTY = "Empty string";
  100. public static final String CELL_STYLE_GENERATOR_NULL = "Null";
  101. private static final int MANUALLY_FORMATTED_COLUMNS = 5;
  102. public static final int COLUMNS = 12;
  103. public static final int EDITABLE_COLUMNS = COLUMNS - 1;
  104. public static final int ROWS = 1000;
  105. private int containerDelay = 0;
  106. private boolean singleSelectAllowDeselect = true;
  107. private boolean allowUserSelection = true;
  108. private IndexedContainer ds;
  109. private Grid grid;
  110. private SelectionListener selectionListener = new SelectionListener() {
  111. @Override
  112. public void select(SelectionEvent event) {
  113. Iterator<Object> iter = event.getAdded().iterator();
  114. Object addedRow = (iter.hasNext() ? iter.next() : "none");
  115. iter = event.getRemoved().iterator();
  116. Object removedRow = (iter.hasNext() ? iter.next() : "none");
  117. log("SelectionEvent: Added " + addedRow + ", Removed "
  118. + removedRow);
  119. }
  120. };
  121. private ItemClickListener itemClickListener = new ItemClickListener() {
  122. @Override
  123. public void itemClick(ItemClickEvent event) {
  124. log("Item " + (event.isDoubleClick() ? "double " : "") + "click on "
  125. + event.getPropertyId() + ", item " + event.getItemId());
  126. }
  127. };
  128. private RowDescriptionGenerator rowDescriptionGenerator = new RowDescriptionGenerator() {
  129. @Override
  130. public String getDescription(RowReference row) {
  131. return "<b>Row</b> tooltip\n for row " + row.getItemId();
  132. }
  133. };
  134. private CellDescriptionGenerator cellDescriptionGenerator = new CellDescriptionGenerator() {
  135. @Override
  136. public String getDescription(CellReference cell) {
  137. if ("Column 0".equals(cell.getPropertyId())) {
  138. return "<b>Cell</b> tooltip\n for row " + cell.getItemId()
  139. + ", column 0";
  140. } else {
  141. return null;
  142. }
  143. }
  144. };
  145. private ItemClickListener editorOpeningItemClickListener = new ItemClickListener() {
  146. @Override
  147. public void itemClick(ItemClickEvent event) {
  148. grid.editItem(event.getItemId());
  149. }
  150. };
  151. private ValueChangeListener reactiveValueChanger = new ValueChangeListener() {
  152. @Override
  153. @SuppressWarnings("unchecked")
  154. public void valueChange(ValueChangeEvent event) {
  155. Object id = grid.getEditedItemId();
  156. grid.getContainerDataSource().getContainerProperty(id, "Column 2")
  157. .setValue("Modified");
  158. }
  159. };
  160. private ColumnReorderListener columnReorderListener = new ColumnReorderListener() {
  161. @Override
  162. public void columnReorder(ColumnReorderEvent event) {
  163. log("Columns reordered, userOriginated: "
  164. + event.isUserOriginated());
  165. }
  166. };
  167. private ColumnVisibilityChangeListener columnVisibilityListener = new ColumnVisibilityChangeListener() {
  168. @Override
  169. public void columnVisibilityChanged(ColumnVisibilityChangeEvent event) {
  170. log("Visibility changed: "//
  171. + "propertyId: " + event.getColumn().getPropertyId() //
  172. + ", isHidden: " + event.getColumn().isHidden() //
  173. + ", userOriginated: " + event.isUserOriginated());
  174. }
  175. };
  176. private final DetailsGenerator detailedDetailsGenerator = new DetailsGenerator() {
  177. @Override
  178. public Component getDetails(final RowReference rowReference) {
  179. CssLayout cssLayout = new CssLayout();
  180. cssLayout.setHeight("200px");
  181. cssLayout.setWidth("100%");
  182. Item item = rowReference.getItem();
  183. for (Object propertyId : item.getItemPropertyIds()) {
  184. Property<?> prop = item.getItemProperty(propertyId);
  185. String string = prop.getValue().toString();
  186. cssLayout.addComponent(new Label(string));
  187. }
  188. final int rowIndex = grid.getContainerDataSource()
  189. .indexOfId(rowReference.getItemId());
  190. ClickListener clickListener = new ClickListener() {
  191. @Override
  192. public void buttonClick(ClickEvent event) {
  193. Notification.show("You clicked on the "
  194. + "button in the details for " + "row " + rowIndex);
  195. }
  196. };
  197. cssLayout.addComponent(new Button("Press me", clickListener));
  198. return cssLayout;
  199. }
  200. };
  201. private final DetailsGenerator watchingDetailsGenerator = new DetailsGenerator() {
  202. private int id = 0;
  203. @Override
  204. public Component getDetails(RowReference rowReference) {
  205. return new Label("You are watching item id "
  206. + rowReference.getItemId() + " (" + (id++) + ")");
  207. }
  208. };
  209. private Map<Object, Panel> detailsMap = new HashMap<Object, Panel>();
  210. private final DetailsGenerator persistingDetailsGenerator = new DetailsGenerator() {
  211. @Override
  212. public Component getDetails(RowReference rowReference) {
  213. Object itemId = rowReference.getItemId();
  214. if (!detailsMap.containsKey(itemId)) {
  215. Panel panel = new Panel();
  216. panel.setContent(new Label("One"));
  217. detailsMap.put(itemId, panel);
  218. }
  219. return detailsMap.get(itemId);
  220. }
  221. };
  222. @Override
  223. @SuppressWarnings("unchecked")
  224. protected Grid constructComponent() {
  225. // Build data source
  226. ds = new IndexedContainer() {
  227. @Override
  228. public List<Object> getItemIds(int startIndex, int numberOfIds) {
  229. log("Requested items " + startIndex + " - "
  230. + (startIndex + numberOfIds));
  231. if (containerDelay > 0) {
  232. try {
  233. Thread.sleep(containerDelay);
  234. } catch (InterruptedException e) {
  235. e.printStackTrace();
  236. }
  237. }
  238. return super.getItemIds(startIndex, numberOfIds);
  239. }
  240. };
  241. {
  242. int col = 0;
  243. for (; col < COLUMNS - MANUALLY_FORMATTED_COLUMNS; col++) {
  244. ds.addContainerProperty(getColumnProperty(col), String.class,
  245. "");
  246. }
  247. ds.addContainerProperty(getColumnProperty(col++), Integer.class,
  248. Integer.valueOf(0));
  249. ds.addContainerProperty(getColumnProperty(col++), Date.class,
  250. new Date());
  251. ds.addContainerProperty(getColumnProperty(col++), String.class, "");
  252. // Random numbers
  253. ds.addContainerProperty(getColumnProperty(col++), Integer.class, 0);
  254. ds.addContainerProperty(getColumnProperty(col++), Integer.class, 0);
  255. }
  256. {
  257. Random rand = new Random();
  258. rand.setSeed(13334);
  259. long timestamp = 0;
  260. for (int row = 0; row < ROWS; row++) {
  261. Item item = ds.addItem(Integer.valueOf(row));
  262. int col = 0;
  263. for (; col < COLUMNS - MANUALLY_FORMATTED_COLUMNS; col++) {
  264. item.getItemProperty(getColumnProperty(col))
  265. .setValue("(" + row + ", " + col + ")");
  266. }
  267. item.getItemProperty(getColumnProperty(1)).setReadOnly(true);
  268. item.getItemProperty(getColumnProperty(col++))
  269. .setValue(Integer.valueOf(row));
  270. item.getItemProperty(getColumnProperty(col++))
  271. .setValue(new Date(timestamp));
  272. timestamp += 91250000; // a bit over a day, just to get
  273. // variation
  274. item.getItemProperty(getColumnProperty(col++))
  275. .setValue("<b>" + row + "</b>");
  276. // Random numbers
  277. item.getItemProperty(getColumnProperty(col++))
  278. .setValue(rand.nextInt());
  279. // Random between 0 - 5 to test multisorting
  280. item.getItemProperty(getColumnProperty(col++))
  281. .setValue(rand.nextInt(5));
  282. }
  283. }
  284. // Create grid
  285. Grid grid = new Grid(ds);
  286. {
  287. int col = grid.getContainerDataSource().getContainerPropertyIds()
  288. .size() - MANUALLY_FORMATTED_COLUMNS;
  289. grid.getColumn(getColumnProperty(col++))
  290. .setRenderer(new NumberRenderer(
  291. new DecimalFormat("0,000.00", DecimalFormatSymbols
  292. .getInstance(new Locale("fi", "FI")))));
  293. grid.getColumn(getColumnProperty(col++)).setRenderer(
  294. new DateRenderer(new SimpleDateFormat("dd.MM.yy HH:mm")));
  295. grid.getColumn(getColumnProperty(col++))
  296. .setRenderer(new HtmlRenderer());
  297. grid.getColumn(getColumnProperty(col++))
  298. .setRenderer(new NumberRenderer());
  299. grid.getColumn(getColumnProperty(col++))
  300. .setRenderer(new NumberRenderer());
  301. }
  302. // Create footer
  303. grid.appendFooterRow();
  304. grid.setFooterVisible(false);
  305. // Add footer values (header values are automatically created)
  306. for (int col = 0; col < COLUMNS; col++) {
  307. grid.getFooterRow(0).getCell(getColumnProperty(col))
  308. .setText("Footer " + col);
  309. }
  310. // Set varying column widths
  311. for (int col = 0; col < COLUMNS; col++) {
  312. Column column = grid.getColumn(getColumnProperty(col));
  313. column.setWidth(100 + col * 50);
  314. column.setHidable(isColumnHidableByDefault(col));
  315. }
  316. grid.addSortListener(new SortListener() {
  317. @Override
  318. public void sort(SortEvent event) {
  319. log("SortEvent: isUserOriginated? " + event.isUserOriginated());
  320. }
  321. });
  322. grid.addColumnResizeListener(new ColumnResizeListener() {
  323. @Override
  324. public void columnResize(ColumnResizeEvent event) {
  325. log("ColumnResizeEvent: isUserOriginated? "
  326. + event.isUserOriginated());
  327. }
  328. });
  329. grid.setSelectionMode(SelectionMode.NONE);
  330. grid.getColumn(getColumnProperty(2)).getEditorField().setReadOnly(true);
  331. grid.getColumn(getColumnProperty(3)).setEditable(false);
  332. createGridActions();
  333. createColumnActions();
  334. createPropertyActions();
  335. createHeaderActions();
  336. createFooterActions();
  337. createRowActions();
  338. createEditorActions();
  339. addHeightActions();
  340. addFilterActions();
  341. addInternalActions();
  342. createDetailsActions();
  343. this.grid = grid;
  344. return grid;
  345. }
  346. protected boolean isColumnHidableByDefault(int col) {
  347. return false;
  348. }
  349. protected boolean isColumnHiddenByDefault(int col) {
  350. return false;
  351. }
  352. private void addInternalActions() {
  353. createClickAction("Update column order without updating client",
  354. "Internals", new Command<Grid, Void>() {
  355. @Override
  356. public void execute(Grid grid, Void value, Object data) {
  357. List<Column> columns = grid.getColumns();
  358. grid.setColumnOrder(columns.get(1).getPropertyId(),
  359. columns.get(0).getPropertyId());
  360. grid.getUI().getConnectorTracker().markClean(grid);
  361. }
  362. }, null);
  363. }
  364. private void addFilterActions() {
  365. createBooleanAction("Column 1 starts with \"(23\"", "Filter", false,
  366. new Command<Grid, Boolean>() {
  367. Filter filter = new Filter() {
  368. @Override
  369. public boolean passesFilter(Object itemId, Item item) {
  370. return item.getItemProperty("Column 1").getValue()
  371. .toString().startsWith("(23");
  372. }
  373. @Override
  374. public boolean appliesToProperty(Object propertyId) {
  375. return propertyId.equals("Column 1");
  376. }
  377. };
  378. @Override
  379. public void execute(Grid grid, Boolean value, Object data) {
  380. if (value) {
  381. ds.addContainerFilter(filter);
  382. } else {
  383. ds.removeContainerFilter(filter);
  384. }
  385. }
  386. });
  387. createBooleanAction("Impassable filter", "Filter", false,
  388. new Command<Grid, Boolean>() {
  389. Filter filter = new Filter() {
  390. @Override
  391. public boolean passesFilter(Object itemId, Item item) {
  392. return false;
  393. }
  394. @Override
  395. public boolean appliesToProperty(Object propertyId) {
  396. return true;
  397. }
  398. };
  399. @Override
  400. public void execute(Grid c, Boolean value, Object data) {
  401. if (value) {
  402. ds.addContainerFilter(filter);
  403. } else {
  404. ds.removeContainerFilter(filter);
  405. }
  406. }
  407. });
  408. }
  409. protected void createGridActions() {
  410. LinkedHashMap<String, String> primaryStyleNames = new LinkedHashMap<String, String>();
  411. primaryStyleNames.put("v-grid", "v-grid");
  412. primaryStyleNames.put("v-escalator", "v-escalator");
  413. primaryStyleNames.put("my-grid", "my-grid");
  414. createMultiClickAction("Primary style name", "State", primaryStyleNames,
  415. new Command<Grid, String>() {
  416. @Override
  417. public void execute(Grid grid, String value, Object data) {
  418. grid.setPrimaryStyleName(value);
  419. }
  420. }, primaryStyleNames.get("v-grid"));
  421. LinkedHashMap<String, SelectionMode> selectionModes = new LinkedHashMap<String, Grid.SelectionMode>();
  422. selectionModes.put("single", SelectionMode.SINGLE);
  423. selectionModes.put("multi", SelectionMode.MULTI);
  424. selectionModes.put("none", SelectionMode.NONE);
  425. createSelectAction("Selection mode", "State", selectionModes, "none",
  426. new Command<Grid, Grid.SelectionMode>() {
  427. @Override
  428. public void execute(Grid grid, SelectionMode selectionMode,
  429. Object data) {
  430. grid.setSelectionMode(selectionMode);
  431. if (selectionMode == SelectionMode.SINGLE) {
  432. grid.addSelectionListener(selectionListener);
  433. ((SelectionModel.Single) grid.getSelectionModel())
  434. .setDeselectAllowed(
  435. singleSelectAllowDeselect);
  436. } else {
  437. grid.removeSelectionListener(selectionListener);
  438. }
  439. ((HasUserSelectionAllowed) grid.getSelectionModel())
  440. .setUserSelectionAllowed(allowUserSelection);
  441. }
  442. });
  443. LinkedHashMap<String, Integer> selectionLimits = new LinkedHashMap<String, Integer>();
  444. selectionLimits.put("2", Integer.valueOf(2));
  445. selectionLimits.put("1000", Integer.valueOf(1000));
  446. selectionLimits.put("Integer.MAX_VALUE",
  447. Integer.valueOf(Integer.MAX_VALUE));
  448. createSelectAction("Selection limit", "State", selectionLimits, "1000",
  449. new Command<Grid, Integer>() {
  450. @Override
  451. public void execute(Grid grid, Integer limit, Object data) {
  452. if (!(grid
  453. .getSelectionModel() instanceof MultiSelectionModel)) {
  454. grid.setSelectionMode(SelectionMode.MULTI);
  455. }
  456. ((MultiSelectionModel) grid.getSelectionModel())
  457. .setSelectionLimit(limit.intValue());
  458. }
  459. });
  460. LinkedHashMap<String, List<SortOrder>> sortableProperties = new LinkedHashMap<String, List<SortOrder>>();
  461. for (Object propertyId : ds.getSortableContainerPropertyIds()) {
  462. sortableProperties.put(propertyId + ", ASC",
  463. Sort.by(propertyId).build());
  464. sortableProperties.put(propertyId + ", DESC",
  465. Sort.by(propertyId, SortDirection.DESCENDING).build());
  466. }
  467. createSelectAction("Sort by column", "State", sortableProperties,
  468. "Column 9, ascending", new Command<Grid, List<SortOrder>>() {
  469. @Override
  470. public void execute(Grid grid, List<SortOrder> sortOrder,
  471. Object data) {
  472. grid.setSortOrder(sortOrder);
  473. }
  474. });
  475. createBooleanAction("Reverse Grid Columns", "State", false,
  476. new Command<Grid, Boolean>() {
  477. @Override
  478. public void execute(Grid c, Boolean value, Object data) {
  479. List<Object> ids = new ArrayList<Object>();
  480. ids.addAll(ds.getContainerPropertyIds());
  481. if (!value) {
  482. c.setColumnOrder(ids.toArray());
  483. } else {
  484. Object[] idsArray = new Object[ids.size()];
  485. for (int i = 0; i < ids.size(); ++i) {
  486. idsArray[i] = ids.get((ids.size() - 1) - i);
  487. }
  488. c.setColumnOrder(idsArray);
  489. }
  490. }
  491. });
  492. LinkedHashMap<String, CellStyleGenerator> cellStyleGenerators = new LinkedHashMap<String, CellStyleGenerator>();
  493. LinkedHashMap<String, RowStyleGenerator> rowStyleGenerators = new LinkedHashMap<String, RowStyleGenerator>();
  494. rowStyleGenerators.put(ROW_STYLE_GENERATOR_NONE, null);
  495. rowStyleGenerators.put(ROW_STYLE_GENERATOR_ROW_NUMBERS,
  496. new RowStyleGenerator() {
  497. @Override
  498. public String getStyle(RowReference rowReference) {
  499. return "row" + rowReference.getItemId();
  500. }
  501. });
  502. rowStyleGenerators.put(ROW_STYLE_GENERATOR_ROW_NUMBERS_FOR_3_OF_4,
  503. new RowStyleGenerator() {
  504. @Override
  505. public String getStyle(RowReference rowReference) {
  506. int rowIndex = ((Integer) rowReference.getItemId())
  507. .intValue();
  508. if (rowIndex % 4 == 0) {
  509. return null;
  510. } else {
  511. return "row" + rowReference.getItemId();
  512. }
  513. }
  514. });
  515. rowStyleGenerators.put(ROW_STYLE_GENERATOR_EMPTY,
  516. new RowStyleGenerator() {
  517. @Override
  518. public String getStyle(RowReference rowReference) {
  519. return "";
  520. }
  521. });
  522. rowStyleGenerators.put(ROW_STYLE_GENERATOR_NULL,
  523. new RowStyleGenerator() {
  524. @Override
  525. public String getStyle(RowReference rowReference) {
  526. return null;
  527. }
  528. });
  529. cellStyleGenerators.put(CELL_STYLE_GENERATOR_NONE, null);
  530. cellStyleGenerators.put(CELL_STYLE_GENERATOR_PROPERTY_TO_STRING,
  531. new CellStyleGenerator() {
  532. @Override
  533. public String getStyle(CellReference cellReference) {
  534. return cellReference.getPropertyId().toString()
  535. .replace(' ', '-');
  536. }
  537. });
  538. cellStyleGenerators.put(CELL_STYLE_GENERATOR_SPECIAL,
  539. new CellStyleGenerator() {
  540. @Override
  541. public String getStyle(CellReference cellReference) {
  542. int rowIndex = ((Integer) cellReference.getItemId())
  543. .intValue();
  544. Object propertyId = cellReference.getPropertyId();
  545. if (rowIndex % 4 == 1) {
  546. return null;
  547. } else if (rowIndex % 4 == 3
  548. && "Column 1".equals(propertyId)) {
  549. return null;
  550. }
  551. return propertyId.toString().replace(' ', '_');
  552. }
  553. });
  554. cellStyleGenerators.put(CELL_STYLE_GENERATOR_EMPTY,
  555. new CellStyleGenerator() {
  556. @Override
  557. public String getStyle(CellReference cellReference) {
  558. return "";
  559. }
  560. });
  561. cellStyleGenerators.put(CELL_STYLE_GENERATOR_NULL,
  562. new CellStyleGenerator() {
  563. @Override
  564. public String getStyle(CellReference cellReference) {
  565. return null;
  566. }
  567. });
  568. createSelectAction("Row style generator", "State", rowStyleGenerators,
  569. CELL_STYLE_GENERATOR_NONE,
  570. new Command<Grid, RowStyleGenerator>() {
  571. @Override
  572. public void execute(Grid grid, RowStyleGenerator generator,
  573. Object data) {
  574. grid.setRowStyleGenerator(generator);
  575. }
  576. });
  577. createSelectAction("Cell style generator", "State", cellStyleGenerators,
  578. CELL_STYLE_GENERATOR_NONE,
  579. new Command<Grid, CellStyleGenerator>() {
  580. @Override
  581. public void execute(Grid grid, CellStyleGenerator generator,
  582. Object data) {
  583. grid.setCellStyleGenerator(generator);
  584. }
  585. });
  586. LinkedHashMap<String, ContentMode> contentModes = new LinkedHashMap<String, ContentMode>();
  587. contentModes.put("None", null);
  588. // Abusing an unused value for this special case
  589. contentModes.put("Default", ContentMode.RAW);
  590. contentModes.put("Plain text", ContentMode.TEXT);
  591. contentModes.put("Preformatted", ContentMode.PREFORMATTED);
  592. contentModes.put("HTML", ContentMode.HTML);
  593. createSelectAction("Row description generator", "State", contentModes,
  594. "None", new Command<Grid, ContentMode>() {
  595. @Override
  596. public void execute(Grid grid, ContentMode mode, Object data) {
  597. if (mode == null) {
  598. grid.setRowDescriptionGenerator(null);
  599. } else if (mode == ContentMode.RAW) {
  600. grid.setRowDescriptionGenerator(rowDescriptionGenerator);
  601. } else {
  602. grid.setRowDescriptionGenerator(
  603. rowDescriptionGenerator, mode);
  604. }
  605. }
  606. });
  607. createSelectAction("Cell description generator", "State",
  608. contentModes, "None", new Command<Grid, ContentMode>() {
  609. @Override
  610. public void execute(Grid grid, ContentMode mode, Object data) {
  611. if (mode == null) {
  612. grid.setCellDescriptionGenerator(null);
  613. } else if (mode == ContentMode.RAW) {
  614. grid.setCellDescriptionGenerator(cellDescriptionGenerator);
  615. } else {
  616. grid.setCellDescriptionGenerator(
  617. cellDescriptionGenerator, mode);
  618. }
  619. }
  620. });
  621. LinkedHashMap<String, Integer> frozenOptions = new LinkedHashMap<String, Integer>();
  622. for (int i = -1; i <= COLUMNS; i++) {
  623. frozenOptions.put(String.valueOf(i), Integer.valueOf(i));
  624. }
  625. /*
  626. * This line below is a workaround for a FF24 bug regarding submenu
  627. * handling - it makes the sub menu wider.
  628. */
  629. frozenOptions.put("-1 for unfreezing selection column", -1);
  630. createSelectAction("Frozen column count", "State", frozenOptions, "0",
  631. new Command<Grid, Integer>() {
  632. @Override
  633. public void execute(Grid c, Integer value, Object data) {
  634. c.setFrozenColumnCount(value.intValue());
  635. }
  636. });
  637. LinkedHashMap<String, Integer> containerDelayValues = new LinkedHashMap<String, Integer>();
  638. for (int delay : new int[] { 0, 500, 2000, 10000 }) {
  639. containerDelayValues.put(String.valueOf(delay),
  640. Integer.valueOf(delay));
  641. }
  642. createSelectAction("Container delay", "State", containerDelayValues,
  643. "0", new Command<Grid, Integer>() {
  644. @Override
  645. public void execute(Grid grid, Integer delay, Object data) {
  646. containerDelay = delay.intValue();
  647. }
  648. });
  649. createBooleanAction("ItemClickListener", "State", false,
  650. new Command<Grid, Boolean>() {
  651. @Override
  652. public void execute(Grid c, Boolean value, Object data) {
  653. if (!value) {
  654. c.removeItemClickListener(itemClickListener);
  655. } else {
  656. c.addItemClickListener(itemClickListener);
  657. }
  658. }
  659. });
  660. createBooleanAction("EditorOpeningItemClickListener", "State", false,
  661. new Command<Grid, Boolean>() {
  662. @Override
  663. public void execute(Grid c, Boolean value, Object data) {
  664. if (!value) {
  665. c.removeItemClickListener(
  666. editorOpeningItemClickListener);
  667. } else {
  668. c.addItemClickListener(
  669. editorOpeningItemClickListener);
  670. }
  671. }
  672. });
  673. createBooleanAction("ReactiveValueChanger", "State", false,
  674. new Command<Grid, Boolean>() {
  675. @Override
  676. public void execute(Grid c, Boolean value, Object data) {
  677. Field<?> targetField = grid.getEditorFieldGroup()
  678. .getField("Column 0");
  679. if (targetField != null) {
  680. if (!value) {
  681. targetField.removeValueChangeListener(
  682. reactiveValueChanger);
  683. } else {
  684. targetField.addValueChangeListener(
  685. reactiveValueChanger);
  686. }
  687. }
  688. }
  689. });
  690. createBooleanAction("ColumnReorderListener", "State", false,
  691. new Command<Grid, Boolean>() {
  692. @Override
  693. public void execute(Grid grid, Boolean value, Object data) {
  694. if (value) {
  695. grid.addColumnReorderListener(
  696. columnReorderListener);
  697. } else {
  698. grid.removeColumnReorderListener(
  699. columnReorderListener);
  700. }
  701. }
  702. });
  703. createBooleanAction("ColumnVisibilityChangeListener", "State", false,
  704. new Command<Grid, Boolean>() {
  705. @Override
  706. public void execute(Grid grid, Boolean value, Object data) {
  707. if (value) {
  708. grid.addColumnVisibilityChangeListener(
  709. columnVisibilityListener);
  710. } else {
  711. grid.removeColumnVisibilityChangeListener(
  712. columnVisibilityListener);
  713. }
  714. }
  715. });
  716. createBooleanAction("Single select allow deselect", "State",
  717. singleSelectAllowDeselect, new Command<Grid, Boolean>() {
  718. @Override
  719. public void execute(Grid c, Boolean value, Object data) {
  720. singleSelectAllowDeselect = value.booleanValue();
  721. SelectionModel model = c.getSelectionModel();
  722. if (model instanceof SelectionModel.Single) {
  723. ((SelectionModel.Single) model).setDeselectAllowed(
  724. singleSelectAllowDeselect);
  725. }
  726. }
  727. });
  728. createBooleanAction("Allow user selection", "State", allowUserSelection,
  729. new Command<Grid, Boolean>() {
  730. @Override
  731. public void execute(Grid c, Boolean value, Object data) {
  732. allowUserSelection = value.booleanValue();
  733. SelectionModel model = c.getSelectionModel();
  734. ((HasUserSelectionAllowed) model)
  735. .setUserSelectionAllowed(allowUserSelection);
  736. }
  737. });
  738. createBooleanAction("Column Reordering Allowed", "State", false,
  739. new Command<Grid, Boolean>() {
  740. @Override
  741. public void execute(Grid c, Boolean value, Object data) {
  742. c.setColumnReorderingAllowed(value);
  743. }
  744. });
  745. createClickAction("Select all", "State", new Command<Grid, String>() {
  746. @Override
  747. public void execute(Grid c, String value, Object data) {
  748. SelectionModel selectionModel = c.getSelectionModel();
  749. if (selectionModel instanceof SelectionModel.Multi) {
  750. ((SelectionModel.Multi) selectionModel).selectAll();
  751. }
  752. }
  753. }, null);
  754. createClickAction("Select none", "State", new Command<Grid, String>() {
  755. @Override
  756. public void execute(Grid c, String value, Object data) {
  757. SelectionModel selectionModel = c.getSelectionModel();
  758. if (selectionModel instanceof SelectionModel.Multi) {
  759. ((SelectionModel.Multi) selectionModel).deselectAll();
  760. }
  761. }
  762. }, null);
  763. }
  764. protected void createHeaderActions() {
  765. createCategory("Header", null);
  766. createBooleanAction("Visible", "Header", true,
  767. new Command<Grid, Boolean>() {
  768. @Override
  769. public void execute(Grid grid, Boolean value, Object data) {
  770. grid.setHeaderVisible(value);
  771. }
  772. });
  773. LinkedHashMap<String, String> defaultRows = new LinkedHashMap<String, String>();
  774. defaultRows.put("Top", "Top");
  775. defaultRows.put("Bottom", "Bottom");
  776. defaultRows.put("Unset", "Unset");
  777. createMultiClickAction("Default row", "Header", defaultRows,
  778. new Command<Grid, String>() {
  779. @Override
  780. public void execute(Grid grid, String value, Object data) {
  781. HeaderRow defaultRow = null;
  782. if (value.equals("Top")) {
  783. defaultRow = grid.getHeaderRow(0);
  784. } else if (value.equals("Bottom")) {
  785. defaultRow = grid
  786. .getHeaderRow(grid.getHeaderRowCount() - 1);
  787. }
  788. grid.setDefaultHeaderRow(defaultRow);
  789. }
  790. }, defaultRows.get("Top"));
  791. createClickAction("Prepend row", "Header", new Command<Grid, Object>() {
  792. @Override
  793. public void execute(Grid grid, Object value, Object data) {
  794. grid.prependHeaderRow();
  795. }
  796. }, null);
  797. createClickAction("Append row", "Header", new Command<Grid, Object>() {
  798. @Override
  799. public void execute(Grid grid, Object value, Object data) {
  800. grid.appendHeaderRow();
  801. }
  802. }, null);
  803. createClickAction("Remove top row", "Header",
  804. new Command<Grid, Object>() {
  805. @Override
  806. public void execute(Grid grid, Object value, Object data) {
  807. grid.removeHeaderRow(0);
  808. }
  809. }, null);
  810. createClickAction("Remove bottom row", "Header",
  811. new Command<Grid, Object>() {
  812. @Override
  813. public void execute(Grid grid, Object value, Object data) {
  814. grid.removeHeaderRow(grid.getHeaderRowCount() - 1);
  815. }
  816. }, null);
  817. }
  818. protected void createFooterActions() {
  819. createCategory("Footer", null);
  820. createBooleanAction("Visible", "Footer", false,
  821. new Command<Grid, Boolean>() {
  822. @Override
  823. public void execute(Grid grid, Boolean value, Object data) {
  824. grid.setFooterVisible(value);
  825. }
  826. });
  827. createClickAction("Prepend row", "Footer", new Command<Grid, Object>() {
  828. @Override
  829. public void execute(Grid grid, Object value, Object data) {
  830. grid.prependFooterRow();
  831. }
  832. }, null);
  833. createClickAction("Append row", "Footer", new Command<Grid, Object>() {
  834. @Override
  835. public void execute(Grid grid, Object value, Object data) {
  836. grid.appendFooterRow();
  837. }
  838. }, null);
  839. createClickAction("Remove top row", "Footer",
  840. new Command<Grid, Object>() {
  841. @Override
  842. public void execute(Grid grid, Object value, Object data) {
  843. grid.removeFooterRow(0);
  844. }
  845. }, null);
  846. createClickAction("Remove bottom row", "Footer",
  847. new Command<Grid, Object>() {
  848. @Override
  849. public void execute(Grid grid, Object value, Object data) {
  850. grid.removeFooterRow(grid.getFooterRowCount() - 1);
  851. }
  852. }, null);
  853. }
  854. @SuppressWarnings("boxing")
  855. protected void createColumnActions() {
  856. createCategory("Columns", null);
  857. for (int c = 0; c < COLUMNS; c++) {
  858. final int index = c;
  859. createCategory(getColumnProperty(c), "Columns");
  860. createClickAction("Add / Remove", getColumnProperty(c),
  861. new Command<Grid, String>() {
  862. boolean wasHidable;
  863. boolean wasHidden;
  864. String wasColumnHidingToggleCaption;
  865. @Override
  866. public void execute(Grid grid, String value,
  867. Object data) {
  868. String columnProperty = getColumnProperty(
  869. (Integer) data);
  870. Column column = grid.getColumn(columnProperty);
  871. if (column == null) {
  872. column = grid.addColumn(columnProperty);
  873. column.setHidable(wasHidable);
  874. column.setHidden(wasHidden);
  875. column.setHidingToggleCaption(
  876. wasColumnHidingToggleCaption);
  877. } else {
  878. wasHidable = column.isHidable();
  879. wasHidden = column.isHidden();
  880. wasColumnHidingToggleCaption = column
  881. .getHidingToggleCaption();
  882. grid.removeColumn(columnProperty);
  883. }
  884. }
  885. }, null, c);
  886. createClickAction("Move left", getColumnProperty(c),
  887. new Command<Grid, String>() {
  888. @Override
  889. public void execute(Grid grid, String value,
  890. Object data) {
  891. final String columnProperty = getColumnProperty(
  892. (Integer) data);
  893. List<Column> cols = grid.getColumns();
  894. List<Object> reordered = new ArrayList<Object>();
  895. boolean addAsLast = false;
  896. for (int i = 0; i < cols.size(); i++) {
  897. Column col = cols.get(i);
  898. if (col.getPropertyId()
  899. .equals(columnProperty)) {
  900. if (i == 0) {
  901. addAsLast = true;
  902. } else {
  903. reordered.add(i - 1, columnProperty);
  904. }
  905. } else {
  906. reordered.add(col.getPropertyId());
  907. }
  908. }
  909. if (addAsLast) {
  910. reordered.add(columnProperty);
  911. }
  912. grid.setColumnOrder(reordered.toArray());
  913. }
  914. }, null, c);
  915. createBooleanAction("Sortable", getColumnProperty(c), true,
  916. new Command<Grid, Boolean>() {
  917. @Override
  918. public void execute(Grid grid, Boolean value,
  919. Object columnIndex) {
  920. Object propertyId = getColumnProperty(
  921. (Integer) columnIndex);
  922. Column column = grid.getColumn(propertyId);
  923. column.setSortable(value);
  924. }
  925. }, c);
  926. createBooleanAction("Resizable", getColumnProperty(c), true,
  927. new Command<Grid, Boolean>() {
  928. @Override
  929. public void execute(Grid grid, Boolean value,
  930. Object columnIndex) {
  931. Object propertyId = getColumnProperty(
  932. (Integer) columnIndex);
  933. Column column = grid.getColumn(propertyId);
  934. column.setResizable(value);
  935. }
  936. }, c);
  937. createBooleanAction("Hidable", getColumnProperty(c),
  938. isColumnHidableByDefault(c), new Command<Grid, Boolean>() {
  939. @Override
  940. public void execute(Grid c, Boolean hidable,
  941. Object propertyId) {
  942. grid.getColumn(propertyId).setHidable(hidable);
  943. }
  944. }, getColumnProperty(c));
  945. createBooleanAction("Hidden", getColumnProperty(c),
  946. isColumnHiddenByDefault(c), new Command<Grid, Boolean>() {
  947. @Override
  948. public void execute(Grid c, Boolean hidden,
  949. Object propertyId) {
  950. grid.getColumn(propertyId).setHidden(hidden);
  951. }
  952. }, getColumnProperty(c));
  953. createClickAction("Change hiding toggle caption",
  954. getColumnProperty(c), new Command<Grid, String>() {
  955. int count = 0;
  956. @Override
  957. public void execute(Grid grid, String value,
  958. Object data) {
  959. final String columnProperty = getColumnProperty(
  960. (Integer) data);
  961. grid.getColumn(columnProperty)
  962. .setHidingToggleCaption(columnProperty
  963. + " caption " + count++);
  964. }
  965. }, null, c);
  966. createClickAction("Change header caption", getColumnProperty(c),
  967. new Command<Grid, String>() {
  968. int count = 0;
  969. @Override
  970. public void execute(Grid grid, String value,
  971. Object data) {
  972. final String columnProperty = getColumnProperty(
  973. (Integer) data);
  974. grid.getColumn(columnProperty).setHeaderCaption(
  975. columnProperty + " header " + count++);
  976. }
  977. }, null, c);
  978. createCategory("Column " + c + " Width", getColumnProperty(c));
  979. createClickAction("Auto", "Column " + c + " Width",
  980. new Command<Grid, Integer>() {
  981. @Override
  982. public void execute(Grid grid, Integer value,
  983. Object columnIndex) {
  984. Object propertyId = getColumnProperty(
  985. (Integer) columnIndex);
  986. Column column = grid.getColumn(propertyId);
  987. column.setWidthUndefined();
  988. }
  989. }, -1, c);
  990. createClickAction("25.5px", "Column " + c + " Width",
  991. new Command<Grid, Void>() {
  992. @Override
  993. public void execute(Grid grid, Void value,
  994. Object columnIndex) {
  995. grid.getColumns().get((Integer) columnIndex)
  996. .setWidth(25.5);
  997. }
  998. }, null, c);
  999. for (int w = 50; w < 300; w += 50) {
  1000. createClickAction(w + "px", "Column " + c + " Width",
  1001. new Command<Grid, Integer>() {
  1002. @Override
  1003. public void execute(Grid grid, Integer value,
  1004. Object columnIndex) {
  1005. Object propertyId = getColumnProperty(
  1006. (Integer) columnIndex);
  1007. Column column = grid.getColumn(propertyId);
  1008. column.setWidth(value);
  1009. }
  1010. }, w, c);
  1011. }
  1012. LinkedHashMap<String, GridStaticCellType> defaultRows = new LinkedHashMap<String, GridStaticCellType>();
  1013. defaultRows.put("Text Header", GridStaticCellType.TEXT);
  1014. defaultRows.put("Html Header ", GridStaticCellType.HTML);
  1015. defaultRows.put("Widget Header", GridStaticCellType.WIDGET);
  1016. createMultiClickAction("Header Type", getColumnProperty(c),
  1017. defaultRows, new Command<Grid, GridStaticCellType>() {
  1018. @Override
  1019. public void execute(Grid grid,
  1020. GridStaticCellType value, Object columnIndex) {
  1021. final Object propertyId = getColumnProperty((Integer) columnIndex);
  1022. final HeaderCell cell = grid.getDefaultHeaderRow()
  1023. .getCell(propertyId);
  1024. switch (value) {
  1025. case TEXT:
  1026. cell.setText("Text Header");
  1027. break;
  1028. case HTML:
  1029. cell.setHtml("HTML Header");
  1030. break;
  1031. case WIDGET:
  1032. cell.setComponent(new Button("Button Header",
  1033. new ClickListener() {
  1034. @Override
  1035. public void buttonClick(
  1036. ClickEvent event) {
  1037. log("Button clicked!");
  1038. }
  1039. }));
  1040. default:
  1041. break;
  1042. }
  1043. }
  1044. }, c);
  1045. defaultRows = new LinkedHashMap<String, GridStaticCellType>();
  1046. defaultRows.put("Text Footer", GridStaticCellType.TEXT);
  1047. defaultRows.put("Html Footer", GridStaticCellType.HTML);
  1048. defaultRows.put("Widget Footer", GridStaticCellType.WIDGET);
  1049. createMultiClickAction("Footer Type", getColumnProperty(c),
  1050. defaultRows, new Command<Grid, GridStaticCellType>() {
  1051. @Override
  1052. public void execute(Grid grid, GridStaticCellType value,
  1053. Object columnIndex) {
  1054. final Object propertyId = getColumnProperty(
  1055. (Integer) columnIndex);
  1056. final FooterCell cell = grid.getFooterRow(0)
  1057. .getCell(propertyId);
  1058. switch (value) {
  1059. case TEXT:
  1060. cell.setText("Text Footer");
  1061. break;
  1062. case HTML:
  1063. cell.setHtml("HTML Footer");
  1064. break;
  1065. case WIDGET:
  1066. cell.setComponent(new Button("Button Footer",
  1067. new ClickListener() {
  1068. @Override
  1069. public void buttonClick(
  1070. ClickEvent event) {
  1071. log("Button clicked!");
  1072. }
  1073. }));
  1074. default:
  1075. break;
  1076. }
  1077. }
  1078. }, c);
  1079. }
  1080. createClickAction("All columns auto width", "Columns",
  1081. new Command<Grid, Boolean>() {
  1082. @Override
  1083. public void execute(Grid c, Boolean value, Object data) {
  1084. for (Column col : grid.getColumns()) {
  1085. col.setWidthUndefined();
  1086. }
  1087. }
  1088. }, null);
  1089. createBooleanAction("All columns hidable", "Columns", false,
  1090. new Command<Grid, Boolean>() {
  1091. @Override
  1092. public void execute(Grid c, Boolean value, Object data) {
  1093. for (Column col : grid.getColumns()) {
  1094. col.setHidable(value);
  1095. }
  1096. }
  1097. });
  1098. createBooleanAction("Toggle all column hidden state", "Columns", false,
  1099. new Command<Grid, Boolean>() {
  1100. @Override
  1101. public void execute(Grid c, Boolean value, Object data) {
  1102. for (Column col : grid.getColumns()) {
  1103. col.setHidden(!col.isHidden());
  1104. }
  1105. }
  1106. });
  1107. createBooleanAction("All columns resizable", "Columns", false,
  1108. new Command<Grid, Boolean>() {
  1109. @Override
  1110. public void execute(Grid c, Boolean value, Object data) {
  1111. for (Column col : grid.getColumns()) {
  1112. col.setResizable(value);
  1113. }
  1114. }
  1115. });
  1116. createClickAction("All columns expanding, Col 0 has max width of 30px",
  1117. "Columns", new Command<Grid, Boolean>() {
  1118. @Override
  1119. public void execute(Grid c, Boolean value, Object data) {
  1120. for (Column col : grid.getColumns()) {
  1121. col.setWidthUndefined();
  1122. }
  1123. grid.getColumns().get(0).setMaximumWidth(30);
  1124. }
  1125. }, null);
  1126. createBooleanAction("Simple resize mode", "Columns", false,
  1127. new Command<Grid, Boolean>() {
  1128. @Override
  1129. public void execute(Grid g, Boolean value, Object data) {
  1130. g.setColumnResizeMode(value ? ColumnResizeMode.SIMPLE
  1131. : ColumnResizeMode.ANIMATED);
  1132. }
  1133. });
  1134. }
  1135. private static String getColumnProperty(int c) {
  1136. return "Column " + c;
  1137. }
  1138. protected void createPropertyActions() {
  1139. createCategory("Properties", null);
  1140. createBooleanAction("Prepend property", "Properties", false,
  1141. new Command<Grid, Boolean>() {
  1142. private final Object propertyId = new Object();
  1143. @Override
  1144. public void execute(Grid c, Boolean enable, Object data) {
  1145. if (enable.booleanValue()) {
  1146. ds.addContainerProperty(propertyId, String.class,
  1147. "property value");
  1148. grid.getColumn(propertyId)
  1149. .setHeaderCaption("new property");
  1150. grid.setColumnOrder(propertyId);
  1151. } else {
  1152. ds.removeContainerProperty(propertyId);
  1153. }
  1154. }
  1155. }, null);
  1156. }
  1157. protected void createRowActions() {
  1158. createCategory("Body rows", null);
  1159. class NewRowCommand implements Command<Grid, String> {
  1160. private final int index;
  1161. public NewRowCommand() {
  1162. this(0);
  1163. }
  1164. public NewRowCommand(int index) {
  1165. this.index = index;
  1166. }
  1167. @Override
  1168. public void execute(Grid c, String value, Object data) {
  1169. Item item = ds.addItemAt(index, new Object());
  1170. for (int i = 0; i < COLUMNS; i++) {
  1171. Class<?> type = ds.getType(getColumnProperty(i));
  1172. if (String.class.isAssignableFrom(type)) {
  1173. Property<String> itemProperty = getProperty(item, i);
  1174. itemProperty.setValue("newcell: " + i);
  1175. } else if (Integer.class.isAssignableFrom(type)) {
  1176. Property<Integer> itemProperty = getProperty(item, i);
  1177. itemProperty.setValue(Integer.valueOf(i));
  1178. } else {
  1179. // let the default value be taken implicitly.
  1180. }
  1181. }
  1182. }
  1183. private <T extends Object> Property<T> getProperty(Item item,
  1184. int i) {
  1185. @SuppressWarnings("unchecked")
  1186. Property<T> itemProperty = item
  1187. .getItemProperty(getColumnProperty(i));
  1188. return itemProperty;
  1189. }
  1190. }
  1191. final NewRowCommand newRowCommand = new NewRowCommand();
  1192. createClickAction("Add 18 rows", "Body rows",
  1193. new Command<Grid, String>() {
  1194. @Override
  1195. public void execute(Grid c, String value, Object data) {
  1196. for (int i = 0; i < 18; i++) {
  1197. newRowCommand.execute(c, value, data);
  1198. }
  1199. }
  1200. }, null);
  1201. createClickAction("Add first row", "Body rows", newRowCommand, null);
  1202. createClickAction("Add third row", "Body rows", new NewRowCommand(2),
  1203. null);
  1204. createClickAction("Remove first row", "Body rows",
  1205. new Command<Grid, String>() {
  1206. @Override
  1207. public void execute(Grid c, String value, Object data) {
  1208. Object firstItemId = ds.getIdByIndex(0);
  1209. ds.removeItem(firstItemId);
  1210. }
  1211. }, null);
  1212. createClickAction("Remove 18 first rows", "Body rows",
  1213. new Command<Grid, String>() {
  1214. @Override
  1215. public void execute(Grid c, String value, Object data) {
  1216. for (int i = 0; i < 18; i++) {
  1217. Object firstItemId = ds.getIdByIndex(0);
  1218. ds.removeItem(firstItemId);
  1219. }
  1220. }
  1221. }, null);
  1222. createClickAction("Modify first row (getItemProperty)", "Body rows",
  1223. new Command<Grid, String>() {
  1224. @SuppressWarnings("unchecked")
  1225. @Override
  1226. public void execute(Grid c, String value, Object data) {
  1227. Object firstItemId = ds.getIdByIndex(0);
  1228. Item item = ds.getItem(firstItemId);
  1229. for (int i = 0; i < COLUMNS; i++) {
  1230. Property<?> property = item
  1231. .getItemProperty(getColumnProperty(i));
  1232. if (property.getType().equals(String.class)) {
  1233. ((Property<String>) property)
  1234. .setValue("modified: " + i);
  1235. }
  1236. }
  1237. }
  1238. }, null);
  1239. createClickAction("Modify first row (getContainerProperty)",
  1240. "Body rows", new Command<Grid, String>() {
  1241. @SuppressWarnings("unchecked")
  1242. @Override
  1243. public void execute(Grid c, String value, Object data) {
  1244. Object firstItemId = ds.getIdByIndex(0);
  1245. for (Object containerPropertyId : ds
  1246. .getContainerPropertyIds()) {
  1247. Property<?> property = ds.getContainerProperty(
  1248. firstItemId, containerPropertyId);
  1249. if (property.getType().equals(String.class)) {
  1250. ((Property<String>) property).setValue(
  1251. "modified: " + containerPropertyId);
  1252. }
  1253. }
  1254. }
  1255. }, null);
  1256. createBooleanAction("Select first row", "Body rows", false,
  1257. new Command<Grid, Boolean>() {
  1258. @Override
  1259. public void execute(Grid grid, Boolean select,
  1260. Object data) {
  1261. final Object firstItemId = grid.getContainerDataSource()
  1262. .firstItemId();
  1263. if (select.booleanValue()) {
  1264. grid.select(firstItemId);
  1265. } else {
  1266. grid.deselect(firstItemId);
  1267. }
  1268. }
  1269. });
  1270. createClickAction("Remove all rows", "Body rows",
  1271. new Command<Grid, String>() {
  1272. @SuppressWarnings("unchecked")
  1273. @Override
  1274. public void execute(Grid c, String value, Object data) {
  1275. ds.removeAllItems();
  1276. }
  1277. }, null);
  1278. createClickAction("Remove selected rows", "Body rows",
  1279. new Command<Grid, String>() {
  1280. @Override
  1281. public void execute(Grid c, String value, Object data) {
  1282. // Usually you'd deselect all the rows before removing
  1283. // them. It is done this way to test for #19152
  1284. for (Object itemId : c.getSelectedRows()) {
  1285. ds.removeItem(itemId);
  1286. }
  1287. c.select(null);
  1288. }
  1289. }, null);
  1290. }
  1291. protected void createEditorActions() {
  1292. createBooleanAction("Enabled", "Editor", false,
  1293. new Command<Grid, Boolean>() {
  1294. @Override
  1295. public void execute(Grid c, Boolean value, Object data) {
  1296. c.setEditorEnabled(value);
  1297. }
  1298. });
  1299. createBooleanAction("Buffered mode", "Editor", true,
  1300. new Command<Grid, Boolean>() {
  1301. @Override
  1302. public void execute(Grid c, Boolean value, Object data) {
  1303. c.setEditorBuffered(value);
  1304. }
  1305. });
  1306. createClickAction("Edit item 5", "Editor", new Command<Grid, String>() {
  1307. @Override
  1308. public void execute(Grid c, String value, Object data) {
  1309. c.editItem(5);
  1310. }
  1311. }, null);
  1312. createClickAction("Edit item 100", "Editor",
  1313. new Command<Grid, String>() {
  1314. @Override
  1315. public void execute(Grid c, String value, Object data) {
  1316. c.editItem(100);
  1317. }
  1318. }, null);
  1319. createClickAction("Save", "Editor", new Command<Grid, String>() {
  1320. @Override
  1321. public void execute(Grid c, String value, Object data) {
  1322. try {
  1323. c.saveEditor();
  1324. } catch (CommitException e) {
  1325. // TODO Auto-generated catch block
  1326. e.printStackTrace();
  1327. }
  1328. }
  1329. }, null);
  1330. createClickAction("Cancel edit", "Editor", new Command<Grid, String>() {
  1331. @Override
  1332. public void execute(Grid c, String value, Object data) {
  1333. c.cancelEditor();
  1334. }
  1335. }, null);
  1336. createClickAction("Change save caption", "Editor",
  1337. new Command<Grid, String>() {
  1338. @Override
  1339. public void execute(Grid c, String value, Object data) {
  1340. c.setEditorSaveCaption("ǝʌɐS");
  1341. }
  1342. }, null);
  1343. createClickAction("Change cancel caption", "Editor",
  1344. new Command<Grid, String>() {
  1345. @Override
  1346. public void execute(Grid c, String value, Object data) {
  1347. c.setEditorCancelCaption("ʃǝɔuɐↃ");
  1348. }
  1349. }, null);
  1350. }
  1351. @SuppressWarnings("boxing")
  1352. protected void addHeightActions() {
  1353. createCategory("Height by Rows", "Size");
  1354. createBooleanAction("HeightMode Row", "Size", false,
  1355. new Command<Grid, Boolean>() {
  1356. @Override
  1357. public void execute(Grid c, Boolean heightModeByRows,
  1358. Object data) {
  1359. c.setHeightMode(heightModeByRows ? HeightMode.ROW
  1360. : HeightMode.CSS);
  1361. }
  1362. }, null);
  1363. addActionForHeightByRows(1d / 3d);
  1364. addActionForHeightByRows(2d / 3d);
  1365. for (double i = 1; i < 5; i++) {
  1366. addActionForHeightByRows(i);
  1367. addActionForHeightByRows(i + 1d / 3d);
  1368. addActionForHeightByRows(i + 2d / 3d);
  1369. }
  1370. Command<Grid, String> sizeCommand = new Command<Grid, String>() {
  1371. @Override
  1372. public void execute(Grid grid, String height, Object data) {
  1373. grid.setHeight(height);
  1374. }
  1375. };
  1376. createCategory("Height", "Size");
  1377. // header 20px + scrollbar 16px = 36px baseline
  1378. createClickAction("86px (no drag scroll select)", "Height", sizeCommand,
  1379. "86px");
  1380. createClickAction("96px (drag scroll select limit)", "Height",
  1381. sizeCommand, "96px");
  1382. createClickAction("106px (drag scroll select enabled)", "Height",
  1383. sizeCommand, "106px");
  1384. }
  1385. private void addActionForHeightByRows(final Double i) {
  1386. DecimalFormat df = new DecimalFormat("0.00");
  1387. createClickAction(df.format(i) + " rows", "Height by Rows",
  1388. new Command<Grid, String>() {
  1389. @Override
  1390. public void execute(Grid c, String value, Object data) {
  1391. c.setHeightByRows(i);
  1392. }
  1393. }, null);
  1394. }
  1395. private void createDetailsActions() {
  1396. Command<Grid, DetailsGenerator> swapDetailsGenerator = new Command<Grid, DetailsGenerator>() {
  1397. @Override
  1398. public void execute(Grid c, DetailsGenerator generator,
  1399. Object data) {
  1400. grid.setDetailsGenerator(generator);
  1401. }
  1402. };
  1403. Command<Grid, Boolean> openOrCloseItemId = new Command<Grid, Boolean>() {
  1404. @Override
  1405. @SuppressWarnings("boxing")
  1406. public void execute(Grid g, Boolean visible, Object itemId) {
  1407. g.setDetailsVisible(itemId, visible);
  1408. }
  1409. };
  1410. createCategory("Generators", "Details");
  1411. createClickAction("NULL", "Generators", swapDetailsGenerator,
  1412. DetailsGenerator.NULL);
  1413. createClickAction("\"Watching\"", "Generators", swapDetailsGenerator,
  1414. watchingDetailsGenerator);
  1415. createClickAction("Detailed", "Generators", swapDetailsGenerator,
  1416. detailedDetailsGenerator);
  1417. createClickAction("Persisting", "Generators", swapDetailsGenerator,
  1418. persistingDetailsGenerator);
  1419. createClickAction("- Change Component", "Generators",
  1420. new Command<Grid, Void>() {
  1421. @Override
  1422. public void execute(Grid c, Void value, Object data) {
  1423. for (Object id : detailsMap.keySet()) {
  1424. Panel panel = detailsMap.get(id);
  1425. Label label = (Label) panel.getContent();
  1426. if (label.getValue().equals("One")) {
  1427. panel.setContent(new Label("Two"));
  1428. } else {
  1429. panel.setContent(new Label("One"));
  1430. }
  1431. }
  1432. }
  1433. }, null);
  1434. createClickAction("Toggle firstItemId", "Details",
  1435. new Command<Grid, Void>() {
  1436. @Override
  1437. public void execute(Grid g, Void value, Object data) {
  1438. Object firstItemId = g.getContainerDataSource()
  1439. .firstItemId();
  1440. boolean toggle = g.isDetailsVisible(firstItemId);
  1441. g.setDetailsVisible(firstItemId, !toggle);
  1442. g.setDetailsVisible(firstItemId, toggle);
  1443. }
  1444. }, null);
  1445. createBooleanAction("Open firstItemId", "Details", false,
  1446. openOrCloseItemId, ds.firstItemId());
  1447. createBooleanAction("Open 1", "Details", false, openOrCloseItemId,
  1448. ds.getIdByIndex(1));
  1449. createBooleanAction("Open 995", "Details", false, openOrCloseItemId,
  1450. ds.getIdByIndex(995));
  1451. }
  1452. @Override
  1453. protected Integer getTicketNumber() {
  1454. return 12829;
  1455. }
  1456. @Override
  1457. protected Class<Grid> getTestClass() {
  1458. return Grid.class;
  1459. }
  1460. }