| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| ======= |
| >>>>>>> remove both of gwt-representer and gwt-dispatch dependencies, add license headers to all new files |
| /**************************************************************** |
| * Licensed to the Apache Software Foundation (ASF) under one * |
| * or more contributor license agreements. See the NOTICE file * |
| * distributed with this work for additional information * |
| * regarding copyright ownership. The ASF licenses this file * |
| * to you under the Apache License, Version 2.0 (the * |
| * "License"); you may not use this file except in compliance * |
| * with the License. You may obtain a copy of the License at * |
| * * |
| * http://www.apache.org/licenses/LICENSE-2.0 * |
| * * |
| * Unless required by applicable law or agreed to in writing, * |
| * software distributed under the License is distributed on an * |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * |
| * KIND, either express or implied. See the License for the * |
| * specific language governing permissions and limitations * |
| * under the License. * |
| ****************************************************************/ |
| |
| <<<<<<< HEAD |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> remove both of gwt-representer and gwt-dispatch dependencies, add license headers to all new files |
| package org.apache.hupa.client.activity; |
| |
| import gwtupload.client.IUploadStatus.Status; |
| import gwtupload.client.IUploader; |
| import gwtupload.client.IUploader.OnCancelUploaderHandler; |
| import gwtupload.client.IUploader.OnFinishUploaderHandler; |
| import gwtupload.client.IUploader.OnStatusChangedHandler; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| import org.apache.hupa.client.place.MessageSendPlace; |
| <<<<<<< HEAD |
| import org.apache.hupa.client.rf.SendForwardMessageRequest; |
| import org.apache.hupa.client.rf.SendMessageRequest; |
| import org.apache.hupa.client.rf.SendReplyMessageRequest; |
| import org.apache.hupa.client.validation.EmailListValidator; |
| import org.apache.hupa.shared.Util; |
| import org.apache.hupa.shared.data.MessageAttachmentImpl; |
| import org.apache.hupa.shared.domain.GenericResult; |
| import org.apache.hupa.shared.domain.ImapFolder; |
| import org.apache.hupa.shared.domain.Message; |
| import org.apache.hupa.shared.domain.MessageAttachment; |
| import org.apache.hupa.shared.domain.MessageDetails; |
| import org.apache.hupa.shared.domain.SendForwardMessageAction; |
| import org.apache.hupa.shared.domain.SendMessageAction; |
| import org.apache.hupa.shared.domain.SendReplyMessageAction; |
| import org.apache.hupa.shared.domain.SmtpMessage; |
| import org.apache.hupa.shared.domain.User; |
| ======= |
| import net.customware.gwt.dispatch.client.DispatchAsync; |
| import net.customware.gwt.dispatch.shared.Action; |
| |
| import org.apache.hupa.client.evo.HupaEvoCallback; |
| import org.apache.hupa.client.place.MessageSendPlace; |
| import org.apache.hupa.client.ui.WidgetDisplayable; |
| ======= |
| import net.customware.gwt.dispatch.client.DispatchAsync; |
| import net.customware.gwt.dispatch.shared.Action; |
| ======= |
| >>>>>>> Make chechsession and login work with RF, with refactoring fetch folders. |
| |
| import org.apache.hupa.client.evo.HupaEvoCallback; |
| ======= |
| >>>>>>> try to get message details, problem is: |
| import org.apache.hupa.client.place.MessageSendPlace; |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| ======= |
| import org.apache.hupa.client.rf.HupaRequestFactory; |
| ======= |
| >>>>>>> scrub code |
| import org.apache.hupa.client.rf.SendForwardMessageRequest; |
| import org.apache.hupa.client.rf.SendMessageRequest; |
| import org.apache.hupa.client.rf.SendReplyMessageRequest; |
| >>>>>>> forward and reply message to use RF |
| import org.apache.hupa.client.ui.WidgetDisplayable; |
| >>>>>>> Make the evo more clear. |
| import org.apache.hupa.client.validation.EmailListValidator; |
| import org.apache.hupa.shared.Util; |
| import org.apache.hupa.shared.data.MessageAttachmentImpl; |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| import org.apache.hupa.shared.data.SMTPMessage; |
| <<<<<<< HEAD |
| import org.apache.hupa.shared.data.User; |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| import org.apache.hupa.shared.domain.ImapFolder; |
| >>>>>>> Allow client can use the domain entity interface. |
| ======= |
| ======= |
| import org.apache.hupa.shared.data.SmtpMessageImpl; |
| ======= |
| >>>>>>> remove both of gwt-representer and gwt-dispatch dependencies, add license headers to all new files |
| import org.apache.hupa.shared.domain.GenericResult; |
| >>>>>>> forward and reply message to use RF |
| import org.apache.hupa.shared.domain.ImapFolder; |
| import org.apache.hupa.shared.domain.Message; |
| import org.apache.hupa.shared.domain.MessageAttachment; |
| import org.apache.hupa.shared.domain.MessageDetails; |
| import org.apache.hupa.shared.domain.SendForwardMessageAction; |
| import org.apache.hupa.shared.domain.SendMessageAction; |
| import org.apache.hupa.shared.domain.SendReplyMessageAction; |
| import org.apache.hupa.shared.domain.SmtpMessage; |
| import org.apache.hupa.shared.domain.User; |
| >>>>>>> Make chechsession and login work with RF, with refactoring fetch folders. |
| import org.apache.hupa.shared.events.BackEvent; |
| import org.apache.hupa.shared.events.ContactsUpdatedEvent; |
| import org.apache.hupa.shared.events.ContactsUpdatedEventHandler; |
| import org.apache.hupa.shared.events.FlashEvent; |
| import org.apache.hupa.shared.events.FolderSelectionEvent; |
| import org.apache.hupa.shared.events.FolderSelectionEventHandler; |
| import org.apache.hupa.shared.events.LoadMessagesEvent; |
| import org.apache.hupa.shared.events.LoadMessagesEventHandler; |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| import org.apache.hupa.shared.events.SentMessageEvent; |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| import org.apache.hupa.shared.proxy.IMAPFolderProxy; |
| import org.apache.hupa.shared.rpc.ContactsResult.Contact; |
| <<<<<<< HEAD |
| import org.apache.hupa.widgets.ui.HasEnable; |
| |
| ======= |
| ======= |
| ======= |
| import org.apache.hupa.shared.proxy.IMAPFolderProxy; |
| >>>>>>> Aim to make the front end view work after the server side's IMAPFolder services RF being working, but there are issues on RF's find* method, I think. |
| ======= |
| import org.apache.hupa.shared.proxy.ImapFolder; |
| >>>>>>> Make the ValueProxy(ImapFolder) work with Manolo's patch. Hupa can display folders in west view with RequestFactory now. |
| ======= |
| >>>>>>> Allow client can use the domain entity interface. |
| ======= |
| >>>>>>> try to get message details, problem is: |
| import org.apache.hupa.shared.rpc.ContactsResult.Contact; |
| >>>>>>> 1. improve the inbox folder place. |
| import org.apache.hupa.shared.rpc.ForwardMessage; |
| import org.apache.hupa.shared.rpc.ReplyMessage; |
| import org.apache.hupa.shared.rpc.SendMessage; |
| ======= |
| import org.apache.hupa.shared.events.SentMessageEvent; |
| import org.apache.hupa.shared.rpc.ContactsResult.Contact; |
| >>>>>>> forward and reply message to use RF |
| import org.apache.hupa.widgets.ui.HasEnable; |
| |
| <<<<<<< HEAD |
| import com.google.gwt.activity.shared.AbstractActivity; |
| <<<<<<< HEAD |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> fix issue 10 |
| import com.google.gwt.event.dom.client.ClickEvent; |
| import com.google.gwt.event.dom.client.ClickHandler; |
| import com.google.gwt.event.dom.client.HasClickHandlers; |
| import com.google.gwt.event.shared.EventBus; |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| ======= |
| import com.google.gwt.place.shared.PlaceController; |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| import com.google.gwt.place.shared.PlaceController; |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> forward and reply message to use RF |
| import com.google.gwt.user.client.ui.AcceptsOneWidget; |
| import com.google.gwt.user.client.ui.Focusable; |
| import com.google.gwt.user.client.ui.HasHTML; |
| import com.google.gwt.user.client.ui.HasText; |
| import com.google.gwt.user.client.ui.IsWidget; |
| import com.google.inject.Inject; |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| import com.google.web.bindery.requestfactory.shared.Receiver; |
| |
| public class MessageSendActivity extends AppBaseActivity { |
| ======= |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| |
| public class MessageSendActivity extends AbstractActivity { |
| |
| private ArrayList<MessageAttachment> attachments = new ArrayList<MessageAttachment>(); |
| private Type type = Type.NEW; |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| private IMAPFolderProxy folder; |
| ======= |
| private IMAPFolder folder; |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| private IMAPFolderProxy folder; |
| >>>>>>> Aim to make the front end view work after the server side's IMAPFolder services RF being working, but there are issues on RF's find* method, I think. |
| ======= |
| private ImapFolder folder; |
| >>>>>>> Make the ValueProxy(ImapFolder) work with Manolo's patch. Hupa can display folders in west view with RequestFactory now. |
| private Message oldmessage; |
| |
| protected SMTPMessage message = null; |
| @SuppressWarnings("unused") |
| private MessageDetails oldDetails; |
| |
| // @Inject private DispatchAsync dispatcher; |
| @Inject private Displayable display; |
| @Inject private EventBus eventBus; |
| @Inject private PlaceController placeController; |
| |
| ======= |
| import com.google.web.bindery.requestfactory.shared.Receiver; |
| |
| public class MessageSendActivity extends AppBaseActivity { |
| |
| <<<<<<< HEAD |
| private List<MessageAttachment> attachments = new ArrayList<MessageAttachment>(); |
| private Type type = Type.NEW; |
| private ImapFolder folder; |
| private Message oldmessage; |
| |
| protected SmtpMessage message; |
| private MessageDetails oldDetails; |
| |
| @Inject private Displayable display; |
| @Inject private EventBus eventBus; |
| @Inject private HupaRequestFactory requestFactory; |
| |
| >>>>>>> forward and reply message to use RF |
| private MessageSendPlace place; |
| |
| private User user; |
| <<<<<<< HEAD |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| |
| ======= |
| >>>>>>> scrub code |
| @Override |
| public void start(AcceptsOneWidget container, EventBus eventBus) { |
| bind(); |
| revealDisplay(user, folder, oldmessage, oldDetails, type); |
| container.setWidget(display.asWidget()); |
| } |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| |
| public MessageSendActivity with(MessageSendPlace place) { |
| <<<<<<< HEAD |
| ======= |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| @Inject |
| public MessageSendActivity(Displayable display, EventBus eventBus, PlaceController placeController, |
| DispatchAsync dispatcher){ |
| this.dispatcher = dispatcher; |
| this.display = display; |
| this.eventBus = eventBus; |
| this.placeController = placeController; |
| |
| } |
| ======= |
| >>>>>>> fix issue 2&3. Handle exceptions thrown in async blocks & Simply injection code |
| |
| public MessageSendActivity with(MessageSendPlace place){ |
| ======= |
| |
| public MessageSendActivity with(MessageSendPlace place) { |
| >>>>>>> forward and reply message to use RF |
| this.place = place; |
| <<<<<<< HEAD |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> scrub code |
| this.user = place.getUser(); |
| this.folder = place.getFolder(); |
| this.oldmessage = place.getMessage(); |
| this.oldDetails = place.getMessageDetails(); |
| this.type = place.getForward(); |
| return this; |
| } |
| |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| private void bind() { |
| eventBus.addHandler(LoadMessagesEvent.TYPE, new LoadMessagesEventHandler() { |
| public void onLoadMessagesEvent(LoadMessagesEvent loadMessagesEvent) { |
| reset(); |
| } |
| }); |
| eventBus.addHandler(FolderSelectionEvent.TYPE, new FolderSelectionEventHandler() { |
| public void onFolderSelectionEvent(FolderSelectionEvent event) { |
| reset(); |
| } |
| }); |
| eventBus.addHandler(ContactsUpdatedEvent.TYPE, new ContactsUpdatedEventHandler() { |
| public void onContactsUpdated(ContactsUpdatedEvent event) { |
| display.fillContactList(event.getContacts()); |
| } |
| }); |
| registrations.add(display.getSendClick().addClickHandler(sendClickHandler)); |
| registrations.add(display.getBackButtonClick().addClickHandler(new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| eventBus.fireEvent(new BackEvent()); |
| } |
| })); |
| registrations.add(display.getUploader().addOnStatusChangedHandler(onStatusChangedHandler)); |
| registrations.add(display.getUploader().addOnFinishUploadHandler(onFinishUploadHandler)); |
| registrations.add(display.getUploader().addOnCancelUploadHandler(onCancelUploadHandler)); |
| reset(); |
| } |
| |
| protected ClickHandler sendClickHandler = new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| if (validate()) { |
| sendReq = rf.sendMessageRequest(); |
| message = sendReq.create(SmtpMessage.class); |
| List<MessageAttachment> attaches = new ArrayList<MessageAttachment>(); |
| for(MessageAttachment attach : attachments){// we must use this, else console will complain a NullPointerException |
| MessageAttachment attachMent = sendReq.create(MessageAttachment.class); |
| attachMent.setName(attach.getName()); |
| attachMent.setSize(attach.getSize()); |
| attachMent.setContentType(attach.getContentType()); |
| attaches.add(attachMent); |
| } |
| |
| message.setFrom(display.getFromText().getText()); |
| message.setSubject(display.getSubjectText().getText()); |
| message.setText(display.getMessageHTML().getHTML()); |
| message.setMessageAttachments(attaches); |
| message.setTo(emailTextToArray(display.getToText().getText())); |
| message.setCc(emailTextToArray(display.getCcText().getText())); |
| message.setBcc(emailTextToArray(display.getBccText().getText())); |
| |
| if (type == Type.NEW) { |
| SendMessageAction sendAction = sendReq.create(SendMessageAction.class); |
| // SmtpMessage sm = sendReq.edit(message); |
| sendAction.setMessage(message); |
| sendReq.send(sendAction).fire(new Receiver<GenericResult>() { |
| @Override |
| public void onSuccess(GenericResult response) { |
| afterSend(response); |
| } |
| }); |
| } else if (type == Type.FORWARD) { |
| SendForwardMessageRequest forwardReq = rf.sendForwardMessageRequest(); |
| SendForwardMessageAction forwardAction = forwardReq.create(SendForwardMessageAction.class); |
| forwardAction.setMessage(message); |
| forwardAction.setFolder(folder); |
| forwardAction.setUid(oldmessage.getUid()); |
| forwardReq.send(forwardAction).fire(new Receiver<GenericResult>() { |
| @Override |
| public void onSuccess(GenericResult response) { |
| afterSend(response); |
| } |
| }); |
| } else { |
| SendReplyMessageRequest replyReq = rf.sendReplyMessageRequest(); |
| SendReplyMessageAction replyAction = replyReq.create(SendReplyMessageAction.class); |
| replyAction.setMessage(message); |
| replyAction.setFolder(folder); |
| replyAction.setUid(oldmessage.getUid()); |
| replyReq.send(replyAction).fire(new Receiver<GenericResult>() { |
| @Override |
| public void onSuccess(GenericResult response) { |
| afterSend(response); |
| } |
| }); |
| } |
| } |
| } |
| }; |
| |
| private void afterSend(GenericResult response) { |
| if (response.isSuccess()) { |
| eventBus.fireEvent(new SentMessageEvent()); |
| reset(); |
| } else { |
| eventBus.fireEvent(new FlashEvent(response.getMessage(), 6000)); |
| } |
| display.setLoading(false); |
| } |
| protected boolean validate() { |
| // Don't trust only in view validation |
| return display.validate() && display.getToText().getText().trim().length() > 0 |
| && EmailListValidator.isValidAddressList(display.getToText().getText()) |
| && EmailListValidator.isValidAddressList(display.getCcText().getText()) |
| && EmailListValidator.isValidAddressList(display.getBccText().getText()); |
| } |
| |
| protected ArrayList<String> emailTextToArray(String emails) { |
| ArrayList<String> cc = new ArrayList<String>(); |
| for (String ccRaw : emails.split("[,;]+")) { |
| String ccRecip = ccRaw.trim(); |
| if (ccRecip.length() > 0) { |
| cc.add(ccRaw.trim()); |
| } |
| } |
| return cc; |
| } |
| |
| public void revealDisplay(User user, ImapFolder folder, Message oldmessage, MessageDetails oldDetails, |
| String mailto, Type type) { |
| this.reset(); |
| this.oldmessage = oldmessage; |
| this.oldDetails = oldDetails; |
| this.folder = folder; |
| this.type = type; |
| |
| // Depending on the type, we have to automatically fill the view inputs |
| display.getFromText().setText(user.getName()); |
| display.getMessageHTML().setHTML(wrapMessage(oldmessage, oldDetails, type)); |
| if (type.equals(Type.NEW) && mailto != null) { |
| display.getToText().setText(mailto); |
| } else if (type.equals(Type.FORWARD)) { |
| String subject = oldmessage.getSubject() != null ? oldmessage.getSubject().trim() : ""; |
| if (!subject.toLowerCase().startsWith("fwd:")) { |
| subject = "Fwd: " + subject; |
| } |
| display.getSubjectText().setText(subject); |
| } else if (type.equals(Type.REPLY) || type.equals(Type.REPLY_ALL)) { |
| String subject = oldmessage.getSubject() != null ? oldmessage.getSubject().trim() : ""; |
| if (!subject.toLowerCase().startsWith("re:")) { |
| subject = "Re: " + subject; |
| } |
| display.getSubjectText().setText(subject); |
| if (type.equals(Type.REPLY)) { |
| if (oldmessage.getReplyto() != null && !oldmessage.getFrom().contains(oldmessage.getReplyto())) { |
| display.getToText().setText(oldmessage.getReplyto()); |
| } else { |
| display.getToText().setText(oldmessage.getFrom()); |
| } |
| } else { |
| ArrayList<String> list = new ArrayList<String>(); |
| if (oldmessage.getReplyto() != null && !oldmessage.getFrom().contains(oldmessage.getReplyto())) |
| list.add(oldmessage.getReplyto()); |
| if (oldmessage.getTo() != null) |
| list.addAll(oldmessage.getTo()); |
| if (oldmessage.getCc() != null) |
| list.addAll(oldmessage.getCc()); |
| list = removeEmailFromList(list, user.getName()); |
| display.getCcText().setText(Util.listToString(list)); |
| if (oldmessage.getTo() != null) { |
| oldmessage.getTo().remove(user.getName()); |
| } |
| display.getToText().setText(oldmessage.getFrom()); |
| } |
| } |
| display.refresh(); |
| display.getEditorFocus().setFocus(true); |
| } |
| |
| public void revealDisplay(User user, ImapFolder folder, Message oldmessage, MessageDetails oldDetails, Type type) { |
| this.revealDisplay(user, folder, oldmessage, oldDetails, null, type); |
| } |
| |
| public void revealDisplay(User user, String mailto) { |
| revealDisplay(user, null, null, null, mailto, Type.NEW); |
| } |
| |
| /** |
| * Bind the given user to the presenter |
| * |
| * @param user |
| */ |
| public void revealDisplay(User user) { |
| revealDisplay(user, null, null, null, null, Type.NEW); |
| } |
| |
| private static String generateHeader(Message message, Type type) { |
| String ret = "<br>"; |
| if (message != null) { |
| if (type.equals(Type.FORWARD)) { |
| ret += "--------- Forwarded message --------- <br>"; |
| ret += "From: " + message.getFrom().replaceAll("<", "<").replaceAll(">", ">") + "<br>"; |
| ret += "Date: " + message.getReceivedDate() + "<br>"; |
| ret += "Subject: " + message.getSubject() + "<br>"; |
| ArrayList<String> to = new ArrayList<String>(); |
| to.addAll(message.getTo()); |
| to.addAll(message.getCc()); |
| ret += "To: " + Util.listToString(to).replaceAll("<", "<").replaceAll(">", ">") + "<br>"; |
| } else if (type.equals(Type.REPLY) || type.equals(Type.REPLY_ALL)) { |
| ret += "On " + message.getReceivedDate(); |
| ret += ", " + message.getFrom().replaceAll("<", "<").replaceAll(">", ">"); |
| ret += ". wrote:<br>"; |
| } |
| } |
| return ret + "<br>"; |
| } |
| |
| public static String wrapMessage(Message message, MessageDetails details, Type type) { |
| String ret = ""; |
| if (message != null) { |
| ret += generateHeader(message, type); |
| } |
| if (details != null && details.getText() != null && details.getText().length() > 0) { |
| ret += "<blockquote style='border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;'>"; |
| ret += details.getText(); |
| ret += "</blockquote>"; |
| } |
| return ret; |
| } |
| |
| protected ArrayList<String> removeEmailFromList(List<String> list, String email) { |
| ArrayList<String> ret = new ArrayList<String>(); |
| String regex = ".*<?\\s*" + email.trim() + "\\s*>?\\s*"; |
| for (String e : list) { |
| if (!e.matches(regex)) { |
| ret.add(e); |
| } |
| } |
| return ret; |
| } |
| /** |
| * Reset everything |
| */ |
| private void reset() { |
| display.getUploader().reset(); |
| display.getBccText().setText(""); |
| display.getCcText().setText(""); |
| display.getToText().setText(""); |
| display.getSubjectText().setText(""); |
| attachments.clear(); |
| folder = null; |
| oldmessage = null; |
| type = Type.NEW; |
| } |
| |
| /** |
| * The Type for which the SendPresenter will get used |
| */ |
| public enum Type { |
| NEW, REPLY, REPLY_ALL, FORWARD |
| } |
| |
| private OnFinishUploaderHandler onFinishUploadHandler = new OnFinishUploaderHandler() { |
| public void onFinish(IUploader uploader) { |
| if (uploader.getStatus() == Status.SUCCESS) { |
| String name = uploader.getInputName(); |
| MessageAttachment attachment = new MessageAttachmentImpl(); |
| attachment.setName(name); |
| attachments.add(attachment); |
| display.getSendEnable().setEnabled(true); |
| } |
| } |
| }; |
| |
| private OnStatusChangedHandler onStatusChangedHandler = new OnStatusChangedHandler() { |
| public void onStatusChanged(IUploader uploader) { |
| Status stat = display.getUploader().getStatus(); |
| if (stat == Status.INPROGRESS) |
| display.getSendEnable().setEnabled(false); |
| else |
| display.getSendEnable().setEnabled(true); |
| } |
| }; |
| |
| private OnCancelUploaderHandler onCancelUploadHandler = new OnCancelUploaderHandler() { |
| public void onCancel(IUploader uploader) { |
| for (MessageAttachment attachment : attachments) { |
| if (attachment.getName().equals(uploader.getInputName())) |
| attachments.remove(attachment); |
| } |
| } |
| }; |
| |
| @Inject private Displayable display; |
| private List<MessageAttachment> attachments = new ArrayList<MessageAttachment>(); |
| private Type type = Type.NEW; |
| private ImapFolder folder; |
| private Message oldmessage; |
| protected SmtpMessage message; |
| private MessageDetails oldDetails; |
| private User user; |
| private SendMessageRequest sendReq; |
| |
| <<<<<<< HEAD |
| ======= |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| private void bind(){ |
| ======= |
| private void bind() { |
| >>>>>>> forward and reply message to use RF |
| eventBus.addHandler(LoadMessagesEvent.TYPE, new LoadMessagesEventHandler() { |
| public void onLoadMessagesEvent(LoadMessagesEvent loadMessagesEvent) { |
| reset(); |
| } |
| }); |
| eventBus.addHandler(FolderSelectionEvent.TYPE, new FolderSelectionEventHandler() { |
| public void onFolderSelectionEvent(FolderSelectionEvent event) { |
| reset(); |
| } |
| }); |
| eventBus.addHandler(ContactsUpdatedEvent.TYPE, new ContactsUpdatedEventHandler() { |
| public void onContactsUpdated(ContactsUpdatedEvent event) { |
| display.fillContactList(event.getContacts()); |
| } |
| }); |
| registrations.add(display.getSendClick().addClickHandler(sendClickHandler)); |
| registrations.add(display.getBackButtonClick().addClickHandler(new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| eventBus.fireEvent(new BackEvent()); |
| } |
| })); |
| registrations.add(display.getUploader().addOnStatusChangedHandler(onStatusChangedHandler)); |
| registrations.add(display.getUploader().addOnFinishUploadHandler(onFinishUploadHandler)); |
| registrations.add(display.getUploader().addOnCancelUploadHandler(onCancelUploadHandler)); |
| reset(); |
| } |
| |
| protected ClickHandler sendClickHandler = new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| if (validate()) { |
| sendReq = rf.sendMessageRequest(); |
| message = sendReq.create(SmtpMessage.class); |
| List<MessageAttachment> attaches = new ArrayList<MessageAttachment>(); |
| for(MessageAttachment attach : attachments){// we must use this, else console will complain a NullPointerException |
| MessageAttachment attachMent = sendReq.create(MessageAttachment.class); |
| attachMent.setName(attach.getName()); |
| attachMent.setSize(attach.getSize()); |
| attachMent.setContentType(attach.getContentType()); |
| attaches.add(attachMent); |
| } |
| |
| message.setFrom(display.getFromText().getText()); |
| message.setSubject(display.getSubjectText().getText()); |
| message.setText(display.getMessageHTML().getHTML()); |
| message.setMessageAttachments(attaches); |
| message.setTo(emailTextToArray(display.getToText().getText())); |
| message.setCc(emailTextToArray(display.getCcText().getText())); |
| message.setBcc(emailTextToArray(display.getBccText().getText())); |
| |
| if (type == Type.NEW) { |
| SendMessageAction sendAction = sendReq.create(SendMessageAction.class); |
| // SmtpMessage sm = sendReq.edit(message); |
| sendAction.setMessage(message); |
| sendReq.send(sendAction).fire(new Receiver<GenericResult>() { |
| @Override |
| public void onSuccess(GenericResult response) { |
| afterSend(response); |
| } |
| }); |
| } else if (type == Type.FORWARD) { |
| SendForwardMessageRequest forwardReq = rf.sendForwardMessageRequest(); |
| SendForwardMessageAction forwardAction = forwardReq.create(SendForwardMessageAction.class); |
| forwardAction.setMessage(message); |
| forwardAction.setFolder(folder); |
| forwardAction.setUid(oldmessage.getUid()); |
| forwardReq.send(forwardAction).fire(new Receiver<GenericResult>() { |
| @Override |
| public void onSuccess(GenericResult response) { |
| afterSend(response); |
| } |
| }); |
| } else { |
| SendReplyMessageRequest replyReq = rf.sendReplyMessageRequest(); |
| SendReplyMessageAction replyAction = replyReq.create(SendReplyMessageAction.class); |
| replyAction.setMessage(message); |
| replyAction.setFolder(folder); |
| replyAction.setUid(oldmessage.getUid()); |
| replyReq.send(replyAction).fire(new Receiver<GenericResult>() { |
| @Override |
| public void onSuccess(GenericResult response) { |
| afterSend(response); |
| } |
| }); |
| } |
| } |
| } |
| }; |
| |
| private void afterSend(GenericResult response) { |
| if (response.isSuccess()) { |
| eventBus.fireEvent(new SentMessageEvent()); |
| reset(); |
| } else { |
| eventBus.fireEvent(new FlashEvent(response.getMessage(), 6000)); |
| } |
| display.setLoading(false); |
| } |
| protected boolean validate() { |
| // Don't trust only in view validation |
| return display.validate() && display.getToText().getText().trim().length() > 0 |
| && EmailListValidator.isValidAddressList(display.getToText().getText()) |
| && EmailListValidator.isValidAddressList(display.getCcText().getText()) |
| && EmailListValidator.isValidAddressList(display.getBccText().getText()); |
| } |
| |
| protected ArrayList<String> emailTextToArray(String emails) { |
| ArrayList<String> cc = new ArrayList<String>(); |
| for (String ccRaw : emails.split("[,;]+")) { |
| String ccRecip = ccRaw.trim(); |
| if (ccRecip.length() > 0) { |
| cc.add(ccRaw.trim()); |
| } |
| } |
| return cc; |
| } |
| |
| public void revealDisplay(User user, ImapFolder folder, Message oldmessage, MessageDetails oldDetails, |
| String mailto, Type type) { |
| this.reset(); |
| this.oldmessage = oldmessage; |
| this.oldDetails = oldDetails; |
| this.folder = folder; |
| this.type = type; |
| |
| // Depending on the type, we have to automatically fill the view inputs |
| display.getFromText().setText(user.getName()); |
| display.getMessageHTML().setHTML(wrapMessage(oldmessage, oldDetails, type)); |
| if (type.equals(Type.NEW) && mailto != null) { |
| display.getToText().setText(mailto); |
| } else if (type.equals(Type.FORWARD)) { |
| String subject = oldmessage.getSubject() != null ? oldmessage.getSubject().trim() : ""; |
| if (!subject.toLowerCase().startsWith("fwd:")) { |
| subject = "Fwd: " + subject; |
| } |
| display.getSubjectText().setText(subject); |
| } else if (type.equals(Type.REPLY) || type.equals(Type.REPLY_ALL)) { |
| String subject = oldmessage.getSubject() != null ? oldmessage.getSubject().trim() : ""; |
| if (!subject.toLowerCase().startsWith("re:")) { |
| subject = "Re: " + subject; |
| } |
| display.getSubjectText().setText(subject); |
| if (type.equals(Type.REPLY)) { |
| if (oldmessage.getReplyto() != null && !oldmessage.getFrom().contains(oldmessage.getReplyto())) { |
| display.getToText().setText(oldmessage.getReplyto()); |
| } else { |
| display.getToText().setText(oldmessage.getFrom()); |
| } |
| } else { |
| ArrayList<String> list = new ArrayList<String>(); |
| if (oldmessage.getReplyto() != null && !oldmessage.getFrom().contains(oldmessage.getReplyto())) |
| list.add(oldmessage.getReplyto()); |
| if (oldmessage.getTo() != null) |
| list.addAll(oldmessage.getTo()); |
| if (oldmessage.getCc() != null) |
| list.addAll(oldmessage.getCc()); |
| list = removeEmailFromList(list, user.getName()); |
| display.getCcText().setText(Util.listToString(list)); |
| if (oldmessage.getTo() != null) { |
| oldmessage.getTo().remove(user.getName()); |
| } |
| display.getToText().setText(oldmessage.getFrom()); |
| } |
| } |
| display.refresh(); |
| display.getEditorFocus().setFocus(true); |
| } |
| |
| public void revealDisplay(User user, ImapFolder folder, Message oldmessage, MessageDetails oldDetails, Type type) { |
| this.revealDisplay(user, folder, oldmessage, oldDetails, null, type); |
| } |
| |
| <<<<<<< HEAD |
| protected ClickHandler sendClickHandler = new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| if (validate()) { |
| message = new SMTPMessage(); |
| message.setFrom(display.getFromText().getText()); |
| message.setSubject(display.getSubjectText().getText()); |
| message.setText(display.getMessageHTML().getHTML()); |
| message.setMessageAttachments(attachments); |
| message.setTo(emailTextToArray(display.getToText().getText())); |
| message.setCc(emailTextToArray(display.getCcText().getText())); |
| message.setBcc(emailTextToArray(display.getBccText().getText())); |
| |
| SendMessage command; |
| if (type == Type.NEW) { |
| command = new SendMessage(message); |
| } else if (type == Type.FORWARD) { |
| command = new ForwardMessage(message, folder, oldmessage.getUid()); |
| } else { |
| command = new ReplyMessage(message, folder, oldmessage.getUid()); |
| } |
| // dispatchMessage(dispatcher, eventBus, command); |
| } |
| } |
| }; |
| |
| protected boolean validate() { |
| // Don't trust only in view validation |
| return display.validate() |
| && display.getToText().getText().trim().length() > 0 |
| && EmailListValidator.isValidAddressList(display.getToText().getText()) |
| && EmailListValidator.isValidAddressList(display.getCcText().getText()) |
| && EmailListValidator.isValidAddressList(display.getBccText().getText()); |
| } |
| |
| protected ArrayList<String> emailTextToArray(String emails) { |
| ArrayList<String> cc = new ArrayList<String>(); |
| for (String ccRaw : emails.split("[,;]+")) { |
| String ccRecip = ccRaw.trim(); |
| if (ccRecip.length() > 0) { |
| cc.add(ccRaw.trim()); |
| } |
| } |
| return cc; |
| } |
| |
| // Although dispatcher and eventBus parameters are not necessary, they are needed for testability |
| // protected void dispatchMessage(DispatchAsync dispatcher, final EventBus eventBus, Action<GenericResult> command) { |
| // display.setLoading(true); |
| // dispatcher.execute(command, new HupaEvoCallback<GenericResult>(dispatcher, eventBus) { |
| // public void callback(GenericResult result) { |
| // if (result.isSuccess()) { |
| // eventBus.fireEvent(new SentMessageEvent()); |
| // reset(); |
| // } else { |
| // eventBus.fireEvent(new FlashEvent(result.getMessage(), 6000)); |
| // } |
| // display.setLoading(false); |
| // } |
| // }); |
| // } |
| |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| public void revealDisplay(User user, IMAPFolderProxy folder, Message oldmessage, MessageDetails oldDetails, String mailto, Type type) { |
| ======= |
| public void revealDisplay(User user, IMAPFolder folder, Message oldmessage, MessageDetails oldDetails, String mailto, Type type) { |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| public void revealDisplay(User user, IMAPFolderProxy folder, Message oldmessage, MessageDetails oldDetails, String mailto, Type type) { |
| >>>>>>> Aim to make the front end view work after the server side's IMAPFolder services RF being working, but there are issues on RF's find* method, I think. |
| ======= |
| public void revealDisplay(User user, ImapFolder folder, Message oldmessage, MessageDetails oldDetails, String mailto, Type type) { |
| >>>>>>> Make the ValueProxy(ImapFolder) work with Manolo's patch. Hupa can display folders in west view with RequestFactory now. |
| this.reset(); |
| this.oldmessage = oldmessage; |
| this.oldDetails = oldDetails; |
| this.folder = folder; |
| this.type = type; |
| |
| // Depending on the type, we have to automatically fill the view inputs |
| display.getFromText().setText(user.getName()); |
| display.getMessageHTML().setHTML(wrapMessage(oldmessage, oldDetails, type)); |
| if (type.equals(Type.NEW) && mailto != null) { |
| display.getToText().setText(mailto); |
| } else if (type.equals(Type.FORWARD)) { |
| String subject = oldmessage.getSubject() != null ? oldmessage.getSubject().trim() : ""; |
| if (!subject.toLowerCase().startsWith("fwd:")){ |
| subject = "Fwd: " + subject; |
| } |
| display.getSubjectText().setText(subject); |
| } else if (type.equals(Type.REPLY) || type.equals(Type.REPLY_ALL)) { |
| String subject = oldmessage.getSubject() != null ? oldmessage.getSubject().trim() : ""; |
| if (!subject.toLowerCase().startsWith("re:")){ |
| subject = "Re: " + subject; |
| } |
| display.getSubjectText().setText(subject); |
| if (type.equals(Type.REPLY)) { |
| if (oldmessage.getReplyto() != null && !oldmessage.getFrom().contains(oldmessage.getReplyto())) { |
| display.getToText().setText(oldmessage.getReplyto()); |
| } else { |
| display.getToText().setText(oldmessage.getFrom()); |
| } |
| } else { |
| ArrayList<String> list = new ArrayList<String>(); |
| if (oldmessage.getReplyto() != null && !oldmessage.getFrom().contains(oldmessage.getReplyto())) |
| list.add(oldmessage.getReplyto()); |
| if (oldmessage.getTo() != null) |
| list.addAll(oldmessage.getTo()); |
| if (oldmessage.getCc() != null) |
| list.addAll(oldmessage.getCc()); |
| list = removeEmailFromList(list, user.getName()); |
| display.getCcText().setText(Util.listToString(list)); |
| if (oldmessage.getTo() != null) { |
| oldmessage.getTo().remove(user.getName()); |
| } |
| display.getToText().setText(oldmessage.getFrom()); |
| } |
| } |
| display.refresh(); |
| display.getEditorFocus().setFocus(true); |
| } |
| |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| public void revealDisplay(User user, IMAPFolderProxy folder, Message oldmessage, MessageDetails oldDetails, Type type) { |
| ======= |
| public void revealDisplay(User user, IMAPFolder folder, Message oldmessage, MessageDetails oldDetails, Type type) { |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| public void revealDisplay(User user, IMAPFolderProxy folder, Message oldmessage, MessageDetails oldDetails, Type type) { |
| >>>>>>> Aim to make the front end view work after the server side's IMAPFolder services RF being working, but there are issues on RF's find* method, I think. |
| ======= |
| public void revealDisplay(User user, ImapFolder folder, Message oldmessage, MessageDetails oldDetails, Type type) { |
| >>>>>>> Make the ValueProxy(ImapFolder) work with Manolo's patch. Hupa can display folders in west view with RequestFactory now. |
| this.revealDisplay(user, folder, oldmessage, oldDetails, null, type); |
| } |
| |
| public void revealDisplay(User user, String mailto) { |
| revealDisplay(user, null, null, null, mailto, Type.NEW); |
| } |
| |
| /** |
| * Bind the given user to the presenter |
| * |
| * @param user |
| */ |
| public void revealDisplay(User user) { |
| revealDisplay(user, null, null, null, null, Type.NEW); |
| } |
| |
| private static String generateHeader(Message message, Type type) { |
| String ret = "<br>"; |
| if (message != null) { |
| if (type.equals(Type.FORWARD)) { |
| ret += "--------- Forwarded message --------- <br>"; |
| ret += "From: " + message.getFrom().replaceAll("<", "<").replaceAll(">", ">") + "<br>"; |
| ret += "Date: " + message.getReceivedDate() + "<br>"; |
| ret += "Subject: " + message.getSubject() + "<br>"; |
| ArrayList<String> to = new ArrayList<String>(); |
| to.addAll(message.getTo()); |
| to.addAll(message.getCc()); |
| ret += "To: " + Util.listToString(to).replaceAll("<", "<").replaceAll(">", ">") + "<br>"; |
| } else if (type.equals(Type.REPLY) || type.equals(Type.REPLY_ALL)) { |
| ret += "On " + message.getReceivedDate(); |
| ret += ", " + message.getFrom().replaceAll("<", "<").replaceAll(">", ">"); |
| ret += ". wrote:<br>"; |
| } |
| } |
| return ret + "<br>"; |
| } |
| |
| public static String wrapMessage(Message message, MessageDetails details, Type type) { |
| String ret = ""; |
| if (message != null) { |
| ret += generateHeader(message, type); |
| } |
| if (details != null && details.getText() != null && details.getText().length() > 0) { |
| ret += "<blockquote style='border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;'>"; |
| ret += details.getText(); |
| ret += "</blockquote>"; |
| } |
| return ret; |
| } |
| |
| |
| protected ArrayList<String> removeEmailFromList(List<String> list, String email) { |
| ArrayList<String> ret = new ArrayList<String>(); |
| String regex = ".*<?\\s*" + email.trim() + "\\s*>?\\s*"; |
| for(String e: list) { |
| if (! e.matches(regex)) { |
| ret.add(e); |
| } |
| } |
| return ret; |
| } |
| /** |
| * Reset everything |
| */ |
| private void reset() { |
| display.getUploader().reset(); |
| display.getBccText().setText(""); |
| display.getCcText().setText(""); |
| display.getToText().setText(""); |
| display.getSubjectText().setText(""); |
| attachments.clear(); |
| folder = null; |
| oldmessage = null; |
| type = Type.NEW; |
| } |
| /** |
| * The Type for which the SendPresenter will get used |
| */ |
| public enum Type { |
| NEW, REPLY, REPLY_ALL, FORWARD |
| } |
| private OnFinishUploaderHandler onFinishUploadHandler = new OnFinishUploaderHandler() { |
| public void onFinish(IUploader uploader) { |
| if (uploader.getStatus() == Status.SUCCESS) { |
| String name = uploader.getInputName(); |
| MessageAttachment attachment = new MessageAttachmentImpl(); |
| attachment.setName(name); |
| attachments.add(attachment); |
| display.getSendEnable().setEnabled(true); |
| } |
| } |
| }; |
| |
| private OnStatusChangedHandler onStatusChangedHandler = new OnStatusChangedHandler() { |
| public void onStatusChanged(IUploader uploader) { |
| Status stat = display.getUploader().getStatus(); |
| if (stat == Status.INPROGRESS) |
| display.getSendEnable().setEnabled(false); |
| else |
| display.getSendEnable().setEnabled(true); |
| } |
| }; |
| |
| private OnCancelUploaderHandler onCancelUploadHandler = new OnCancelUploaderHandler() { |
| public void onCancel(IUploader uploader) { |
| for (MessageAttachment attachment : attachments) { |
| if (attachment.getName().equals(uploader.getInputName())) |
| attachments.remove(attachment); |
| } |
| } |
| }; |
| <<<<<<< HEAD |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| >>>>>>> 1. improve the inbox folder place. |
| ======= |
| public void revealDisplay(User user, String mailto) { |
| revealDisplay(user, null, null, null, mailto, Type.NEW); |
| } |
| |
| /** |
| * Bind the given user to the presenter |
| * |
| * @param user |
| */ |
| public void revealDisplay(User user) { |
| revealDisplay(user, null, null, null, null, Type.NEW); |
| } |
| |
| private static String generateHeader(Message message, Type type) { |
| String ret = "<br>"; |
| if (message != null) { |
| if (type.equals(Type.FORWARD)) { |
| ret += "--------- Forwarded message --------- <br>"; |
| ret += "From: " + message.getFrom().replaceAll("<", "<").replaceAll(">", ">") + "<br>"; |
| ret += "Date: " + message.getReceivedDate() + "<br>"; |
| ret += "Subject: " + message.getSubject() + "<br>"; |
| ArrayList<String> to = new ArrayList<String>(); |
| to.addAll(message.getTo()); |
| to.addAll(message.getCc()); |
| ret += "To: " + Util.listToString(to).replaceAll("<", "<").replaceAll(">", ">") + "<br>"; |
| } else if (type.equals(Type.REPLY) || type.equals(Type.REPLY_ALL)) { |
| ret += "On " + message.getReceivedDate(); |
| ret += ", " + message.getFrom().replaceAll("<", "<").replaceAll(">", ">"); |
| ret += ". wrote:<br>"; |
| } |
| } |
| return ret + "<br>"; |
| } |
| |
| public static String wrapMessage(Message message, MessageDetails details, Type type) { |
| String ret = ""; |
| if (message != null) { |
| ret += generateHeader(message, type); |
| } |
| if (details != null && details.getText() != null && details.getText().length() > 0) { |
| ret += "<blockquote style='border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;'>"; |
| ret += details.getText(); |
| ret += "</blockquote>"; |
| } |
| return ret; |
| } |
| |
| protected ArrayList<String> removeEmailFromList(List<String> list, String email) { |
| ArrayList<String> ret = new ArrayList<String>(); |
| String regex = ".*<?\\s*" + email.trim() + "\\s*>?\\s*"; |
| for (String e : list) { |
| if (!e.matches(regex)) { |
| ret.add(e); |
| } |
| } |
| return ret; |
| } |
| /** |
| * Reset everything |
| */ |
| private void reset() { |
| display.getUploader().reset(); |
| display.getBccText().setText(""); |
| display.getCcText().setText(""); |
| display.getToText().setText(""); |
| display.getSubjectText().setText(""); |
| attachments.clear(); |
| folder = null; |
| oldmessage = null; |
| type = Type.NEW; |
| } |
| |
| /** |
| * The Type for which the SendPresenter will get used |
| */ |
| public enum Type { |
| NEW, REPLY, REPLY_ALL, FORWARD |
| } |
| |
| private OnFinishUploaderHandler onFinishUploadHandler = new OnFinishUploaderHandler() { |
| public void onFinish(IUploader uploader) { |
| if (uploader.getStatus() == Status.SUCCESS) { |
| String name = uploader.getInputName(); |
| MessageAttachment attachment = new MessageAttachmentImpl(); |
| attachment.setName(name); |
| attachments.add(attachment); |
| display.getSendEnable().setEnabled(true); |
| } |
| } |
| }; |
| |
| private OnStatusChangedHandler onStatusChangedHandler = new OnStatusChangedHandler() { |
| public void onStatusChanged(IUploader uploader) { |
| Status stat = display.getUploader().getStatus(); |
| if (stat == Status.INPROGRESS) |
| display.getSendEnable().setEnabled(false); |
| else |
| display.getSendEnable().setEnabled(true); |
| } |
| }; |
| |
| private OnCancelUploaderHandler onCancelUploadHandler = new OnCancelUploaderHandler() { |
| public void onCancel(IUploader uploader) { |
| for (MessageAttachment attachment : attachments) { |
| if (attachment.getName().equals(uploader.getInputName())) |
| attachments.remove(attachment); |
| } |
| } |
| }; |
| |
| <<<<<<< HEAD |
| >>>>>>> forward and reply message to use RF |
| ======= |
| @Inject private Displayable display; |
| private List<MessageAttachment> attachments = new ArrayList<MessageAttachment>(); |
| private Type type = Type.NEW; |
| private ImapFolder folder; |
| private Message oldmessage; |
| protected SmtpMessage message; |
| private MessageDetails oldDetails; |
| private User user; |
| private SendMessageRequest sendReq; |
| |
| >>>>>>> scrub code |
| public interface Displayable extends WidgetDisplayable { |
| ======= |
| public interface Displayable extends IsWidget { |
| >>>>>>> replace with IsWidget |
| public HasText getFromText(); |
| public HasText getToText(); |
| public HasText getCcText(); |
| public HasText getBccText(); |
| public HasText getSubjectText(); |
| public HasHTML getMessageHTML(); |
| public Focusable getEditorFocus(); |
| public HasClickHandlers getSendClick(); |
| public HasEnable getSendEnable(); |
| public IUploader getUploader(); |
| public HasClickHandlers getBackButtonClick(); |
| public void refresh(); |
| public void setLoading(boolean loading); |
| public void fillContactList(Contact[] contacts); |
| public boolean validate(); |
| } |
| } |