package edu.washington.cs.oneswarm.ui.gwt.client.newui;
import java.util.ArrayList;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;
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.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 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.friends.FriendListPanel;
import edu.washington.cs.oneswarm.ui.gwt.client.newui.friends.wizard.FriendsImportWizard;
import edu.washington.cs.oneswarm.ui.gwt.rpc.CommunityRecord;
public class CommunityServersSidePanel extends VerticalPanel implements Updateable {
private static OSMessages msg = OneSwarmGWT.msg;
ServerPanel mSelectedServer = null;
class ServerPanel extends FocusPanel {
private static final int MAX_LABEL_NAME_LENGTH = 20;
private boolean isSelected = false;
private long lastClick = 0;
private final ClickHandler clickListener = new ClickHandler() {
public void onClick(ClickEvent event) {
if (!isSelected) {
if (server.getSplash_path() == null) {
Window.alert(msg.community_servers_sidebar_no_files());
return;
}
ServerPanel.this.addStyleName(FriendListPanel.CSS_FRIEND_HIGHLIGHTED);
if (mSelectedServer != null) {
mSelectedServer.clearSelected();
}
mSelectedServer = ServerPanel.this;
setSelected();
EntireUIRoot.getRoot(CommunityServersSidePanel.this).serverFilterChanged();
} else if ((System.currentTimeMillis() - lastClick) < SwarmsBrowser.DOUBLE_CLICK_THRESHOLD) {
Window.open(server.getBaseURL(), "_blank", null);
}
lastClick = System.currentTimeMillis();
} // onClick()
};
private final HorizontalPanel mainPanel = new HorizontalPanel();
private final Image statusImage = new Image(ImageConstants.ICON_FRIEND_LIMITED);
private final HorizontalPanel imagePanel = new HorizontalPanel();
private final AbsolutePanel labelPanel = new AbsolutePanel();
private final Label nameLabel = new Label("");
private CommunityRecord server;
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 ServerPanel(CommunityRecord server) {
this.server = server;
addStyleName(OneSwarmCss.CLICKABLE);
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);
super.add(mainPanel);
refreshUI();
}
private void refreshUI() {
String name = server.getServer_name() == null ? server.getUrl() : server
.getServer_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);
// System.out.println(statusImage.getUrl() + " / " +
// server.getSplash_path());
if (statusImage.getUrl().endsWith(ImageConstants.ICON_FRIEND_LIMITED)
&& server.getSplash_path() != null) {
statusImage.setUrl(ImageConstants.ICON_FRIEND_ONLINE);
}
}
public void setSelected() {
if (!isSelected) {
ServerPanel.this.addStyleName(FriendListPanel.CSS_FRIEND_HIGHLIGHTED);
}
isSelected = true;
}
public void clearSelected() {
if (isSelected) {
ServerPanel.this.removeStyleName(FriendListPanel.CSS_FRIEND_HIGHLIGHTED);
super.setFocus(false);
}
isSelected = false;
}
public CommunityRecord getRecord() {
return server;
}
public void update(CommunityRecord po) {
this.server = po;
refreshUI();
}
}
private final VerticalPanel serverListVP = new VerticalPanel();
private final DisclosurePanel disclosurePanel = new DisclosurePanel(
msg.community_servers_sidebar_header(), false);
public CommunityServersSidePanel() {
VerticalPanel contentPanel = new VerticalPanel();
// add the panel that will contain the friends
serverListVP.setWidth("100%");
disclosurePanel.setOpen(true);
disclosurePanel.addStyleName("os-friendList");
MenuBar footerMenu = new MenuBar();
footerMenu.addStyleName("os-friendListFooter");
footerMenu.setWidth("100%");
MenuItem addFriendItem = new MenuItem(msg.community_servers_sidebar_add(), new Command() {
public void execute() {
OneSwarmDialogBox dlg = new FriendsImportWizard(
FriendsImportWizard.FRIEND_SRC_COMMUNITY);
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);
addFriendItem.getElement().setId("addFriendItemLink");
contentPanel.add(serverListVP);
contentPanel.add(footerMenu);
contentPanel.setCellHorizontalAlignment(footerMenu, HorizontalPanel.ALIGN_CENTER);
disclosurePanel.add(contentPanel);
this.add(disclosurePanel);
OneSwarmGWT.addToUpdateTask(this);
}
long nextUpdateRPC = 0;
public void update(int count) {
if (System.currentTimeMillis() > nextUpdateRPC) {
OneSwarmRPCClient.getService().getStringListParameterValue(
OneSwarmRPCClient.getSessionID(), "oneswarm.community.servers",
new AsyncCallback<ArrayList<String>>() {
public void onFailure(Throwable caught) {
caught.printStackTrace();
}
public void onSuccess(ArrayList<String> result) {
nextUpdateRPC = System.currentTimeMillis() + 5 * 1000;
if (result.size() / 5 == serverListVP.getWidgetCount()) {
// might need to update status
for (int i = 0; i < result.size() / 5; i++) {
CommunityRecord rec = new CommunityRecord(result, i * 5);
ServerPanel p = (ServerPanel) serverListVP.getWidget(i);
p.update(rec);
}
return;
}
serverListVP.clear();
for (int i = 0; i < result.size() / 5; i++) {
CommunityRecord rec = new CommunityRecord(result, i * 5);
serverListVP.add(new ServerPanel(rec));
}
}
});
nextUpdateRPC = System.currentTimeMillis() + 10 * 1000;
}
}
public void clearSelectedServer() {
if (mSelectedServer != null) {
mSelectedServer.clearSelected();
mSelectedServer = null;
}
}
public CommunityRecord getSelectedServer() {
if (mSelectedServer == null) {
return null;
}
return mSelectedServer.getRecord();
}
}