def __init__(self, ):
     self.__init__._super()
     outer = VerticalPanel()
     outer.add(self.getLoader())
     result = VerticalPanel()
     result.getElement().setId(u"friendsAreFriendsResult")
     uids1 = ArrayList((Long),)
     uids1.add(self.apiClient.getLoggedInUser())
     uids1.add(Long(751836969))
     uids1.add(Long(708775201))
     uids2 = ArrayList((Long),)
     uids2.add(Long(709281400))
     uids2.add(Long(560635378))
     uids2.add(Long(709281400))
     class _anonymous(AsyncCallback):
         
         @java.typed(Throwable)
         def onFailure(self, caught):
             self.handleFailure(caught)
         
         @java.typed(List)
         def onSuccess(self, friendInfoList):
             outer.clear()
             result.add(HTML(u"Size " + java.str(friendInfoList.size())))
             for fi in friendInfoList:
                 result.add(HTML(java.str(java.str(FbName(fi.getUid1())) + u" friend with " + FbName(fi.getUid2())) + u" ? " + fi.getAreFriends()))
             outer.add(result)
             Xfbml.parse(result.getElement())
     self.apiClient.friendsAreFriends(uids1, uids2, _anonymous())
     self.initWidget(outer)
class Comments_xfbml(Showcase):

    """
    Display facebook comments on the site.
    @author ola
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.outer = VerticalPanel()
        self.fbComments = FbComments(Comments_get.XID)
        self.header = HTML(u"<h3>A comment would be great! Thanks :-)</h3>")
    
    @__init__.register
    @java.typed()
    def __init__(self, ):
        self.__init__._super()
        """
        Create example
        """
        self.outer.getElement().setId(u"xfbml_comments")
        self.outer.add(self.header)
        self.outer.add(self.fbComments)
        Xfbml.parse(self.outer)
        self.initWidget(self.outer)
 def __init__(self, ):
     self.__init__._super()
     outer = VerticalPanel()
     mutualFriends = VerticalPanel()
     mutualFriends.getElement().setId(u"Friends_getMutualFriends-mutualFriends")
     fs = FriendSelector() #  Let the user pick a friends
     class _anonymous(FriendSelectionHandler):
         #  Check if current logged in user has common friends with selected.
         
         @java.typed(Long)
         def onSelected(self, targetUid):
             mutualFriends.clear()
             self.addLoader(mutualFriends)
             class _anonymous(AsyncCallback):
                 
                 @java.typed(Throwable)
                 def onFailure(self, caught):
                     self.handleFailure(caught)
                 
                 @java.typed(List)
                 def onSuccess(self, result):
                     self.removeLoader(mutualFriends)
                     mutualFriends.add(HTML(java.str(u"Number of mutual friends " + java.str(result.size())) + u" with " + FbName(targetUid)))
                     p = ProfilePicsPanel(result)
                     mutualFriends.add(p)
             self.apiClient.friendsGetMutualFriends(targetUid, _anonymous()) #  Call facebook
     fs.addFriendSelectionHandler(_anonymous())
     outer.add(fs)
     outer.add(mutualFriends)
     self.initWidget(outer)
class ProfilePicsPanel(Composite):

    """
    Display Profile Pics in a panel.
    
    CSS Configuration.
    
    <ul>
    <li>.gwittit-ProfilePicsPanel
    <li>.gwittit-ProfilePicsPanel-pics
    </ul>
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.outer = VerticalPanel()
        self.pics = FlowPanel()
        self.seeAllLink = Anchor(u"See All")
        self.PAGE_SIZE = 10
        self.uids = None
    
    @__init__.register
    @java.typed(List)
    def __init__(self, uids):
        self.__init__._super()
        """
        Create a new Panel
        """
        self.uids = uids
        self.outer.getElement().setId(u"ProfilePicsPanel")
        self.pics.getElement().setId(u"ProfilePicsPanel-pics-" + java.str(System.currentTimeMillis()))
        self.outer.addStyleName(u"gwittit-ProfilePicsPanel")
        self.pics.addStyleName(u"gwittit-ProfilePicsPanel-pics")
        self.outer.add(self.pics)
        self.renderProfilePics() #  Add list of fbprofilepics to the pics panel
        if uids.size() > PAGE_SIZE:
            self.outer.add(self.seeAllLink)
        class _anonymous(ClickHandler):
            
            @java.typed(ClickEvent)
            def onClick(self, event):
                popup = ProfilePicsPopup(uids)
                popup.center()
                popup.show()
        self.seeAllLink.addClickHandler(_anonymous())
        Xfbml.parse(self.pics)
        self.initWidget(self.outer)
    
    @java.private
    def renderProfilePics(self):
        i = 0
        while i < PAGE_SIZE and i < self.uids.size():
            i+= 1
            uid = self.uids.get(i)
            profilePic = FbProfilePic(uid, Size.square)
            profilePic.setWidth(u"35px")
            profilePic.setHeight(u"35px")
            self.pics.add(profilePic)
 def __init__(self, ):
     self.__init__._super()
     outer = VerticalPanel()
     outer.getElement().setId(u"WidgetShowcase")
     outer.add(HTML(u"<h3>FbPromptPermission</h3>"))
     promptPerm = FbPromptPermission(u"Click to see create_event, create_note and publish_stream permission dialog", Permission.create_event, Permission.create_note, Permission.publish_stream)
     outer.add(promptPerm)
     Xfbml.parse(outer)
     self.initWidget(outer)
Beispiel #6
0
class LoginBox(Composite):

    """
    Displays a rounded box ( firefox/safari ) with at facebook connect button.
    And a link as backup in case the button is not rendered.
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.outer = VerticalPanel()
        self.inner = HorizontalPanel()
        self.loginButton = FbLoginButton(u"facebookConnectLogin()")
        self.loginLink = Anchor(u"don't see a button? Click here to login")
        self.loginCallback = None
    
    @java.typed(LoginCallback)
    def addLoginCallback(self, loginCallback):
        self.loginCallback = loginCallback
    
    @__init__.register
    @java.typed()
    def __init__(self, ):
        self.__init__._super()
        self.outer.getElement().setId(u"OuterRouter")
        class _anonymous(ClickHandler):
            
            @java.typed(ClickEvent)
            def onClick(self, event):
                class _anonymous(AsyncCallback):
                    
                    @java.typed(Throwable)
                    def onFailure(self, caught):
                        GWT.log(u"Require session failed: " + java.str(caught))
                    
                    @java.typed(Boolean)
                    def onSuccess(self, isLoggedIn):
                        if self.loginCallback is not None and isLoggedIn:
                            self.loginCallback.onLogin()
                FacebookConnect.requireSession(_anonymous())
        self.loginLink.addClickHandler(_anonymous()) #  Login with the javascript api. GWT client doesnt render the fb:login-button
        self.outer.getElement().setId(u"LoginBox")
        self.inner.addStyleName(u"inner")
        self.outer.add(HTML(u"<h1>Login with your facebook id: </h1>"))
        self.outer.add(HTML(u"This demo uses facebook data heavily to demonstrate API calls etc so you might as well login right away"))
        self.inner.setSpacing(10)
        self.inner.add(HTML(u"Click the button to allow this application to access your facebook account"))
        self.inner.add(self.loginButton)
        self.outer.add(self.inner)
        self.outer.add(self.loginLink)
        sourceCode = HTML(u"<br/><br/>This project on Gogle code : <a target=_blank href=\"http://code.google.com/p/gwt-facebook/\"> http://code.google.com/p/gwt-facebook/ </a>")
        sourceCode.addStyleName(u"sourceCode")
        self.outer.setWidth(u"400px")
        self.outer.add(sourceCode)
        Xfbml.parse(self.outer)
        self.initWidget(self.outer)
 def renderMainContent(self, addContentToPnl):
     """
     Render when user granted us permission to read stream
     """
     streamBody = VerticalPanel()
     streamBody.getElement().setId(u"streamBody")
     menu = HorizontalPanel()
     menu.addStyleName(u"streamMenu")
     menu.setSpacing(5)
     postsLink = Anchor(u"Posts") #  Create menu
     profilesLink = Anchor(u"Profiles")
     albumsLink = Anchor(u"Albums")
     menu.add(HTML(u"<b> Choose Stream : </b> "))
     menu.add(postsLink)
     menu.add(albumsLink)
     menu.add(profilesLink)
     class _anonymous(ClickHandler):
         
         @java.typed(ClickEvent)
         def onClick(self, event):
             self.renderPosts(streamBody, self.stream.getPosts())
             Xfbml.parse(streamBody)
     postsLink.addClickHandler(_anonymous()) #  Click posts link
     class _anonymous(ClickHandler):
         
         @java.typed(ClickEvent)
         def onClick(self, event):
             streamBody.clear()
             self.renderProfiles(streamBody, self.stream.getProfiles())
     profilesLink.addClickHandler(_anonymous()) #  Click profiles link
     class _anonymous(ClickHandler):
         
         @java.typed(ClickEvent)
         def onClick(self, event):
             self.renderAlbums(streamBody, self.stream.getAlbums())
     albumsLink.addClickHandler(_anonymous()) #  Click album links
     addContentToPnl.add(streamBody)
     self.addLoader(streamBody) #  Start loading
     class _anonymous(AsyncCallback):
         
         @java.typed(Throwable)
         def onFailure(self, caught):
             self.handleFailure(caught)
         
         @java.typed(Stream)
         def onSuccess(self, result):
             self.stream = result
             addContentToPnl.insert(menu, 0)
             self.removeLoader(streamBody)
             self.renderPosts(streamBody, result.getPosts())
             Xfbml.parse(streamBody)
     self.apiClient.streamGet(_anonymous()) #  Get stream from facebook.
 def __init__(self, ):
     self.__init__._super()
     outer = VerticalPanel()
     friendRequestWrapper = HorizontalPanel()
     friendRequestWrapper.getElement().setId(u"friendRequestWrapper")
     friendRequestWrapper.setSpacing(10)
     groupInvitesWrapper = VerticalPanel()
     groupInvitesWrapper.getElement().setId(u"groupInvitesWrapper")
     eventInvitesWrapper = VerticalPanel()
     eventInvitesWrapper.getElement().setId(u"eventInvitesWrapper")
     self.addLoader(outer)
     class _anonymous(AsyncCallback):
         
         @java.typed(Throwable)
         def onFailure(self, caught):
             self.handleFailure(caught)
         
         @java.typed(List)
         def onSuccess(self, result):
             self.removeLoader(outer)
             for nc in result:
                 outer.add(HTML(java.str(u"<h3>" + java.str(nc.getType())) + u"</h3>"))
                 if nc.getUnread() is not None:
                     outer.add(HTML(u"Unread: " + java.str(nc.getUnread())))
                 #  Friend requests.
                 if nc.getTypeEnum() == NotificationType.friend_requests and nc.getRequestIds().size() > 0:
                     outer.add(friendRequestWrapper)
                     for uid in nc.getRequestIds():
                         friendRequestWrapper.add(FbProfilePic(uid))
                     Xfbml.parse(friendRequestWrapper)
                 elif nc.getTypeEnum() == NotificationType.friend_requests and nc.getRequestIds().size() > 0:
                     outer.add(friendRequestWrapper)
                     for uid in nc.getRequestIds():
                         friendRequestWrapper.add(FbProfilePic(uid))
                     Xfbml.parse(friendRequestWrapper)
                 elif nc.getTypeEnum() == NotificationType.group_invites:
                     outer.add(groupInvitesWrapper)
                     for gid in nc.getRequestIds():
                         groupInvitesWrapper.add(HTML(u"GroupInvite: " + java.str(gid)))
                         groupInvitesWrapper.add(FbGroupLink(gid))
                     Xfbml.parse(groupInvitesWrapper)
                 else:
                   if nc.getTypeEnum() == NotificationType.event_invites:
                       outer.add(eventInvitesWrapper)
                       if nc.getRequestIds().size() > 0:
                           for eid in nc.getRequestIds():
                               eventInvitesWrapper.add(FbEventLink(eid))
                       Xfbml.parse(eventInvitesWrapper)
     self.apiClient.notificationsGet(_anonymous()) #  Get facebook data
     self.initWidget(outer)
 def renderAlbums(self, addContentToPnl, albums):
     """
     Render list of albums in stream
     """
     addContentToPnl.clear()
     p = VerticalPanel()
     p.getElement().setId(u"ProfilAlbums")
     p.add(HTML(u"<h3>Albums in Stream</h3>"))
     for a in Util.iterate(albums):
         p.add(HTML(java.str(u"<h4>" + java.str(a.getName())) + u"</h4>"))
         if a.hasCover():
             p.add(HTML(u" CoverPid:  " + java.str(a.getCoverPid())))
             p.add(FbPhoto(a.getCoverPid(), FbPhoto.Size.small))
     addContentToPnl.add(p)
     Xfbml.parse(p)
 def __init__(self, ):
     self.__init__._super()
     outer = VerticalPanel()
     outer.getElement().setId(u"Friends_getAppUsers")
     self.addLoader(outer)
     class _anonymous(AsyncCallback):
         
         @java.typed(Throwable)
         def onFailure(self, caught):
             self.handleFailure(caught)
         
         @java.typed(List)
         def onSuccess(self, result):
             self.removeLoader(outer)
             outer.add(ProfilePicsPanel(result))
     self.apiClient.friendsGetAppUsers(_anonymous())
     self.initWidget(outer)
 def __init__(self, ):
     self.__init__._super()
     outer = VerticalPanel()
     outer.getElement().setId(self.__class__.method)
     self.addLoader(outer)
     class _anonymous(AsyncCallback):
         
         @java.typed(Throwable)
         def onFailure(self, caught):
             self.handleFailure(caught)
         
         @java.typed(List)
         def onSuccess(self, result):
             self.removeLoader(outer)
             for fl in result:
                 outer.add(HTML(java.str(fl.getFlid()) + u"/" + fl.getName()))
     self.apiClient.friendsGetLists(_anonymous()) #  Call facebook
     self.initWidget(outer)
 def displayUsers(self, picsList, page):
     startIdx = page * PAGE_SIZE
     stopIdx = startIdx + (PAGE_SIZE - 1)
     holder = VerticalPanel()
     holder.getElement().setId(u"ProfilePics-Page_" + java.str(page))
     i = startIdx
     while i < self.uids.size() and i < stopIdx:
         i+= 1
         uid = self.uids.get(i)
         wrapper = HorizontalPanel()
         wrapper.setSpacing(10)
         profilePic = FbProfilePic(uid, Size.square)
         name = FbName(uid)
         wrapper.add(profilePic)
         wrapper.add(name)
         holder.add(wrapper)
     picsList.add(holder)
     Xfbml.parse(holder)
class XFBML_serverFbml(Showcase):

    """
    Demonstrates serverFbml tag. Used to do invites etc.
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.outer = VerticalPanel()
    #  Display request form inside iframe(fb:serverFbml).
    fbml = u"<script type=\"text/fbml\">  <fb:fbml>  <fb:request-form action=\"/test\" method=\"POST\" invite=\"true\" type=\"XFBML\" content=\"This is a test invitation from XFBML test app <fb:req-choice url='see wiki page for fb:req-choice for details' label='Ignore the Connect test app!' />  \" >  <fb:multi-friend-selector showborder=\"false\" actiontext=\"Invite your friends to use Connect.\">  </fb:request-form>  </fb:fbml>  </script>"
    #  Construct
    
    @__init__.register
    @java.typed()
    def __init__(self, ):
        self.__init__._super()
        self.outer.setWidth(u"800px")
        self.outer.getElement().setId(u"XFBML_serverFbml")
        self.outer.add(FbServerFbml(self.__class__.fbml))
        Xfbml.parse(self.outer)
        self.initWidget(self.outer)
 def __init__(self, ):
     self.__init__._super()
     outer = VerticalPanel()
     outer.add(self.getLoader())
     outer.getElement().setId(u"ShowPhotosGetAlbums")
     class _anonymous(AsyncCallback):
         
         @java.typed(Throwable)
         def onFailure(self, caught):
             self.handleFailure(caught)
         
         @java.typed(List)
         def onSuccess(self, result):
             outer.remove(self.getLoader())
             outer.add(HTML(u"Result Size: " + java.str(result.size())))
             for a in result:
                 html = java.str(java.str(u"<h2>Name: " + java.str(a.getName())) + u", Description: " + a.getDescription()) + u"</h2>"
                 outer.add(HTML(html))
                 if a.hasCover():
                     outer.add(FbPhoto(a.getCoverPid(), Size.small))
             Xfbml.parse(outer)
     self.apiClient.photosGetAlbums(_anonymous()) #  Call facebook
     self.initWidget(outer)
class Events_get(Showcase):

    """
    Showcase for method <code>events.get</code>
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.eventIcon = Image(u"/cal_icon.gif")
        self.outer = VerticalPanel()
        self.responsePanel = VerticalPanel()
        self.listBox = ListBox(False)
    #  Get members
    
    @java.private
    @java.innerclass
    @java.implements(ClickHandler)
    class GetMembersClickHandler(Object):
    
        
        @java.init
        def __init__(self, *a, **kw):
            self.eid = None
            self.addToPanel = None
        
        @__init__.register
        @java.typed(Long, Panel)
        def __init__(self, eid, addToPanel):
            self.eid = eid
            self.addToPanel = addToPanel
        
        @java.typed(ClickEvent)
        def onClick(self, event):
            members = Events_getMembers(self.eid)
            self.addToPanel.clear()
            self.addToPanel.add(members)
    
    @java.private
    @java.innerclass
    @java.implements(ChangeHandler)
    class FilterHandler(Object):
    
        """
        Let user filter events
        """
        
        @java.init
        def __init__(self, *a, **kw):
            pass
        
        @java.typed(ChangeEvent)
        def onChange(self, event):
            idx = self.listBox.getSelectedIndex()
            value = self.listBox.getValue(idx)
            if u"All".equals(value):
                self.doEventsGet(None)
            else:
                self.doEventsGet(RsvpStatus.valueOf(value))
    
    @java.private
    @java.innerclass
    @java.implements(AsyncCallbackList)
    class EventsGetCallback(Object):
    
        """
        Handle events get
        """
        
        @java.init
        def __init__(self, *a, **kw):
            pass
        
        @java.typed(Throwable)
        def onFailure(self, caught):
            self.handleFailure(caught)
        
        @java.typed(List)
        def onSuccess(self, result):
            GWT.log(u"Events get #" + java.str(result.size()), None)
            self.handleResponse(result) #  removeLoader ( outer );
    
    @__init__.register
    @java.typed()
    def __init__(self, ):
        self.__init__._super()
        """
        Create new showcase
        """
        self.outer.getElement().setId(u"Events_get")
        self.outer.addStyleName(u"gwittit-Events_get")
        self.outer.add(self.createEventFilter())
        self.outer.add(self.responsePanel)
        self.doEventsGet(None)
        self.listBox.addChangeHandler(self.FilterHandler())
        self.initWidget(self.outer)
    #  Create ui for dropdown filter
    
    @java.private
    def createEventFilter(self):
        filter = HorizontalPanel()
        self.listBox.addItem(u"All")
        for rs in RsvpStatus.values():
            self.listBox.addItem(java.str(rs))
        filter.setSpacing(10)
        filter.add(HTML(u"Filter By: "))
        filter.add(self.listBox)
        return filter
    #  Handle response from call
    
    @java.private
    @java.typed(List)
    def handleResponse(self, events):
        self.removeLoader(self.responsePanel)
        header = HTML(java.str(u"<h3><img src=/cal_icon.gif> &nbsp; You have " + java.str(events.size())) + u" event invitations </h3><p/>")
        self.responsePanel.add(header)
        for eventInfo in events:
            self.responsePanel.add(self.createEventInfoUi(eventInfo))
        Xfbml.parse(self.responsePanel)
    #  Create somekind of ui.
    
    @java.private
    @java.typed(EventInfo)
    def createEventInfoUi(self, eventInfo):
        p = VerticalPanel()
        p.addStyleName(u"eventInfo")
        html = java.str(u"<h4>" + java.str(eventInfo.getName())) + u"</h4>"
        html += java.str(java.str(u"When: " + java.str(eventInfo.getStartTime())) + u", Where: " + eventInfo.getLocation()) + u"<br/>"
        self.responsePanel.add(HTML(html))
        mPanel = SimplePanel()
        mLink = Anchor(u"See who's attending")
        mLink.addClickHandler(self.GetMembersClickHandler(eventInfo.getEid(), mPanel))
        p.add(mLink)
        p.add(mPanel)
        return p
    #  Render events based on rsvpstatus
    
    @java.private
    @java.typed(RsvpStatus)
    def doEventsGet(self, status):
        self.responsePanel.clear()
        self.addLoader(self.responsePanel)
        GWT.log(u"display events", None)
        eventFilter = EventInfo.createEventInfo(None, None, None, None, status) #  Create a filter used in the query
        self.apiClient.eventsGet(eventFilter, self.EventsGetCallback())
class Stream_get(Showcase):

    """
    Showcase for method call <code>stream.get</code>
    
    @author olamar72
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.outer = VerticalPanel()
        self.stream = None
    method = u"stream.get"
    
    @__init__.register
    @java.typed()
    def __init__(self, ):
        self.__init__._super()
        self.outer.setSpacing(5)
        self.outer.addStyleName(u"gwittit-Stream_get")
        self.outer.getElement().setId(self.__class__.method)
        self.initWidget(self.outer)
    
    def getNeedPermission(self):
        """
        Need read stream to render showcase
        """
        return Permission.read_stream
    
    def permissionGranted(self):
        self.renderMainContent(self.outer)
    
    def getMessage(self):
        return u"Click to access your NewsFeed"
    
    @java.typed(VerticalPanel)
    def renderMainContent(self, addContentToPnl):
        """
        Render when user granted us permission to read stream
        """
        streamBody = VerticalPanel()
        streamBody.getElement().setId(u"streamBody")
        menu = HorizontalPanel()
        menu.addStyleName(u"streamMenu")
        menu.setSpacing(5)
        postsLink = Anchor(u"Posts") #  Create menu
        profilesLink = Anchor(u"Profiles")
        albumsLink = Anchor(u"Albums")
        menu.add(HTML(u"<b> Choose Stream : </b> "))
        menu.add(postsLink)
        menu.add(albumsLink)
        menu.add(profilesLink)
        class _anonymous(ClickHandler):
            
            @java.typed(ClickEvent)
            def onClick(self, event):
                self.renderPosts(streamBody, self.stream.getPosts())
                Xfbml.parse(streamBody)
        postsLink.addClickHandler(_anonymous()) #  Click posts link
        class _anonymous(ClickHandler):
            
            @java.typed(ClickEvent)
            def onClick(self, event):
                streamBody.clear()
                self.renderProfiles(streamBody, self.stream.getProfiles())
        profilesLink.addClickHandler(_anonymous()) #  Click profiles link
        class _anonymous(ClickHandler):
            
            @java.typed(ClickEvent)
            def onClick(self, event):
                self.renderAlbums(streamBody, self.stream.getAlbums())
        albumsLink.addClickHandler(_anonymous()) #  Click album links
        addContentToPnl.add(streamBody)
        self.addLoader(streamBody) #  Start loading
        class _anonymous(AsyncCallback):
            
            @java.typed(Throwable)
            def onFailure(self, caught):
                self.handleFailure(caught)
            
            @java.typed(Stream)
            def onSuccess(self, result):
                self.stream = result
                addContentToPnl.insert(menu, 0)
                self.removeLoader(streamBody)
                self.renderPosts(streamBody, result.getPosts())
                Xfbml.parse(streamBody)
        self.apiClient.streamGet(_anonymous()) #  Get stream from facebook.
    
    @java.typed(VerticalPanel, JsArray)
    def renderAlbums(self, addContentToPnl, albums):
        """
        Render list of albums in stream
        """
        addContentToPnl.clear()
        p = VerticalPanel()
        p.getElement().setId(u"ProfilAlbums")
        p.add(HTML(u"<h3>Albums in Stream</h3>"))
        for a in Util.iterate(albums):
            p.add(HTML(java.str(u"<h4>" + java.str(a.getName())) + u"</h4>"))
            if a.hasCover():
                p.add(HTML(u" CoverPid:  " + java.str(a.getCoverPid())))
                p.add(FbPhoto(a.getCoverPid(), FbPhoto.Size.small))
        addContentToPnl.add(p)
        Xfbml.parse(p)
    
    @java.typed(VerticalPanel, JsArray)
    def renderProfiles(self, addContentToPnl, profiles):
        """
        Render profiles in the stream
        """
        addContentToPnl.clear()
        addContentToPnl.add(HTML(u"<h3>Profiles in Strea</h3>"))
        for p in Util.iterate(profiles):
            tmp = FlowPanel() #  Split pic on the left, name on the right
            tmp.addStyleName(u"profiles fbColorLight rounded addSpace")
            tmp.add(Image(p.getPicSquare()))
            a = Anchor(p.getName()) #  Link to profile
            a.addStyleName(u"postContent")
            a.setHref(p.getUrl())
            tmp.add(a)
            addContentToPnl.add(tmp)
    
    @java.typed(VerticalPanel, JsArray)
    def renderPosts(self, addContentToPnl, posts):
        """
        Render posts i a stream
        """
        addContentToPnl.clear()
        addContentToPnl.add(HTML(u"Number of posts: " + java.str(posts.__len__())))
        for post in Util.iterate(posts):
            try:
                GWT.log(u"Render: " + java.str(JSONObject(post).toString()), None)
                postContentPnl = VerticalPanel()
                postContentPnl.addStyleName(u"postContent")
                postContentPnl.add(HTML(java.str(FbName(post.getActorId())) + u" " + post.getMessage()))
                if post.getAttachment().getName() is not None:
                    postContentPnl.add(self.createAttachmentUI(post.getAttachment()))
                if post.getLikes().getCount() > 0:
                    postContentPnl.add(self.createLikesUI(post.getLikes()))
                if post.getComments().getCount() > 0:
                    postContentPnl.add(self.createCommentsUI(post.getComments()))
                p = HorizontalPanel() #  Add profilepic on the left, postcontent on the right
                p.addStyleName(u"post")
                p.add(FbProfilePic(post.getActorId()))
                p.add(postContentPnl)
                addContentToPnl.add(p) #  postPnl.add ( asJson ( "LikesAsJson: ", post.getLikes () ));
            except Exception,e:
                GWT.log(u"Unkown exception ", e)
class Comments_add(Showcase):

    """
    Showcase for method call <code>comments.add</code>
    
    @author olamar72
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.outer = VerticalPanel()
        self.inputWrapper = VerticalPanel()
        self.responseWrapper = SimplePanel()
        self.commentsListPanel = VerticalPanel()
        self.text = TextArea()
        self.submitButton = Button(u"Add Comment ")
    #  Handle add comment
    
    @java.private
    @java.innerclass
    @java.implements(AsyncCallbackJavaScriptObject)
    class AddCommentCallback(Object):
    
        
        @java.init
        def __init__(self, *a, **kw):
            pass
        
        @java.typed(Throwable)
        def onFailure(self, caught):
            self.handleFailure(caught)
        
        @java.typed(JavaScriptObject)
        def onSuccess(self, result):
            self.removeLoader(self.outer)
            self.text.setValue(None)
            self.responseWrapper.add(HTML(u" Thanks :-)"))
            self.displayComments()
    #  User adds comment
    
    @java.private
    @java.innerclass
    @java.implements(ClickHandler)
    class AddCommentClickHandler(Object):
    
        
        @java.init
        def __init__(self, *a, **kw):
            pass
        
        @java.typed(ClickEvent)
        def onClick(self, event):
            comment = Comment.createComment(u"comments_test", self.text.getValue())
            self.apiClient.commentsAdd(comment, self.AddCommentCallback())
    
    @__init__.register
    @java.typed()
    def __init__(self, ):
        self.__init__._super()
        """
        New demo
        """
        self.inputWrapper.setSpacing(10)
        self.outer.setSpacing(10)
        self.inputWrapper.getElement().setId(u"CommentsAdd-Input") #  ID's
        self.submitButton.getElement().getStyle().setProperty(u"float", u"right") #  Styles
        self.submitButton.getElement().getStyle().setProperty(u"marginTop", u"10px")
        self.inputWrapper.add(HTML(u"A comment would be great! Thanks."))
        self.inputWrapper.add(self.createInputUi())
        self.outer.add(self.inputWrapper)
        self.outer.add(self.responseWrapper) #  Thank you
        self.outer.add(self.commentsListPanel) #  Show list of comments
        self.displayComments()
        self.submitButton.addClickHandler(self.AddCommentClickHandler())
        Xfbml.parse(self.inputWrapper)
        self.initWidget(self.outer)
    
    @java.private
    def createInputUi(self):
        """
        * Create input text area and submit button.
        """
        vp = VerticalPanel()
        p = HorizontalPanel()
        p.setSpacing(10)
        p.add(FbProfilePic(self.apiClient.getLoggedInUser(), FbProfilePic.Size.square))
        self.text.setHeight(u"100px")
        self.text.setWidth(u"400px")
        vp.add(self.text)
        vp.add(self.submitButton)
        p.add(vp)
        return p
    
    def displayComments(self):
        self.commentsListPanel.clear()
        comments = Comments_get()
        self.commentsListPanel.add(comments)
class ProfilePicsPopup(DecoratedPopupPanel):

    """
    Let user browse a user list in a popup.
    
    CSS Configuration
    
    <ul>
    <li>.gwittit-ProfilePicsPopup
    <li>.gwittit-ProfilePicsPopup-content
    <li>.gwittit-ProfilePicsPopup-moreButton
    </ul>
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.outer = VerticalPanel()
        self.scrollPanel = ScrollPanel()
        self.picsHolder = VerticalPanel()
        self.PAGE_SIZE = 30
        self.page = 0
        self.moreButton = Button(u"More")
        self.uids = None
    
    @__init__.register
    @java.typed(List)
    def __init__(self, uids):
        self.__init__._super()
        self.uids = uids
        super(self.__class__,self).setAutoHideEnabled(True)
        self.outer.addStyleName(u"gwittit-ProfilePicsPopup")
        self.moreButton.addStyleName(u"gwittit-ProfilePicsPopup-moreButton")
        self.scrollPanel.addStyleDependentName(u"gwittit-ProfilePicsPopup-scrollPanel") #  ScrollPanel
        self.scrollPanel.setWidth(u"400px")
        self.scrollPanel.setHeight(u"500px")
        self.outer.getElement().setId(u"gwittit-ProfilePicsPopup-content") #  Main Content
        self.outer.addStyleName(u"gwittit-ProfilePicsPopup-content")
        self.displayUsers(self.picsHolder, self.page)
        self.outer.add(self.picsHolder) #  Compile Panels
        self.outer.add(self.moreButton)
        self.scrollPanel.add(self.outer)
        super(self.__class__,self).setWidget(self.scrollPanel)
        Xfbml.parse(self.outer)
        class _anonymous(ClickHandler):
            
            @java.typed(ClickEvent)
            def onClick(self, event):
                self.displayUsers(self.picsHolder, self.page+= 1)
        self.moreButton.addClickHandler(_anonymous()) #  Add Clickhandler that enables user to browse list
    
    @java.private
    @java.typed(VerticalPanel, int)
    def displayUsers(self, picsList, page):
        startIdx = page * PAGE_SIZE
        stopIdx = startIdx + (PAGE_SIZE - 1)
        holder = VerticalPanel()
        holder.getElement().setId(u"ProfilePics-Page_" + java.str(page))
        i = startIdx
        while i < self.uids.size() and i < stopIdx:
            i+= 1
            uid = self.uids.get(i)
            wrapper = HorizontalPanel()
            wrapper.setSpacing(10)
            profilePic = FbProfilePic(uid, Size.square)
            name = FbName(uid)
            wrapper.add(profilePic)
            wrapper.add(name)
            holder.add(wrapper)
        picsList.add(holder)
        Xfbml.parse(holder)
class ShowcaseClient(Composite):

    """
    This class wraps showcases and adds a treemenu for navigation.
    TODO: Needs a cleanup.
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.wText = u"gwt-facebook is a library for writing facebook apps using GWT." + u"Click the menu on the left to browse showcases and see source code."
        self.outer = VerticalPanel()
        self.horizontalSplit = HorizontalPanel()
        self.authMethods = u"XAuth:auth_createToken,auth_expireSession,auth_getSession,auth_promoteSession,auth_revokeAuthorization,auth_revokeExtendedPermission"
        self.batchMethods = u"XBatch:batch_run"
        self.commentMethods = u"Comments:comments_xfbml,comments_add,comments_get,Xcomments_remove"
        self.connectMethods = u"Connect:connect_getUnconnect...,Xconnect_registerUsers,Xconnect_unregisterUsers"
        self.dataMethods = u"Data:data_getCookies,data_setCookie"
        self.eventMethods = u"Events:Xevents_cancel,events_create,Xevents_edit,events_get,events_getMembers,Xevents_rsvp"
        self.fbmlMethods = u"XFBML:fbml_deleteCustomTags,fbml_getCustomTags,fbml_refreshImgSrc,fbml_refreshRefUrl,fbml_registerCustomTags,fbml_setRefHandle"
        self.feedMethods = u"XFeed:feed_deactivateTemplateBundleByID,feed_getRegisteredTemplateBundleByID,feed_getRegisteredTemplateBundles,feed_publishTemplatizedAction,feed_publishUserAction,feed_registerTemplateBundle"
        self.fqlMethods = u"XFql:fql_multiquery,fql_query"
        self.friendMethods = u"Friends:friends_areFriends,friends_get,friends_getAppUsers,friends_getLists,friends_getMutualFriends"
        self.groupMethods = u"Groups:groups_get,Xgroups_getMembers"
        self.intlMethods = u"XIntl:intl_getTranslations,intl_uploadNativeStrings"
        self.linkMethods = u"XLinks:links_get,links_post"
        self.messageMethods = u"Message:XliveMessage_send,message_getThreadsInFolder"
        self.noteMethods = u"Notes:notes_create,Xnotes_delete,Xnotes_edit,notes_get"
        self.notificationMethods = u"Notification:notifications_get,notifications_getList,Xnotifications_markRead,notifications_sendEmail,Xnotifications_sendEmail"
        self.pageMethods = u"XPages:pages_getInfo,pages_isAdmin,pages_isAppAdded,pages_isFan"
        self.photoMethods = u"Photos:Xphotos_addTag,photos_createAlbum,photos_get,photos_getAlbums,Xphotos_getTags,Xphotos_upload"
        self.profileMethods = u"XProfile:profile_getFBML,profile_getInfo,profile_getInfoOptions,profile_setFBML,profile_setInfo,profile_setInfoOptions"
        self.smsMethods = u"XSMS:Xsms_canSend,sms_send"
        self.statusMethods = u"XStatus:status_get,status_set"
        self.streamMethods = u"Stream:Xstream_addComment,Xstream_addLike,stream_get,Xstream_getComments,Xstream_getFilters,stream_publish,stream_publishAttachment,Xstream_remove,Xstream_removeComment,Xstream_removeLike"
        self.userMethods = u"Users:users_getInfo,users_getLoggedInUser,Xusers_getStandardInfo,Xusers_hasAppPermission,Xusers_isAppUser,Xusers_isVerified,Xusers_setStatus"
        self.videoMethods = u"XVideo:video_getUploadLimits,video_upload"
        self.xfbml = u"FBML:various,serverFbml"
        self.menu = java.Array([self.authMethods, self.batchMethods, self.commentMethods, self.connectMethods, self.dataMethods, self.eventMethods, self.fbmlMethods, self.feedMethods, self.fqlMethods, self.friendMethods, self.groupMethods, self.intlMethods, self.linkMethods, self.messageMethods, self.noteMethods, self.notificationMethods, self.pageMethods, self.photoMethods, self.profileMethods, self.smsMethods, self.statusMethods, self.streamMethods, self.userMethods, self.videoMethods, self.xfbml])
        self.showcaseWrapper = VerticalPanel()
        self.loader = Image(u"/loader.gif")
        self.treeMenu = self.createMenu()
        self.apiClient = ApiFactory.getInstance()
    DEFAULT_SHOW = u"#comments_xfbml"
    
    @java.private
    @java.innerclass
    @java.implements(SelectionHandlerTreeItem)
    class ShowcaseHandler(Object):
    
        
        @java.init
        def __init__(self, *a, **kw):
            pass
        
        @java.typed(SelectionEvent)
        def onSelection(self, event):
            clickedLink = event.getSelectedItem()
            if clickedLink.getChildCount() == 0:
                if not self.apiClient.isSessionValid():
                    Window.alert(u"Your session has expired")
                    self.showcaseWrapper.clear()
                else:
                    History.newItem(clickedLink.getText())
    
    @__init__.register
    @java.typed()
    def __init__(self, ):
        self.__init__._super()
        """
        Create showcase client.
        """
        History.addValueChangeHandler(self)
        self.outer.getElement().setId(u"ShowcaseClient")
        self.showcaseWrapper.getElement().setId(u"ShowcaseWrapper")
        self.horizontalSplit.setSpacing(10)
        self.showcaseWrapper.setWidth(u"700px")
        self.showcaseWrapper.addStyleName(u"showcaseWrapper")
        self.treeMenu.addStyleName(u"treeMenu")
        token = Window.Location.getHash()
        if token == None or u"".equals(token):
            self.doDisplayShowcase(self.__class__.DEFAULT_SHOW)
            self.showcaseWrapper.insert(self.createDefaultFrontpage(), 0)
        else:
            self.doDisplayShowcase(token)
        treeMenuWrapper = VerticalPanel()
        treeMenuWrapper.addStyleName(u"treeMenuWrapper")
        treeMenuWrapper.add(HTML(u"<h4>Methods: </h4>"))
        treeMenuWrapper.add(self.treeMenu)
        self.horizontalSplit.add(treeMenuWrapper) #  Add left + right column
        self.horizontalSplit.add(self.decorate(self.showcaseWrapper))
        self.outer.add(self.horizontalSplit)
        Xfbml.parse(self.outer)
        self.initWidget(self.outer)
    
    @java.private
    def createDefaultFrontpage(self):
        pp = FbProfilePic(self.apiClient.getLoggedInUser(), Size.square)
        pp.setSize(u"30px", u"30px")
        name = FbName(self.apiClient.getLoggedInUser())
        name.setUseyou(False)
        name.setLinked(False)
        welcomePnl = VerticalPanel()
        welcomePnl.setSpacing(10)
        welcomePnl.add(HTML(java.str(java.str(java.str(u"<h4>Welcome, " + java.str(name)) + u" ") + java.str(pp)) + u"</h4> "))
        welcomePnl.add(HTML(self.wText))
        return welcomePnl
    #  Create menu
    
    @java.private
    def createMenu(self):
        treeMenu = Tree()
        #  Create vertical left menu
        for m in self.menu:
            labelMethods = m.split(u":")
            if not labelMethods[0].startswith(u"X"):
                treeItem = treeMenu.addItem(labelMethods[0])
                self.addSections(treeItem, labelMethods[1].split(u","))
        treeMenu.addSelectionHandler(self.ShowcaseHandler()) #  Add selection handler ( user clicks )
        return treeMenu
    #  Create sections left vertical menu
    
    @java.private
    @java.typed(TreeItem, [String])
    def addSections(self, parent, methods):
        parentOpen = False
        for method in methods:
            if not method.startswith(u"X"):
                token = Window.Location.getHash()
                if token is not None:
                    token = token.replace(u"#", u"")
                item = TreeItem(method)
                if method.equals(token):
                    parentOpen = True
                parent.addItem(item)
        if parentOpen:
            parent.setState(True)
    #  Display showcase
    
    @java.private
    @java.typed(String)
    def doDisplayShowcase(self, token):
        self.showcaseWrapper.clear()
        token = token.replace(u"#", u"")
        example = self.createExample(token)
        if example == None:
            Window.alert(u"Failed to create example: null")
        if example.getNeedPermission() == None:
            self.createShowcasePanel(example)
        else:
            pd = PermissionDialog(example.getMessage())
            class _anonymous(PermissionHandler):
                
                @java.typed(Boolean)
                def onPermissionChange(self, granted):
                    if granted:
                        example.permissionGranted()
                        self.createShowcasePanel(example)
                    else:
                        self.showcaseWrapper.add(HTML(java.str(u"Need " + java.str(example.getNeedPermission())) + u" to show this demo, hit reload"))
            pd.addPermissionHandler(_anonymous())
            pd.checkPermission(example.getNeedPermission())
            self.showcaseWrapper.add(pd)
    #  Create showcase with source link on top.
    
    @java.private
    @java.typed(Showcase)
    def createShowcasePanel(self, example):
        self.showcaseWrapper.clear()
        sourceLink = Anchor()
        sourceLink.setHTML(java.str(u"Browse Source: " + java.str(example.getClass().getName())) + u".java ")
        sourceLink.addStyleName(u"sourceLink")
        repo = u"http://code.google.com/p/gwt-facebook/source/browse/trunk/GwittIt/src/"
        className = java.str((u"" + java.str(example.getClass().getName())).replace(u".", u"/")) + u".java"
        sourceLink.setHref(repo + className)
        sourceLink.setTarget(u"_blank")
        self.showcaseWrapper.add(sourceLink)
        self.showcaseWrapper.add(HTML(u"<hr/>"))
        self.showcaseWrapper.add(example)
    #  Add panel
    
    @java.private
    @java.typed(Panel)
    def decorate(self, p):
        dp = DecoratorPanel()
        dp.setWidget(p)
        return dp
    
    @java.private
    @java.typed(String)
    def createExample(self, m):
        GWT.log(u"Create example " + java.str(m), None)
        showcase = None
        if u"admin_banUsers".equals(m):
            pass
        elif u"admin_banUsers".equals(m):
            pass
        elif u"batch_run".equals(m):
            pass
        elif u"comments_xfbml".equals(m):
            showcase = Comments_xfbml()
        elif u"comments_add".equals(m):
            showcase = Comments_add()
        elif u"comments_get".equals(m):
            showcase = Comments_get()
        elif u"comments_remove".equals(m):
            pass
        elif u"connect_getUnconnect...".equals(m):
            showcase = Connect_getUnconnectedFriendsCount()
        elif u"connect_registerUsers".equals(m):
            pass
        elif u"connect_unregisterUsers".equals(m):
            pass
        elif u"data_getCookies".equals(m):
            showcase = Data_getCookies()
        elif u"data_setCookie".equals(m):
            showcase = Data_setCookie()
        elif u"events_cancel".equals(m):
            pass
        elif u"events_create".equals(m):
            showcase = Events_create()
        elif u"events_edit".equals(m):
            pass
        elif u"events_get".equals(m):
            showcase = Events_get()
        elif u"events_getMembers".equals(m):
            return Events_getMembers()
        elif u"events_rsvp".equals(m):
            pass
        elif u"fbml_deleteCustomTags".equals(m):
            pass
        elif u"fbml_getCustomTags".equals(m):
            pass
        elif u"fbml_refreshImgSrc".equals(m):
            pass
        elif u"fbml_refreshRefUrl".equals(m):
            pass
        elif u"fbml_registerCustomTags".equals(m):
            pass
        elif u"fbml_setRefHandle".equals(m):
            pass
        elif u"feed_deactivateTemplateBundleByID".equals(m):
            pass
        elif u"feed_getRegisteredTemplateBundleByID".equals(m):
            pass
        elif u"feed_getRegisteredTemplateBundles".equals(m):
            pass
        elif u"feed_publishTemplatizedAction".equals(m):
            pass
        elif u"feed_publishUserAction".equals(m):
            pass
        elif u"feed_registerTemplateBundle".equals(m):
            pass
        elif u"fql_multiquery".equals(m):
            pass
        elif u"fql_query".equals(m):
            pass
        elif u"friends_areFriends".equals(m):
            showcase = Friends_areFriends()
        elif u"friends_get".equals(m):
            showcase = Friends_get()
        elif u"friends_getAppUsers".equals(m):
            showcase = Friends_getAppUsers()
        elif u"friends_getLists".equals(m):
            showcase = Friends_getLists()
        elif u"friends_getMutualFriends".equals(m):
            showcase = Friends_getMutualFriends()
        elif u"groups_get".equals(m):
            showcase = Groups_get()
        elif u"groups_getMembers".equals(m):
            pass
        elif u"hashCode".equals(m):
            pass
        elif u"intl_getTranslations".equals(m):
            pass
        elif u"intl_uploadNativeStrings".equals(m):
            pass
        elif u"links_get".equals(m):
            pass
        elif u"links_post".equals(m):
            pass
        elif u"liveMessage_send".equals(m):
            pass
        elif u"message_getThreadsInFolder".equals(m):
            showcase = Message_getThreadsInFolder()
        elif u"notes_create".equals(m):
            showcase = Notes_create()
        elif u"notes_delete".equals(m):
            pass
        elif u"notes_edit".equals(m):
            pass
        elif u"notes_get".equals(m):
            showcase = Notes_get()
        elif u"notifications_get".equals(m):
            showcase = Notifications_get()
        elif u"notifications_getList".equals(m):
            showcase = Notifications_getList()
        elif u"notifications_markRead".equals(m):
            pass
        elif u"notifications_sendEmail".equals(m):
            showcase = Notifications_send()
        elif u"pages_getInfo".equals(m):
            pass
        elif u"pages_isAdmin".equals(m):
            pass
        elif u"pages_isAppAdded".equals(m):
            pass
        elif u"pages_isFan".equals(m):
            pass
        elif u"photos_addTag".equals(m):
            pass
        elif u"photos_createAlbum".equals(m):
            showcase = Photos_createAlbum()
        elif u"photos_get".equals(m):
            showcase = Photos_get()
        elif u"photos_getAlbums".equals(m):
            showcase = Photos_getAlbums()
        elif u"photos_getTags".equals(m):
            pass
        elif u"photos_upload".equals(m):
            pass
        elif u"profile_getFBML".equals(m):
            pass
        elif u"profile_getInfo".equals(m):
            pass
        elif u"profile_getInfoOptions".equals(m):
            pass
        elif u"profile_setFBML".equals(m):
            pass
        elif u"profile_setInfo".equals(m):
            pass
        elif u"profile_setInfoOptions".equals(m):
            pass
        elif u"sms_canSend".equals(m):
            pass
        elif u"sms_send".equals(m):
            showcase = Sms_send()
        elif u"status_get".equals(m):
            pass
        elif u"status_set".equals(m):
            pass
        elif u"stream_addComment".equals(m):
            pass
        elif u"stream_addLike".equals(m):
            pass
        elif u"stream_get".equals(m):
            showcase = Stream_get()
        elif u"stream_getComments".equals(m):
            pass
        elif u"stream_getFilters".equals(m):
            pass
        elif u"stream_publishAttachment".equals(m):
            showcase = Stream_publishAttachment()
        elif u"stream_publish".equals(m):
            showcase = Stream_publish()
        elif u"stream_remove".equals(m):
            pass
        elif u"stream_removeComment".equals(m):
            pass
        elif u"stream_removeLike".equals(m):
            pass
        elif u"toString".equals(m):
            pass
        elif u"users_getInfo".equals(m):
            showcase = Users_getInfo()
        elif u"users_getLoggedInUser".equals(m):
            showcase = Users_getLoggedInUser()
        elif u"users_getStandardInfo".equals(m):
            pass
        elif u"users_hasAppPermission".equals(m):
            pass
        elif u"users_isAppUser".equals(m):
            pass
        elif u"users_isVerified".equals(m):
            pass
        elif u"users_setStatus".equals(m):
            pass
        elif u"video_getUploadLimits".equals(m):
            pass
        elif u"video_upload".equals(m):
            pass
        elif u"various".equals(m):
            showcase = XFBMLShowcase()
        else:
          if u"serverFbml".equals(m):
              showcase = XFBML_serverFbml()
        return showcase
    
    @java.typed(ValueChangeEvent)
    def onValueChange(self, event):
        self.doDisplayShowcase(event.getValue())
class Comments_get(Showcase):

    """
    Showcase for method call <code>comments.get</code>
    
    @author olamar72
    """
    
    @java.init
    def __init__(self, *a, **kw):
        self.outer = VerticalPanel()
    XID = u"comments_test"
    #  Display comments
    
    @java.private
    @java.innerclass
    @java.implements(AsyncCallbackList)
    class CommentsGetCallback(Object):
    
        
        @java.init
        def __init__(self, *a, **kw):
            pass
        
        @java.typed(Throwable)
        def onFailure(self, caught):
            self.handleFailure(caught)
        
        @java.typed(List)
        def onSuccess(self, result):
            self.removeLoader(self.outer)
            self.handleCommentsResponse(result)
    #  Remove comments
    
    @java.private
    @java.innerclass
    @java.implements(AsyncCallbackJavaScriptObject)
    class CommentsRemoveCallback(Object):
    
        
        @java.init
        def __init__(self, *a, **kw):
            pass
        
        @java.typed(Throwable)
        def onFailure(self, caught):
            self.handleFailure(caught)
        
        @java.typed(JavaScriptObject)
        def onSuccess(self, result):
            self.doCommentsGet() #  ReRender comments
    #  User clicks remove link
    
    @java.private
    @java.innerclass
    @java.implements(ClickHandler)
    class CommentsRemoveClickHandler(Object):
    
        
        @java.init
        def __init__(self, *a, **kw):
            self.commentId = None
        
        @__init__.register
        @java.typed(String)
        def __init__(self, commentId):
            self.commentId = commentId
        
        @java.typed(ClickEvent)
        def onClick(self, event):
            self.apiClient.commentsRemove(self.__class__.XID, self.commentId, self.CommentsRemoveCallback())
    
    @__init__.register
    @java.typed()
    def __init__(self, ):
        self.__init__._super()
        """
        Create showcase
        """
        self.outer.getElement().setId(u"comments.get")
        self.doCommentsGet()
        self.initWidget(self.outer)
    
    @java.private
    def doCommentsGet(self):
        """
        Call comments get
        """
        self.outer.clear()
        self.addLoader(self.outer)
        self.apiClient.commentsGet(self.__class__.XID, self.CommentsGetCallback())
    
    @java.private
    @java.typed(List)
    def handleCommentsResponse(self, comments):
        for comment in comments:
            box = VerticalPanel()
            box.addStyleName(u"commentBox")
            p = HorizontalPanel()
            p.setSpacing(5)
            p.add(FbProfilePic(comment.getFromId(), Size.square))
            p.add(HTML(java.str(comment.getText()) + u" from " + FbName(comment.getFromId())))
            box.add(p)
            removeLink = Anchor(u"Remove")
            removeLink.addClickHandler(self.CommentsRemoveClickHandler(comment.getId()))
            box.add(removeLink)
            self.outer.add(box)
        Xfbml.parse(self.outer)
Beispiel #21
0
class GwittIt(Object):

    """
    Entry point classes define <code>onModuleLoad()</code>.
    """

    @java.init
    def __init__(self, *a, **kw):
        self.outer = VerticalPanel()
        self.topMenu = None
        self.apiClient = GWT.create(FacebookApi.__class__)
        self.loginBoxPanel = None
        self.loginCallback = None
        self.waitingText = HTML(u"Waiting for facebook connect status...")
        self.userService = GWT.create(UserService.__class__)

    #  Runs on every localhost port 8080
    API_KEY = u"1d81c942b38e2e6b3fc35a147d371ab3"

    @java.private
    @java.innerclass
    @java.implements(AsyncCallbackVoid)
    class LogCallback(Object):

        """
        Change this if you setup your own app
        """

        @java.init
        def __init__(self, *a, **kw):
            pass

        @java.typed(Throwable)
        def onFailure(self, caught):
            pass

        @java.typed(Void)
        def onSuccess(self, result):
            pass

    @java.private
    @java.innerclass
    @java.implements(AsyncCallbackConnectState)
    class RenderAppWhenReadyCallback(Object):

        """
        Fired when we know users status
        """

        @java.init
        def __init__(self, *a, **kw):
            pass

        @java.typed(Throwable)
        def onFailure(self, caught):
            Window.alert(u"Failed to get status:" + java.str(caught))

        @java.typed(ConnectState)
        def onSuccess(self, result):
            self.outer.remove(self.waitingText)
            if result == ConnectState.connected:
                self.renderWhenConnected()
            else:
                self.renderWhenNotConnected()

    @java.private
    @java.innerclass
    @java.implements(LoginCallback)
    class MyLoginCallback(Object):

        """
        Fired when user clicks fb login button
        """

        @java.init
        def __init__(self, *a, **kw):
            pass

        def onLogin(self):
            self.renderWhenConnected()
            self.sendNotificationToDeveloper()
            self.logUser()

    def onModuleLoad(self):
        """
        Load Main Module
        """
        self.loginCallback = self.MyLoginCallback()
        self.topMenu = TopMenu()
        self.outer.getElement().setId(u"GwittIt")
        self.outer.ensureDebugId(u"GwittIt")
        self.waitingText.getElement().setAttribute(u"style", u"color: white; font-weight: bold")
        self.outer.add(self.waitingText)
        FacebookConnect.init(
            self.__class__.API_KEY, u"/xd_receiver.htm", self.loginCallback
        )  #  Set up Facebook Connect
        FacebookConnect.waitUntilStatusReady(
            self.RenderAppWhenReadyCallback()
        )  #  Wait until we can determine the users status
        RootPanel.get().add(self.outer)  #  Add UI.

    def renderWhenConnected(self):
        """
        Render when user is connected
        """
        self.topMenu.renderLoginInfo()
        self.outer.clear()
        self.outer.add(self.topMenu)
        self.outer.add(ShowcaseClient())

    def renderWhenNotConnected(self):
        """
        Render when user is not connected
        """
        self.loginBoxPanel = LoginBox()
        self.loginBoxPanel.addLoginCallback(self.loginCallback)
        self.outer.add(self.topMenu)
        self.outer.add(self.loginBoxPanel)

    @java.private
    def sendNotificationToDeveloper(self):
        """
        Send notification about who added the app. used for personal stats .
        """
        notification = u" logged in using " + java.str(self.getUserAgent())
        recepients = ArrayList((Long))
        recepients.add(Long(744450545))
        self.apiClient.notificationsSendEmail(recepients, u"User logged in", notification, u"", Callback((List)))

    @java.private
    def logUser(self):
        self.userService.logUser(self.apiClient.getLoggedInUser(), self.LogCallback())

    @java.static
    @java.native
    def getUserAgent(self):
        """