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.5KB

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