package com.andreiolar.abms.client.widgets; import java.util.List; import com.andreiolar.abms.client.constants.DialogBoxConstants; import com.andreiolar.abms.client.constants.UserMenuConstants; import com.andreiolar.abms.client.rpc.DBGetTenantSuggestions; import com.andreiolar.abms.client.rpc.DBGetTenantSuggestionsAsync; import com.andreiolar.abms.client.rpc.DBSendMessage; import com.andreiolar.abms.client.rpc.DBSendMessageAsync; import com.andreiolar.abms.client.utils.DialogBoxCreator; import com.andreiolar.abms.shared.Conversation; import com.andreiolar.abms.shared.UserInfo; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.FontStyle; import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.regexp.shared.MatchResult; import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.ServiceDefTarget; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.MultiWordSuggestOracle; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; public class MessageDialogBox { private UserInfo userInfo; public MessageDialogBox(UserInfo userInfo) { this.userInfo = userInfo; } public DialogBox initializeDialogBox() { final DialogBox messageDialogBox = new DialogBox(); messageDialogBox.setText(UserMenuConstants.MESSAGE_DIALOG_BOX_TITLE); messageDialogBox.setWidth("500px"); VerticalPanel panel = new VerticalPanel(); panel.setSpacing(6); messageDialogBox.setWidget(panel); Grid grid = new Grid(4, 2); Label toLabel = new Label(); toLabel.setText("To"); MultiWordSuggestOracle oracle = getDBSuggestions(); final CustomTexBox toBox = new CustomTexBox(); final SuggestBox suggestBox = new SuggestBox(oracle, toBox); Label subjectLabel = new Label(); subjectLabel.setText("Subject"); final TextBox subjectBox = new TextBox(); subjectBox.setMaxLength(15); Label messageLabel = new Label(); messageLabel.setText("Message"); final TextArea messageBox = new TextArea(); messageBox.setSize("350px", "150px"); messageBox.getElement().setAttribute("maxlength", "500"); final Label charsRemainingLabel = new Label(); charsRemainingLabel.setText("500 characters remaining."); charsRemainingLabel.getElement().getStyle().setFontWeight(FontWeight.LIGHTER); charsRemainingLabel.getElement().getStyle().setFontStyle(FontStyle.ITALIC); messageBox.addKeyUpHandler(new KeyUpHandler() { @Override public void onKeyUp(KeyUpEvent event) { String text = messageBox.getText(); int length = text.length(); int remaining = 500 - length; charsRemainingLabel.setText(remaining + " characters remaining."); } }); grid.setWidget(0, 0, toLabel); grid.setWidget(0, 1, suggestBox); grid.setWidget(1, 0, subjectLabel); grid.setWidget(1, 1, subjectBox); grid.setWidget(2, 0, messageLabel); grid.setWidget(2, 1, messageBox); grid.setWidget(3, 1, charsRemainingLabel); grid.getWidget(0, 0).getElement().getStyle().setMarginBottom(5.0, Unit.PX); grid.getWidget(0, 1).getElement().getStyle().setMarginBottom(5.0, Unit.PX); grid.getWidget(1, 0).getElement().getStyle().setMarginBottom(5.0, Unit.PX); grid.getWidget(1, 1).getElement().getStyle().setMarginBottom(5.0, Unit.PX); Button sendButton = new Button(); sendButton.setText("Send"); sendButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { String destination = suggestBox.getText(); String subject = subjectBox.getText(); String messageText = messageBox.getText(); String error = ""; boolean isDestination = true; boolean isSubject = true; boolean isMessage = true; boolean isValidAptNumber = true; if (destination == null || destination.trim().equals("")) { error += "<p>Please select destination!</p>"; isDestination = false; } if (subject == null || subject.trim().equals("")) { error += "<p>Please type in a subject!</p>"; isSubject = false; } if (messageText == null || messageText.trim().equals("")) { error += "<p>Please write a message!</p>"; isMessage = false; } String aptNumber = getAptNumberFromSuggestion(destination); if (aptNumber == null || aptNumber.trim().equals("")) { error += "<p>Destination was not found!</p>"; isValidAptNumber = false; } if (isDestination && isSubject && isMessage && isValidAptNumber) { DBSendMessageAsync rpc = (DBSendMessageAsync) GWT.create(DBSendMessage.class); ServiceDefTarget tar = (ServiceDefTarget) rpc; String moduleURL = GWT.getModuleBaseURL() + "DBSendMessageImpl"; tar.setServiceEntryPoint(moduleURL); Conversation conversation = new Conversation(userInfo.getUsername(), aptNumber, messageText); rpc.sendMessage(userInfo.getUsername(), "", "", new AsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { messageDialogBox.hide(); DialogBox dialogBox = DialogBoxCreator.createDialogBox(UserMenuConstants.SUCCESS_SEND_MESSAGE, UserMenuConstants.SUCCESS_SEND_MESSAGE_MESSAGE, DialogBoxConstants.CLOSE_BUTTON, false, false); dialogBox.setGlassEnabled(true); dialogBox.setAnimationEnabled(true); dialogBox.center(); dialogBox.show(); } @Override public void onFailure(Throwable caught) { DialogBox dialogBox = DialogBoxCreator.createDialogBox(UserMenuConstants.FAILED_SEND_MESSAGE, caught.getMessage(), DialogBoxConstants.CLOSE_BUTTON, false, false); dialogBox.setGlassEnabled(true); dialogBox.setAnimationEnabled(true); dialogBox.center(); dialogBox.show(); } }); } else { DialogBox dialogBox = DialogBoxCreator.createDialogBox(UserMenuConstants.FAILED_SEND_MESSAGE, error, DialogBoxConstants.CLOSE_BUTTON, false, false); dialogBox.setGlassEnabled(true); dialogBox.setAnimationEnabled(true); dialogBox.center(); dialogBox.show(); } } }); Button cancelButton = new Button(); cancelButton.setText("Cancel"); cancelButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { messageDialogBox.hide(); } }); FlowPanel flowPanel = new FlowPanel(); flowPanel.add(sendButton); flowPanel.add(cancelButton); flowPanel.getWidget(0).getElement().getStyle().setMarginRight(5.0, Unit.PX); panel.add(grid); panel.add(flowPanel); panel.setCellHorizontalAlignment(flowPanel, HasHorizontalAlignment.ALIGN_RIGHT); return messageDialogBox; } protected String getAptNumberFromSuggestion(String destination) { String match = null; RegExp regExp = RegExp.compile("Apt. Number: [0-9]{1,3}"); MatchResult matcher = regExp.exec(destination); if (regExp.test(destination)) { match = matcher.getGroup(0); } if (match != null) { regExp = RegExp.compile("[0-9]{1,3}"); matcher = regExp.exec(match); if (regExp.test(match)) { match = matcher.getGroup(0); } } return match; } private MultiWordSuggestOracle getDBSuggestions() { final MultiWordSuggestOracle oracle = new MultiWordSuggestOracle(); DBGetTenantSuggestionsAsync rpc = (DBGetTenantSuggestionsAsync) GWT.create(DBGetTenantSuggestions.class); ServiceDefTarget tar = (ServiceDefTarget) rpc; String moduleURL = GWT.getModuleBaseURL() + "DBGetTenantSuggestionsImpl"; tar.setServiceEntryPoint(moduleURL); rpc.getTenantSuggestions(userInfo, new AsyncCallback<List<String>>() { @Override public void onSuccess(List<String> result) { oracle.addAll(result); } @Override public void onFailure(Throwable caught) { // Do nothing } }); return oracle; } }