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

Migrate 7.7.5 branch patches to v8. (#7969) * Prevent adding several scrollbar handlers (#19189). Change-Id: Ib0cc6c6835aab6d263f153362a328bcf2be7bc5c * Prevent adding several scrollbar handlers (#19189). * Keep expand ratio for last row/column when reducing grid layout size (#20297) Change-Id: Iff53a803596f4fc1eae8e4bfa307b9c1f4df961a * Fixed drag and drop failure when message dragged from email client (#20451) When dragging message form email client on Windows, item.webkitGetAsEntry() might return null creating NPE on the client side. Added additional checks for this situation. Change-Id: I569f7e6d0d7b137f24be53d1fbce384695ae8c73 * Change expected pre-release version number pattern in publish report Change-Id: Icdacecc490d2490ea9e262f5c5736c1dece2a89d * Mark TextField/TextArea as busy when a text change event is pending (#20469) Change-Id: I404985ae0be1e7dc65171b610032f8649e700f50 # Conflicts: # client/src/main/java/com/vaadin/client/ui/VTextField.java # uitest/src/main/java/com/vaadin/tests/components/textfield/TextChangeEvents.java * Fixed touch scrolling issue in Surface and WP devices (#18737) Fixed by using pointerevents instead of touchevents when the browser is IE11, or Edge. Also added touch-action: none; css rules into escalator.css to prevent default touch behaviour on IE11 and Edge. Does not affect IE8 to IE10 browsers, behaviour on those will stay the same as before the fix. No new unit tests since we do not have automatic touch testing possibilities yet. Please test manually with Surface: IE11 and Edge, use for example uitest: com.vaadin.tests.components.grid.basics.GridBasicsomponents.grid.basics.GridBasics Change-Id: Iddbf1852e6ffafc855f749d6f4ebb235ed0f5703 * Add lazy/simple resize mode to Grid (#20108) Change-Id: I47427efc28c350382dba8c1f50fd332a3f4585e4 # Conflicts: # client/src/main/java/com/vaadin/client/connectors/GridConnector.java # client/src/main/java/com/vaadin/client/widgets/Grid.java # server/src/main/java/com/vaadin/ui/Grid.java # shared/src/main/java/com/vaadin/shared/ui/grid/GridState.java # themes/src/main/themes/VAADIN/themes/base/grid/grid.scss # uitest/src/main/java/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeatures.java Change-Id: Ieca56121875198ed559a41c143b28926e2695433 * Fix NPE in case some items don't contain all properties of Grid. This could occur in when parent is a different entity than its children in hierarchical data. Change-Id: Icd53b5b5e5544a3680d0cd99702ab78224b2dc08 # Conflicts: # server/src/main/java/com/vaadin/data/fieldgroup/FieldGroup.java # server/src/main/java/com/vaadin/ui/Grid.java * Mark TextField/TextArea as busy when a text change event is pending (#20469) Change-Id: I404985ae0be1e7dc65171b610032f8649e700f50 # Conflicts: # client/src/main/java/com/vaadin/client/ui/VTextField.java # uitest/src/test/java/com/vaadin/tests/components/textfield/TextChangeEventsTest.java * Add lazy/simple resize mode to Grid (#20108) Change-Id: I47427efc28c350382dba8c1f50fd332a3f4585e4 * Removed V8 VTextField unused import, forgotten @RunLocally. * Don't rely on selenium "sendKeys" behavior. * Revert "Change expected pre-release version number pattern in publish report" This reverts commit 8df27b952dddb691aead6a633c5b3724c98bf343. * Migrate TextField/TextArea patch from 7.7 to master (modern components) Mark TextField/TextArea as busy when a text change event is pending (#20469) Change-Id: I404985ae0be1e7dc65171b610032f8649e700f50
7 years ago
Migrate 7.7.5 branch patches to v8. (#7969) * Prevent adding several scrollbar handlers (#19189). Change-Id: Ib0cc6c6835aab6d263f153362a328bcf2be7bc5c * Prevent adding several scrollbar handlers (#19189). * Keep expand ratio for last row/column when reducing grid layout size (#20297) Change-Id: Iff53a803596f4fc1eae8e4bfa307b9c1f4df961a * Fixed drag and drop failure when message dragged from email client (#20451) When dragging message form email client on Windows, item.webkitGetAsEntry() might return null creating NPE on the client side. Added additional checks for this situation. Change-Id: I569f7e6d0d7b137f24be53d1fbce384695ae8c73 * Change expected pre-release version number pattern in publish report Change-Id: Icdacecc490d2490ea9e262f5c5736c1dece2a89d * Mark TextField/TextArea as busy when a text change event is pending (#20469) Change-Id: I404985ae0be1e7dc65171b610032f8649e700f50 # Conflicts: # client/src/main/java/com/vaadin/client/ui/VTextField.java # uitest/src/main/java/com/vaadin/tests/components/textfield/TextChangeEvents.java * Fixed touch scrolling issue in Surface and WP devices (#18737) Fixed by using pointerevents instead of touchevents when the browser is IE11, or Edge. Also added touch-action: none; css rules into escalator.css to prevent default touch behaviour on IE11 and Edge. Does not affect IE8 to IE10 browsers, behaviour on those will stay the same as before the fix. No new unit tests since we do not have automatic touch testing possibilities yet. Please test manually with Surface: IE11 and Edge, use for example uitest: com.vaadin.tests.components.grid.basics.GridBasicsomponents.grid.basics.GridBasics Change-Id: Iddbf1852e6ffafc855f749d6f4ebb235ed0f5703 * Add lazy/simple resize mode to Grid (#20108) Change-Id: I47427efc28c350382dba8c1f50fd332a3f4585e4 # Conflicts: # client/src/main/java/com/vaadin/client/connectors/GridConnector.java # client/src/main/java/com/vaadin/client/widgets/Grid.java # server/src/main/java/com/vaadin/ui/Grid.java # shared/src/main/java/com/vaadin/shared/ui/grid/GridState.java # themes/src/main/themes/VAADIN/themes/base/grid/grid.scss # uitest/src/main/java/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeatures.java Change-Id: Ieca56121875198ed559a41c143b28926e2695433 * Fix NPE in case some items don't contain all properties of Grid. This could occur in when parent is a different entity than its children in hierarchical data. Change-Id: Icd53b5b5e5544a3680d0cd99702ab78224b2dc08 # Conflicts: # server/src/main/java/com/vaadin/data/fieldgroup/FieldGroup.java # server/src/main/java/com/vaadin/ui/Grid.java * Mark TextField/TextArea as busy when a text change event is pending (#20469) Change-Id: I404985ae0be1e7dc65171b610032f8649e700f50 # Conflicts: # client/src/main/java/com/vaadin/client/ui/VTextField.java # uitest/src/test/java/com/vaadin/tests/components/textfield/TextChangeEventsTest.java * Add lazy/simple resize mode to Grid (#20108) Change-Id: I47427efc28c350382dba8c1f50fd332a3f4585e4 * Removed V8 VTextField unused import, forgotten @RunLocally. * Don't rely on selenium "sendKeys" behavior. * Revert "Change expected pre-release version number pattern in publish report" This reverts commit 8df27b952dddb691aead6a633c5b3724c98bf343. * Migrate TextField/TextArea patch from 7.7 to master (modern components) Mark TextField/TextArea as busy when a text change event is pending (#20469) Change-Id: I404985ae0be1e7dc65171b610032f8649e700f50
7 years ago
Migrating 7.7.1, 7.7.2, 7.7.3 to V8. commit 11c3f8bd9ea65f7a7b8da9a282c31a127bd475a6 - Test and its UI class are added (both V8 and V7). Required functionality should be available via modern GWT version. commit 729dbf96fe76e7627168ab2c9d1d71c4eb7214c8 - About update release notes. No need to be included. commit 675f38349c43ac45dae40cf33a7b1fd0f8f261ca - V8 already contains correct Import-Packages section which uses osgi.javax.servlet.version variable whise version is 3.0.0 at the moment. commit 5da7c052f55cb4703b74f38f5bb19fc3f3fa2a76 - Use Vaadin plugin 7.7.0 from 7.7.0.alpha1. Is not applicable. commit 1df80001ab6c916effa917781dba652d09d01056 - Updated tutorial to Vaadin 7.7.0. Is not applicable. The tutorial already contains correct links and updated source code snippets. commit 8b4f0ed8a894b04902a5d4258119dcdc8e76d1e0 - set-property-fallback name="user.agent" value="safari". Is already there. commit 28ed04e827669cc4dd329331dac9699bd93f70bc - Fix animation end listeners so they are always removed. Is already there. commit 408253bc3f8bd3975f0525ce6832be214a3552e9 - Use servlet context classloader when finding servlet class for websockets. Is already there. commit 7a6f250d89474849648ed2ee96a6bfb78c3b9ca8 - Fire actions before removing menu from the DOM. Is already there. commit 9b66c6eb9bebf657d3f2def8c767e0e9d51cc92c - Do not run test on IE8 as IE8 is broken. Transplanted. commit 3faa43ff39ecda56587b93f0c5e262a2907871a7 - Discard for DateField when the data source contains null. It is not applicable for V8 (There is no anymore discard method in DateField (and no datasource suport in field)). Transplanted for DateField in compatibility. commit e0c1f91a3d6d1884e07ce8d1ba957aff6a9bf29a - Fix ComboBox paging when number of items equals page length. It's already done by another fix which replaced ComboBox in compatibility package to the V7 version. commit 83a1b8a0961cc9b2d43e01757530cefd035b0a22 - Update DOM and update escalator row count in the correct order. Transplanted. commit 45f2fba8ff7a4b62680618a325d4afcebfb7a1e9 - Prevent editor from being canceled while it is being saved. Transplanted to compatibility package. Is not applicable to modern Grid. commit ad67f7f43afb0feec5e029aea90297f2abe4f2c1 - Delete broken stylesheet and revert to default style until a new stylesheet is created. Is already there. commit c970a78d42a2d8f1745df7a11a74f3731f8be9a5 - Always show loading indicator for JavaScript RPC. Transplanted. commit 2aad3416061586f7e2649160bd832eefe03702ad - Make test independent of any converters present in the factory. It's already there. commit c9ad48430be135d18fe9f30868e091dd51c57b94 - Do not include yuicompressor for Sass compiler. Transplanted. Exclusion is added into vaadin/pom.xml commit 52d01a68e91ce73306b3a1747af97e928048ecdf - Test for Firefox download disconnecting push channel. Transplanted. commit 4bc375d1d21f468e6433da3a183150e0bfe0cae4 - Handle encoded URL characters correctly when constructing widget set name. Transplanted. commit 17ba88eaf87e15e6f3c729e5c7f8e875d5f86d8d - Update version to 7.7-SNAPSHOT. Is not applicable. commit 47b7b13e5c959de3bd925693b074d85e7625a87e - Ensure Firefox always updates the grid scrollbar. Transplanted. Made changes in the logic to the test for modern Grid component. commit 4d851ba21d1b8f35685b631d2845731f8fb33252 - Calculate column widths immediately if there is data. Transplanted to both client side modules. commit 8f0b1a1dd026a756912c9f21bd2b34ea46897c7f - Skip Maven enforcer plugin during demo validation. Transplanted (one build file is affected). commit 62815353e1b9d3cd126809f5c818ad35bf913807 - Build demos from 7.7 branch (now for master branch). FW8 demos are added (one build file is affected). commit 815d72115d5aaf3676daefd5642115577e4151ef - Make test pass on all browsers. Transplanted to both V7 and V8 version tests. commit 516c428ca127e3c31b7b4d74220e4b7eed4571be - Use widget set specified by init parameter. Transplanted to the one UIProvider class. commit b00c580ed70f682a42afbfa91f978921bb86c2cd - Use correct column index when calculating min width during resize. Transplanted into both client side classes (main and compatibility) as is. Test for V7 is transplanted as is. Test for V8 is written from scratch based on V7 version. commit 7dd91cf057eb06a09009096a8278f34aad9bd8d9 - Fix regression that broke widget set compilation in 7.7.1. It's already there. commit c665731b0b97b697e80c47955d3558c19f0c81cb - Ensure temporary layout manager state is cleared at the end of a layout phase. Transplanted to the one LayoutManager class. commit 57a965251afdb5ee9ac1913a0101d854d8215aa6 - Fix assertion error when column widths are calculated. Transplanted to both versions of the client Grid widget. commit c5c52684eb30d924cb75a632b526a0f879d5a33c - Format Java files using Eclipse Neon and Vaadin settings. Only formatting changes. Is not transplanted. f5d06d877165bf413ec71c4fc88cf46c8c57a372 - Change javadoc to a style Eclipse formatter can handle. Transplanted to both versions of the client Grid widget. commit 6033e13c20b3d6e8b6f5add0f786d5ab2e1bb3fe - Make initially disabled grid work when enabled. Transplanted to both client side modules. commit a2d6e4fb4b1fd13e9a1b88f2ab1b78d14d8b64a9 - Use requestAnimationFrame when scrolling in Grid. Transplanted to both client side modules. commit fe9438e7b77c606855cfd739dd7e30b3f8cd4165 - Specify branch also for Sampler. Is not applicable for master branch. commit 1ec5d8ef7cb8bbd82bae1c9b79a376a5dca28f48 - Update to Chrome 53. Is already there. commit 961851bfbc4844474299433c34af6c9e4323d891 - Updated link to new step 1 video in tutorial. Is already there. commit 41dc2fe1611adc70d00e6f77debb2a6d4dcdefb0 - Revert "Use widget set specified by init parameter. Transplanted to the one UIProvider class. commit 092b4f7f3192555fe3ae22ac03a89ac2ada2a2dd - Use widget set specified by init parameter. Transplanted to the common server side classes. commit 977cec7e3107c2da306d46449dbf32f6544313be - Fix widget set builder to create widget set in correct location. Transplanted to the one ClassPathExplorer class file. commit 6c12ad89ea1064cd4cc0456baca5ee00ae76d032 - Format project pom files using correct settings. Is not transplanted: only formatting changes for POM files. commit 0aad93ecc1ce743dffc093ce7ae2ef88831f6073 - Add tests for widgetset compilation in different modes. Transplanted. New test projects. commit 0a3a1ef8321ed421be2337034fdb1cae2c434c3d - Use versions-maven-plugin 2.3 to avoid NPE while setting project version. Is already there. Change-Id: Ie3a5088f25de1772f01ea30c4a5eba0b169ee0ab
7 years ago
Migrate 7.7.5 branch patches to v8. (#7969) * Prevent adding several scrollbar handlers (#19189). Change-Id: Ib0cc6c6835aab6d263f153362a328bcf2be7bc5c * Prevent adding several scrollbar handlers (#19189). * Keep expand ratio for last row/column when reducing grid layout size (#20297) Change-Id: Iff53a803596f4fc1eae8e4bfa307b9c1f4df961a * Fixed drag and drop failure when message dragged from email client (#20451) When dragging message form email client on Windows, item.webkitGetAsEntry() might return null creating NPE on the client side. Added additional checks for this situation. Change-Id: I569f7e6d0d7b137f24be53d1fbce384695ae8c73 * Change expected pre-release version number pattern in publish report Change-Id: Icdacecc490d2490ea9e262f5c5736c1dece2a89d * Mark TextField/TextArea as busy when a text change event is pending (#20469) Change-Id: I404985ae0be1e7dc65171b610032f8649e700f50 # Conflicts: # client/src/main/java/com/vaadin/client/ui/VTextField.java # uitest/src/main/java/com/vaadin/tests/components/textfield/TextChangeEvents.java * Fixed touch scrolling issue in Surface and WP devices (#18737) Fixed by using pointerevents instead of touchevents when the browser is IE11, or Edge. Also added touch-action: none; css rules into escalator.css to prevent default touch behaviour on IE11 and Edge. Does not affect IE8 to IE10 browsers, behaviour on those will stay the same as before the fix. No new unit tests since we do not have automatic touch testing possibilities yet. Please test manually with Surface: IE11 and Edge, use for example uitest: com.vaadin.tests.components.grid.basics.GridBasicsomponents.grid.basics.GridBasics Change-Id: Iddbf1852e6ffafc855f749d6f4ebb235ed0f5703 * Add lazy/simple resize mode to Grid (#20108) Change-Id: I47427efc28c350382dba8c1f50fd332a3f4585e4 # Conflicts: # client/src/main/java/com/vaadin/client/connectors/GridConnector.java # client/src/main/java/com/vaadin/client/widgets/Grid.java # server/src/main/java/com/vaadin/ui/Grid.java # shared/src/main/java/com/vaadin/shared/ui/grid/GridState.java # themes/src/main/themes/VAADIN/themes/base/grid/grid.scss # uitest/src/main/java/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeatures.java Change-Id: Ieca56121875198ed559a41c143b28926e2695433 * Fix NPE in case some items don't contain all properties of Grid. This could occur in when parent is a different entity than its children in hierarchical data. Change-Id: Icd53b5b5e5544a3680d0cd99702ab78224b2dc08 # Conflicts: # server/src/main/java/com/vaadin/data/fieldgroup/FieldGroup.java # server/src/main/java/com/vaadin/ui/Grid.java * Mark TextField/TextArea as busy when a text change event is pending (#20469) Change-Id: I404985ae0be1e7dc65171b610032f8649e700f50 # Conflicts: # client/src/main/java/com/vaadin/client/ui/VTextField.java # uitest/src/test/java/com/vaadin/tests/components/textfield/TextChangeEventsTest.java * Add lazy/simple resize mode to Grid (#20108) Change-Id: I47427efc28c350382dba8c1f50fd332a3f4585e4 * Removed V8 VTextField unused import, forgotten @RunLocally. * Don't rely on selenium "sendKeys" behavior. * Revert "Change expected pre-release version number pattern in publish report" This reverts commit 8df27b952dddb691aead6a633c5b3724c98bf343. * Migrate TextField/TextArea patch from 7.7 to master (modern components) Mark TextField/TextArea as busy when a text change event is pending (#20469) Change-Id: I404985ae0be1e7dc65171b610032f8649e700f50
7 years ago
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. }