blob: ab49d6f6f2af2ec615bd5173afd57c7b36a35fa9 [file] [log] [blame]
/****************************************************************
* 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.activity;
<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
import java.util.Collection;
import java.util.List;
import java.util.Set;
<<<<<<< HEAD
<<<<<<< HEAD
import org.apache.hupa.client.place.AbstractPlace;
import org.apache.hupa.client.place.FolderPlace;
import org.apache.hupa.client.place.MessagePlace;
import org.apache.hupa.client.rf.DeleteMessageByUidRequest;
<<<<<<< HEAD
import org.apache.hupa.client.rf.GetMessageDetailsRequest;
import org.apache.hupa.client.rf.MoveMessageRequest;
import org.apache.hupa.client.ui.MessagesCellTable;
import org.apache.hupa.client.ui.ToolBarView;
<<<<<<< HEAD
import org.apache.hupa.shared.domain.DeleteMessageByUidAction;
import org.apache.hupa.shared.domain.DeleteMessageResult;
import org.apache.hupa.shared.domain.GenericResult;
import org.apache.hupa.shared.domain.GetMessageDetailsAction;
import org.apache.hupa.shared.domain.GetMessageDetailsResult;
import org.apache.hupa.shared.domain.ImapFolder;
import org.apache.hupa.shared.domain.Message;
import org.apache.hupa.shared.domain.MoveMessageAction;
import org.apache.hupa.shared.domain.User;
import org.apache.hupa.shared.events.DeleteClickEvent;
import org.apache.hupa.shared.events.DeleteClickEventHandler;
import org.apache.hupa.shared.events.MoveMessageEvent;
import org.apache.hupa.shared.events.MoveMessageEventHandler;
import org.apache.hupa.shared.events.RefreshMessagesEvent;
import org.apache.hupa.shared.events.RefreshMessagesEventHandler;
import org.apache.hupa.shared.events.RefreshUnreadEvent;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.view.client.CellPreviewEvent;
import com.google.gwt.view.client.CellPreviewEvent.Handler;
import com.google.inject.Inject;
import com.google.web.bindery.requestfactory.shared.Receiver;
import com.google.web.bindery.requestfactory.shared.ServerFailure;
public class MessageListActivity extends AppBaseActivity {
@Inject private Displayable display;
@Inject private ToolBarActivity.Displayable toolBar;
@Inject private TopBarActivity.Displayable topBar;
private String folderName;
// private String searchValue;
private User user;
@Override
public void start(AcceptsOneWidget container, final EventBus eventBus) {
container.setWidget(display.asWidget());
bindTo(eventBus);
display.refresh();
this.registerHandler(display.getGrid().addCellPreviewHandler(new Handler<Message>() {
@Override
public void onCellPreview(final CellPreviewEvent<Message> event) {
if (hasClickedButFirstCol(event)) {
hc.showTopLoading("Loading...");
antiSelectMessages(display.getGrid().getVisibleItems());
GetMessageDetailsRequest req = rf.messageDetailsRequest();
GetMessageDetailsAction action = req.create(GetMessageDetailsAction.class);
final ImapFolder f = req.create(ImapFolder.class);
f.setFullName(folderName);
action.setFolder(f);
action.setUid(event.getValue().getUid());
req.get(action).fire(new Receiver<GetMessageDetailsResult>() {
@Override
public void onSuccess(GetMessageDetailsResult response) {
MessagePlace place = new MessagePlace(folderName + AbstractPlace.SPLITTER
+ event.getValue().getUid());
pc.goTo(place);
display.getGrid().getSelectionModel().setSelected(event.getValue(), true);
toolBar.enableAllTools(true);
ToolBarView.Parameters p = new ToolBarView.Parameters(user, folderName, event.getValue(),
response.getMessageDetails());
toolBar.setParameters(p);
display.refresh();
hc.hideTopLoading();
eventBus.fireEvent(new RefreshUnreadEvent());
}
@Override
public void onFailure(ServerFailure error) {
if (error.isFatal()) {
// log.log(Level.SEVERE, error.getMessage());
// TODO write the error message to
// status bar.
toolBar.enableAllTools(false);
hc.hideTopLoading();
throw new RuntimeException(error.getMessage());
}
}
});
}
}
}));
}
private boolean hasClickedButFirstCol(CellPreviewEvent<Message> event) {
return "click".equals(event.getNativeEvent().getType()) && 0 != event.getColumn();
}
private void bindTo(final EventBus eventBus) {
eventBus.addHandler(DeleteClickEvent.TYPE, new DeleteClickEventHandler() {
@Override
public void onDeleteClickEvent(DeleteClickEvent event) {
deleteSelectedMessages();
}
});
eventBus.addHandler(RefreshMessagesEvent.TYPE, new RefreshMessagesEventHandler() {
@Override
public void onRefresh(RefreshMessagesEvent event) {
display.setSearchValue(event.getSearchValue());
display.refresh();
}
});
eventBus.addHandler(MoveMessageEvent.TYPE, new MoveMessageEventHandler() {
@Override
public void onMoveMessageHandler(final MoveMessageEvent event) {
hc.showTopLoading("Moving...");
MoveMessageRequest req = rf.moveMessageRequest();
ImapFolder f = req.create(ImapFolder.class);
ImapFolder newF = req.create(ImapFolder.class);
String fullName = null;
if (pc.getWhere() instanceof FolderPlace) {
fullName = ((FolderPlace) pc.getWhere()).getToken();
} else {
fullName = ((MessagePlace) pc.getWhere()).getTokenWrapper().getFolder();
}
f.setFullName(fullName);
newF.setFullName(event.getNewFolder().getFullName());
MoveMessageAction action = req.create(MoveMessageAction.class);
final List<Long> uids = display.getSelectedMessagesIds();
if(uids.isEmpty() || uids.size() > 1){//TODO can move more than one message once.
hc.hideTopLoading();
hc.showNotice("Please select one and only one message", 10000);
return;
}
action.setMessageUid(uids.get(0));
action.setNewFolder(newF);
action.setOldFolder(f);
req.move(action).fire(new Receiver<GenericResult>() {
@Override
public void onSuccess(GenericResult response) {
display.refresh();
eventBus.fireEvent(new RefreshUnreadEvent());
hc.hideTopLoading();
hc.showNotice("The conversation has been moved to \"" + event.getNewFolder() + "\"", 10000);
}
@Override
public void onFailure(ServerFailure error) {
super.onFailure(error);
hc.hideTopLoading();
hc.showNotice(error.getMessage(), 10000);
}
});
}
});
}
public MessageListActivity with(String folderName) {
this.folderName = folderName;
return this;
}
public interface Displayable extends IsWidget {
MessagesCellTable getGrid();
void refresh();
List<Long> getSelectedMessagesIds();
Set<Message> getSelectedMessages();
void setSearchValue(String searchValue);
}
private void antiSelectMessages(Collection<Message> c) {
toolBar.enableAllTools(false);
for (Message msg : c) {
if (!display.getGrid().getSelectionModel().isSelected(msg))
continue;
display.getGrid().getSelectionModel().setSelected(msg, false);
}
}
private void deleteSelectedMessages() {
hc.showTopLoading("Deleting...");
String fullName = null;
if (pc.getWhere() instanceof FolderPlace) {
fullName = ((FolderPlace) pc.getWhere()).getToken();
} else {
fullName = ((MessagePlace) pc.getWhere()).getTokenWrapper().getFolder();
}
final List<Long> uids = display.getSelectedMessagesIds();
DeleteMessageByUidRequest req = rf.deleteMessageByUidRequest();
DeleteMessageByUidAction action = req.create(DeleteMessageByUidAction.class);
ImapFolder f = req.create(ImapFolder.class);
f.setFullName(fullName);
action.setMessageUids(uids);
action.setFolder(f);
req.delete(action).fire(new Receiver<DeleteMessageResult>() {
@Override
public void onSuccess(DeleteMessageResult response) {
antiSelectMessages(display.getSelectedMessages());
display.refresh();
hc.hideTopLoading();
eventBus.fireEvent(new RefreshUnreadEvent());
}
});
}
=======
=======
import org.apache.hupa.client.place.IMAPMessagePlace;
import org.apache.hupa.client.place.MailFolderPlace;
import org.apache.hupa.client.rf.GetMessageDetailsRequest;
>>>>>>> prepare for message content panel
=======
import org.apache.hupa.client.place.MailFolderPlace;
>>>>>>> make reload message content work, use the same place with folder list, while separated with slash, that looks like Gmail's
=======
=======
import java.util.Collection;
>>>>>>> fixed issue#59, coupled with fixing some UI refreshment issues in toolsbar
import java.util.List;
import java.util.Set;
=======
import org.apache.hupa.client.HupaController;
>>>>>>> try to rearrange the places and history managment.
import org.apache.hupa.client.place.DefaultPlace;
import org.apache.hupa.client.place.IMAPMessagePlace;
import org.apache.hupa.client.place.MailFolderPlace;
=======
import org.apache.hupa.client.place.AbstractPlace;
import org.apache.hupa.client.place.FolderPlace;
import org.apache.hupa.client.place.MessagePlace;
>>>>>>> change place management and make refresh folder and message list more gentle
import org.apache.hupa.client.rf.DeleteMessageByUidRequest;
import org.apache.hupa.client.rf.FetchMessagesRequest;
=======
>>>>>>> replace with IsWidget
import org.apache.hupa.client.rf.GetMessageDetailsRequest;
import org.apache.hupa.client.ui.MessagesCellTable;
<<<<<<< HEAD
>>>>>>> let messages list activity make use of mvp
=======
import org.apache.hupa.client.ui.ToolBarView;
<<<<<<< HEAD
>>>>>>> fixed issue#61; add loading to mark, unmark.
import org.apache.hupa.client.ui.WidgetDisplayable;
=======
>>>>>>> replace with IsWidget
import org.apache.hupa.shared.data.ImapFolderImpl;
=======
>>>>>>> fixed issue#82, make display message first and then mark etc.
import org.apache.hupa.shared.domain.DeleteMessageByUidAction;
import org.apache.hupa.shared.domain.DeleteMessageResult;
import org.apache.hupa.shared.domain.GetMessageDetailsAction;
import org.apache.hupa.shared.domain.GetMessageDetailsResult;
import org.apache.hupa.shared.domain.ImapFolder;
import org.apache.hupa.shared.domain.Message;
import org.apache.hupa.shared.domain.User;
import org.apache.hupa.shared.events.DeleteClickEvent;
import org.apache.hupa.shared.events.DeleteClickEventHandler;
import org.apache.hupa.shared.events.RefreshMessagesEvent;
import org.apache.hupa.shared.events.RefreshMessagesEventHandler;
import org.apache.hupa.shared.events.RefreshUnreadEvent;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.view.client.CellPreviewEvent;
import com.google.gwt.view.client.CellPreviewEvent.Handler;
import com.google.inject.Inject;
import com.google.web.bindery.requestfactory.shared.Receiver;
import com.google.web.bindery.requestfactory.shared.ServerFailure;
public class MessageListActivity extends AppBaseActivity {
@Inject private Displayable display;
@Inject private ToolBarActivity.Displayable toolBar;
@Inject private TopBarActivity.Displayable topBar;
private String folderName;
// private String searchValue;
private User user;
@Override
public void start(AcceptsOneWidget container, final EventBus eventBus) {
container.setWidget(display.asWidget());
bindTo(eventBus);
display.refresh();
this.registerHandler(display.getGrid().addCellPreviewHandler(new Handler<Message>() {
@Override
public void onCellPreview(final CellPreviewEvent<Message> event) {
if (hasClickedButFirstCol(event)) {
hc.showTopLoading("Loading...");
antiSelectMessages(display.getGrid().getVisibleItems());
GetMessageDetailsRequest req = rf.messageDetailsRequest();
GetMessageDetailsAction action = req.create(GetMessageDetailsAction.class);
final ImapFolder f = req.create(ImapFolder.class);
f.setFullName(folderName);
action.setFolder(f);
action.setUid(event.getValue().getUid());
req.get(action).fire(new Receiver<GetMessageDetailsResult>() {
@Override
public void onSuccess(GetMessageDetailsResult response) {
MessagePlace place = new MessagePlace(folderName + AbstractPlace.SPLITTER
+ event.getValue().getUid());
pc.goTo(place);
display.getGrid().getSelectionModel().setSelected(event.getValue(), true);
toolBar.enableAllTools(true);
ToolBarView.Parameters p = new ToolBarView.Parameters(user, folderName, event.getValue(),
response.getMessageDetails());
toolBar.setParameters(p);
display.refresh();
hc.hideTopLoading();
eventBus.fireEvent(new RefreshUnreadEvent());
}
@Override
public void onFailure(ServerFailure error) {
if (error.isFatal()) {
// log.log(Level.SEVERE, error.getMessage());
// TODO write the error message to
// status bar.
toolBar.enableAllTools(false);
hc.hideTopLoading();
throw new RuntimeException(error.getMessage());
}
}
});
}
}
}));
}
private boolean hasClickedButFirstCol(CellPreviewEvent<Message> event) {
return "click".equals(event.getNativeEvent().getType()) && 0 != event.getColumn();
}
private void bindTo(EventBus eventBus) {
eventBus.addHandler(DeleteClickEvent.TYPE, new DeleteClickEventHandler() {
@Override
public void onDeleteClickEvent(DeleteClickEvent event) {
deleteSelectedMessages();
}
});
eventBus.addHandler(RefreshMessagesEvent.TYPE, new RefreshMessagesEventHandler(){
@Override
public void onRefresh(RefreshMessagesEvent event) {
display.setSearchValue(event.getSearchValue());
display.refresh();
}
});
}
public MessageListActivity with(String folderName) {
this.folderName = folderName;
return this;
}
<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
@Inject private Displayable display;
<<<<<<< HEAD
public interface Displayable extends WidgetDisplayable {}
>>>>>>> integrate all of the views to their corresponding activities and mappers
=======
=======
@Inject
private Displayable display;
>>>>>>> make message content work as expected partly
=======
>>>>>>> make reload message content work, use the same place with folder list, while separated with slash, that looks like Gmail's
public interface Displayable extends WidgetDisplayable {
=======
public interface Displayable extends IsWidget {
>>>>>>> replace with IsWidget
MessagesCellTable getGrid();
void refresh();
List<Long> getSelectedMessagesIds();
Set<Message> getSelectedMessages();
void setSearchValue(String searchValue);
}
private void antiSelectMessages(Collection<Message> c) {
toolBar.enableAllTools(false);
for (Message msg : c) {
if (!display.getGrid().getSelectionModel().isSelected(msg))
continue;
display.getGrid().getSelectionModel().setSelected(msg, false);
}
}
private void deleteSelectedMessages() {
hc.showTopLoading("Deleting...");
String fullName = null;
if (pc.getWhere() instanceof FolderPlace) {
fullName = ((FolderPlace) pc.getWhere()).getToken();
} else {
fullName = ((MessagePlace) pc.getWhere()).getTokenWrapper().getFolder();
}
final List<Long> uids = display.getSelectedMessagesIds();
DeleteMessageByUidRequest req = rf.deleteMessageByUidRequest();
DeleteMessageByUidAction action = req.create(DeleteMessageByUidAction.class);
ImapFolder f = req.create(ImapFolder.class);
f.setFullName(fullName);
action.setMessageUids(uids);
action.setFolder(f);
req.delete(action).fire(new Receiver<DeleteMessageResult>() {
@Override
public void onSuccess(DeleteMessageResult response) {
antiSelectMessages(display.getSelectedMessages());
display.refresh();
hc.hideTopLoading();
eventBus.fireEvent(new RefreshUnreadEvent());
}
});
}
>>>>>>> prepare for message content panel
}