/** * Copyright (c) 2008-2010 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sakaiproject.profile2.tool.pages.panels; import java.io.IOException; import java.io.ObjectInputStream; import org.apache.log4j.Logger; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.sakaiproject.profile2.logic.ProfileConnectionsLogic; import org.sakaiproject.profile2.logic.ProfileLogic; import org.sakaiproject.profile2.logic.SakaiProxy; import org.sakaiproject.profile2.model.Person; import org.sakaiproject.profile2.model.ProfilePreferences; import org.sakaiproject.profile2.model.ProfilePrivacy; import org.sakaiproject.profile2.tool.components.ProfileImageRenderer; import org.sakaiproject.profile2.tool.components.ProfileStatusRenderer; import org.sakaiproject.profile2.tool.dataproviders.ConfirmedFriendsDataProvider; import org.sakaiproject.profile2.tool.models.FriendAction; import org.sakaiproject.profile2.tool.pages.MySearch; import org.sakaiproject.profile2.tool.pages.ViewProfile; import org.sakaiproject.profile2.tool.pages.windows.RemoveFriend; import org.sakaiproject.profile2.util.ProfileConstants; import org.sakaiproject.user.api.User; public class ConfirmedFriends extends Panel { private static final long serialVersionUID = 1L; private static final Logger log = Logger.getLogger(ConfirmedFriends.class); @SpringBean(name="org.sakaiproject.profile2.logic.SakaiProxy") private SakaiProxy sakaiProxy; @SpringBean(name="org.sakaiproject.profile2.logic.ProfileConnectionsLogic") protected ProfileConnectionsLogic connectionsLogic; private Integer numConfirmedFriends = 0; private boolean ownList = false; public ConfirmedFriends(final String id, final String userUuid) { super(id); log.debug("ConfirmedFriends()"); //setup model to store the actions in the modal windows final FriendAction friendActionModel = new FriendAction(); //get info for user viewing this page (will be the same if user is viewing own list, different if viewing someone else's) final String currentUserUuid = sakaiProxy.getCurrentUserId(); User currentUser = sakaiProxy.getUserQuietly(currentUserUuid); final String currentUserType = currentUser.getType(); //to be used for checking if connection between users is allowed, when this is added //if viewing own friends, you can manage them. if(userUuid.equals(currentUserUuid)) { ownList = true; } //get our list of confirmed friends as an IDataProvider ConfirmedFriendsDataProvider provider = new ConfirmedFriendsDataProvider(userUuid); //init number of friends numConfirmedFriends = provider.size(); //model so we can update the number of friends IModel<Integer> numConfirmedFriendsModel = new Model<Integer>() { private static final long serialVersionUID = 1L; public Integer getObject() { return numConfirmedFriends; } }; //heading final WebMarkupContainer confirmedFriendsHeading = new WebMarkupContainer("confirmedFriendsHeading"); Label confirmedFriendsLabel = new Label("confirmedFriendsLabel"); //if viewing own list, "my friends", else, "their name's friends" if(ownList) { confirmedFriendsLabel.setDefaultModel(new ResourceModel("heading.friends.my")); } else { String displayName = sakaiProxy.getUserDisplayName(userUuid); confirmedFriendsLabel.setDefaultModel(new StringResourceModel("heading.friends.view", null, new Object[]{ displayName } )); } confirmedFriendsHeading.add(confirmedFriendsLabel); confirmedFriendsHeading.add(new Label("confirmedFriendsNumber", numConfirmedFriendsModel)); confirmedFriendsHeading.setOutputMarkupId(true); add(confirmedFriendsHeading); //search for connections WebMarkupContainer searchConnections = new WebMarkupContainer("searchConnections"); Link<String> searchConnectionsLink = new Link<String>("searchConnectionsLink") { private static final long serialVersionUID = 1L; public void onClick() { setResponsePage(new MySearch()); } }; Label searchConnectionsLabel = new Label("searchConnectionsLabel", new ResourceModel("link.my.friends.search")); searchConnectionsLink.add(searchConnectionsLabel); searchConnections.add(searchConnectionsLink); add(searchConnections); //container which wraps list final WebMarkupContainer confirmedFriendsContainer = new WebMarkupContainer("confirmedFriendsContainer"); confirmedFriendsContainer.setOutputMarkupId(true); //connection window final ModalWindow connectionWindow = new ModalWindow("connectionWindow"); //results DataView<Person> confirmedFriendsDataView = new DataView<Person>("connections", provider) { private static final long serialVersionUID = 1L; protected void populateItem(final Item<Person> item) { Person person = (Person)item.getDefaultModelObject(); String personUuid = person.getUuid(); //setup values String displayName = person.getDisplayName(); boolean friend; //get friend status if(ownList) { friend = true; //viewing own page of conenctions, must be friend! } else { friend = connectionsLogic.isUserXFriendOfUserY(userUuid, personUuid); //other person viewing, check if they are friends } //get other objects ProfilePrivacy privacy = person.getPrivacy(); ProfilePreferences prefs = person.getPreferences(); //image wrapper, links to profile Link<String> friendItem = new Link<String>("connectionPhotoWrap", new Model<String>(personUuid)) { private static final long serialVersionUID = 1L; public void onClick() { setResponsePage(new ViewProfile(getModelObject())); } }; //image friendItem.add(new ProfileImageRenderer("connectionPhoto", personUuid, prefs, privacy, ProfileConstants.PROFILE_IMAGE_THUMBNAIL, true)); item.add(friendItem); //name and link to profile Link<String> profileLink = new Link<String>("connectionLink", new Model<String>(personUuid)) { private static final long serialVersionUID = 1L; public void onClick() { setResponsePage(new ViewProfile(getModelObject())); } }; profileLink.add(new Label("connectionName", displayName)); item.add(profileLink); //status component ProfileStatusRenderer status = new ProfileStatusRenderer("connectionStatus", person, "connection-status-msg", "connection-status-date"); status.setOutputMarkupId(true); item.add(status); /* ACTIONS */ //REMOVE FRIEND LINK AND WINDOW final AjaxLink<String> removeConnectionLink = new AjaxLink<String>("removeConnectionLink", new Model<String>(personUuid)) { private static final long serialVersionUID = 1L; public void onClick(AjaxRequestTarget target) { //get this item, and set content for modalwindow String friendUuid = getModelObject(); connectionWindow.setContent(new RemoveFriend(connectionWindow.getContentId(), connectionWindow, friendActionModel, userUuid, friendUuid)); //modalwindow handler connectionWindow.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { private static final long serialVersionUID = 1L; public void onClose(AjaxRequestTarget target){ if(friendActionModel.isRemoved()) { //decrement number of friends numConfirmedFriends--; //remove friend item from display target.appendJavascript("$('#" + item.getMarkupId() + "').slideUp();"); //update label target.addComponent(confirmedFriendsHeading); //if none left, hide whole thing if(numConfirmedFriends==0) { target.appendJavascript("$('#" + confirmedFriendsContainer.getMarkupId() + "').fadeOut();"); } } } }); connectionWindow.show(target); target.appendJavascript("fixWindowVertical();"); } }; ContextImage removeConnectionIcon = new ContextImage("removeConnectionIcon",new Model<String>(ProfileConstants.DELETE_IMG)); removeConnectionIcon.add(new AttributeModifier("alt", true, new StringResourceModel("accessibility.connection.remove", null, new Object[]{ displayName } ))); removeConnectionLink.add(removeConnectionIcon); removeConnectionLink.add(new AttributeModifier("title", true,new ResourceModel("link.title.removefriend"))); item.add(removeConnectionLink); //can only delete if own connections if(!ownList) { removeConnectionLink.setEnabled(false); removeConnectionLink.setVisible(false); } item.setOutputMarkupId(true); } }; confirmedFriendsDataView.setOutputMarkupId(true); confirmedFriendsDataView.setItemsPerPage(ProfileConstants.MAX_CONNECTIONS_PER_PAGE); confirmedFriendsContainer.add(confirmedFriendsDataView); //add results container add(confirmedFriendsContainer); //add window add(connectionWindow); //add pager AjaxPagingNavigator pager = new AjaxPagingNavigator("navigator", confirmedFriendsDataView); add(pager); //initially, if no friends, hide container and pager if(numConfirmedFriends == 0) { confirmedFriendsContainer.setVisible(false); pager.setVisible(false); } //also, if num less than num required for pager, hide it if(numConfirmedFriends <= ProfileConstants.MAX_CONNECTIONS_PER_PAGE) { pager.setVisible(false); } } }