package edu.washington.cs.oneswarm.ui.gwt.client.newui; import java.util.ArrayList; import java.util.List; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Hyperlink; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; 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.ReportableErrorDialogBox; import edu.washington.cs.oneswarm.ui.gwt.client.Updateable; import edu.washington.cs.oneswarm.ui.gwt.client.i18n.OSMessages; public class NewUserSetupPanel extends VerticalPanel implements Updateable { private static OSMessages msg = OneSwarmGWT.msg; public static final String CSS_WELCOME_BANNER = "os-welcome_banner"; public static final String CSS_WELCOME_PROMPT = "os-welcome_prompt"; public static final String CSS_WELCOME_DEFAULTS_BUTTON = "os-welcome_defaults_button"; private final SwarmsBrowser swarmsBrowser; enum State { kLoading, kNoFriendsNoCommunity, kNoFriends, kNoOnlineFriends, kFriendsButNotOnline, kFriendsOnline } private State state = State.kLoading; public NewUserSetupPanel(SwarmsBrowser browser) { // HTML w = new HTML("<div id=\"" + OneSwarmCss.CSS_NOTHING_SHOWING + // "\">" + Strings.get(Strings.NO_FILES_MESSAGE) + "</div>"); // this.add(w); // this.swarmsBrowser = browser; addStyleName(OneSwarmCss.CSS_NOTHING_SHOWING); setWidth("100%"); updateStatus(msg.loading()); } private void updateStatus(String message) { updateStatus(message, true); } private void updateStatus(String message, boolean show_spinner) { clear(); SimplePanel spacer = new SimplePanel(); DOM.setStyleAttribute(spacer.getElement(), "height", "75px"); add(spacer); Image spinner = new Image(ImageConstants.PROGRESS_SPINNER); spinner.setWidth("16px"); spinner.setHeight("16px"); HorizontalPanel status = new HorizontalPanel(); HTML workingLabel = new HTML(message); if (show_spinner) { status.add(spinner); status.setCellVerticalAlignment(spinner, ALIGN_MIDDLE); status.setSpacing(3); } // workingLabel.addStyleName(CSS_WELCOME_PROMPT); status.add(workingLabel); status.setCellVerticalAlignment(workingLabel, ALIGN_MIDDLE); status.setCellWidth(workingLabel, "375px"); if (!show_spinner) { DOM.setStyleAttribute(workingLabel.getElement(), "textAlign", "center"); } add(status); setCellHorizontalAlignment(status, ALIGN_CENTER); spacer = new SimplePanel(); DOM.setStyleAttribute(spacer.getElement(), "height", "150px"); add(spacer); } private void firstrun() { clear(); state = State.kNoFriendsNoCommunity; Label banner = new Label(msg.swarm_browser_welcome_banner()); banner.addStyleName(CSS_WELCOME_BANNER); add(banner); SimplePanel spacer = new SimplePanel(); DOM.setStyleAttribute(spacer.getElement(), "height", "15px"); add(spacer); Label desc = new Label(msg.swarm_browser_welcome_prompt()); desc.addStyleName(CSS_WELCOME_PROMPT); add(desc); this.setCellHorizontalAlignment(desc, ALIGN_CENTER); Button defaultsButton = new Button(msg.swarm_browser_welcome_button_default()); defaultsButton.getElement().setId("useDefaultsLink"); defaultsButton.addStyleName(CSS_WELCOME_DEFAULTS_BUTTON); defaultsButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { defaultClicked(); } }); add(defaultsButton); this.setCellHorizontalAlignment(defaultsButton, ALIGN_CENTER); Label defaults = new Label(msg.swarm_browser_welcome_defaults()); add(defaults); setCellHorizontalAlignment(defaults, ALIGN_CENTER); Hyperlink advanced = new Hyperlink(msg.swarm_browser_welcome_manual_import(), ""); add(advanced); setCellHorizontalAlignment(advanced, ALIGN_CENTER); advanced.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { swarmsBrowser.showSettings(1); } }); spacer = new SimplePanel(); DOM.setStyleAttribute(spacer.getElement(), "height", "150px"); add(spacer); } @Override public void onAttach() { super.onAttach(); OneSwarmGWT.addToUpdateTask(this); } @Override public void onDetach() { super.onDetach(); OneSwarmGWT.removeFromUpdateTask(this); } private void defaultClicked() { updateStatus(msg.swarm_browser_welcome_configuring()); OneSwarmRPCClient.getService().applyDefaultSettings(OneSwarmRPCClient.getSessionID(), new AsyncCallback<Void>() { @Override public void onFailure(Throwable caught) { String message = caught.getClass().getName() + " / " + caught.toString() + " / " + caught.getMessage(); new ReportableErrorDialogBox(message, false); } @Override public void onSuccess(Void result) { state = State.kNoFriends; } }); } private long mNextRPC = 0; @Override public void update(int count) { if (mNextRPC < System.currentTimeMillis()) { mNextRPC = System.currentTimeMillis() + 10 * 1000; // System.out.println("new user rpc"); OneSwarmRPCClient.getService().getNumberOnlineFriends(OneSwarmRPCClient.getSessionID(), new AsyncCallback<Integer>() { @Override public void onFailure(Throwable caught) { caught.printStackTrace(); } @Override public void onSuccess(Integer onlineFriends) { mNextRPC = System.currentTimeMillis() + 10 * 1000; // System.out.println("online friends: " + // onlineFriends); if (onlineFriends == 0) { OneSwarmRPCClient.getService().getNumberFriendsCount( OneSwarmRPCClient.getSessionID(), new AsyncCallback<Integer>() { @Override public void onFailure(Throwable caught) { caught.printStackTrace(); } @Override public void onSuccess(Integer anyfriends) { // System.out.println("total friends: " // + anyfriends); if (anyfriends == 0) { // System.out.println("0 total friends"); // now also check if there // are no community servers mNextRPC = System.currentTimeMillis() + 10 * 1000; OneSwarmRPCClient .getService() .getStringListParameterValue( OneSwarmRPCClient .getSessionID(), "oneswarm.community.servers", new AsyncCallback<ArrayList<String>>() { @Override public void onFailure( Throwable caught) { } @Override public void onSuccess( ArrayList<String> result) { if (result.size() == 0) { System.out .println("no community servers"); if (state != State.kNoFriendsNoCommunity) { firstrun(); state = State.kNoFriendsNoCommunity; } } else if (state != State.kNoFriends) { nofriends(); state = State.kNoFriends; } mNextRPC = System .currentTimeMillis() + 5 * 1000; } }); } else if (state != State.kFriendsButNotOnline) { // System.out.println("friends but not online"); nofriendsonline(); mNextRPC = System.currentTimeMillis() + 5 * 1000; state = State.kFriendsButNotOnline; } } }); } else { // onlineFriends > 0 if (state != State.kFriendsOnline) { state = State.kFriendsOnline; friendsonline(); } mNextRPC = System.currentTimeMillis() + 5 * 1000; } } }); } // if < RPC threshold } private void friendsonline() { updateStatus(msg.swarm_browser_welcome_friends_online(), false); } private void nofriends() { updateStatus(msg.swarm_browser_welcome_no_friends_online_HTML(), false); } private void nofriendsonline() { updateStatus(msg.swarm_browser_welcome_no_friends_online_HTML(), false); } }