/**
* Copyright (c) 2008-2012 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 org.apache.log4j.Logger;
import org.apache.wicket.markup.html.basic.Label;
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.GridView;
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.ProfilePreferencesLogic;
import org.sakaiproject.profile2.logic.ProfilePrivacyLogic;
import org.sakaiproject.profile2.logic.SakaiProxy;
import org.sakaiproject.profile2.model.Person;
import org.sakaiproject.profile2.tool.components.ProfileImageRenderer;
import org.sakaiproject.profile2.tool.dataproviders.FriendsFeedDataProvider;
import org.sakaiproject.profile2.tool.pages.MyFriends;
import org.sakaiproject.profile2.tool.pages.MyProfile;
import org.sakaiproject.profile2.tool.pages.MySearch;
import org.sakaiproject.profile2.tool.pages.ViewFriends;
import org.sakaiproject.profile2.tool.pages.ViewProfile;
import org.sakaiproject.profile2.util.ProfileConstants;
/*
* id = markup id
* ownerUserId = userId of the page that this friends feed panel is on
* viewingUserId = userId of the person who is viewing this friends feed panel
* (this might be the same or might be different if viewing someone else's profile and is passed to the DataProvider to decide)
*
*/
public class FriendsFeed extends Panel {
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(FriendsFeed.class);
@SpringBean(name="org.sakaiproject.profile2.logic.SakaiProxy")
private SakaiProxy sakaiProxy;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileConnectionsLogic")
protected ProfileConnectionsLogic connectionsLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfilePreferencesLogic")
protected ProfilePreferencesLogic preferencesLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfilePrivacyLogic")
protected ProfilePrivacyLogic privacyLogic;
public FriendsFeed(String id, final String ownerUserId, final String viewingUserId) {
super(id);
log.debug("FriendsFeed()");
//heading
Label heading = new Label("heading");
if(viewingUserId.equals(ownerUserId)) {
heading.setDefaultModel(new ResourceModel("heading.widget.my.friends"));
} else {
String displayName = sakaiProxy.getUserDisplayName(ownerUserId);
heading.setDefaultModel(new StringResourceModel("heading.widget.view.friends", null, new Object[]{ displayName } ));
}
add(heading);
//get our list of friends as an IDataProvider
//the FriendDataProvider takes care of the privacy associated with the associated list
//so what it returns will always be clean
FriendsFeedDataProvider provider = new FriendsFeedDataProvider(ownerUserId);
GridView<Person> dataView = new GridView<Person>("rows", provider) {
private static final long serialVersionUID = 1L;
@Override
protected void populateEmptyItem(Item<Person> item)
{
Link friendItem = new Link("friendsFeedItem") {
private static final long serialVersionUID = 1L;
public void onClick() {}
};
friendItem.add(new ProfileImageRenderer("friendPhoto", null, null, null, ProfileConstants.PROFILE_IMAGE_THUMBNAIL, true));
friendItem.add(new Label("friendName","empty"));
item.add(friendItem);
friendItem.setVisible(false);
}
protected void populateItem(Item<Person> item)
{
final Person person = (Person)item.getDefaultModelObject();
final String friendId = person.getUuid();
//setup info
String displayName = person.getDisplayName();
boolean friend;
//get friend status
if(ownerUserId.equals(viewingUserId)) {
friend = true; //viewing own list of friends so must be a friend
} else {
friend = connectionsLogic.isUserXFriendOfUserY(viewingUserId, friendId); //other person viewing, check if they are friends
}
//link to their profile
Link<String> friendItem = new Link<String>("friendsFeedItem") {
private static final long serialVersionUID = 1L;
public void onClick() {
//link to own profile if link will point to self
if(viewingUserId.equals(friendId)) {
setResponsePage(new MyProfile());
} else {
setResponsePage(new ViewProfile(friendId));
}
}
};
/* IMAGE */
friendItem.add(new ProfileImageRenderer("friendPhoto", friendId, person.getPreferences(), person.getPrivacy(), ProfileConstants.PROFILE_IMAGE_THUMBNAIL, true));
//name (will be linked also)
Label friendLinkLabel = new Label("friendName", displayName);
friendItem.add(friendLinkLabel);
item.add(friendItem);
}
};
dataView.setColumns(3);
add(dataView);
/* NUM FRIENDS LABEL (can't just use provider as it only ever returns the number in the grid */
final int numFriends = connectionsLogic.getConnectionsForUserCount(ownerUserId);
Label numFriendsLabel = new Label("numFriendsLabel");
add(numFriendsLabel);
/* VIEW ALL FRIENDS LINK */
Link<String> viewFriendsLink = new Link<String>("viewFriendsLink") {
private static final long serialVersionUID = 1L;
public void onClick() {
//this could come from a bookmarkablelink, but this works for now
if(numFriends == 0) {
setResponsePage(new MySearch());
} else {
//if own FriendsFeed, link to own MyFriends, otherwise link to ViewFriends
if (sakaiProxy.isSuperUserAndProxiedToUser(ownerUserId)) {
setResponsePage(new ViewFriends(ownerUserId));
} else if (viewingUserId.equals(ownerUserId)) {
setResponsePage(new MyFriends());
} else {
setResponsePage(new ViewFriends(ownerUserId));
}
}
}
};
Label viewFriendsLabel = new Label("viewFriendsLabel");
viewFriendsLink.add(viewFriendsLabel);
add(viewFriendsLink);
/* TESTS FOR THE ABOVE to change labels and links */
if(numFriends == 0) {
numFriendsLabel.setDefaultModel(new ResourceModel("text.friend.feed.num.none"));
//numFriendsLabel.setVisible(false);
//if own FriendsFeed, show search link, otherwise hide
if(viewingUserId.equals(ownerUserId)) {
viewFriendsLabel.setDefaultModel(new ResourceModel("link.friend.feed.search"));
} else {
viewFriendsLink.setVisible(false);
}
} else if (numFriends == 1) {
numFriendsLabel.setDefaultModel(new ResourceModel("text.friend.feed.num.one"));
viewFriendsLink.setVisible(false);
} else {
numFriendsLabel.setDefaultModel(new StringResourceModel("text.friend.feed.num.many", null, new Object[]{ numFriends }));
viewFriendsLabel.setDefaultModel(new ResourceModel("link.friend.feed.view"));
}
}
}