Package muntjac :: Package ui :: Module uri_fragment_utility
[hide private]
[frames] | no frames]

Source Code for Module muntjac.ui.uri_fragment_utility

  1  # Copyright (C) 2012 Vaadin Ltd.  
  2  # Copyright (C) 2012 Richard Lincoln 
  3  #  
  4  # Licensed under the Apache License, Version 2.0 (the "License");  
  5  # you may not use this file except in compliance with the License.  
  6  # You may obtain a copy of 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,  
 12  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
 13  # See the License for the specific language governing permissions and  
 14  # limitations under the License. 
 15   
 16  from muntjac.ui.abstract_component import AbstractComponent 
 17  from muntjac.ui.component import Event as ComponentEvent 
 18   
 19   
20 -class IFragmentChangedListener(object):
21 """Listener that listens changes in URI fragment.""" 22
23 - def fragmentChanged(self, source):
24 raise NotImplementedError
25 26 27 _FRAGMENT_CHANGED_METHOD = getattr(IFragmentChangedListener, 'fragmentChanged') 28 29
30 -class UriFragmentUtility(AbstractComponent):
31 """Experimental web browser dependent component for URI fragment (part 32 after hash mark "#") reading and writing. 33 34 Component can be used to workaround common ajax web applications pitfalls: 35 bookmarking a program state and back button. 36 """ 37 38 CLIENT_WIDGET = None #ClientWidget(VUriFragmentUtility, LoadStyle.EAGER) 39 40
41 - def addListener(self, listener, iface=None):
42 if (isinstance(listener, IFragmentChangedListener) and 43 (iface is None or issubclass(iface, IFragmentChangedListener))): 44 self.registerListener(FragmentChangedEvent, 45 listener, _FRAGMENT_CHANGED_METHOD) 46 47 super(UriFragmentUtility, self).addListener(listener, iface)
48 49
50 - def addCallback(self, callback, eventType=None, *args):
51 if eventType is None: 52 eventType = callback._eventType 53 54 if issubclass(eventType, FragmentChangedEvent): 55 self.registerCallback(FragmentChangedEvent, callback, None, *args) 56 else: 57 super(UriFragmentUtility, self).addCallback(callback, 58 eventType, *args)
59 60
61 - def removeListener(self, listener, iface=None):
62 if (isinstance(listener, IFragmentChangedListener) and 63 (iface is None or issubclass(iface, IFragmentChangedListener))): 64 self.withdrawListener(FragmentChangedEvent, 65 listener, _FRAGMENT_CHANGED_METHOD) 66 67 super(UriFragmentUtility, self).removeListener(listener, iface)
68 69
70 - def removeCallback(self, callback, eventType=None):
71 if eventType is None: 72 eventType = callback._eventType 73 74 if issubclass(eventType, FragmentChangedEvent): 75 self.withdrawCallback(FragmentChangedEvent, callback) 76 else: 77 super(UriFragmentUtility, self).removeCallback(callback, eventType)
78 79
80 - def __init__(self):
81 super(UriFragmentUtility, self).__init__() 82 83 self._fragment = None 84 85 # immediate by default 86 self.setImmediate(True)
87 88
89 - def paintContent(self, target):
90 super(UriFragmentUtility, self).paintContent(target) 91 value = self._fragment if self._fragment is not None else '' 92 target.addVariable(self, 'fragment', value)
93 94
95 - def changeVariables(self, source, variables):
96 super(UriFragmentUtility, self).changeVariables(source, variables) 97 self._fragment = variables.get('fragment') 98 self.fireEvent( FragmentChangedEvent(self) )
99 100
101 - def getFragment(self):
102 """Gets currently set URI fragment. 103 104 To listen changes in fragment, hook a L{IFragmentChangedListener}. 105 106 Note that initial URI fragment that user used to enter the application 107 will be read after application init. It fires FragmentChangedEvent 108 only if it is not the same as on server side. 109 110 @return: the current fragment in browser uri or null if not known 111 """ 112 return self._fragment
113 114
115 - def setFragment(self, newFragment, fireEvent=True):
116 """Sets URI fragment. Optionally fires a L{FragmentChangedEvent} 117 118 @param newFragment: 119 id of the new fragment 120 @param fireEvent: 121 true to fire event 122 @see: L{FragmentChangedEvent} 123 @see: L{IFragmentChangedListener} 124 """ 125 if ((newFragment is None and self._fragment is not None) 126 or (newFragment is not None 127 and newFragment != self._fragment)): 128 self._fragment = newFragment 129 if fireEvent: 130 fireEvent( FragmentChangedEvent(self) ) 131 132 self.requestRepaint()
133 134
135 -class FragmentChangedEvent(ComponentEvent):
136 """Event fired when uri fragment changes.""" 137
138 - def __init__(self, source):
139 """Creates a new instance of UriFragmentReader change event. 140 141 @param source: 142 the Source of the event. 143 """ 144 super(FragmentChangedEvent, self).__init__(source)
145 146
147 - def getUriFragmentUtility(self):
148 """Gets the UriFragmentReader where the event occurred. 149 150 @return: the Source of the event. 151 """ 152 return self.getSource()
153