package edu.washington.cs.oneswarm.ui.gwt.client.newui.friends.wizard; import java.util.Date; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmRPCClient; import edu.washington.cs.oneswarm.ui.gwt.client.newui.HelpButton; import edu.washington.cs.oneswarm.ui.gwt.rpc.FriendInvitationLite; import edu.washington.cs.oneswarm.ui.gwt.rpc.OneSwarmConstants.SecurityLevel; public class InvitationRedeemPanel extends FriendsImportWithBack { private final FriendsImportCallback fwCallback; private Step1 step1; public InvitationRedeemPanel(FriendsImportCallback _fwcallback, String inviteCode, String name) { this.fwCallback = _fwcallback; this.step1 = new Step1(this, inviteCode, name); setFirstStep(step1); } public InvitationRedeemPanel(FriendsImportCallback _fwcallback) { this(_fwcallback, "", ""); } private class Step1 extends FriendsImportWithBackStep implements KeyUpHandler, MouseUpHandler, ChangeHandler, MouseOutHandler { private boolean enteredNickname = false; private boolean enteredCode = false; private TextBox nickBox; private TextBox codeBox; private InvitationRedeemPanel parent; private final HTML errorLabel = new HTML(); public Step1(InvitationRedeemPanel parent, String code, String name) { this.parent = parent; /********************************************************* * step 1: friends name */ Label selectLabel = new HTML(msg.add_friends_manual_step_1_type_nickname_HTML()); selectLabel.addStyleName(FriendsImportWizard.CSS_DIALOG_HEADER); selectLabel.setWidth(WIDTH + "px"); this.add(selectLabel); // nickname HorizontalPanel nickPanel = new HorizontalPanel(); nickPanel.setSpacing(3); nickPanel.setWidth(WIDTH + "px"); Label nickLabel = new Label(msg.friend_properties_nickname_label()); nickLabel.setWidth("100%"); nickPanel.add(nickLabel); nickPanel.setCellVerticalAlignment(nickLabel, VerticalPanel.ALIGN_MIDDLE); nickPanel.setCellWidth(nickLabel, "95px"); nickBox = new TextBox(); nickBox.setText(name); nickBox.addKeyUpHandler(this); nickBox.addMouseUpHandler(this); nickBox.addChangeHandler(this); nickBox.setWidth("100%"); nickPanel.add(nickBox); HelpButton nameHelp = new HelpButton(msg.friend_properties_nickname_help()); nickPanel.add(nameHelp); nickPanel.setCellVerticalAlignment(nameHelp, VerticalPanel.ALIGN_MIDDLE); nickPanel.setCellHorizontalAlignment(nameHelp, HorizontalPanel.ALIGN_RIGHT); this.add(nickPanel); /************************************************************* * step 2: Invitation code */ Label codeLabel = new HTML(msg.add_friends_invite_redeem_step2_enter_code_HTML()); codeLabel.addStyleName(FriendsImportWizard.CSS_DIALOG_HEADER); codeLabel.setWidth(WIDTH + "px"); this.add(codeLabel); // nickname HorizontalPanel codePanel = new HorizontalPanel(); codePanel.setSpacing(3); codePanel.setWidth(WIDTH + "px"); // Label cLabel = new Label("Invitation Code:"); // cLabel.setWidth("100%"); // codePanel.add(cLabel); // codePanel.setCellVerticalAlignment(cLabel, // VerticalPanel.ALIGN_MIDDLE); // codePanel.setCellWidth(cLabel, "95px"); codeBox = new TextBox(); codeBox.setText(code); codeBox.addKeyUpHandler(this); codeBox.addChangeHandler(this); codeBox.addMouseUpHandler(this); codeBox.addMouseOutHandler(this); codeBox.setWidth("100%"); codeBox.addStyleName("friend_invitation-code"); codePanel.add(codeBox); HelpButton codeHelp = new HelpButton(msg.add_friends_invite_redeem_invite_code_help()); codePanel.add(codeHelp); codePanel.setCellVerticalAlignment(codeHelp, VerticalPanel.ALIGN_MIDDLE); codePanel.setCellHorizontalAlignment(codeHelp, HorizontalPanel.ALIGN_RIGHT); this.add(codePanel); errorLabel.setVisible(false); this.add(errorLabel); parent.enableNextButton(false); checkText(); } @Override public FriendsImportWithBackStep createNextPanel() { FriendInvitationLite i = createInvitation(); boolean testOnly = false; OneSwarmRPCClient.getService().redeemInvitation(OneSwarmRPCClient.getSessionID(), i, testOnly, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { caught.printStackTrace(); } public void onSuccess(Void result) { fwCallback.back(); } }); return null; } private FriendInvitationLite createInvitation() { FriendInvitationLite i = new FriendInvitationLite(); i.setCanSeeFileList(true); i.setKey(codeBox.getText()); i.setName(nickBox.getText()); i.setSecurityLevel(SecurityLevel.NONE); i.setCreatedDate(new Date().getTime()); i.setCreatedLocally(false); return i; } public void checkText() { enteredNickname = (nickBox.getText().length() > 0); enteredCode = (codeBox.getText().length() > 0); if (enteredCode && enteredNickname) { FriendInvitationLite i = createInvitation(); boolean testOnly = true; OneSwarmRPCClient.getService().redeemInvitation(OneSwarmRPCClient.getSessionID(), i, testOnly, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { parent.enableNextButton(false); setErrorText(caught.getMessage()); } public void onSuccess(Void result) { parent.enableNextButton(true); errorLabel.setVisible(false); errorLabel.setText(""); } }); } else if (enteredCode) { setErrorText(msg.add_friends_invite_redeem_error_need_nickname()); } } private void setErrorText(String text) { boolean visible = text != null && text.length() > 0; errorLabel.setVisible(visible); errorLabel.setHTML(msg.add_friends_invite_redeem_error_HTML() + text); } @Override public String getNextButtonText() { return msg.add_friends_invite_redeem_button(); } public void onKeyUp(KeyUpEvent event) { checkText(); } public void onMouseUp(MouseUpEvent event) { checkText(); } public void onChange(ChangeEvent event) { checkText(); } public void onMouseOut(MouseOutEvent event) { checkText(); } } public void enableNextButton(boolean enable) { this.nextButton.setEnabled(enable); } @Override protected void onLastBack() { this.fwCallback.back(); } protected void onLastNext() { this.fwCallback.cancel(); } }