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.

ResizeTerrorizerControlConnector.java 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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.tests.widgetset.client;
  17. import java.util.Arrays;
  18. import com.google.gwt.animation.client.AnimationScheduler;
  19. import com.google.gwt.animation.client.AnimationScheduler.AnimationCallback;
  20. import com.google.gwt.event.dom.client.ClickEvent;
  21. import com.google.gwt.event.dom.client.ClickHandler;
  22. import com.google.gwt.event.dom.client.KeyCodes;
  23. import com.google.gwt.event.dom.client.KeyUpEvent;
  24. import com.google.gwt.event.dom.client.KeyUpHandler;
  25. import com.google.gwt.event.logical.shared.ValueChangeEvent;
  26. import com.google.gwt.event.logical.shared.ValueChangeHandler;
  27. import com.google.gwt.event.shared.HandlerRegistration;
  28. import com.google.gwt.user.client.History;
  29. import com.google.gwt.user.client.ui.Button;
  30. import com.google.gwt.user.client.ui.FlowPanel;
  31. import com.google.gwt.user.client.ui.IntegerBox;
  32. import com.google.gwt.user.client.ui.Label;
  33. import com.google.gwt.user.client.ui.RequiresResize;
  34. import com.vaadin.client.ui.AbstractComponentConnector;
  35. import com.vaadin.client.ui.PostLayoutListener;
  36. import com.vaadin.shared.AbstractComponentState;
  37. import com.vaadin.shared.Connector;
  38. import com.vaadin.shared.annotations.DelegateToWidget;
  39. import com.vaadin.shared.ui.Connect;
  40. import com.vaadin.tests.util.ResizeTerrorizer;
  41. @Connect(ResizeTerrorizer.ResizeTerrorizerControl.class)
  42. public class ResizeTerrorizerControlConnector extends AbstractComponentConnector
  43. implements PostLayoutListener {
  44. public static class ResizeTerorrizerState extends AbstractComponentState {
  45. public Connector target;
  46. public int defaultWidthOffset = 200;
  47. public int defaultHeightOffset = 200;
  48. @DelegateToWidget
  49. public boolean useUriFragments = true;
  50. }
  51. public class ResizeTerrorizerControlPanel extends FlowPanel {
  52. private Label results = new Label("Results");
  53. private IntegerBox startWidth = new IntegerBox();
  54. private IntegerBox endWidth = new IntegerBox();
  55. private IntegerBox startHeight = new IntegerBox();
  56. private IntegerBox endHeight = new IntegerBox();
  57. private final Button terrorizeButton = new Button("Terrorize",
  58. new ClickHandler() {
  59. @Override
  60. public void onClick(ClickEvent event) {
  61. terrorize(startWidth.getValue(), endWidth.getValue(),
  62. startHeight.getValue(), endHeight.getValue(),
  63. 1000);
  64. }
  65. });
  66. private HandlerRegistration historyHandlerRegistration;
  67. public ResizeTerrorizerControlPanel() {
  68. add(new Label("Start width"));
  69. add(startWidth);
  70. add(new Label("End width"));
  71. add(endWidth);
  72. add(new Label("Start height"));
  73. add(startHeight);
  74. add(new Label("End height"));
  75. add(endHeight);
  76. add(terrorizeButton);
  77. add(results);
  78. startWidth.getElement().setId("terror-start-width");
  79. endWidth.getElement().setId("terror-end-width");
  80. terrorizeButton.getElement().setId("terror-button");
  81. results.getElement().setId("terror-results");
  82. // Emulate button click from enter on any of the text boxes
  83. for (IntegerBox box : Arrays.asList(startWidth, endWidth,
  84. startHeight, endHeight)) {
  85. box.addKeyUpHandler(new KeyUpHandler() {
  86. @Override
  87. public void onKeyUp(KeyUpEvent event) {
  88. if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
  89. terrorizeButton.click();
  90. }
  91. }
  92. });
  93. }
  94. }
  95. private void showResults(String results) {
  96. Integer temp = startWidth.getValue();
  97. startWidth.setValue(endWidth.getValue());
  98. endWidth.setValue(temp);
  99. temp = startHeight.getValue();
  100. startHeight.setValue(endHeight.getValue());
  101. endHeight.setValue(temp);
  102. this.results.setText(results);
  103. if (historyHandlerRegistration != null) {
  104. upateHistoryToken();
  105. }
  106. }
  107. public void setUseUriFragments(boolean useUriFragments) {
  108. if (useUriFragments && historyHandlerRegistration == null) {
  109. // First read current state
  110. updateFromHistoryToken(History.getToken());
  111. // Then add history change listener
  112. historyHandlerRegistration = History.addValueChangeHandler(
  113. new ValueChangeHandler<String>() {
  114. @Override
  115. public void onValueChange(
  116. ValueChangeEvent<String> event) {
  117. updateFromHistoryToken(event.getValue());
  118. }
  119. });
  120. } else if (!useUriFragments && historyHandlerRegistration != null) {
  121. historyHandlerRegistration.removeHandler();
  122. historyHandlerRegistration = null;
  123. }
  124. }
  125. private void updateFromHistoryToken(String token) {
  126. if (token == null || token.isEmpty()) {
  127. return;
  128. }
  129. String[] parts = token.split(",");
  130. if (parts.length != 4) {
  131. results.setText("Unsupported history token format: " + token);
  132. return;
  133. }
  134. try {
  135. startWidth.setValue(new Integer(parts[0]));
  136. endWidth.setValue(new Integer(parts[1]));
  137. startHeight.setValue(new Integer(parts[2]));
  138. endHeight.setValue(new Integer(parts[3]));
  139. } catch (NumberFormatException e) {
  140. results.setText("Number format problem: " + e.getMessage());
  141. }
  142. }
  143. private void upateHistoryToken() {
  144. String token = startWidth.getValue().intValue() + ","
  145. + endWidth.getValue().intValue() + ","
  146. + startHeight.getValue().intValue() + ","
  147. + endHeight.getValue().intValue();
  148. History.newItem(token, false);
  149. }
  150. }
  151. private void terrorize(final double startWidth, final double endWidth,
  152. final double startHeight, final double endHeight,
  153. final double duration) {
  154. final AbstractComponentConnector target = getTarget();
  155. final AnimationScheduler scheduler = AnimationScheduler.get();
  156. AnimationCallback callback = new AnimationCallback() {
  157. double startTime = -1;
  158. int frameCount = 0;
  159. @Override
  160. public void execute(double timestamp) {
  161. frameCount++;
  162. boolean done = false;
  163. if (startTime == -1) {
  164. startTime = timestamp;
  165. }
  166. double time = timestamp - startTime;
  167. if (time > duration) {
  168. time = duration;
  169. done = true;
  170. }
  171. double progress = time / duration;
  172. double widthToSet = startWidth
  173. + (endWidth - startWidth) * progress;
  174. double heightToSet = startHeight
  175. + (endHeight - startHeight) * progress;
  176. if (widthToSet != startWidth) {
  177. target.getWidget().setWidth(widthToSet + "px");
  178. }
  179. if (heightToSet != startHeight) {
  180. target.getWidget().setHeight(heightToSet + "px");
  181. }
  182. // TODO Optionally inform LayoutManager as well
  183. if (target.getWidget() instanceof RequiresResize) {
  184. ((RequiresResize) target.getWidget()).onResize();
  185. }
  186. if (!done) {
  187. scheduler.requestAnimationFrame(this);
  188. } else {
  189. double fps = Math.round(frameCount / (duration / 1000));
  190. String results = frameCount + " frames, " + fps + " fps";
  191. getWidget().showResults(results);
  192. }
  193. }
  194. };
  195. scheduler.requestAnimationFrame(callback);
  196. }
  197. private AbstractComponentConnector getTarget() {
  198. return (AbstractComponentConnector) getState().target;
  199. }
  200. @Override
  201. public ResizeTerorrizerState getState() {
  202. return (ResizeTerorrizerState) super.getState();
  203. }
  204. @Override
  205. public ResizeTerrorizerControlPanel getWidget() {
  206. return (ResizeTerrorizerControlPanel) super.getWidget();
  207. }
  208. @Override
  209. protected ResizeTerrorizerControlPanel createWidget() {
  210. return new ResizeTerrorizerControlPanel();
  211. }
  212. @Override
  213. public void postLayout() {
  214. if (getWidget().startWidth.getValue() == null) {
  215. int width = getTarget().getWidget().getElement().getOffsetWidth();
  216. getWidget().startWidth.setValue(width);
  217. getWidget().endWidth
  218. .setValue(width + getState().defaultWidthOffset);
  219. }
  220. if (getWidget().startHeight.getValue() == null) {
  221. int height = getTarget().getWidget().getElement().getOffsetHeight();
  222. getWidget().startHeight.setValue(height);
  223. getWidget().endHeight
  224. .setValue(height + getState().defaultHeightOffset);
  225. }
  226. }
  227. }