GWT開發線上即時傳訊系統 文/沈炳宏 ==========程式========= 程式1 projectCreator.cmd -eclipse IMDemo applicationCreator.cmd -eclipse IMDemo com.runpc.demo.client. IMDemo ==========程式========= ==========程式========= 程式2
==========程式========= ==========程式========= 程式4 public class LoginPanel extends Composite implements ClickListener,KeyboardListener { public interface LoginHandler { public void onSuccess(User user); public void onFailure(); } private final VerticalPanel panel = new VerticalPanel(); private final LabelledTextBox userNameBox = new LabelledTextBox("帳號");… } public void onClick(Widget sender) { authenticate(); } public void onKeyDown( Widget sender, char keyCode, int modifiers) { … authenticate(); }}} private void authenticate() { …; }} ==========程式========= ==========程式========= 程式5 public class IMDemo implements EntryPoint { public void onModuleLoad() { final RootPanel rootPanel = RootPanel.get(); final LoginPanel loginPanel = new LoginPanel( new LoginPanel.LoginHandler() { public void onFailure() { } public void onSuccess(User user) { rootPanel.clear(); rootPanel.add(new ContactList( new ConversationManager(new Model(user)))); } }); rootPanel.add(loginPanel); loginPanel.setFocus(true); } } ==========程式========= ==========程式========= 程式6 public class User implements IsSerializable { public static User createUser(String name) { User user = new User(); user.name = name; user.statusMessage = "線上"; return user; } private String name; private String statusMessage; public boolean equals(Object obj) { … } getter()… setter()… } ==========程式========= ==========程式========= 程式7 public class ContactList extends Composite implements UserEventHandler { private class UserEntry extends FlowPanel { final Label nameLabel = new Label(); final Label statusLabel = new Label(); User user; UserEntry(User user) { … } void updateUser(User newUser) { } void update() { } public void onBrowserEvent(Event event) { … } final VerticalPanel topPanel = new VerticalPanel(); final FlowPanel userPanel = new FlowPanel(); final Label label = new Label("聯絡人"); final ConversationManager manager; public ContactList(ConversationManager manager) private UserEntry findEntry(User user) private void addSelf() private void addUser(User user) private void removeUser(User user) private void updateUser(User user) public void setPosition(int left, int top) public void onUserAdded(User user) public void onUserRemoved(User user) public void onUserUpdated(User user) ==========程式========= ==========程式========= 程式8 public class ConversationManager implements MessageEventHandler, PopupListener { private final Model model; private final HashMap conversations = new HashMap(); private ConversationPanel focusedConversationPanel; … public ConversationPanel maybeInitiateConversationPanel(User toUser) { … } return panel; } public void onNewMessage( User sender, List recipient, String message) { … } public void onPopupClosed( PopupPanel sender, boolean autoClosed) { … } public void sendMessage( List recipients, String message) { … } } ==========程式========= ==========程式========= 程式9 final public class Model { public interface MessageEventHandler { public void onNewMessage( User sender, List recipients, String message); } public interface UserEventHandler { public void onUserAdded(User user); public void onUserRemoved(User user); public void onUserUpdated(User user); } ==========程式========= ==========程式========= 程式10 private final class ModelUpdateVisitor extends ChatEventVisitor { public void visit(NewMessageEvent event) { … }… } private final class PollTimer extends Timer { public void run() { service.exchangeEvents( user, outgoingEvents, new AsyncCallback() { public void onFailure(Throwable caught) { pollTimer.schedule(1000); } public void onSuccess(Object result) { update((List) result); pollTimer.schedule(1000); } }); outgoingEvents.clear(); } } ==========程式========= ==========程式========= 程式11 private static final int private final Timer pollTimer = new PollTimer(); private ChatServiceAsync service = getService(); private final User user; private final HandlerCollection userEventHandlers = new HandlerCollection(); private final HandlerCollection messageEventHandlers = new HandlerCollection(); private final ArrayList outgoingEvents = new ArrayList(); public void addEventHandler( UserEventHandler handler) { userEventHandlers.add(handler); } public void removeEventHandler( UserEventHandler handler) { userEventHandlers.remove(handler); } ==========程式========= ==========程式========= 程式12 public interface ChatService extends RemoteService { /* * @gwt.typeArgs clientEvents * @gwt.typeArgs < com.runpc.IMDemo.client.ChatEvent> */ List exchangeEvents(User user, List clientEvents) throws ChatServiceException; /* * @gwt.typeArgs clientEvents */ List getCurrentUsers(User user); } public interface ChatServiceAsync { void exchangeEvents(User user, List clientEvents, AsyncCallback callback); void getCurrentUsers(User user, AsyncCallback callback); } ==========程式========= ==========程式========= 程式13 public List exchangeEvents( User user, List clientEvents) throws ChatServiceException { UserInfo userInfo = findUserInfoForUser(user); if (userInfo == null) { userInfo = createUser(user); } userInfo.resetInactivityTimer(); if (clientEvents != null) { processClientEvents(clientEvents); } List events = userInfo.getEventQueue(); userInfo.clearEventQueue(); return events; } public List getCurrentUsers(User user) { UserInfo userInfo = findUserInfoForUser(user); if (userInfo == null) { userInfo = createUser(user); } List currentUsers = new ArrayList( userToUserInfoMap.keySet()); currentUsers.remove(user); return currentUsers; } ==========程式=========