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.

OrderedLayoutCases.java 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. package com.vaadin.tests.components.orderedlayout;
  2. import java.lang.reflect.Field;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. import com.vaadin.annotations.Theme;
  7. import com.vaadin.server.VaadinRequest;
  8. import com.vaadin.tests.components.AbstractReindeerTestUI;
  9. import com.vaadin.tests.util.TestUtils;
  10. import com.vaadin.ui.AbstractOrderedLayout;
  11. import com.vaadin.ui.Alignment;
  12. import com.vaadin.ui.Button;
  13. import com.vaadin.ui.Button.ClickEvent;
  14. import com.vaadin.ui.Button.ClickListener;
  15. import com.vaadin.ui.Component;
  16. import com.vaadin.ui.HorizontalLayout;
  17. import com.vaadin.ui.VerticalLayout;
  18. import com.vaadin.v7.data.Property.ValueChangeEvent;
  19. import com.vaadin.v7.data.Property.ValueChangeListener;
  20. import com.vaadin.v7.ui.NativeSelect;
  21. @Theme("tests-components")
  22. public class OrderedLayoutCases extends AbstractReindeerTestUI {
  23. private static final String[] dimensionValues = { "-1px", "5px", "350px",
  24. "800px", "100%", "50%" };
  25. private static class SampleChild extends VerticalLayout {
  26. public SampleChild(int i) {
  27. addStyleName("sampleChild");
  28. addStyleName("sampleChild" + i);
  29. addComponent(createSimpleSelector("Child width",
  30. new ValueChangeListener() {
  31. @Override
  32. public void valueChange(ValueChangeEvent event) {
  33. setWidth(event.getProperty().getValue().toString());
  34. }
  35. }, dimensionValues));
  36. addComponent(createSimpleSelector("Child height",
  37. new ValueChangeListener() {
  38. @Override
  39. public void valueChange(ValueChangeEvent event) {
  40. setHeight(
  41. event.getProperty().getValue().toString());
  42. }
  43. }, dimensionValues));
  44. addComponent(
  45. createSimpleSelector("Caption", new ValueChangeListener() {
  46. @Override
  47. public void valueChange(ValueChangeEvent event) {
  48. String value = event.getProperty().getValue()
  49. .toString();
  50. if (value.isEmpty()) {
  51. setCaption(null);
  52. } else if (value.equals("Long")) {
  53. setCaption(
  54. "A rather long caption just to see what happens");
  55. } else {
  56. setCaption(value);
  57. }
  58. }
  59. }, "", "Short", "Long"));
  60. addComponent(createSimpleSelector("Expand ratio",
  61. new ValueChangeListener() {
  62. @Override
  63. public void valueChange(ValueChangeEvent event) {
  64. AbstractOrderedLayout parent = (AbstractOrderedLayout) getParent();
  65. if (parent == null) {
  66. return;
  67. }
  68. String value = event.getProperty().getValue()
  69. .toString();
  70. parent.setExpandRatio(SampleChild.this,
  71. Float.parseFloat(value));
  72. }
  73. }, "0", "1", "2"));
  74. // Why is Alignment not an enum? Now we have to use reflection just
  75. // to get the different values as hardcoding is never an option! ;)
  76. List<String> alignmentValues = new ArrayList<>();
  77. Field[] fields = Alignment.class.getDeclaredFields();
  78. for (Field field : fields) {
  79. if (field.getType() == Alignment.class) {
  80. alignmentValues.add(field.getName());
  81. }
  82. }
  83. addComponent(createSimpleSelector("Alignment",
  84. new ValueChangeListener() {
  85. @Override
  86. public void valueChange(ValueChangeEvent event) {
  87. String value = event.getProperty().getValue()
  88. .toString();
  89. AlignmentHandler parent = (AlignmentHandler) getParent();
  90. if (parent == null) {
  91. return;
  92. }
  93. try {
  94. Field field = Alignment.class
  95. .getDeclaredField(value);
  96. Alignment alignment = (Alignment) field
  97. .get(null);
  98. parent.setComponentAlignment(SampleChild.this,
  99. alignment);
  100. } catch (Exception e) {
  101. throw new RuntimeException(e);
  102. }
  103. }
  104. }, alignmentValues, "TOP_LEFT")); // Sorry for not using
  105. // more reflection magic
  106. // just to find the
  107. // default value...
  108. }
  109. }
  110. private AbstractOrderedLayout currentLayout;
  111. private HorizontalLayout sizeBar;
  112. @Override
  113. protected void setup(VaadinRequest request) {
  114. TestUtils.injectCSS(getUI(),
  115. ".sampleChild, .theLayout {border: 1px solid black;}"
  116. + ".sampleChild1 {background: aqua;}"
  117. + ".sampleChild2 {background: yellow;}"
  118. + ".sampleChild3 {background: lightgrey;}");
  119. currentLayout = new HorizontalLayout();
  120. for (int i = 0; i < 3; i++) {
  121. currentLayout.addComponent(new SampleChild(i + 1));
  122. }
  123. sizeBar = new HorizontalLayout();
  124. sizeBar.setSpacing(true);
  125. sizeBar.addComponent(
  126. createSimpleSelector("Layout width", new ValueChangeListener() {
  127. @Override
  128. public void valueChange(ValueChangeEvent event) {
  129. currentLayout.setWidth(
  130. event.getProperty().getValue().toString());
  131. }
  132. }, dimensionValues));
  133. sizeBar.addComponent(createSimpleSelector("Layout height",
  134. new ValueChangeListener() {
  135. @Override
  136. public void valueChange(ValueChangeEvent event) {
  137. currentLayout.setHeight(
  138. event.getProperty().getValue().toString());
  139. }
  140. }, dimensionValues));
  141. sizeBar.addComponent(
  142. createSimpleSelector("Spacing", new ValueChangeListener() {
  143. @Override
  144. public void valueChange(ValueChangeEvent event) {
  145. currentLayout.setSpacing(Boolean.parseBoolean(
  146. event.getProperty().getValue().toString()));
  147. }
  148. }, "false", "true"));
  149. sizeBar.addComponent(
  150. createSimpleSelector("Margin", new ValueChangeListener() {
  151. @Override
  152. public void valueChange(ValueChangeEvent event) {
  153. currentLayout.setMargin(Boolean.parseBoolean(
  154. event.getProperty().getValue().toString()));
  155. }
  156. }, "false", "true"));
  157. sizeBar.addComponent(
  158. createSimpleSelector("Direction", new ValueChangeListener() {
  159. @Override
  160. public void valueChange(ValueChangeEvent event) {
  161. Object value = event.getProperty().getValue();
  162. AbstractOrderedLayout newLayout;
  163. if (value.equals("Horizontal")) {
  164. newLayout = new HorizontalLayout();
  165. } else {
  166. newLayout = new VerticalLayout();
  167. }
  168. while (currentLayout.getComponentCount() > 0) {
  169. Component child = currentLayout.getComponent(0);
  170. Alignment alignment = currentLayout
  171. .getComponentAlignment(child);
  172. float expRatio = currentLayout
  173. .getExpandRatio(child);
  174. newLayout.addComponent(child);
  175. newLayout.setExpandRatio(child, expRatio);
  176. newLayout.setComponentAlignment(child, alignment);
  177. }
  178. newLayout.setStyleName("theLayout");
  179. newLayout.setHeight(currentLayout.getHeight(),
  180. currentLayout.getHeightUnits());
  181. newLayout.setWidth(currentLayout.getWidth(),
  182. currentLayout.getWidthUnits());
  183. newLayout.setMargin(currentLayout.getMargin());
  184. newLayout.setSpacing(currentLayout.isSpacing());
  185. getLayout().replaceComponent(currentLayout, newLayout);
  186. getLayout().setExpandRatio(newLayout, 1);
  187. currentLayout = newLayout;
  188. }
  189. }, "Horizontal", "Vertical"));
  190. HorizontalLayout caseBar = new HorizontalLayout();
  191. caseBar.addComponent(
  192. new Button("Undefined without relative", new ClickListener() {
  193. @Override
  194. public void buttonClick(ClickEvent event) {
  195. resetState();
  196. setState(sizeBar, 2, 1);
  197. // width: 350px to middle child
  198. setChildState(1, 0, 2);
  199. // middle center allign to middle child
  200. setChildState(1, 4, 5);
  201. // long captions to right child
  202. setChildState(2, 2, 2);
  203. }
  204. }));
  205. caseBar.addComponent(
  206. new Button("Undefined with relative", new ClickListener() {
  207. @Override
  208. public void buttonClick(ClickEvent event) {
  209. resetState();
  210. // width: 100% to middle child
  211. setChildState(1, 0, 4);
  212. }
  213. }));
  214. caseBar.addComponent(
  215. new Button("Fixed with overflow", new ClickListener() {
  216. @Override
  217. public void buttonClick(ClickEvent event) {
  218. resetState();
  219. // layout width: 350px
  220. setState(sizeBar, 0, 2);
  221. // layout margin enabled
  222. setState(sizeBar, 3, 1);
  223. }
  224. }));
  225. caseBar.addComponent(
  226. new Button("Fixed with extra space", new ClickListener() {
  227. @Override
  228. public void buttonClick(ClickEvent event) {
  229. resetState();
  230. // Layout width: 800px
  231. setState(sizeBar, 0, 3);
  232. // layout margin enabled
  233. setState(sizeBar, 3, 1);
  234. // width: 350px to middle child
  235. setChildState(1, 0, 2);
  236. // short caption for middle child
  237. setChildState(1, 2, 1);
  238. // top center align for middle child
  239. setChildState(1, 4, 2);
  240. }
  241. }));
  242. caseBar.addComponent(
  243. new Button("Expand with alignment", new ClickListener() {
  244. @Override
  245. public void buttonClick(ClickEvent event) {
  246. resetState();
  247. // Layout width: 800px
  248. setState(sizeBar, 0, 3);
  249. // Layout height: 350px
  250. setState(sizeBar, 1, 2);
  251. // Expand: 1 to middle child
  252. setChildState(1, 3, 1);
  253. // Align bottom left to middle child
  254. setChildState(1, 4, 6);
  255. // Long caption to middle child
  256. setChildState(1, 2, 2);
  257. }
  258. }));
  259. caseBar.addComponent(
  260. new Button("Multiple expands", new ClickListener() {
  261. @Override
  262. public void buttonClick(ClickEvent event) {
  263. resetState();
  264. // Layout width: 800px
  265. setState(sizeBar, 0, 3);
  266. // Layout height: 350px
  267. setState(sizeBar, 1, 2);
  268. // Long caption to left child
  269. setChildState(0, 2, 2);
  270. // Width 350px to middle child
  271. setChildState(1, 0, 2);
  272. // Apply to left and middle child
  273. for (int i = 0; i < 2; i++) {
  274. // Expand: 1
  275. setChildState(i, 3, 1);
  276. // Align: middle center
  277. setChildState(i, 4, 5);
  278. }
  279. }
  280. }));
  281. caseBar.addComponent(
  282. new Button("Fixed + relative height", new ClickListener() {
  283. @Override
  284. public void buttonClick(ClickEvent event) {
  285. resetState();
  286. // Layout height: 100%
  287. setState(sizeBar, 1, 4);
  288. // Height: 350px to left child
  289. setChildState(0, 1, 2);
  290. // Height: 100% to middle child
  291. setChildState(1, 1, 4);
  292. // Short caption to middle child
  293. setChildState(1, 2, 1);
  294. // Alignment: bottom left to right child
  295. setChildState(2, 4, 7);
  296. }
  297. }));
  298. caseBar.addComponent(
  299. new Button("Undefined + relative height", new ClickListener() {
  300. @Override
  301. public void buttonClick(ClickEvent event) {
  302. resetState();
  303. // Height: 350px to left child
  304. setChildState(0, 1, 2);
  305. // Short caption to left child
  306. setChildState(0, 2, 1);
  307. // Height: 100% to middle child
  308. setChildState(1, 1, 4);
  309. }
  310. }));
  311. caseBar.addComponent(
  312. new Button("Undefined + alignments", new ClickListener() {
  313. @Override
  314. public void buttonClick(ClickEvent event) {
  315. resetState();
  316. // Height: 350px to left child
  317. setChildState(0, 1, 2);
  318. // Short caption to left child
  319. setChildState(0, 2, 1);
  320. // Alignment: bottom left to right child
  321. setChildState(2, 4, 7);
  322. }
  323. }));
  324. caseBar.addComponent(new Button("Relative child without expand",
  325. new ClickListener() {
  326. @Override
  327. public void buttonClick(ClickEvent event) {
  328. resetState();
  329. // Width 800px
  330. setState(sizeBar, 0, 3);
  331. // First child 100% wide
  332. setChildState(0, 0, 4);
  333. // Second child expand 1
  334. setChildState(1, 3, 1);
  335. }
  336. }));
  337. /*
  338. * Hidden for not to avoid changing screenshots, functionality is still
  339. * available by adding case=9 to the query string...
  340. */
  341. caseBar.getComponent(9).setVisible(false);
  342. caseBar.setSpacing(true);
  343. addComponent(caseBar);
  344. addComponent(sizeBar);
  345. addComponent(currentLayout);
  346. getLayout().setSpacing(true);
  347. getContent().setSizeFull();
  348. getLayout().setSizeFull();
  349. getLayout().setExpandRatio(currentLayout, 1);
  350. String caseParameter = request.getParameter("case");
  351. if (caseParameter != null) {
  352. int caseIndex = Integer.parseInt(caseParameter);
  353. Button button = (Button) caseBar.getComponent(caseIndex);
  354. button.click();
  355. }
  356. }
  357. private void resetState() {
  358. for (int i = 0; i < sizeBar.getComponentCount(); i++) {
  359. setState(sizeBar, i, 0);
  360. }
  361. for (int i = 0; i < 3; i++) {
  362. // Child width and height -> -1px
  363. SampleChild child = (SampleChild) currentLayout.getComponent(i);
  364. for (int j = 0; j < child.getComponentCount(); j++) {
  365. if (j == 4) {
  366. setState(child, j, 1);
  367. } else {
  368. setState(child, j, 0);
  369. }
  370. }
  371. }
  372. }
  373. private void setChildState(int childIndex, int selectIndex,
  374. int valueIndex) {
  375. Component child = currentLayout.getComponent(childIndex);
  376. setState(child, selectIndex, valueIndex);
  377. }
  378. private static void setState(Component container, int selectIndex,
  379. int value) {
  380. NativeSelect select = (NativeSelect) ((AbstractOrderedLayout) container)
  381. .getComponent(selectIndex);
  382. select.setValue(new ArrayList<Object>(select.getItemIds()).get(value));
  383. }
  384. private static NativeSelect createSimpleSelector(String caption,
  385. ValueChangeListener listener, String... values) {
  386. return createSimpleSelector(caption, listener, Arrays.asList(values),
  387. values[0]);
  388. }
  389. private static NativeSelect createSimpleSelector(String caption,
  390. ValueChangeListener listener, List<String> values,
  391. String defaultValue) {
  392. NativeSelect selector = new NativeSelect(caption, values);
  393. selector.setNullSelectionAllowed(false);
  394. selector.setImmediate(true);
  395. selector.addListener(listener);
  396. selector.setValue(defaultValue);
  397. return selector;
  398. }
  399. @Override
  400. protected Integer getTicketNumber() {
  401. return null;
  402. }
  403. @Override
  404. protected String getTestDescription() {
  405. return "Tester application for exploring how Horizontal/VerticalLayout reacts to various settings ";
  406. }
  407. }