/** * TODO: remove all the show disconnected friends logic in this code (no longer applies) */ package edu.washington.cs.oneswarm.ui.gwt.client.newui.friends; import java.util.Arrays; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Map; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.event.dom.client.MouseOverHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.event.logical.shared.OpenEvent; import com.google.gwt.event.logical.shared.OpenHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.DisclosurePanel; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.MenuBar; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmDialogBox; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmGWT; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmRPCClient; import edu.washington.cs.oneswarm.ui.gwt.client.Updateable; import edu.washington.cs.oneswarm.ui.gwt.client.i18n.OSMessages; import edu.washington.cs.oneswarm.ui.gwt.client.newui.EntireUIRoot; import edu.washington.cs.oneswarm.ui.gwt.client.newui.ImageConstants; import edu.washington.cs.oneswarm.ui.gwt.client.newui.OneSwarmCss; import edu.washington.cs.oneswarm.ui.gwt.client.newui.SwarmsBrowser; import edu.washington.cs.oneswarm.ui.gwt.client.newui.friends.wizard.FriendsImportWizard; import edu.washington.cs.oneswarm.ui.gwt.rpc.FriendInfoLite; import edu.washington.cs.oneswarm.ui.gwt.rpc.FriendList; import edu.washington.cs.oneswarm.ui.gwt.rpc.OneSwarmConstants; import edu.washington.cs.oneswarm.ui.gwt.rpc.OneSwarmUIServiceAsync; import edu.washington.cs.oneswarm.ui.gwt.rpc.StringTools; public class FriendListPanel extends VerticalPanel implements Updateable { public static final String CSS_FRIEND_HIGHLIGHTED = "os-friend_highlight"; private static OSMessages msg = OneSwarmGWT.msg; private static final int UPDATE_LIMIT = 1; private static final String COOKIE_SHOW_OFFLINE_FRIENDS = "ShowOfflineFriends"; private static final String CSS_FRIEND_LIST_ELEMENT = "os-friendListElement"; private final VerticalPanel friendListVP = new VerticalPanel(); private final Map<String, FriendPanel> friendPanels = new HashMap<String, FriendPanel>(); private boolean fullUpdateNeeded = true; private FriendPanel mSelectedFriend = null; private FriendInfoLite[] newFriendsList = new FriendInfoLite[0]; private FriendInfoLite[] oldFriendsList = new FriendInfoLite[0]; private final DisclosurePanel disclosurePanel = new DisclosurePanel( msg.friends_sidebar_header(), false); private boolean showBlocked = false; private long lastClick = 0; private final MenuItem showBlockedItem; private boolean showDisconnected = false; private final MenuItem showOfflineItem; private HTML friendRequestsPanel = new HTML(); private VerticalPanel padding = new VerticalPanel(); private Map<String, Integer> newFriendRequestCounts = new HashMap<String, Integer>(); public FriendListPanel() { super(); // try { // if (Cookies.getCookie(COOKIE_SHOW_OFFLINE_FRIENDS) == null) { // showDisconnected = true; // Cookies.setCookie(COOKIE_SHOW_OFFLINE_FRIENDS, "1"); // } else if( Cookies.getCookie(COOKIE_SHOW_OFFLINE_FRIENDS).equals("1") // ) { // showDisconnected = true; // } else { // showDisconnected = false; // } // } catch (Exception e) { // showDisconnected = true; // } showDisconnected = false; disclosurePanel.addOpenHandler(new OpenHandler<DisclosurePanel>() { public void onOpen(OpenEvent<DisclosurePanel> event) { Cookies.setCookie("friend_list_open", true + ""); updateHeader(); } }); disclosurePanel.addCloseHandler(new CloseHandler<DisclosurePanel>() { public void onClose(CloseEvent<DisclosurePanel> event) { Cookies.setCookie("friend_list_open", false + "", OneSwarmConstants.TEN_YEARS_FROM_NOW); updateHeader(); } }); boolean open = true; String openCookie = Cookies.getCookie("friend_list_open"); if (openCookie != null) { open = Boolean.parseBoolean(openCookie); } disclosurePanel.setOpen(open); disclosurePanel.addStyleName("os-friendList"); // Borders.simpleBorder(panel, 5, Borders.ALL); // Borders.simpleBorder(panel, 5, Borders.ALL); VerticalPanel contentPanel = new VerticalPanel(); // add the panel that will contain the friends friendListVP.setWidth("100%"); friendRequestsPanel.setVisible(false); friendRequestsPanel.addStyleName("os-friendListRequestPanel"); friendRequestsPanel.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { OneSwarmDialogBox dlg = new FriendsImportWizard(newFriendRequestCounts); dlg.show(); dlg.setVisible(false); dlg.center(); dlg.setPopupPosition(dlg.getPopupLeft(), Math.max(40, dlg.getPopupTop() - 200)); dlg.setVisible(true); } }); contentPanel.add(friendRequestsPanel); contentPanel.add(padding); contentPanel.add(friendListVP); // the menu below the friend list MenuBar footerMenu = new MenuBar(); footerMenu.addStyleName("os-friendListFooter"); footerMenu.setWidth("100%"); MenuItem addFriendItem = new MenuItem(msg.friends_sidebar_add_friends(), new Command() { public void execute() { OneSwarmDialogBox dlg = new FriendsImportWizard(newFriendRequestCounts); dlg.show(); dlg.setVisible(false); dlg.center(); dlg.setPopupPosition(dlg.getPopupLeft(), Math.max(40, dlg.getPopupTop() - 200)); dlg.setVisible(true); } }); addFriendItem.setStylePrimaryName("os-friendListFooterMenu"); footerMenu.addItem(addFriendItem); // ********** done add menu // ********** options menu MenuBar optionsMenu = new MenuBar(true); final String showOffline = "Show offline friends"; final String hideOffline = "Hide offline friends"; final String showBlockedStr = "Show deleted friends"; final String hideBlockedStr = "Hide deleted friends"; showOfflineItem = new MenuItem(showDisconnected == true ? hideOffline : showOffline, new Command() { public void execute() { showDisconnected = !showDisconnected; if (showDisconnected == true) { Cookies.setCookie(COOKIE_SHOW_OFFLINE_FRIENDS, "1", new Date(System.currentTimeMillis() + (1 * 365 * 24 * 60 * 60 * 1000))); } else { Cookies.setCookie(COOKIE_SHOW_OFFLINE_FRIENDS, "0", new Date(System.currentTimeMillis() + (1 * 365 * 24 * 60 * 60 * 1000))); } if (showOfflineItem.getText().equals(showOffline)) { showOfflineItem.setText(hideOffline); } else { showOfflineItem.setText(showOffline); showBlockedItem.setText(showBlockedStr); showBlocked = false; Cookies.setCookie("ShowBlockedFriends", "1", OneSwarmConstants.TEN_YEARS_FROM_NOW); } fullUpdateNeeded = true; update(0); } }); optionsMenu.addItem(showOfflineItem); showBlockedItem = new MenuItem(showBlocked == true ? hideBlockedStr : showBlockedStr, new Command() { public void execute() { showBlocked = !showBlocked; if (showBlockedItem.getText().equals(showBlockedStr)) { showBlockedItem.setText(hideBlockedStr); showDisconnected = true; showOfflineItem.setText(hideOffline); Cookies.setCookie("ShowBlockedFriends", "0"); OneSwarmRPCClient.getService().setRecentChanges( OneSwarmRPCClient.getSessionID(), true, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { OneSwarmGWT.log("delete friend: got error"); } public void onSuccess(Void result) { } }); } else { showBlockedItem.setText(showBlockedStr); Cookies.setCookie("ShowBlockedFriends", "1"); OneSwarmRPCClient.getService().setRecentChanges( OneSwarmRPCClient.getSessionID(), true, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { OneSwarmGWT.log("delete friend: got error"); } public void onSuccess(Void result) { } }); } update(0); } }); optionsMenu.addItem(showBlockedItem); MenuItem optionsItem = new MenuItem( "Options<img src='images/icons/disclosure.png' width='10px' height='10px'>", true, optionsMenu); optionsItem.setStylePrimaryName("os-friendListFooterMenu"); // footerMenu.addItem(optionsItem); contentPanel.add(footerMenu); contentPanel.setCellHorizontalAlignment(footerMenu, HorizontalPanel.ALIGN_CENTER); disclosurePanel.add(contentPanel); // RoundedPanel rp = new RoundedPanel(panel, RoundedPanel.TOPRIGHT | // RoundedPanel.BOTTOMLEFT, 3); // rp.setCornerStyleName("os-friendListCorners"); // this.initWidget(rp); this.add(disclosurePanel); if (Cookies.getCookie("ShowBlockedFriends") == null) { Cookies.setCookie("ShowBlockedFriends", "1", OneSwarmConstants.TEN_YEARS_FROM_NOW); } OneSwarmGWT.addToUpdateTask(this); } public void clearSelectedFriend() { if (mSelectedFriend != null) { mSelectedFriend.clearSelected(); } mSelectedFriend = null; } public FriendInfoLite getSelectedFriend() { if (mSelectedFriend != null) { return mSelectedFriend.getFriendInfo(); } else { return null; } } private int prevListId = 0; private long nextNewMessageRPCCheck = 0; protected Map<String, Integer> mUnreadChatCounts = new HashMap<String, Integer>(); public void update(int count) { if (count % UPDATE_LIMIT == 0) { String session = OneSwarmRPCClient.getSessionID(); OneSwarmUIServiceAsync service = OneSwarmRPCClient.getService(); if (System.currentTimeMillis() > nextNewMessageRPCCheck) { nextNewMessageRPCCheck = System.currentTimeMillis() + 10 * 1000; service.getUnreadMessageCounts(session, new AsyncCallback<HashMap<String, Integer>>() { public void onFailure(Throwable caught) { caught.printStackTrace(); } public void onSuccess(HashMap<String, Integer> result) { mUnreadChatCounts = result; int total = 0; for (FriendPanel panel : friendPanels.values()) { panel.updateChatCount(); } if (result.size() > 0) { for (Integer v : result.values()) { total += v; } } EntireUIRoot.getRoot(FriendListPanel.this) .setUnreadChatCount(total); nextNewMessageRPCCheck = System.currentTimeMillis() + 2000; } }); } service.getFriends(session, prevListId, showDisconnected, showBlocked, new AsyncCallback<FriendList>() { public void onFailure(Throwable caught) { // well, do nothing... newFriendsList = new FriendInfoLite[0]; OneSwarmGWT.log("error " + caught.getMessage()); } public void onSuccess(FriendList result) { /* * check if something changed on the back end, if * not, don't update */ if (prevListId != result.getListId()) { OneSwarmGWT.log("updating friend list: " + (prevListId != result.getListId()) + " prev=" + prevListId + " next=" + result.getListId()); newFriendsList = result.getFriendList(); prevListId = result.getListId(); updateUI(true); } } }); service.getNewFriendsCountsFromAutoCheck(session, new AsyncCallback<HashMap<String, Integer>>() { public void onFailure(Throwable caught) { OneSwarmGWT.log("error " + caught.getMessage()); } public void onSuccess(HashMap<String, Integer> result) { FriendListPanel.this.newFriendRequestCounts = result; int sum = 0; for (String key : result.keySet()) { int count = result.get(key); sum += count; } if (sum > 0) { friendRequestsPanel.setHTML(msg .friends_sidebar_notice_friend_updates_HTML(sum)); padding.setVisible(true); padding.addStyleName("os-friendListRequestPadding"); friendRequestsPanel.setVisible(true); } else { friendRequestsPanel.setVisible(false); padding.setVisible(false); padding.removeStyleName("os-friendListRequestPadding"); } } }); } } public void updateUI() { updateUI(false); } public void updateUI(boolean forceFullUpdate) { if (forceFullUpdate) { fullUpdateNeeded = true; } FriendInfoLite selected = getSelectedFriend(); if (newFriendsList.length != oldFriendsList.length) { // need a complete update here fullUpdateNeeded = true; } System.out.println("updating friend list full=" + fullUpdateNeeded); if (!fullUpdateNeeded) { // same number, just update for (int i = 0; i < oldFriendsList.length; i++) { final FriendInfoLite f = newFriendsList[i]; FriendPanel p = friendPanels.get(f.getPublicKey()); if (p == null) { fullUpdateNeeded = true; break; } p.update(f); if (selected != null && selected.equals(f)) { if (f.getStatus() == FriendInfoLite.STATUS_ONLINE) { mSelectedFriend.clearSelected(); p.setSelected(); mSelectedFriend = p; } else { // selected friend went offline p.clearSelected(); mSelectedFriend = null; EntireUIRoot.getRoot(this).friendFilterChanged(); } } else { p.clearSelected(); } } } if (fullUpdateNeeded) { friendListVP.setVisible(false); friendListVP.clear(); friendPanels.clear(); Map<String, GroupPanel> groups = new HashMap<String, GroupPanel>(); for (FriendInfoLite f : newFriendsList) { FriendPanel p = new FriendPanel(f); friendPanels.put(f.getPublicKey(), p); if (f.getGroup() != null) { if (f.getGroup().length() > 0) { GroupPanel groupTree = groups.get(f.getGroup()); if (groupTree == null) { groupTree = new GroupPanel(f.getGroup()); groups.put(f.getGroup(), groupTree); } groupTree.addChild(p); } else { friendListVP.add(p); } } else { friendListVP.add(p); } if (f.equals(getSelectedFriend())) { if (f.getStatus() == FriendInfoLite.STATUS_ONLINE) { p.setSelected(); mSelectedFriend = p; } else { // selected friend went offline p.clearSelected(); mSelectedFriend = null; } } } GroupPanel[] sortedPanels = groups.values().toArray(new GroupPanel[0]); Arrays.sort(sortedPanels, new Comparator<GroupPanel>() { public int compare(GroupPanel o1, GroupPanel o2) { return o1.getName().compareTo(o2.getName()); } }); for (GroupPanel disc : sortedPanels) { friendListVP.add(disc); } friendListVP.setVisible(true); // System.out.println("full update needed"); } oldFriendsList = newFriendsList; friendListVP.setVisible(true); fullUpdateNeeded = false; updateHeader(); } private void updateHeader() { if (!disclosurePanel.isOpen()) { disclosurePanel.getHeaderTextAccessor().setText( msg.friends_sidebar_header() + " (" + oldFriendsList.length + ")"); } else { disclosurePanel.getHeaderTextAccessor().setText(msg.friends_sidebar_header()); } } private class GroupPanel extends VerticalPanel { public static final String CSS_GROUP_PANEL_HEADER = "os-group_panel_header"; Image hideShowImage = new Image(ImageConstants.ICON_FRIEND_GROUP_CLOSED); Label countLabel = new Label(); ClickHandler swapHandler = new ClickHandler() { public void onClick(ClickEvent event) { boolean isOpen; String neu = ImageConstants.ICON_FRIEND_GROUP_OPEN; if (isOpen()) { neu = ImageConstants.ICON_FRIEND_GROUP_CLOSED; for (int i = 1; i < getWidgetCount(); i++) { getWidget(i).setVisible(false); } isOpen = false; } else { for (int i = 1; i < getWidgetCount(); i++) { getWidget(i).setVisible(true); } isOpen = true; } hideShowImage.setUrl(neu); countLabel.setVisible(!isOpen); Cookies.setCookie(mName, isOpen + "", OneSwarmConstants.TEN_YEARS_FROM_NOW); } }; private String mName; public String getName() { return mName; } private boolean isOpen() { return hideShowImage.getUrl().endsWith(ImageConstants.ICON_FRIEND_GROUP_OPEN); } public GroupPanel(String inName) { addStyleName(CSS_FRIEND_LIST_ELEMENT); mName = inName; HorizontalPanel header = new HorizontalPanel(); header.add(hideShowImage); header.addStyleName(CSS_GROUP_PANEL_HEADER); hideShowImage.addClickHandler(swapHandler); Label l = new Label(inName); l.addClickHandler(swapHandler); header.add(l); // countLabel.addStyleName(OneSwarmCss.TEXT_BOLD); countLabel.addClickHandler(swapHandler); header.add(countLabel); header.setCellVerticalAlignment(hideShowImage, VerticalPanel.ALIGN_MIDDLE); header.setCellVerticalAlignment(l, VerticalPanel.ALIGN_MIDDLE); header.setCellHorizontalAlignment(l, HorizontalPanel.ALIGN_LEFT); header.setCellWidth(hideShowImage, "15px"); header.setCellHorizontalAlignment(hideShowImage, HorizontalPanel.ALIGN_CENTER); header.setWidth("100%"); header.setCellHorizontalAlignment(countLabel, HorizontalPanel.ALIGN_RIGHT); add(header); setWidth("100%"); String isOpenCookie = Cookies.getCookie(mName); if (isOpenCookie != null && Boolean.parseBoolean(isOpenCookie)) { hideShowImage.setUrl(ImageConstants.ICON_FRIEND_GROUP_OPEN); countLabel.setVisible(false); } } public void addChild(Widget kid) { if (isOpen()) { kid.setVisible(true); } else { kid.setVisible(false); } add(kid); countLabel.setText(" (" + (getWidgetCount() - 1) + ")"); } } private class FriendPanel extends FocusPanel { private static final int MAX_LABEL_NAME_LENGTH = 27; private ClickHandler clickListener = new ClickHandler() { public void onClick(ClickEvent event) { if (!isSelected && friendInfoLite.getStatus() == FriendInfoLite.STATUS_ONLINE) { FriendPanel.this.addStyleName(CSS_FRIEND_HIGHLIGHTED); if (mSelectedFriend != null) { mSelectedFriend.clearSelected(); } mSelectedFriend = FriendPanel.this; setSelected(); EntireUIRoot.getRoot(FriendListPanel.this).friendFilterChanged(); OneSwarmGWT.log("selected friend conn id: " + friendInfoLite.getConnectionId()); } else if ((System.currentTimeMillis() - lastClick) < SwarmsBrowser.DOUBLE_CLICK_THRESHOLD) { EntireUIRoot.getRoot(FriendListPanel.this).startChat(friendInfoLite); } lastClick = System.currentTimeMillis(); } }; private FriendInfoLite friendInfoLite; private Image statusImage = new Image("images/friend_offline.png"); private Label nameLabel = new Label(""); private final HorizontalPanel imagePanel = new HorizontalPanel(); private HorizontalPanel mainPanel = new HorizontalPanel(); private AbsolutePanel labelPanel = new AbsolutePanel(); private boolean isSelected = false; // final ; private final HorizontalPanel iconsPanel = new HorizontalPanel(); private final static int TOTAL_WIDTH = 170; private final static int STATUS_IMAGE = 12; private final static int NAME_LABEL_WIDTH = TOTAL_WIDTH - STATUS_IMAGE - 4; private final static int HEIGHT = 18; public FriendPanel(FriendInfoLite friend) { // panel.setVisible(false); mainPanel.setWidth(TOTAL_WIDTH + "px"); statusImage.setHeight(STATUS_IMAGE + "px"); statusImage.setWidth(STATUS_IMAGE + "px"); imagePanel.add(statusImage); imagePanel.setHorizontalAlignment(ALIGN_CENTER); imagePanel.setWidth(STATUS_IMAGE + 2 + "px"); mainPanel.add(imagePanel); mainPanel.setCellVerticalAlignment(imagePanel, HorizontalPanel.ALIGN_TOP); mainPanel.setCellHorizontalAlignment(imagePanel, HorizontalPanel.ALIGN_CENTER); statusImage.addClickHandler(clickListener); labelPanel.setHeight(HEIGHT + "px"); labelPanel.setWidth(NAME_LABEL_WIDTH + "px"); nameLabel.setWidth(NAME_LABEL_WIDTH + "px"); nameLabel.setHeight(14 + "px"); nameLabel.setText("test"); labelPanel.add(nameLabel, 2, 0); nameLabel.addClickHandler(clickListener); mainPanel.add(labelPanel); iconsPanel.setVisible(false); iconsPanel.addStyleName(OneSwarmCss.CLICKABLE); super.add(mainPanel); this.addMouseOverHandler(new MouseOverHandler() { public void onMouseOver(MouseOverEvent event) { iconsPanel.setVisible(true); } }); this.addMouseOutHandler(new MouseOutHandler() { public void onMouseOut(MouseOutEvent event) { iconsPanel.setVisible(false); } }); update(friend); // panel.setVisible(true); } private int iconsPanelSize = 0; private void addIcon(Image image) { int iconSize = 16; int totalSize = 20; iconsPanelSize += totalSize; image.setHeight(iconSize + "px"); image.setWidth(iconSize + "px"); iconsPanel.add(image); iconsPanel.setCellWidth(image, totalSize + "px"); iconsPanel.setCellHeight(image, totalSize + "px"); iconsPanel.setCellHorizontalAlignment(image, HorizontalPanel.ALIGN_CENTER); } protected void updateChatCount() { if (mUnreadChatCounts.containsKey(friendInfoLite.getPublicKey())) { statusImage.setUrl(ImageConstants.ICON_CHAT); String pre = "(" + mUnreadChatCounts.get(this.friendInfoLite.getPublicKey()) + ") "; nameLabel.setText(pre + StringTools.truncate(friendInfoLite.getName(), FriendPanel.MAX_LABEL_NAME_LENGTH - pre.length(), false)); } else { if (statusImage.getUrl().endsWith(ImageConstants.ICON_CHAT)) { nameLabel.setText(StringTools.truncate(friendInfoLite.getName(), FriendPanel.MAX_LABEL_NAME_LENGTH, false)); updateStatus(this.friendInfoLite, false); } } } public boolean isSelected() { return isSelected; } private Image createEditImage() { final Image editImage = new Image(ImageConstants.ICON_TRIANGLE); editImage.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { FriendPropertiesDialog dlg = new FriendPropertiesDialog(FriendListPanel.this, friendInfoLite, OneSwarmGWT.hasDevUpdates()); dlg.show(); dlg.setVisible(false); dlg.center(); dlg.setPopupPosition(editImage.getAbsoluteLeft(), editImage.getAbsoluteTop()); // since we // don't know the size until the list loads, we fix this to // high up on the screen dlg.setVisible(true); iconsPanel.setVisible(false); } }); return editImage; } private Image createChatImage() { final Image editImage = new Image(ImageConstants.ICON_CHAT); editImage.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { EntireUIRoot.getRoot(editImage).startChat(friendInfoLite); } }); return editImage; } public void update(FriendInfoLite friend) { // OneSwarmGWT.log("updating: " + friend.getName()); this.friendInfoLite = friend; updateName(friendInfoLite); updateStatus(friendInfoLite, true); updateIcons(friendInfoLite); } private void updateIcons(FriendInfoLite friend) { iconsPanel.clear(); iconsPanelSize = 0; if (friend.isSupportsChat() && friend.isAllowChat()) { Image chatImage = createChatImage(); addIcon(chatImage); } Image editImage = createEditImage(); addIcon(editImage); iconsPanel.setHorizontalAlignment(HorizontalPanel.ALIGN_RIGHT); iconsPanel.setWidth(iconsPanelSize + "px"); labelPanel.add(iconsPanel, NAME_LABEL_WIDTH + 2 - iconsPanelSize, 0); } public void setSelected() { if (!isSelected) { FriendPanel.this.addStyleName(CSS_FRIEND_HIGHLIGHTED); } isSelected = true; } public void clearSelected() { if (isSelected) { FriendPanel.this.removeStyleName(CSS_FRIEND_HIGHLIGHTED); super.setFocus(false); } isSelected = false; } public FriendInfoLite getFriendInfo() { return friendInfoLite; } private void setImageSettings(HorizontalPanel panel, Image i, int imageWidth, int imageHeigth) { panel.add(i); i.setHeight(imageHeigth + "px"); i.setWidth(imageWidth + "px"); } private String oldName; private void updateName(FriendInfoLite f) { final String name = f.getName(); if (name.equals(oldName)) { return; } oldName = name; String labelName; if (name.length() > MAX_LABEL_NAME_LENGTH) { labelName = name.substring(0, MAX_LABEL_NAME_LENGTH - 2) + "..."; } else { labelName = name; } nameLabel.setText(labelName); nameLabel.setTitle(name + (this.friendInfoLite.isCanSeeFileList() == false ? " (limited)" : "")); // System.out.println("updating: " + labelName); } private int oldStatus = -1; private void updateStatus(FriendInfoLite f, boolean updateChat) { if (f.getStatus() != oldStatus) { oldStatus = f.getStatus(); imagePanel.clear(); int imageWidth = 12; int imageHeigth = 12; if (f.getStatus() == FriendInfoLite.STATUS_ONLINE) { nameLabel.setStylePrimaryName(CSS_FRIEND_LIST_ELEMENT); if (f.isCanSeeFileList() == true) { statusImage.setUrl(ImageConstants.ICON_FRIEND_ONLINE); } else { statusImage.setUrl(ImageConstants.ICON_FRIEND_LIMITED); } statusImage.setTitle("Connected" + (f.isCanSeeFileList() == false ? " (limited)" : "")); } else { nameLabel.setStylePrimaryName("os-friendListElementDisconnected"); if (f.isBlocked()) { statusImage.setUrl(ImageConstants.ICON_FRIEND_BLOCKED); statusImage.setTitle("Deleted"); // imageWidth = 14; // imageHeigth = 14; } else if (f.getStatus() == FriendInfoLite.STATUS_CONNECTING) { statusImage.setUrl(ImageConstants.ICON_FRIEND_CONNECTING); statusImage.setTitle("Connecting..."); // imageWidth = 14; // imageHeigth = 14; } else if (f.getStatus() == FriendInfoLite.STATUS_HANDSHAKING) { statusImage.setUrl(ImageConstants.ICON_FRIEND_HANDSHAKING); statusImage.setTitle("Handshaking..."); // imageWidth = 14; // imageHeigth = 14; } else if (f.getLastConnectedDate() == null) { statusImage.setUrl(ImageConstants.ICON_FRIEND_UNKNOWN); statusImage.setTitle("Never connected"); // imageWidth = 14; // imageHeigth = 14; } else if (f.getStatus() == FriendInfoLite.STATUS_OFFLINE) { statusImage.setUrl(ImageConstants.ICON_FRIEND_OFFLINE); statusImage.setTitle("Offline"); } } imagePanel.add(statusImage); setImageSettings(imagePanel, statusImage, imageWidth, imageHeigth); } if (updateChat) { updateChatCount(); } // System.out.println("updating: " + nameLabel.getText() + // " status=" + f.getStatus() + " blocked=" + f.isBlocked()); } } public FriendInfoLite[] getAllFriends() { return newFriendsList; } }