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.

UriFragmentUtility.java 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. @ITMillApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.ui;
  5. import java.io.Serializable;
  6. import java.lang.reflect.Method;
  7. import java.util.Map;
  8. import com.vaadin.terminal.PaintException;
  9. import com.vaadin.terminal.PaintTarget;
  10. import com.vaadin.terminal.gwt.client.ui.VUriFragmentUtility;
  11. /**
  12. * Experimental web browser dependent component for URI fragment (part after
  13. * hash mark "#") reading and writing.
  14. *
  15. * Component can be used to workaround common ajax web applications pitfalls:
  16. * bookmarking a program state and back button.
  17. *
  18. */
  19. @SuppressWarnings("serial")
  20. @ClientWidget(value = VUriFragmentUtility.class, lazyLoad = false)
  21. public class UriFragmentUtility extends AbstractComponent {
  22. /**
  23. * Listener that listens changes in URI fragment.
  24. */
  25. public interface FragmentChangedListener extends Serializable {
  26. public void fragmentChanged(FragmentChangedEvent source);
  27. }
  28. /**
  29. * Event fired when uri fragment changes.
  30. */
  31. public class FragmentChangedEvent extends Component.Event {
  32. /**
  33. * Creates a new instance of UriFragmentReader change event.
  34. *
  35. * @param source
  36. * the Source of the event.
  37. */
  38. public FragmentChangedEvent(Component source) {
  39. super(source);
  40. }
  41. /**
  42. * Gets the UriFragmentReader where the event occurred.
  43. *
  44. * @return the Source of the event.
  45. */
  46. public UriFragmentUtility getUriFragmentUtility() {
  47. return (UriFragmentUtility) getSource();
  48. }
  49. }
  50. private static final Method FRAGMENT_CHANGED_METHOD;
  51. static {
  52. try {
  53. FRAGMENT_CHANGED_METHOD = FragmentChangedListener.class
  54. .getDeclaredMethod("fragmentChanged",
  55. new Class[] { FragmentChangedEvent.class });
  56. } catch (final java.lang.NoSuchMethodException e) {
  57. // This should never happen
  58. throw new java.lang.RuntimeException(
  59. "Internal error finding methods in FragmentChangedListener");
  60. }
  61. }
  62. public void addListener(FragmentChangedListener listener) {
  63. addListener(FragmentChangedEvent.class, listener,
  64. FRAGMENT_CHANGED_METHOD);
  65. }
  66. public void removeListener(FragmentChangedListener listener) {
  67. removeListener(FragmentChangedEvent.class, listener,
  68. FRAGMENT_CHANGED_METHOD);
  69. }
  70. private String fragment;
  71. public UriFragmentUtility() {
  72. // immediate by default
  73. setImmediate(true);
  74. }
  75. @Override
  76. public void paintContent(PaintTarget target) throws PaintException {
  77. super.paintContent(target);
  78. target.addVariable(this, "fragment", fragment);
  79. }
  80. @Override
  81. public void changeVariables(Object source, Map variables) {
  82. super.changeVariables(source, variables);
  83. fragment = (String) variables.get("fragment");
  84. fireEvent(new FragmentChangedEvent(this));
  85. }
  86. /**
  87. * Gets currently set URI fragment.
  88. * <p>
  89. * To listen changes in fragment, hook a {@link FragmentChangedListener}.
  90. * <p>
  91. * Note that initial URI fragment that user used to enter the application
  92. * will be read after application init. It fires FragmentChangedEvent only
  93. * if it is not the same as on server side.
  94. *
  95. * @return the current fragment in browser uri or null if not known
  96. */
  97. public String getFragment() {
  98. return fragment;
  99. }
  100. /**
  101. * Sets URI fragment. Optionally fires a {@link FragmentChangedEvent}
  102. *
  103. * @param newFragment
  104. * id of the new fragment
  105. * @param fireEvent
  106. * true to fire event
  107. * @see FragmentChangedEvent
  108. * @see FragmentChangedListener
  109. */
  110. public void setFragment(String newFragment, boolean fireEvent) {
  111. if ((newFragment == null && fragment != null)
  112. || (newFragment != null && !newFragment.equals(fragment))) {
  113. fragment = newFragment;
  114. if (fireEvent) {
  115. fireEvent(new FragmentChangedEvent(this));
  116. }
  117. requestRepaint();
  118. }
  119. }
  120. /**
  121. * Sets URI fragment. This method fires a {@link FragmentChangedEvent}
  122. *
  123. * @param newFragment
  124. * id of the new fragment
  125. * @see FragmentChangedEvent
  126. * @see FragmentChangedListener
  127. */
  128. public void setFragment(String newFragment) {
  129. setFragment(newFragment, true);
  130. }
  131. }