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 68KB

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