| /****************************************************************
|
| * 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. *
|
| ****************************************************************/
|
|
|
| package org.apache.hupa.client.mvp;
|
|
|
| import java.util.ArrayList;
|
| import java.util.List;
|
|
|
| import net.customware.gwt.dispatch.client.DispatchAsync;
|
| import net.customware.gwt.presenter.client.EventBus;
|
| import net.customware.gwt.presenter.client.widget.WidgetDisplay;
|
| import net.customware.gwt.presenter.client.widget.WidgetPresenter;
|
|
|
| import org.apache.hupa.client.HandlerRegistrationAdapter;
|
| import org.apache.hupa.client.HupaCallback;
|
| import org.apache.hupa.client.widgets.HasDialog;
|
| <<<<<<< HEAD |
| import org.apache.hupa.shared.data.ImapFolderImpl;
|
| import org.apache.hupa.shared.data.Message;
|
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| import org.apache.hupa.shared.data.Message.IMAPFlag;
|
| <<<<<<< HEAD |
| import org.apache.hupa.shared.data.User;
|
| <<<<<<< HEAD |
| ======= |
| import org.apache.hupa.shared.data.User;
|
| import org.apache.hupa.shared.data.Message.IMAPFlag;
|
| >>>>>>> first commit |
| ======= |
| import org.apache.hupa.shared.data.Message.IMAPFlag;
|
| import org.apache.hupa.shared.data.User;
|
| >>>>>>> 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.domain.ImapFolder;
|
| >>>>>>> Allow client can use the domain entity interface. |
| ======= |
| ======= |
| import org.apache.hupa.shared.data.MessageImpl;
|
| import org.apache.hupa.shared.data.MessageImpl.IMAPFlag;
|
| >>>>>>> try to change fetch messages to use RF |
| import org.apache.hupa.shared.domain.ImapFolder;
|
| import org.apache.hupa.shared.domain.Message;
|
| import org.apache.hupa.shared.domain.User;
|
| >>>>>>> Make chechsession and login work with RF, with refactoring fetch folders. |
| import org.apache.hupa.shared.events.DecreaseUnseenEvent;
|
| import org.apache.hupa.shared.events.ExpandMessageEvent;
|
| import org.apache.hupa.shared.events.FolderSelectionEvent;
|
| import org.apache.hupa.shared.events.FolderSelectionEventHandler;
|
| import org.apache.hupa.shared.events.IncreaseUnseenEvent;
|
| import org.apache.hupa.shared.events.LoadMessagesEvent;
|
| import org.apache.hupa.shared.events.LogoutEvent;
|
| import org.apache.hupa.shared.events.LogoutEventHandler;
|
| import org.apache.hupa.shared.events.MessagesReceivedEvent;
|
| import org.apache.hupa.shared.events.MessagesReceivedEventHandler;
|
| import org.apache.hupa.shared.events.MoveMessageEvent;
|
| import org.apache.hupa.shared.events.MoveMessageEventHandler;
|
| import org.apache.hupa.shared.events.NewMessageEvent;
|
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| import org.apache.hupa.shared.proxy.IMAPFolderProxy;
|
| ======= |
| >>>>>>> first commit |
| ======= |
| 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. |
| import org.apache.hupa.shared.rpc.DeleteAllMessages;
|
| import org.apache.hupa.shared.rpc.DeleteMessageByUid;
|
| import org.apache.hupa.shared.rpc.DeleteMessageResult;
|
| import org.apache.hupa.shared.rpc.GenericResult;
|
| import org.apache.hupa.shared.rpc.MoveMessage;
|
| import org.apache.hupa.shared.rpc.MoveMessageResult;
|
| import org.apache.hupa.shared.rpc.SetFlag;
|
| import org.apache.hupa.widgets.ui.HasEnable;
|
|
|
| import com.google.gwt.event.dom.client.ChangeEvent;
|
| import com.google.gwt.event.dom.client.ChangeHandler;
|
| import com.google.gwt.event.dom.client.ClickEvent;
|
| import com.google.gwt.event.dom.client.ClickHandler;
|
| import com.google.gwt.event.dom.client.HasChangeHandlers;
|
| import com.google.gwt.event.dom.client.HasClickHandlers;
|
| import com.google.gwt.gen2.table.event.client.HasPageChangeHandlers;
|
| import com.google.gwt.gen2.table.event.client.HasPageLoadHandlers;
|
| import com.google.gwt.gen2.table.event.client.HasRowSelectionHandlers;
|
| import com.google.gwt.gen2.table.event.client.PageChangeEvent;
|
| import com.google.gwt.gen2.table.event.client.PageChangeHandler;
|
| import com.google.gwt.gen2.table.event.client.RowSelectionEvent;
|
| import com.google.gwt.gen2.table.event.client.RowSelectionHandler;
|
| import com.google.gwt.user.client.ui.HasValue;
|
| import com.google.gwt.user.client.ui.SourcesTableEvents;
|
| import com.google.gwt.user.client.ui.TableListener;
|
| import com.google.inject.Inject;
|
|
|
| @SuppressWarnings("deprecation")
|
| public class IMAPMessageListPresenter extends WidgetPresenter<IMAPMessageListPresenter.Display>{
|
|
|
| public interface Display extends WidgetDisplay {
|
| public HasRowSelectionHandlers getDataTableSelection();
|
| public HasPageLoadHandlers getDataTableLoad();
|
| public void addTableListener(TableListener listener) ;
|
| public void removeTableListener(TableListener listener) ;
|
| public void setPostFetchMessageCount(int count);
|
| public HasClickHandlers getNewClick();
|
| public Message getData(int rowIndex);
|
| public HasClickHandlers getDeleteClick();
|
| public HasClickHandlers getDeleteAllClick();
|
| public HasEnable getDeleteEnable();
|
| public void reloadData();
|
| public void removeMessages(List<Message> messages);
|
| public List<Message> getSelectedMessages();
|
| public void reset();
|
| public HasDialog getConfirmDeleteDialog();
|
| public HasDialog getConfirmDeleteAllDialog();
|
| public HasClickHandlers getConfirmDeleteDialogClick();
|
| public HasClickHandlers getConfirmDeleteAllDialogClick();
|
| public void selectAllMessages();
|
| public void deselectAllMessages();
|
| public HasClickHandlers getSelectAllClick();
|
| public HasClickHandlers getSelectNoneClick();
|
| public HasClickHandlers getMarkSeenClick();
|
| public HasClickHandlers getMarkUnseenClick();
|
| public HasEnable getMarkSeenEnable();
|
| public HasEnable getMarkUnseenEnable();
|
| public HasClickHandlers getRefreshClick();
|
| public void redraw();
|
| public HasPageChangeHandlers getDataTablePageChange();
|
| public void goToPage(int page);
|
| public int getCurrentPage();
|
| public int getRowsPerPageIndex();
|
| public HasChangeHandlers getRowsPerPageChange();
|
| public HasClickHandlers getSearchClick();
|
| public HasValue<String> getSearchValue();
|
| public void fillSearchOracle(List<Message> messages);
|
| public void setExpandLoading(boolean expanding);
|
|
|
| }
|
|
|
| private String searchValue;
|
| private User user;
|
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| private IMAPFolderProxy folder;
|
| ======= |
| private IMAPFolder folder;
|
| >>>>>>> first commit |
| ======= |
| 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 DispatchAsync dispatcher;
|
| private ShowMessageTableListener tableListener = new ShowMessageTableListener();
|
|
|
| @Inject
|
| public IMAPMessageListPresenter(IMAPMessageListPresenter.Display display,EventBus bus,DispatchAsync dispatcher) {
|
| super(display,bus);
|
| this.dispatcher = dispatcher;
|
|
|
| // add this event on constructor because we don't want to remove it on unbind
|
| eventBus.addHandler(LogoutEvent.TYPE, new LogoutEventHandler() {
|
|
|
| public void onLogout(LogoutEvent logoutEvent) {
|
| getDisplay().reset();
|
| getDisplay().getSearchValue().setValue("");
|
|
|
| // we need to fire a event to notify the history about the reset
|
| firePresenterChangedEvent();
|
| }
|
|
|
| });
|
| }
|
|
|
| @Override
|
| protected void onBind() {
|
| registerHandler(eventBus.addHandler(MessagesReceivedEvent.TYPE, new MessagesReceivedEventHandler() {
|
|
|
| public void onMessagesReceived(MessagesReceivedEvent event) {
|
|
|
| // fill the oracle
|
| display.fillSearchOracle(event.getMessages());
|
| }
|
|
|
| }));
|
| registerHandler(display.getSearchClick().addClickHandler(new ClickHandler() {
|
|
|
| public void onClick(ClickEvent event) {
|
| String searchValue = null;
|
| if (display.getSearchValue().getValue().trim().length() > 0) {
|
| searchValue = display.getSearchValue().getValue().trim();
|
| }
|
| eventBus.fireEvent(new LoadMessagesEvent(user, folder, searchValue));
|
| }
|
|
|
| }));
|
| registerHandler(eventBus.addHandler(MoveMessageEvent.TYPE, new MoveMessageEventHandler() {
|
|
|
| public void onMoveMessageHandler(MoveMessageEvent event) {
|
| final Message message = event.getMessage();
|
| dispatcher.execute(new MoveMessage(event.getOldFolder(), event.getNewFolder(), message.getUid()), new HupaCallback<MoveMessageResult>(dispatcher, eventBus) {
|
| public void callback(MoveMessageResult result) {
|
| ArrayList<Message> messageArray = new ArrayList<Message>();
|
| messageArray.add(message);
|
| display.removeMessages(messageArray);
|
| }
|
| });
|
| }
|
|
|
| }));
|
| registerHandler(display.getSelectAllClick().addClickHandler(new ClickHandler() {
|
|
|
| public void onClick(ClickEvent event) {
|
| display.deselectAllMessages();
|
| display.selectAllMessages();
|
| }
|
|
|
| }));
|
|
|
| registerHandler(display.getSelectNoneClick().addClickHandler(new ClickHandler() {
|
|
|
| public void onClick(ClickEvent event) {
|
| display.deselectAllMessages();
|
| }
|
|
|
| }));
|
|
|
|
|
| registerHandler(display.getDeleteClick().addClickHandler(new com.google.gwt.event.dom.client.ClickHandler() {
|
|
|
| public void onClick(com.google.gwt.event.dom.client.ClickEvent event) {
|
| if (folder.getFullName().equals(user.getSettings().getTrashFolderName())) {
|
| display.getConfirmDeleteDialog().show();
|
| } else {
|
| deleteMessages();
|
| }
|
|
|
| }
|
|
|
| }));
|
| registerHandler(display.getConfirmDeleteDialogClick().addClickHandler(new ClickHandler() {
|
|
|
| public void onClick(ClickEvent event) {
|
| deleteMessages();
|
| }
|
|
|
| }));
|
|
|
| registerHandler(display.getNewClick().addClickHandler(new com.google.gwt.event.dom.client.ClickHandler() {
|
|
|
| public void onClick(com.google.gwt.event.dom.client.ClickEvent event) {
|
| eventBus.fireEvent(new NewMessageEvent());
|
| }
|
|
|
| }));
|
|
|
| registerHandler(display.getDeleteAllClick().addClickHandler(new ClickHandler() {
|
|
|
| public void onClick(ClickEvent event) {
|
| display.getConfirmDeleteAllDialog().center();
|
| }
|
|
|
| }));
|
|
|
| registerHandler(display.getConfirmDeleteAllDialogClick().addClickHandler(new ClickHandler() {
|
|
|
| public void onClick(ClickEvent event) {
|
| dispatcher.execute(new DeleteAllMessages(folder), new HupaCallback<DeleteMessageResult>(dispatcher, eventBus) {
|
| public void callback(DeleteMessageResult result) {
|
| display.reset();
|
| display.reloadData();
|
| // eventBus.fireEvent(new DecreaseUnseenEvent(user,folder,result.getCount()));
|
| }
|
| });
|
| }
|
|
|
| }));
|
| registerHandler(display.getMarkSeenClick().addClickHandler( new ClickHandler() {
|
| public void onClick(ClickEvent event) {
|
| final ArrayList<Message> selectedMessages = new ArrayList<Message>(display.getSelectedMessages());
|
| ArrayList<Long> uids = new ArrayList<Long>();
|
| for (Message m : selectedMessages) {
|
| if (m.getFlags().contains(IMAPFlag.SEEN) == false) {
|
| uids.add(m.getUid());
|
| } else {
|
| selectedMessages.remove(m);
|
| }
|
| }
|
| dispatcher.execute(new SetFlag(folder, IMAPFlag.SEEN, true, uids), new HupaCallback<GenericResult>(dispatcher, eventBus) {
|
| public void callback(GenericResult result) {
|
| for (Message m : selectedMessages) {
|
| if (m.getFlags().contains(IMAPFlag.SEEN) == false) {
|
| m.getFlags().add(IMAPFlag.SEEN);
|
| }
|
| }
|
| display.redraw();
|
| eventBus.fireEvent(new DecreaseUnseenEvent(user, folder,selectedMessages.size()));
|
| }
|
| });
|
| }
|
|
|
| }));
|
|
|
| registerHandler(display.getMarkUnseenClick().addClickHandler(new ClickHandler() {
|
|
|
| public void onClick(ClickEvent event) {
|
| final ArrayList<Message> selectedMessages = new ArrayList<Message>(display.getSelectedMessages());
|
| ArrayList<Long> uids = new ArrayList<Long>();
|
| for (Message m : selectedMessages) {
|
| if (m.getFlags().contains(IMAPFlag.SEEN)) {
|
| uids.add(m.getUid());
|
| } else {
|
| selectedMessages.remove(m);
|
| }
|
| }
|
|
|
| dispatcher.execute(new SetFlag(folder, IMAPFlag.SEEN, false, uids), new HupaCallback<GenericResult>(dispatcher, eventBus) {
|
| public void callback(GenericResult result) {
|
| for (Message m : selectedMessages) {
|
| if (m.getFlags().contains(IMAPFlag.SEEN)) {
|
| m.getFlags().remove(IMAPFlag.SEEN);
|
| }
|
| }
|
| display.redraw();
|
| eventBus.fireEvent(new IncreaseUnseenEvent(user, folder,selectedMessages.size()));
|
| }
|
| });
|
| }
|
|
|
|
|
| }));
|
| registerHandler(eventBus.addHandler(FolderSelectionEvent.TYPE, new FolderSelectionEventHandler() {
|
|
|
| public void onFolderSelectionEvent(FolderSelectionEvent event) {
|
| folder = event.getFolder();
|
| user = event.getUser();
|
| firePresenterChangedEvent();
|
| }
|
|
|
| }));
|
| registerHandler(new HandlerRegistrationAdapter(display.getDataTableSelection().addRowSelectionHandler(new RowSelectionHandler() {
|
| public void onRowSelection(RowSelectionEvent event) {
|
| if (event.getSelectedRows().size() == 0) {
|
| display.getDeleteEnable().setEnabled(false);
|
| display.getMarkSeenEnable().setEnabled(false);
|
| display.getMarkUnseenEnable().setEnabled(false);
|
| } else {
|
| display.getDeleteEnable().setEnabled(true);
|
| display.getMarkSeenEnable().setEnabled(true);
|
| display.getMarkUnseenEnable().setEnabled(true);
|
| }
|
| }
|
|
|
|
|
|
|
| })));
|
|
|
| registerHandler(display.getRefreshClick().addClickHandler(new ClickHandler() {
|
|
|
| public void onClick(ClickEvent event) {
|
| display.reset();
|
| display.reloadData();
|
| }
|
|
|
| }));
|
| registerHandler(new HandlerRegistrationAdapter(display.getDataTablePageChange().addPageChangeHandler(new PageChangeHandler() {
|
|
|
| public void onPageChange(PageChangeEvent event) {
|
| //firePresenterRevealedEvent(true);
|
| firePresenterChangedEvent();
|
| }
|
|
|
| })));
|
| registerHandler(display.getRowsPerPageChange().addChangeHandler(new ChangeHandler() {
|
|
|
| public void onChange(ChangeEvent event) {
|
| //firePresenterRevealedEvent(true);
|
| firePresenterChangedEvent();
|
| }
|
|
|
| }));
|
| display.addTableListener(tableListener);
|
| }
|
|
|
|
|
| private void deleteMessages() {
|
| final ArrayList<Message> selectedMessages = new ArrayList<Message>(display.getSelectedMessages());
|
| ArrayList<Long> uids = new ArrayList<Long>();
|
| for (Message m : selectedMessages) {
|
| uids.add(m.getUid());
|
| }
|
| // maybe its better to just remove the messages from the table and expect the removal will work
|
| display.removeMessages(selectedMessages);
|
|
|
| dispatcher.execute(new DeleteMessageByUid(folder,uids), new HupaCallback<DeleteMessageResult>(dispatcher, eventBus) {
|
| public void callback(DeleteMessageResult result) {
|
| eventBus.fireEvent(new DecreaseUnseenEvent(user,folder,result.getCount()));
|
| }
|
| });
|
| }
|
|
|
|
|
| /*
|
| * (non-Javadoc)
|
| * @see net.customware.gwt.presenter.client.BasicPresenter#onUnbind()
|
| */
|
| protected void onUnbind() {
|
| display.removeTableListener(tableListener);
|
| }
|
|
|
|
|
| private final class ShowMessageTableListener implements TableListener {
|
|
|
| public void onCellClicked(SourcesTableEvents sender, int row,
|
| int cell) {
|
|
|
| display.setExpandLoading(true);
|
| Message message = display.getData(row);
|
|
|
| // mark the message as seen and redraw the table to reflect this
|
| if (message.getFlags().contains(MessageImpl.IMAPFlag.SEEN) == false) {
|
| // add flag, fire event and redraw
|
| message.getFlags().add(MessageImpl.IMAPFlag.SEEN);
|
| eventBus.fireEvent(new DecreaseUnseenEvent(user,folder,1));
|
|
|
| display.redraw();
|
|
|
| }
|
|
|
| eventBus.fireEvent(new ExpandMessageEvent(user,folder,message));
|
| }
|
|
|
| }
|
|
|
| @Override
|
| protected void onRevealDisplay() {
|
| <<<<<<< HEAD |
| <<<<<<< HEAD |
| if (user != null && folder != null) {
|
| display.reloadData();
|
| }
|
| }
|
|
|
| <<<<<<< HEAD |
| public void revealDisplay(User user, IMAPFolderProxy folder, String searchValue) {
|
| <<<<<<< HEAD |
| ======= |
| public void revealDisplay(User user, ImapFolder folder, String searchValue) {
|
| >>>>>>> Make the ValueProxy(ImapFolder) work with Manolo's patch. Hupa can display folders in west view with RequestFactory now. |
| this.user = user;
|
|
|
| if (this.user == null
|
| || !this.user.getName().equals(user.getName())
|
| || this.folder == null
|
| || !this.folder.getFullName().equals(folder.getFullName())
|
| || (searchValue == null && this.searchValue != null)
|
| || (searchValue != null && searchValue.equals(this.searchValue) == false)) {
|
| ======= |
| display.reloadData();
|
| ======= |
| if (user != null && folder != null) {
|
| display.reloadData();
|
| }
|
| >>>>>>> constantly changed by manolo |
| }
|
|
|
| public void revealDisplay(User user, IMAPFolder folder, String searchValue) {
|
| ======= |
| >>>>>>> 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. |
| this.user = user;
|
|
|
| <<<<<<< HEAD |
| if (this.folder == null || this.folder.getFullName().equals(folder.getFullName()) == false
|
| || (searchValue == null && this.searchValue != null) || (searchValue != null && searchValue.equals(this.searchValue) == false)) {
|
| >>>>>>> first commit |
| ======= |
| if (this.user == null
|
| || !this.user.getName().equals(user.getName())
|
| || this.folder == null
|
| || !this.folder.getFullName().equals(folder.getFullName())
|
| || (searchValue == null && this.searchValue != null)
|
| || (searchValue != null && searchValue.equals(this.searchValue) == false)) {
|
| >>>>>>> constantly changed by manolo |
| display.reset();
|
| display.deselectAllMessages();
|
| }
|
| display.setExpandLoading(false);
|
| this.searchValue = searchValue;
|
| this.folder = folder;
|
| <<<<<<< HEAD |
| <<<<<<< HEAD |
|
|
|
|
| ======= |
| >>>>>>> first commit |
| ======= |
|
|
|
|
| >>>>>>> constantly changed by manolo |
| revealDisplay();
|
| }
|
|
|
| }
|